Bluetooth LE 中制造数据、服务数据和广告数据之间的区别

Distinction Between Manufacturing Data, Service Data and Advertising Data in Bluetooth LE

就 BLE 而言,我对 BlueZ 中的术语及其用法有点困惑:


我将尝试总结我所理解的内容以及不一致的地方。

here 开始,广告数据包中有一个 31 字节长的有效负载,可用于用户定义的数据。

但是,BlueZ 在其 advertising API 中具有不同的数据概念。它从文档中获取 <type> <byte array> 的字典。

多看一点,你会发现这个table,它似乎具有相同的two byte type和数据结构。

它具有用户定义的有效负载:

0xFF    «Manufacturer Specific Data»    Bluetooth Core Specification:Vol. 3, Part C, section 8.1.4 (v2.1 + EDR, 3.0 + HS and 4.0)Vol. 3, Part C, sections 11.1.4 and 18.11 (v4.0)Core Specification Supplement, Part A, section 1.4

所以我下载了规范以尝试阅读其中的区别,这让我想到了这句话,但我不太理解:

The data is sent in advertising or periodic advertising events. Host Advertising data is placed in the AdvData field of ADV_IND, ADV_NONCONN_IND, ADV_SCAN_IND, AUX_ADV_IND, and AUX_CHAIN_IND PDUs. Additional Controller Advertising Data is placed in the ACAD field of AUX_ADV_IND, AUX_SYNC_IND, and AUX_SCAN_RSP PDUs. Periodic Advertising data is placed in the AdvData field of AUX_SYNC_IND and AUX_CHAIN_IND PDUs. Scan Response data is sent in the ScanRspData field of SCAN_RSP PDUs or the AdvData field of AUX_SCAN_RSP PDUs. If the complete data cannot fit in the AdvData field of an AUX_ADV_IND, AUX_SYNC_IND, or AUX_SCAN_RSP PDU, AUX_CHAIN_IND PDUs are used to send the remaining fragments of the data. An AD Structure may be fragmented over two or more PDUs

另外,当我查看他们自己的 DBUS API 的 BlueZ 实现时,我看到他们提供了一种填充制造数据的方法,但没有改变广告类型的方法(ADV_NONCONN vs ADV_CONN) .

他们也有 adv_data 类型,但只有 25 个字节?为什么我无法获取完整的 31 个字节?

https://github.com/bluez/bluez/blob/cbbb0c2ead89ed19280ecd94e8a2fb0d22216bb6/client/advertising.c#L55


实际问题:

  1. 使用 BlueZ 实现 BT 外围设备时,我有 31 或 25 个字节。我可以同时填写 Service Data 和 Manufacturer Data 总共 50 个字节吗??
  2. 制造商数据是广告数据的抽象吗?如果是这样,我如何访问底层广告数据?如果没有,理论上我可以填写广告和制造商数据吗?

下图由 Jos Ryke 创建,可能有助于直观地了解正在发生的事情。

如图所示,ADV FLAGS 和 Advertisement 数据构成了 31 字节的广告负载,但只有 26 字节的数据可用。该图像包含制造商数据 (type = FF) 和服务数据 (type = 16)

的示例

在 D-Bus API 中,要更改广告类型(ADV_NONCONN 与 ADV_CONN),请使用 type 属性: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/advertising-api.txt#n37

broadcast = ADV_NONCONN

您可以在同一个广告中同时包含服务数据和制造商数据(参见示例 https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/test/example-advertisement#n141),但长度不能超过 31 个字节。使用 BlueZ,您最多可以注册(如果我没记错的话)四个将作为不同数据包发送的广告。

总之,服务数据和制造商数据是广告有效负载中的子元素类型。 BlueZ 允许您在广告中建立不同的 data types,然后注册广播。