我正在尝试实现一个C ++代码(使用bluez 5.43和dbus)来读取来自BLE传感器的广告包。根据bluez DBus文档,有一个 StartDiscovery API可用于扫描附近的设备。但是,我无法找到任何API来存储/解析来自附近BLE设备的广告数据包。 advertising-api.txt列出了registeradvertisement API,但根据我的理解,它只能用于创建广告包而不是从外部设备读取(或者我错了?)有人可以指导我正确的方式来获取广告使用bluez和DBus从附近的BLE设备发送数据包?
答案 0 :(得分:0)
您在上一次评论中所描述的行为是正确的(广告数据没有更新):如果我是正确的,BLE设备不应该一直处于启动状态,它可以睡眠或转为低-power等。
在这种情况下,数据以某种方式“高速缓存”并不奇怪。根据我的经验,当您执行扫描并发现设备时(即使您没有连接到它),设备信息将存储一段时间。
在您的情况下,这是有问题的,因为您通过广告传递数据。但是有一种方法可以强制bluez删除有关设备的所有缓存数据: adapter-api提供 RemoveDevice(对象设备)方法。它将对象路径(例如" / 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做的任何事情的示例=)
答案 1 :(得分:0)
感谢大家的建议。我终于能够通过使用英特尔的tinyb库获得制造商数据。它有一个enable_manufacturer_data_notifications API,可让您在制造商数据发生变化时收到通知。