蓝牙 LE 中制造数据、服务数据和广告数据的区别

cjd*_*jds 2 bluetooth bluez

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

\n
    \n
  • 制造商数据
  • \n
  • 服务数据
  • \n
  • 广告数据
  • \n
\n
\n

我将尝试总结我的理解以及其中的不足。

\n

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

\n

然而,BlueZ 在其广告 API中有不同的数据概念。<type> <byte array>它需要来自文档的字典。

\n

再看一下,您会发现这个表似乎具有相同的两字节类型和数据结构。

\n

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

\n
0xFF    \xc2\xabManufacturer Specific Data\xc2\xbb    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\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

数据在广告或定期广告事件中发送。主机广告数据放置在 ADV_IND、ADV_NONCONN_IND、ADV_SCAN_IND、AUX_ADV_IND 和 AUX_CHAIN_IND PDU 的 AdvData 字段中。附加控制器广告数据放置在 AUX_ADV_IND、AUX_SYNC_IND 和 AUX_SCAN_RSP PDU 的 ACAD 字段中。定期广告数据\n放置在 AUX_SYNC_IND 和 AUX_CHAIN_IND PDU 的 AdvData 字段中。\n扫描响应数据在 SCAN_RSP PDU 的 ScanRspData 字段或\nAUX_SCAN_RSP PDU 的 AdvData 字段中发送。如果完整数据无法容纳在 AUX_ADV_IND、AUX_SYNC_IND 或 AUX_SCAN_RSP PDU 的 AdvData 字段中,则使用 AUX_CHAIN_IND PDU 发送数据的剩余片段。AD 结构可以分为两个或多个 PDU

\n
\n

另外,当我查看 BlueZ 自己的 DBUS API 实现时,我发现他们提供了一种填充制造数据的方法,但无法更改广告类型(ADV_NONCONN 与 ADV_CONN)\n。

\n

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

\n

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

\n
\n

实际问题:

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

ukB*_*Baz 5

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

如图所示,ADV FLAGS 和广告数据构成了 31 字节的广告负载,但只有 26 字节的数据可用。该图像包含制造商数据(类型 = FF)和服务数据(类型 = 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_非连接

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

总之,服务数据和制造商数据是广告有效负载中的子元素类型。BlueZ 允许您在广告中构建所需的不同数据类型,然后将其注册以进行广播。