web-dev-qa-db-ja.com

LinuxでBluezを使用してBluetoothLEを実装する方法

私はBLEデモ用に2つのLinuxシステムのセットアップに取り組んでいます。明らかに、1つのシステムが周辺機器になり、もう1つが中央デバイスになります。これらの構成の両方についていくつか質問があります。

環境

周辺機器のセットアップ

ビジネスの最初の順序は、GATTサーバーを構成して周辺システムをセットアップしてアドバタイズすることです。現時点では、コマンドラインからGATTサーバーを構成することはできないようです。そのため、USBドングルを起動してアドバタイズするのは簡単な作業ですが、カスタムサービスや特性を作成することはできません。私が見つけたGATTサーバーの唯一の例は、Bluezパッケージのgatt-example.cファイルでした。そこで、最新のbluez-5.23ソースをダウンロードしてビルドしました。 ( http://www.linuxfromscratch.org/blfs/view/svn/general/bluez.html )。さらに、-enable-maintainer-modeフラグを使用して構成し、gatt-example.cプラグインをbluetoothdに強制的にビルドします。そして、ビルド後、~/bluez-5.23/pluginsディレクトリからbluetoothd-gat-example.oファイルがあることを確認しました。これは、gatt-exampleが少なくとも正常に構築されたことを示しています。

次に、構成ファイルを変更して、LEと属性サーバーを有効にしました。

$ Sudo vi /etc/bluetooth/main.conf
EnableLE = true           // Enable Low Energy support. Default is false.
AttributeServer = true    // Enable the GATT attribute server. Default is false.

次に、Bluetoothデーモンを再起動または再起動します...

中央デバイスのセットアップ

中央デバイスは周辺機器のように構築された特別なプラグインを必要としないため、apt-getを使用してbluezをインストールしました。これは、bluetoothd -vに従ってv4.101をインストールしたようです。

セッション設定

その場合、接続プロセスはかなり単純なはずです。アドバタイズするように周辺機器をセットアップしてから、中央デバイスに接続します。

周辺:

$ Sudo hciconfig hci0 up        // Make sure the interface is up
$ Sudo hciconfig hci0 leadv     // Set the interface to advertise

中央:

$ Sudo hcitool -i hci0 lescan   // Scan for nearby devices advertising
LE Scan ...
00:02:72:C9:5E:0F (unknown)     // Not sure why two of the same MAC are found?
00:02:72:C9:5E:0F (unknown)     // but I know this is my device...

$ Sudo gatttool -i hci0 -b 00:02:72:C9:5E:0F -m 48 --interactive     // Connect interactively
[   ][00:02:72:C9:5E:0F][LE]> connect
[CON][00:02:72:C9:5E:0F][LE]> primary
attr handle: 0x0001, end grp handle: 0x0008 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0010 uuid: 00001801-0000-1000-8000-00805f9b34fb
[CON][00:02:72:C9:5E:0F][LE]> characteristics 
handle: 0x0004, char properties: 0x02, char value handle: 0x0006, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0007, char properties: 0x02, char value handle: 0x0008, uuid: 00002a01-0000-1000-8000-00805f9b34fb

そして、gatt-exampleのサービスや特性の1つが利用できないことがわかります。

質問

-周辺機器

  1. 独自のカスタムGATTサーバーを作成するにはどうすればよいですか?スタンドアロンのCアプリケーションにすることはできますか、それともgatt-exampleのようなプラグインとしてbluetoothdに組み込む必要がありますか?この質問への答え( Gattサーバーの作成? )は、「GATTライブラリと追加モジュールを初期化することから始めて」そして「GATTデータベースを登録する」ことを意味します。ただし、これらの一般的なステートメントを実装する方法の例は1つではなく、提供されるリンクはBluetoothWebサイトへのURLにすぎません。
  2. GATT仕様( https://developer.bluetooth.org/gatt/Pages/default.aspx )は、XML形式でダウンロード可能な多数の「採用された」サービスと特性を提供します。しかし、それらを使用する方法についての指示はありませんか?!
  3. GATTサーバーが実行されていることをどのように検証しますか?

-中央デバイス

  1. 中央デバイスが周辺機器で実行されているGATTサーバーからのサービスと特性を認識しないのはなぜですか?

必要な追加情報を提供できます。ありがとう。

14
linsek

GATTサーバーを別のプロセスに作成するには、(少なくとも)2つのケースがあります。

  • Bluez v4.x:GATTサービスはBluezプラグインである必要があります
  • Bluez v5.x:GATTサービスは新しいGATT DBus APIを使用する必要があります(ただし、少なくともBluez v5.39(2016年4月以降)を使用することをお勧めします。それ以外の場合は、(Bluez GATTサーバーAPIの観点から)より安全です。 Bluezv4.xプラグインアプローチ。

中央デバイスが新しくエクスポートされたGATTサービスを認識しない場合は、中央デバイスの問題ではなく、おそらく周辺の問題です。中央デバイスにGATTクライアントを実装する必要がある場合でも、次の2つのケースがあります。

  • Bluez v4.x:BluezはGATTAPIを公開していません。シェルスクリプトを使用してgatttoolコマンドを起動するか、 gattlib などのGATTライブラリを使用してBLEデバイスと対話します。
  • Bluez v5.x:同じことですが、Bluez v5.39に移行できない場合は、Bluezv4.xの方法論を使用することをお勧めします。
3
OlivierM