1.蓝牙简介
蓝牙是一种近距离无线通信技术,运行在2.4GHz免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。蓝牙4.0以后的版本分为两种模式,单模蓝牙和双模蓝牙。
- 单模蓝牙,即低功耗蓝牙模式,是蓝牙4.0中的重点技术,低功耗,快连接,长距离。
- 双模蓝牙,支持低功耗蓝牙的同时还兼容经典蓝牙,经典蓝牙的特点是大数据高速率,例如音频、视频等数据传输。
如下图所示,双模蓝牙具有下图所有的特点,而单模蓝牙仅如图右侧所示。
2.BLE工作流程
2.1 角色
BLE设备角色主要分为两种角色,主机(Master或Central)和从机(Peripheral),当主机和从机建立连接之后才能相互收发数据
- 主机,主机可以发起对从机的扫描连接。例如手机,通常作为BLE的主机设备
- 从机,从机只能广播并等待主机的连接。例如智能手环,是作为BLE的从机设备
另外还有观察者(Observer)和广播者(Broadcaster),这两种角色不常使用,但也十分有用,例如iBeacon,就可以使用广播者角色来做,只需要广播特定内容即可。
- 观察者,观察者角色监听空中的广播事件,和主机唯一的区别是不能发起连接,只能持续扫描从机。
- 广播者,广播者可以持续广播信息,和从机的唯一区别是不能被主机连接,只能广播数据。
蓝牙协议栈没有限制设备的角色范围,同一个BLE设备,可以作为主机,也可以作为从机,我们称之为主从一体,主从一体的好处是,每个BLE设备都是对等的,可以发起连接,也可以被别人连接,更加实用。
2.2 广播
广播是指从机每经过一个时间间隔发送一次广播数据包
,这个时间间隔称为广播间隔
,这个广播动作叫做广播事件
,只有当从机处于广播状态时,主机才能发现该从机。
在每个广播事件中,广播包会分别在37,38和39三个信道上依次广播,如下图所示。
广播时间间隔的范围是从20ms到10.24s,广播间隔影响建立连接的时间。广播间隔越大,连接的时间越长。 另外BLE链路层会在两个广播事件之间添加一个0~10ms的随机延时,保证多个设备广播时,不会一直碰撞广播。也就是说,设置100ms的广播间隔,实际上两次广播事件的时间间隔可能是100~110ms之间的任意时间。
广播数据包最多能携带31个字节的数据,一般包含可读的设备名称,设备是否可连接等信息。当主机收到从机广播的数据包后,它可以再发送获取更多数据包的请求,这个时候从机将广播扫描回应
数据包,扫描回应数据包和广播包一样,可以携带31个字节的数据。
【注】提示:蓝牙4.x,广播有效载荷最多是31个字节。而在蓝牙5.0中,通过添加额外的广播信道和新的广播PDU,将有效载荷增加到了255个字节。
2.3 扫描
扫描是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。
扫描动作有两个比较重要的时间参数:扫描窗口
和扫描间隔
,如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机广播包。
两种扫描类型,被动扫描和主动扫描。
- 被动扫描,主机监听广播信道的数据,当接收到广播包时,协议栈将向上层(也就是应用层,用户可编程)传递广播包。
- 主动扫描,主动扫描除了完成被动扫描的动作外,还会向从机发送一个扫描请求,从机收到该请求时,会再次发送一个称作
扫描回应
的广播包。
2.4 连接
在BLE连接中,使用跳频方案,两个设备在特定时间、特定频道上彼此发送和接收数据。这些设备稍后在新的通道(协议栈的链路层处理通道切换)上通过这个约定的时间相遇。这次用于收发数据的相遇称为连接事件。如果没有要发送或接收的应用数据,则交换链路层数据来维护连接。两个连接事件之间的时间跨度称为连接间隔,是以1.25 ms为单位,范围从最小值7.5 ms到最大值4.0 s。
2.5 通信
通俗的说,我们将从机具有的数据或者属性特征,称之为Profile,Profile可翻译为:配置文件。从机中添加Profile配置文件(定义和存储Profile),作为GATT的Server端,主机作为GATT的Client端。
Profile包含一个或者多个Service,每个Service又包含一个或者多个Characteristic。主机可以发现和获取从机的Service和Characteristic,然后与之通信。Characteristic是主从通信的最小单元。
- 主机可主动向从机Write写入或Read读取数据。
- 从机可主动向主机Notify通知数据。
注意,这里引用了服务 Service
和 特征值 Characteristic
的概念。每个服务和特征值都有自己的唯一标识 UUID
,标准UUID为128位,蓝牙协议栈中一般采用16位,也就是两个字节的UUID格式。
一个从机设备包括一个或者多个服务;一个服务中又可以包括一条或者多条特征值,每个特征值都有自己的属性 Property
,属性的取值有:可读 Read
,可写 Write
以及 通知 Notify
。这便是主从机之间两个典型的通信方式:
- 可读可写的字面意思容易理解,表示该特征值可以被主机读取和写入数据,
- 而通知则表示从机可以主动向主机发送通知数据。
下图是一个典型的从机设备,该从机包含有一个Profile,两个个Service和五个Characteristic。
1) 服务0x180A
180A是蓝牙协议里标准的服务UUID,用来描述设备信息 Device Information,可以通过该服务,来提供从机设备的相关说明,例如硬件版本,软件版本,序列号等信息。这样,主机就可以获取从机的设备信息。上图中我们添加了三个提供具体设备信息的特征值,他们分别是:
- 特征值0x2A24,描述产品型号 Model Number String,例如某智能锁的产品型号为:“DSL-C07”。
- 特征值0x2A25,描述产品序列号 Serial Number String,例如某智能锁的产品序列号为:“lkjl0016190502500269”
- 特征值0x2A26,描述产品固件版本号 Firmaware Revision String,例如某智能锁的固件号为:“2.7.2.0”
上述特征值仅有Read属性,因此主机只能读,不能执行写操作。
2)服务0xFFF0
FFF0是我们自定义的服务UUID,它包含两个特征值,用来发送和接收数据。
- 特征值0xFFF1,自定义的数据发送通道,具有Read和Write属性,主机可以通过该特征值,向从机发送数据,至于发送的数据最大长度,可以在Profile中配置。
- 特征值0xFFF2,自定义的数据接收通道,具有Notify属性,从机可以通过该特征值,主动向主机发送数据。
2.6 断开
主机或从机都可以发起断开连接请求,对方会收到该请求,然后断开连接恢复连接前的状态。