Linux

在 BlueZ 中定位 GATT 伺服器的對象路徑

  • November 11, 2019

在 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>

引用自:https://unix.stackexchange.com/questions/538107