千里之行,始于广播 | 低功耗蓝牙的数据传输之旅

在我们身处的世界中,蓝牙无处不在。

电子Beacon引导着消防员穿越建筑物(BeaconOutlets插座可用于强化基础设施定位,帮助应急救援人员更迅速地反应);可穿戴医疗设备将患者的生物数据发送到医生的平板电脑上(可以追踪心率和心脏状况的飞利浦健康智能手表、Minicare手持式验血平台等);生产设备监测着40万平方英尺(约3.7万平方米)的仓库等等。

而蓝牙技术的市场正在不断扩大,根据ABI的万联网市场追踪报告,预计到2021年的安装基数将超过480亿。

那么蓝牙究竟是如何工作的呢? 低功耗蓝牙在2.4GHz ISM频段有40个物理信道,每个频段间隔2MHz。 蓝牙定义了两种传输类型:数据和广播传输。 因此,这40个信道中的3个为广播专用信道,37个为数据专用信道。

无论是Beacon(发送位置、天气或其他数据)或与主机(平板电脑或手机)保持长期连接状态的健身手表,所有外围设备(至少最初)都会以广播模式开始通信。
广播能够让设备将自身的连接意图“广而告之”。

那么蓝牙是如何广播的呢?

为了便于使用,蓝牙为广播和数据传输定义了单一数据包形式。 该数据包包括四个构成部分:前导码(1个八位字节)、接入地址(4个八位字节)、协议数据单元-PDU(2-257个八位字节)和循环冗余校验-CRC(3个八位字节);参见下图1A。

千里之行,始于广播 | 低功耗蓝牙的数据传输之旅

PDU区段非常重要,因为它定义了该数据包是广播格式还是数据格式。我们的探讨将聚焦于广播PDU(图1B)。
广播PDU数据包(如下图2A)包含16比特的报头和大小可变的有效载荷。

千里之行,始于广播 | 低功耗蓝牙的数据传输之旅

广播报头定义了6个区段。 我们将重点关注长度和PDU类型字段/区段(上图2B)。长度字段为6位,它定义了有效载荷的大小,即可以广播多少信息量(上图2A)。它的长度可以在6到37个八位字节之间,并且由PDU类型定义。

Ok,现在我们知道了如何广播,且有“x”个八位字节的有效载荷。但我们为什么需要广播呢? 下面就要轮到PDU的类型登场了。低功耗蓝牙中需要广播(advertise/broadcast)的理由有二种:
• 在设备之间建立双向连接(例如智能手表和手机)。

• 需连接其他设备的信息广播,如在博物馆的Beacon能够通过发送数据告诉你身后5英尺有一具500年历史的木乃伊。

因此无论是应用于智能手表连的接,还是木乃伊位置的推送,我们开发人员都专注于4种PDU类型(图2B):

ADV_IND
称为广播指示(ADV_IND),外围设备请求到连接至任意中央设备(即不指向特定的中心设备)。
示例:请求连接到任意中央设备的智能手表。

ADV_DIRECT_IND
与ADV_IND类似,但是连接请求指向特定的中央设备。
示例:请求连接到特定中央设备的智能手表。

ADV_NONCONN_IND
不可连接设备,向任意接收设备广播信息。
示例:博物馆中的Beacon,其可定义与特定展品的距离。

ADV_SCAN_IND
与ADV_NONCONN_IND类似,通过扫描响应提供选项附加信息。
示例:仓库托盘Beacon,其允许中央设备请求托盘相关的更多信息。

因此,当需要长期连接时,PDU类型设置为ADV_IND或ADV_DIRECT_IND,这取决于外围设备是广播给任意设备还是特定设备。并且当广播通用数据却不建立长期连接时,需选择ADV_NONCONN_IND或ADV_SCAN_IND的PDU类型。 典型的Beacon会使用ADV_NONCONN_IND,而由于外围设备允许更多信息的访问,如我们的仓库托盘,那么ADV_SCAN_IND则可能是更好的选择。

所以无论是请求长期连接,还是作为电子Beacon广播,一切都始于广播。

文章来源: Bluetooth开发者门户