2017-01-03 138 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,可以在製造商數據發生變化時通知您。

相關問題