web-dev-qa-db-ja.com

BlueZでのGATTサーバーのオブジェクトパスの検索

LinuxマシンでBluetooth GATTサーバーを作成するには、BlueZを使用します。モダン(5.50)BlueZを使用する推奨方法は、dbus APIを使用する方法です。

このトピックの documentation は次のように述べています。

GATTのローカルサービスとリモートサービスは、同じ高レベルのD-Bus APIを共有します。ローカルとは、BlueZプラグインまたは外部アプリケーションによってエクスポートされたGATTベースのサービスを指します。リモートは、ピアによってエクスポートされたGATTサービスを指します。

私はこれを次のように解釈しています:

ローカルサービス(Linuxマシンがサーバーで、他のデバイスがBluetooth経由でサーバーに接続しています)とリモートサービス(Linuxマシンはクライアントであり、Bluetooth経由で他のデバイスに接続します)はdbusに表示されます

これは、質問の基本的な仮定を設定します。

Bluezソースコードは example-gatt-server を提供します。あなたが実行できる例はそれが機能し、GATTサーバーでLinuxマシンをオンにします。

その例では 任意の名前の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/serviceorg.bluezの下のオブジェクトとして見つからないのはなぜですか?

私もこれに戸惑っていましたが、この例ではdbus上のこのサービスの既知の名前または要求された名前が定義されていないため、dbusオブジェクトを表示できないことがわかりました。

busctl documentation に従って、サービスをクエリできるようにするには、サービスに関連付けられた名前が必要です。この例のGattサーバーにはありませんが。

1つ以上のサービスのオブジェクトツリーを表示します。 SERVICEが指定されている場合、指定されたサービスのみのオブジェクトツリーを表示します。それ以外の場合は、少なくとも1つの既知の名前を取得したバス上のすべてのサービスのすべてのオブジェクトツリーを表示します。

登録されているオブジェクトを監視するためにSudo dbus-monitor --systemを使用するか、またはgattサーバーのサンプルコードでApplicationオブジェクトを作成する前に、バス上でrequest_nameを呼び出してdbusに名前を要求できます。リクエストされた名前 here のサンプルサービスを確認できます。

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>
0
Rishabh Agrawal