【发布时间】:2020-08-03 06:45:31
【问题描述】:
就 BLE 而言,我对这些术语及其在 BlueZ 中的用法感到有些困惑:
- 制造商数据
- 服务数据
- 广告数据
我将尝试总结一下我所理解的内容以及其中的不足之处。
来自here 的广告包中有一个长度为 31 字节的有效负载,可用于用户定义的数据。
但是,BlueZ 在其advertising API 中具有不同的数据概念。它需要一个来自文档的<type> <byte array> dict。
再看一眼,您会发现这张表似乎与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
所以我下载了规范以尝试阅读区别,这导致我不太理解这句话:
数据在广告或定期广告事件中发送。主机广告 数据放置在 ADV_IND、ADV_NONCONN_IND 的 AdvData 字段中, ADV_SCAN_IND、AUX_ADV_IND 和 AUX_CHAIN_IND PDU。额外的 控制器广告数据放置在 AUX_ADV_IND 的 ACAD 字段中, AUX_SYNC_IND 和 AUX_SCAN_RSP PDU。定期广告数据是 放置在 AUX_SYNC_IND 和 AUX_CHAIN_IND PDU 的 AdvData 字段中。 扫描响应数据在 SCAN_RSP PDU 的 ScanRspData 字段中发送或 AUX_SCAN_RSP PDU 的 AdvData 字段。如果无法容纳完整的数据 AUX_ADV_IND、AUX_SYNC_IND 或 AUX_SCAN_RSP PDU、AUX_CHAIN_IND PDU 用于发送 剩余的数据片段。一个 AD 结构可以分为两个 或更多 PDU
此外,当我查看他们自己的 DBUS API 的 BlueZ 实现时,我看到他们提供了一种填写制造数据的方法,但无法更改广告类型(ADV_NONCONN 与 ADV_CONN) .
他们也有 adv_data 类型,但它只有 25 个字节?为什么我无法获得完整的 31 个字节?
实际问题:
- 使用 BlueZ 实现 BT 外设时,我有 31 还是 25 字节。我可以同时填写服务数据和制造商数据共 50 个字节吗??
- 制造商数据是广告数据的抽象吗?如果是这样,我如何访问基础广告数据?如果不是,理论上我可以同时填写广告和制造商数据吗?
【问题讨论】:
-
使用 ble 对广告数据包长度有限制。我用过nordics ble,但没有用过bluez。但是那里的数据包宽度是 31 个字节。所以这是您可以在数据包中传输的最大限制。这可以根据您的喜好进行分解。因此设备名称、设备制造商数据类型、广告数据、广告商公司等是 ble 的基本限制之一。您可以添加一个称为扫描响应的东西来获取更多数据。对我来说,制造商数据是对广告数据的抽象。因为它在广告数据中。