赞
踩
蓝牙通信中,分为主机和从机,有的模组实现了从机功能,就只能作为从机;有的模组实现了主机功能,就只能作为主机;有的模组既实现了主机功能,又实现了从机功能,所以是主从一体的,既能配置为主机,也能配置为从机。所以在购买蓝牙模组时,就需要注意自己到底需要买的是哪种类型的模组。像nRF52832蓝牙主控芯片,购买时并不存在是主机还是从机一说,而是我们自己用代码去实现主机还是从机的功能。
通常来说,蓝牙协议是一个通用协议,只要主从双方,都是使用的蓝牙协议,并且,从机是在主机的连接范围之内,就可以连接。就像单片机的程序,只要是同一款芯片,不管是烧到哪个芯片里,作用都是一样的,要做的,可能就是改变一下引脚定义,应用软件部分是不用修改的。
基本概念
蓝牙版本
由此可见
蓝牙协议是一个通用协议;
BLE是属于蓝牙4.0以上版本的规范。
设备类型
一般来说,手机都是双模设备,既支持蓝牙低功耗,又支持传统蓝牙,所以,不管蓝牙模组使用的是BLE还是传统蓝牙,手机都能和他们建立连接并通信。
CC2640就是一个单模的设备,只支持BLE。
BLE体系结构
从对链路层的描述我们可以知道:
1、一个设备,同一时刻,要么是主机,要么是从机,不可能同时既是主机又是从机。
2、只有建立连接之后,才会互传数据,所以为什么要建立连接之后模组才能进入透传模式,就是这个原因。
3、为什么需要AT指令模式,就是因为设备上电后,不可能直接进入连接态,必须先设置,然后经由广播态或者发起态才能进入连接态。因此,我们在编写程序时,一定是先设置AT指令,开启广播,连接成功后才会发送透传数据。
链路层信道映射
BLE广播、扫描和连接事件
广播事件
广播是从设备发起的,可以被主设备扫描到,并能对扫描进行响应,即扫描响应。
扫描事件
扫描是主机的行为。
连接事件
注意,建立连接之前,走的都是广播信道,建立连接之后,就会走数据信道。
Profile、Service、Characteristic和UUID
RSSI(Received Signal Strength Indicator)是接收信号的强度指示。
接收包RSSI是指无线模块发送信息后,接收端的无线模块接收到数据后,当前接收数据的信号强度的寄存器值,也就是接收模块获取到发送模块当前发送的信号强度。dbm是无线信号的强度单位。一般在 -90 ~ 0之间。
一般情况下:
-50~0之间信号强度很好,使用感知好。
-70~-50之间信号强度好。使用感知略差,但体验上无明显影响。
-70以下 信号就不是太好了,使用上感知就不好。为什么测量出来的dbm值都是负数?
答:首先我们需要知道的是无线信号dbm都是负数,最大是0。因此测量出来的dbm值肯定都是负数。dbm值只在一种情况下为0,那就是在理想状态下经过实验测量的结果,一般我们认为dbm为0是其最大值,意味着接收方把发射方发射的所有无线信号都接收到了,即无线路由器发射多少功率,接收的无线网卡就获得多少功率。当然这是在理想状态下测量的,在实际中即使将无线网卡挨着无线路由器的发射天线也不会达到dbm为0的效果。所以说不要盲目的认为负数就是信号不好。关于蓝牙协议栈的分层结构说明,参考:
蓝牙协议栈分层_蓝牙协议栈有几层组成?各层的协议有哪些?_wwwlyj123321的博客-CSDN博客
这篇文章可以作为入门来看。
其中:
GAP层(Generic access profile)通用访问文件层
GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
GATT(Generic attribute profile )通用属性配置文件层
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。GATT服务器和客户端
通俗地说吧,Server(服务器)就是数据中心,Client(客户端)就是访问数据者。特别说明,它与主/从设备是独立的概念:一个主设备既可以充当Server,又可以充当Client;从设备亦然。
服务器宣传它的存在,因此它可以被其他设备发现并包含客户端可以读取的数据。客户端扫描附近的设备,当它找到它正在寻找的服务器时,它会建立连接并监听传入的数据。这称为点对点通信(还有其他可能的通信模式,如广播模式和网状网络)。
句柄(Handle)就是服务数据在数据中心的地址,当所有的服务数据组织起来后,它总得有个先后顺序,某个服务的位置就是它的句柄。还是上面的类比,如果想去图书馆借阅《现代操作系统》,需要查明该书在哪一层楼,哪个房间,这就是该书的Handle。
配置文件、服务、特征、描述符
GATT配置文件规格规定了交换配置文件数据的架构。此架构定义了配置文件所用的基本元素,例如服务和特征。
该层级的最高层是配置文件(profile)。配置文件由实现用例所需的一个或多个服务组成。服务由特征或有关其它服务的引用组成。每一个特征包括一个值,还可能包括有关该值的可选信息。服务、特征以及特征的组件(即特征值和特征描述符)构成了配置文件数据,并全部存储在服务器的属性中。
总结来说就是,蓝牙中,定义了一个ATT属性协议,规定了怎样去访问对端设备的数据。
数据存储在属性服务器的“属性”里,供客户端进行读写操作。
属性里存储了好多配置文件,每个配置文件就是各种服务的集合,服务里又有好多特征值。
比如,传感器的温度、湿度数据,就是特征值,这些特征值组成一个服务(即从机能够提供的功能),再往上组成一个配置文件,都存在属性服务器里。
这里注意下,什么是特征的描述符?简答来说就是对该特征的一些描述信息等等。
具体参考:蓝牙 服务,特性,描述符,属性条目_蓝牙特征表_zhuimeng_ruili的博客-CSDN博客
服务存在于从机中,每个服务代表从机的一个能力;
特征的数值就是我们最终要操作的数据。
蓝牙的UUID
UUID是“Universally Unique Identifier”的简称,通用唯一识别码的意思。对于蓝牙设备,每个服务都有通用、独立、唯一的UUID与之对应。
常用的是16bit的UUID,也就是16位的别名。
比如,设备名称的UUID为0x2A00,是固定的,蓝牙协议里规定的。
当然,也可以自定义。具体见上方参考文章。
MTU
最大传输单元(Maximum Transmission Unit,MTU)用来通知对方所能接受数据服务单元的最大尺寸。是包或帧的最大长度,一般以字节记。如果MTU过大,可能会发送失败,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分情况下系统会提供给用户一个默认值,该值一般对用户是比较合适的。
透传
透传是一种透明传输,是一种形象的说法。它指的是,数据从发送端发出,不管中间经过多少设备,最终到达目的地时,依然是原封不动的,这就好像数据是直接从发送端设备到达目的地设备,中间所经过的路径对于发送方和接收方来说,就好像是不存在的一样。所以,将其形象地称之为透明传输,即透传。
这中间的所有设备总和,对数据不进行任何改变,只是单纯地转发出去。
那么就有个问题,既然只是单纯地转发,为什么还要多经过一道透传模块,而不直接发送给目的地呢?
透传一般都是无线设备用来读取远程的数据。在物物相连的物联网时代,要想实现智能设备的数据透传就需要仰仗无线透传模块的力量,可实现发送方和接收方数据的长度和内容完全一致,不需对数据做任何处理,相当于一条数据线或者串口线。
其实,就可以理解成,因为无线设备没有数据线连接,所以要想将数据发送到远程,就只能通过无线透传模块。这也是透传的主要应用。
比如:我有个蓝牙从机,已经实现了功能,现在我想通过串口给从机发命令让它工作,但是,从机又没法直接连上数据线,此时,就要通过一个透传模块,该模块可以和从机通信,我串口向无线透传模块发指令,透传模块再将指令转发给从机,从而将串口的数据,以透明传输的方式发送给从机,这时候,透传模块只是为了实现数据的传输而存在,就相当于是透明的,只是一根数据线而已,就是串口直接将数据发送给从机的。
句柄
英文是 handle
句柄(Handle)是一个用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量 。
Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法——一个广义的指针,它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的唯一的联系。
简而言之,就是通过特定的句柄,去访问某个对象。
nRF52832是一款蓝牙芯片。其实就可以看做一个普通的单片机芯片,只是这个单片机芯片集成了一个功能完善的蓝牙模块。
蓝牙可以分为主机和从机,其实都是一块芯片,当程序里实现主机的功能(典型如扫描)时,就可以作为主机,当程序里实现了从机的功能(典型如广播)时,就可以作为从机。不要以为芯片还分为什么主机芯片和从机芯片。芯片里已经集成了主机和从机等各种功能,去相应实现一下再烧录即可。
可以参考这个视频: 低功耗蓝牙BLE相关概念及用法
说实话,蓝牙里的有些概念真的很抽象,很难理解。
尤其是这几个:
GAP
GATT
服务
特征
属性
配置文件profile
捋一捋上面这几个概念。
GAP和GATT是蓝牙协议结构中的主机层实现,我一开始将GATT和GAP误认为是一种配置文件,为什么容易将GATT误以为是一种配置文件呢?因为我们通常总是说GATT配置文件,就连很多地方都直接将GATT翻译成通用属性配置文件。但其实这两个应该理解成通用访问协议和通用属性协议(ATT是attribute的缩写,表示属性,GATT就表示通用属性),属于BLE协议的一部分,在BLE协议栈里,需要对其进行实现,其实就是对应的软件程序。重点是,这两个协议实现是用来干嘛的。
GATT协议是基于ATT协议,ATT和GATT是蓝牙协议栈重要的2层,也是蓝牙应用开发者打交道最多的两层,用户开发应用程序的时候,调用的都是GATT API,而GATT又调用了ATT的 API。
应用层之间的数据通信,就需要依靠服务、特征和配置文件,这三个概念是定义在应用层的,但是需要经由GATT来解析。这里说的配置文件profile就真的是配置文件,是个说明文档,官网Specifications | Bluetooth® Technology Website可以查阅对应的profile。
其实配置文件就是一种规范的说明,里面说明了有哪些服务。
为什么GATT总是被叫做通用属性配置文件,那是因为这些配置文件里的服务都由GATT这一层来实现。
这里说的服务,就是能提供哪些功能,比如提供心率监测服务,提供温湿度检测服务等等,服务里又会有一些具体的参数,比如温湿度检测服务里,就有温度和湿度这两个参数,这些参数就是特征值,也可以叫特性值,也就是我们最终需要的数据。
以上这些涉及到服务特征等的数据,就可以统称为属性,只是一种泛称,并没有严格的说法。所以,属性配置文件,其实就可以说是关于描述服务和特征的规范文件。
一旦两个设备建立起了连接,GATT 就开始起作用了。
建立连接之前,从机向主机发送广播包,包里包含了MAC地址+帧长度+数据类型+目标数据,主机扫描能识别到广播包。
建立连接后,需要互传数据,那么数据是怎么传递的呢?就是通过特征值来传递的。
具体的传递过程,就是由GATT来实现的。
另外,每个服务和特征都有个UUID,协议里本身就定义了很多UUID,当然,用户也可以自定义UUID来表示特定的服务和特征。之后,我们就可以通过特征传递数据了。这一过程,仍然由GATT层实现。
那么,GAP呢?
要想GATT起作用,首先得经过GAP层
GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与其他设备进行交互。
更多参考:
【IoT】蓝牙 GAP 和 GATT 协议简析_gap gatt-CSDN博客
低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
配置文件一般存在于蓝牙从机中。我们谈配置文件,其实就是谈里面的服务,谈里面的特征……
特征值的几种传递方式
可读、可写(有响应)、可写且无需响应回复、通知、指示;
可读可写是主机的主动行为
通知是被动行为,即从机主动向主机上报数据,如果主机需要接收这个数据,就需要开启该特征值的订阅;指示就是需要有响应的通知,notify是不需要主机回应的。
再解惑
GATT层定义的两个角色是:客户端和服务器;
链路层定义的两个角色是:主机和从机;
这几个角色是针对特定层来说的,并不冲突,一个设备可以是客户端从机,也可以是服务器从机,既可以是客户端主机,也可以是服务器主机。
类似于从不同角度来看。
主从机主要是谁广播,谁扫描;客户端和服务器主要是谁提供数据,谁接收数据。
设备开机后,一开始,处于就绪态,然后从机广播,主机扫描,这个过程,需要物理层,链路层参与数据传输,GAP层参与设备识别与绑定,然后双方建立连接,连接之后,就是GATT参与的时候了,此时,主要是业务数据传输,这时候就涉及到配置文件,服务和特征等属性了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。