深入研究BLE数据包和事件
在BLE中,外围设备和中央设备之间可以交换许多事件和操作。对于任何BLE开发人员而言,了解这些事件都是必不可少的,要实现这一目标有两个方面:
- 学习理论上的概念。
- 通过使用蓝牙分析仪(嗅探器)捕获对它们进行分析来学习。
我相信这两种方法可以帮助人们全面了解BLE。
我们在“蓝牙低功耗入门”书中介绍了第一个方面 (您可以在此处免费下载或以平装本购买)。
在本文中,我们将分析一些事件,并通过分析来自蓝牙嗅探器(Ellisys Bluetooth Tracker)的捕获来更好地理解它们。
这是我们将要查看的事件/操作的列表:
- 广告:
- 类型:可连接可扫描无向和不可连接可扫描无向
- 广告间隔
- 使用的射频通道
- 使用的PHY
- 广告数据字段
- 蓝牙地址和类型
- 连接请求
- 连接后操作:
- 版本交换消息
- 功能交换消息
- 交换MTU
- 属性发现,包括GATT服务,特征,描述符等。
广告
在本节中,我们将介绍几种不同的广告包类型,包括:
- 不可连接的可扫描无向广告:此类型最常用于信标应用程序,在该应用程序中,设备广播要被其他多个BLE设备发现的数据,并且不接受连接。
- 可连接的可扫描非定向广告:这种类型最常用于希望接受来自发现该广告的其他BLE设备的连接的设备。
对于每种类型,我们将研究:
- 不同的广告数据字段
- 使用的射频通道
- 使用的PHY
- 蓝牙地址和类型
在讨论具体示例之前,我们首先来看一下未编码(1M PHY,2M PHY)广告包的格式(摘自Bluetooth 5.1规范文档):
来源:核心蓝牙规范版本5.2
您会注意到PDU中有两个主要部分: Header 和 Payload。
标头是所有广告数据包的标准配置,有效负载取决于广告类型(PDU)。
不可连接的可扫描无向广告
让我们看一下BLE嗅探器捕获中的不可连接的可扫描广告:
这是嗅探器软件显示的详细信息。第一个屏幕截图显示了链接层信息的详细信息:
有关上述字段的一些注意事项:
- 发送此选定数据包的RF信道是信道37(这是主要广告信道)
- 使用的PHY是1M PHY(未编码)
- 蓝牙地址是CD:54:DD:CD:90:6A,它是一个静态地址。
其余详细信息显示了链路层数据包本身的内容。我继续并重点介绍了最重要的领域:
有关捕获中的字段的一些注意事项:
广告类型(PDU): ADV_SCAN_IND。这是指不可连接的可扫描无向广告类型。以十六进制表示的值在右侧显示:0x6,并在官方规范中定义:
有效负载 长度为 28(字节)。
外观 值为 未知(0x0000)。
广告标记:
LE受限可发现模式: 否
LE常规可发现模式: 是
同时LE和BR / EDR(控制器): 否
同时LE和BR / EDR(主机): 否
设备名称(本地名称):“ Nordic_Blinky ”
原始数据:
让我们看一下原始数据如何映射到Details屏幕快照中列出的值。
广告物理信道PDU标头:
有效
负载ADV_SCAN_IND数据包的有效负载在规范中定义为:
因此,我们有了AdvA(广告设备的蓝牙地址)和广告数据:
蓝牙地址: CD:54:DD:CD:90:6A
AdvData(广告数据):
广告数据采用以下格式(来自蓝牙规范):
这遵循众所周知的LTV(长度类型值)格式。在我们的示例中,我们具有以下字段:
现在,让我们看看这些字段分别代表什么。
为此,我们需要参考:
- 在https://www.bluetooth.com/specifications/assigned-numbers/generic-access-profile/上列出 的 广告数据类型(AD类型)
- “蓝牙核心规范补充(CSS) ” https://www.bluetooth.com/specifications/bluetooth-core-specification/
从这些参考,我们现在可以分析字段:
03 19 00 00:
03是长度。
该字段的类型= 0x19,表示“外观”。
它的值为0x00 0x00映射到“未知”。(https://www.bluetooth.com/wp-content/uploads/Sitecore-Media-Library/Gatt/Xml/Characteristics/org.bluetooth.characteristic.gap.appearance.xml)
02 01 06:
02是长度。
该字段的类型= 0x01,表示“标志”。
标志定义如下(来自CSS文档):
在我们的示例中,Flags字段的值为0x06(或00000110二进制),这意味着:
设置位1 –>启用LE常规可发现模式
设置位2 –>启用不支持Br / EDR
0E 09 4E 6F 72 64 69 63 5F 42 6C 69 6E 6B 79:
此字段的类型= 0x09,表示“完整本地名称”或所谓的 设备名称。它的值为4E 6F 72 64 69 63 5F 42 6C 69 6E 6B 79(十六进制),映射为ASCII中的“ Nordic_Blinky”。
最后一个字节是有效负载的CRC:
可连接的可扫描无向广告
现在,让我们看一下广告包的另一种类型:可连接的可扫描无向广告。我们不会像前面的广告类型示例那样详细介绍。
在此示例中,我们注意到与上一个示例有很多相似之处。我们更改的只是广告的类型。
以下是所选数据包的详细信息:
连接请求
BLE中最重要的数据包之一是 连接请求 数据包。它是中央发送到广告外围设备(发送可连接的广告数据包)以发起连接的数据包。
这种数据包类型非常重要,因为它包含了至关重要的信息(中央需要将其传达给外围设备)。
让我们看一下连接请求包的内容(摘自官方的蓝牙规范文档):
重要信息包含在数据包的LLData部分中:
- AA: 访问地址
- CRCInit:包含CRC计算的初始化。
- 使用winsize & WinOffset: 既用于设置 transmitWindowSize (使用winsize * 1.25毫秒)和 transmitWindowOffset (WinOffset * 1.25毫秒),其允许中央发送第一连接事件锚点的定时一定的灵活性。
- 间隔: 用于计算 connectionInterval (间隔* 1.25毫秒),它是中央和外围设备交换数据的频率。
-
延迟: 用于设置 connSlaveLatency (=延迟),它允许从属/外围设备跳过许多连接事件以节省电量并保持更长的睡眠时间:
- connSlaveLatency = 0 –>不允许从站跳过任何连接事件。
- connSlaveLatency = n –>允许从站跳过 n个 连接事件。
- 超时: 用于设置 connSupervisionTimeout (超时* 10毫秒)值。
-
ChM: 包含 信道图, 指示哪些RF数据信道用于数据传输。LSB表示数据通道索引0,位置36的位表示数据通道索引36。0表示 未使用 ,1表示已 使用。
注意:请记住,RF数据通道是通道0-36。 - Hop: 用于设置 hopIncrement 值(5-16范围内的随机值)。
- SCA: 用于设置masterSCA 值,该 值用于确定最坏情况下Master的睡眠时钟精度。
样本连接请求数据包(嗅探器捕获)
这是由Ellisys Bluetooth Tracker嗅探器捕获的连接请求数据包的示例:
这是数据包的详细信息:
让我们看一下原始数据,看看它如何映射到这些细节:
现在,让我们看一下LLData字段:
请记住,此处显示的数据是从LSB到MSB(从接收器接收,从左到右)。
而已。现在您知道 了连接请求数据包中的每一位!
连接后请求和操作
一旦连接了两个BLE设备,它们将经历一些操作和数据包交换,这在两个用户之间交换任何用户启动的数据之前是必需的。
让我们看一下以下操作:
- 版本交换
- 功能交换
- 交换MTU
- 属性发现(包括GATT服务,特征,描述符等)
- 读取设备名称(出于UI的目的,为发现的设备显示有意义的名称)
版本交换
该数据包从每个设备发送,以通知对等方所使用的蓝牙版本和芯片组的制造商。
在下面的示例(iPhone Xs MAX <–> Nordic nRF52840 DK)中,让我们看一下正在交换的数据包:
如您所见,数据包是从每个设备发送的。每个字段包含四个字段:
- 操作码:LL_VERSION_IND,定义PDU类型
- 蓝牙版本:指示所使用的蓝牙规范的版本
- 公司ID:包含蓝牙控制器制造商的公司标识符
- 实施修订版:指定蓝牙控制器的实施修订版
以下是每个设备(第一个是iPhone,第二个是Nordic DK)发送的信息:
功能交换
由于不是Bluetooth规范版本中的所有功能都是强制性的(某些是可选的),因此设备需要相互通信,以支持确实支持哪些特定功能。
这是通过 功能交换 数据包完成的。
其中一台设备发送LL_FEATURE_REQ列出其支持的所有功能,而另一台设备以LL_FEATURE_RSP进行响应以列出其支持的功能。
从蓝牙规范的5.1版开始,有28个定义的位指示是否支持某功能。
让我们看一下示例中每个设备支持的功能列表。
苹果手机:
北欧开发套件:
交换MTU
首先,让我们定义什么是MTU:
MTU代表最大传输单位,它定义了发送方和接收方可以处理的最大数据量,以及它们可以保存在缓冲区中的最大数据量。
每个规格的MTU值没有上限,但使用的特定堆栈可能有其自身的局限性。
有效的MTU由客户端和服务器支持的ATT MTU的最小值确定。
例如,如果客户端支持100字节的ATT MTU,并且服务器响应它支持150字节的ATT MTU,则客户端将决定从其上用于连接的ATT MTU为100字节。
这是我们示例中的Exchange MTU数据包。客户端(iPhone)发送Exchange MTU请求数据包,而服务器(Nordic DK)发送回Exchange MTU响应数据包。
交换iPhone发送的MTU数据包,其MTU值为293字节:
交换Nordic Dev Kit发送的MTU数据包,其MTU值为23:
属性发现
每当两个设备首次连接时,就会进行属性发现过程。
之后,客户端可以缓存所有属性(包括服务,特征,描述符等),以避免在两个设备下次连接时执行发现过程。
如果客户端不缓存属性,则它每次连接到服务器时都必须执行发现过程。
属性列表将包含 每个属性的 键/值对,其中“ 属性句柄” 为 键, 而“ 属性类型”(UUID) 为“ 值”。
如果服务器希望支持属性句柄中的更改(例如,由于固件更新或出厂重置),则它必须包含“ 服务更改” 特征以通知客户端属性句柄已更改,从而触发服务发现。
看一下发现过程的样子:
如您所见,这通常需要多个数据包,尤其是在服务器端有许多已定义的服务和特征的情况下。
客户端不断请求读取属性,直到它收到“找不到属性”错误消息,该消息指示发现过程结束:
读取设备名称
客户端通常会发送的另一个请求(尤其是在具有UI元素的应用程序中)正在读取 设备名称。
这是一个简单的 Read Request GATT操作:
使您的BLE知识更上一层楼!
如果您想了解更多有关其他BLE事件和数据包的详细信息,请查看 Bluetooth Developer Academy。我不仅涵盖了其他BLE数据包,而且还提供了示例Ellisys捕获文件,您可以在没有嗅探器本身的情况下(仅需要嗅探器软件)下载并在计算机上查看这些文件。
在专门的课程中,我将介绍以下其他BLE数据包:
- 关贸总协定行动
- 读
- 写
- 写无回应
- 通知事项
- 适应症
- 杂项事件:
- 连接参数更新请求
- PHY更新请求
- DLE(数据长度扩展