2017-01-03 92 views
2

我想实现一个C++代码(使用的bluez 5.43和DBUS)读取从BLE传感器通告报文阅读从BLE传感器通告报文的正确方法。根据bluez DBus文档,有一个StartDiscovery可用于扫描附近设备的API。但是,我无法找到任何API来存储/解析来自附近BLE设备的广告数据包。该advertising-api.txt名单registeradvertisement API,但按我的理解,它只能用于创建通告报文,而不是从外部设备读取使用(还是我错了?)有人可以请指导我在正确的方式来获得从附近的BLE广告包使用bluez和DBus的设备?什么是使用的bluez 5.43和的DBus

+0

据我所知,你做'StartDiscovery',那么'Device'对象出现,因为他们被发现。这些对象的属性可能充满了来自广告数据包的数据。 – Velkan

+0

@Velkan:感谢您的回复。说实话,我在这里有点困惑。我有一个BLE传感器,以广告数据包的形式定期传输传感器读数。该信息也包含在低能量扫描响应中。所以我需要完整的响应来解析所需的数据。我试图用dbus和bluez-5.43来实现它。我认为任何属性都不会给出低能量扫描响应。如果我错了,请纠正我。 – darkknight

+0

org.bluez.Device1有ServiceData和ManufacturerData。它们与advertising-api.txt中的ServiceData和ManufacturerData不同吗?也许他们包含带有读数的AdvData? – Velkan

回答

0

你在一个你最后的注释中描述的行为是正确的(广告数据不beeing更新):如果我是正确的一个BLE装置不应该把所有的时间,就可以睡觉或转向低功耗等

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

在你的情况,那是因为你是通过广告传递的数据是有问题的。然而,有一种方法可以强制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交互的工具),它是通过使用油嘴GDbus,你可以在这里找到源代码中的bluez家伙developped(看底部找到命令列表):https://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/main.c

有使用GDBus与bluez的,但bluetoothctl源代码更straigthforward方式是一个开始,你会发现几乎任何可能与bluez的做例子=)

0

感谢大家的建议。我终于能够通过使用英特尔的tinyb库获取制造商数据。它有一个enable_manufacturer_data_notifications API,可以在制造商数据发生变化时通知您。