BlueZを使用してLinuxシステムでBluetooth GATTサーバーを作成します。最新(5.50)BlueZを使用する最善の方法は、dbus APIを使用することです。
これ文書このトピックについては、次のように指定されています。
GATTローカルサービスとリモートサービスは、同じ高度なD-Bus APIを共有します。ローカルは、BlueZプラグインまたは外部アプリケーションからエクスポートされたGATTベースのサービスを表します。リモートは、ピアがエクスポートしたGATTサービスを表します。
私はこれを次のように解釈します。
両方地域サービス(Linuxシステムはサーバーで、他のデバイスはBluetooth経由で接続されています)リモートサービス(Linuxシステムはクライアントであり、Bluetooth経由で他のデバイスに接続されています。)dbusとして表されます
これは問題の基本仮定を設定します。
bluezのソースコードは例 gatt サーバー。例を実装すると、正常に動作し、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
?
答え1
私もこれについて混乱しています。この例では、サービスに対してdbusで定義されているよく知られているか、要求された名前がないため、dbusオブジェクトを表示できないことがわかりました。
~によるとバス制御文書サービスを照会するには、サービスに関連付けられた名前が必要です。この例の Gatt サーバーはそうではありません。
1 つ以上のサービスのオブジェクトツリーを表示します。 SERVICEを指定すると、指定されたサービスのオブジェクトツリーのみが表示されます。それ以外の場合は、よく知られている名前が1つ以上あるバス上のすべてのサービスのすべてのオブジェクトツリーが表示されます。
sudo dbus-monitor --systemを使用して登録されているオブジェクトを監視できますが、gattサーバーのサンプルコードからアプリケーションオブジェクトを生成する前に、バスで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>