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/service
がorg.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>