使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥

Posted

技术标签:

【中文标题】使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥【英文标题】:What is the correct way to read advertisement packets from a BLE sensor using bluez 5.43 and DBus使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是什么 【发布时间】:2017-05-17 16:52:36 【问题描述】:

我正在尝试实现 C++ 代码(使用 bluez 5.43 和 dbus)从 BLE 传感器读取广告数据包。根据 bluez DBus 文档,有一个 StartDiscovery API 可用于扫描附近的设备。但是,我找不到任何 API 来存储/解析来自附近 BLE 设备的广告数据包。 advertising-api.txt 列出了 registeradvertisement API,但据我了解,它只能用于创建广告数据包而不是从外部设备读取(或者我错了吗?)有人可以指导我正确获取广告数据包的方法附近使用 bluez 和 DBus 的 BLE 设备?

【问题讨论】:

据我了解,您执行StartDiscovery,然后Device 对象在被发现时出现。这些对象的属性可能填充了来自广告包的数据。 @Velkan:感谢您的回复。老实说,我在这里有点困惑。我有一个 BLE 传感器,它以广告包的形式定期传输传感器读数。该信息也包含在低能量扫描响应中。所以我需要完整的响应来解析所需的数据。我正在尝试使用 dbus 和 bluez-5.43 来实现它。我认为没有任何特性会产生低能量扫描响应。如果我错了,请纠正我。 org.bluez.Device1 有 ServiceData 和 ManufacturerData。它们不是和广告api.txt 中的ServiceData 和ManufacturerData 一样吗?也许它们包含携带读数的 AdvData? 我尝试读取制造商数据,但即使温度发生变化,这些值也保持不变。该传感器有一个开源的 android 应用程序。当我检查源代码时,该应用程序似乎正在读取完整的低能量扫描响应并解析必要的字段。应用程序中正确显示了温度变化。我想知道我做错了什么。 ManufacturerData 中的值是否包含至少一个正确读数? 【参考方案1】:

感谢大家的建议。我终于能够通过使用英特尔的 tinyb 库来获取制造商数据。它有一个 enable_manufacturer_data_notifications API,可让您在制造商数据更改时收到通知。

【讨论】:

【参考方案2】:

您在上一条评论中描述的行为是正确的(广告数据未更新):如果我是正确的,BLE 设备不应该一直处于启动状态,它可以休眠或转为低电平-电源等。

在这种情况下,数据以某种方式“缓存”并不奇怪。根据我的经验,当您执行扫描并发现设备时(即使您没有连接到它),设备信息将被存储一段时间。

在您的情况下,这是有问题的,因为您正在通过广告传递数据。但是有一种方法可以强制 bluez 删除所有关于设备的缓存数据: adapter-api 提供了一个 RemoveDevice(object device) 方法。它将对象路径(例如“/org/bluez/hci0/dev_AA_BB_AA_BB_AA”)作为参数。

如果您正在寻找 C 语言中的 DBus 绑定,我建议您使用 GLib GDBus(您可以在 freedesktop 网站上的本教程底部找到链接:https://dbus.freedesktop.org/doc/dbus-tutorial.html)。

如果你熟悉 bluetoothctl(一个使用命令与 bluez 交互的工具),它是由 bluez 人使用 Glib GDbus 开发的,你可以在这里找到源代码(看底部找到命令列表):https://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/main.c

有更直接的方法可以将 GDBus 与 bluez 一起使用,但 bluetoothctl 源代码只是一个开始,您将找到几乎所有与 bluez 相关的示例 =)

【讨论】:

以上是关于使用 bluez 5.43 和 DBus 从 BLE 传感器读取广告数据包的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

org.bluez.GattCharacteristic1 WriteValue 方法

使用 d-bus 在 C.H.I.P 上使用 bluez 5.43 更改音量

Bluez BLE 连接监控使用 DBUS-Python

使用 DBus 和 Bluez 将数据写入蓝牙设备

Linux BlueZ dbus 通信

BlueZ 5.4 DBus API ConnectProfile GATT 服务 UUID