就 BLE 而言,我对这些术语及其在 BlueZ 中的用法感到有点困惑:
\n我将尝试总结我的理解以及其中的不足。
\n从这里开始,广告数据包中有一个 31 字节长的有效负载,可用于用户定义的数据。
\n然而,BlueZ 在其广告 API中有不同的数据概念。<type> <byte array>它需要来自文档的字典。
再看一下,您会发现这个表似乎具有相同的两字节类型和数据结构。
\n它具有用户定义的有效负载:
\n0xFF \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\nRun Code Online (Sandbox Code Playgroud)\n所以我下载了规范来尝试阅读其中的区别,这让我想到了这句话,我不太明白:
\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
另外,当我查看 BlueZ 自己的 DBUS API 实现时,我发现他们提供了一种填充制造数据的方法,但无法更改广告类型(ADV_NONCONN 与 ADV_CONN)\n。
\n它们也有类型adv_data,但只有 25 个字节?为什么我无法获取完整的 31 字节?
实际问题:
\n下面由 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 允许您在广告中构建所需的不同数据类型,然后将其注册以进行广播。