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 个字节?
实际问题:
- 使用 BlueZ 实现 BT 外围设备时,我有 31 或 25 个字节。我可以同时填写 Service Data 和 Manufacturer Data 总共 50 个字节吗??
- 制造商数据是广告数据的抽象吗?如果是这样,我如何访问底层广告数据?如果没有,理论上我可以填写广告和制造商数据吗?
下图由 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,然后注册广播。
就 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 个字节?
实际问题:
- 使用 BlueZ 实现 BT 外围设备时,我有 31 或 25 个字节。我可以同时填写 Service Data 和 Manufacturer Data 总共 50 个字节吗??
- 制造商数据是广告数据的抽象吗?如果是这样,我如何访问底层广告数据?如果没有,理论上我可以填写广告和制造商数据吗?
下图由 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,然后注册广播。