深入研究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(长度类型值)格式。在我们的示例中,我们具有以下字段:

现在,让我们看看这些字段分别代表什么。

为此,我们需要参考:

从这些参考,我们现在可以分析字段:

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 =  –>不允许从站跳过任何连接事件。
    • 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(数据长度扩展
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值