在 BlueZ 中定位 GATT 伺服器的對象路徑
在 Linux 機器上製作藍牙 GATT 伺服器是使用 BlueZ 完成的。使用現代 (5.50) BlueZ 的首選方式是通過 dbus API。
有關此主題的文件指出:
GATT 本地和遠端服務共享相同的高級 D-Bus API。本地是指由 BlueZ 外掛或外部應用程序導出的基於 GATT 的服務。遠端是指對等方導出的 GATT 服務。
我將其解釋為:
本地服務(Linux 機器是伺服器,其他設備通過藍牙連接到它)和遠端服務(Linux 機器是客戶端,它通過藍牙連接到其他設備)都在 dbus 上表示
這為問題設定了基本假設。
bluez 原始碼提供了一個example-gatt-server。您可以執行一個範例,它將正常工作並將您的 Linux 機器轉入 GATT 伺服器。
在該範例中,引用了一個任意命名的 dbus 對象。它的名字是
/org/bluez/example/service
從文件中我希望,一旦
./example-gatt-server
成功執行,應該有一個/org/bluez/example/service
地方。事實並非如此:
~$ busctl tree org.bluez └─/org └─/org/bluez └─/org/bluez/hci0
我正在使用外部設備確認 Linux 機器充當 GATT 伺服器,但未
/org/bluez/example/service
列出。為什麼
/org/bluez/example/service
在 下找不到作為對象org.bluez
?
我也對此感到困惑,我發現我們無法看到 dbus 對象,因為這個範例沒有在 dbus 上為該服務定義一個眾所周知的/請求的名稱。
根據能夠查詢服務的busctl 文件,您需要有一個與之關聯的名稱。雖然此範例 Gatt 伺服器沒有。
顯示一個或多個服務的對象樹。如果指定了 SERVICE,則僅顯示指定服務的對象樹。否則,顯示匯流排上至少獲得一個知名名稱的所有服務的所有對象樹。
儘管您可以使用 sudo dbus-monitor –system 來監視正在註冊的對象,也可以通過在 gatt 伺服器範常式式碼中創建 Application 對象之前在匯流排上呼叫 request_name 來從 dbus 請求名稱。您可以在此處查看具有請求名稱的範例服務。
bus.request_name(BUS_NAME) named_bus = dbus.service.BusName(BUS_NAME, bus=bus)
您還需要通過編輯 /etc/dbus-1/system.conf 並添加您的服務名稱來授予系統匯流排發布權限,如下所示:
<policy user="root"> <allow own="com.example.gattServer"/> </policy>