web-dev-qa-db-ja.com

LinuxAPIでのBluetoothLow-Energy

いくつかのカスタムGATTサービスを備えたデバイスがあり、それと対話するLinuxプログラムを作成したいと思います。いくつか検索したところ、LinuxがBluetoothLEプロトコルの処理にBlueZを使用していることがわかりました。 BlueZ5.35でUbuntu15.10を使用していますが、ユーザースペースプログラムからこのBlueZをどのように使用するかがわかりません。 APIドキュメントはどこにも見つかりません。チュートリアル、例、何もありません。このBlueZスタックを使用して、デフォルトのサービスでBluetoothデバイスに接続する以外のことを行うことも可能ですか?もしそうなら、ドキュメントはどこにありますか? (できればC/C++ APIですが、この時点では何でもかまいません)

10
UnTraDe

Bluezソース[1]のattrib/gatttool.cをご覧ください。 Gatttoolは、C「API」を使用してBTLEデバイスに接続するためのコマンドラインユーティリティです。ただし、GATTインターフェースはlibbluetoothでは公開されていません。 gatttoolの新しい代替手段であるため、学習するもう1つの例はbtgatt-clientです。これは、tools/btgatt-client.cにあります(コンパイルを有効にするには、--enable-experimentalでbluezを構成します)。 Cインターフェースに加えて、bluezはDBUSインターフェースを統合しました。 bluetoothctlは、DBUSインターフェースを使用したツールの例です。 bluetoothctlのコードはclient/ [2]にあります。 bluezのCインターフェースを使用する別のサンプルプログラムは、Anki Drive SDK [3]です。 bluez GATTCインターフェースを独自のライブラリlibbzleにパッケージ化しました[4]。 Cインターフェースを使用する場合、BTLE接続を確立するときにソケットを接続する必要があります。 gatttoolは、glibiircを使用するGATTインターフェースを介してこれを行います。ただし、説明されているように、syscall(ソケット、接続など)を使用してこれを行うこともできます。ここ[5]。このドキュメントでは、次のことも説明しています。

残念ながら、現時点では参照できる公式のAPIリファレンスがないため、BlueZソースコードをダウンロードして調べることをお勧めします。

Gilbert Braultはまた、bluez [6]からGATTインターフェースを抽出し、GATTインターフェース[7]の基本的なdoxygenドキュメントに次の免責事項を付けてリンクしています。

これは、すべての重要な機能とデータ構造を文書化することを目的とした進行中の作業です。

また、Szymon Jancは、Embedded Linux Conference2016での講演「BluetoothonModernLinux」で素晴らしい概要を説明しました[8]。 42:00に、彼は非公開のCインターフェースについて話します。しかし、一般的に、彼はDBUS APIを推奨しているようです(45:30の「ヒント」スライドを参照)。一部のDBUSドキュメントはdoc/gatt-api.txt [9]にあり、Python DBUSインターフェースを使用した例はtest/にあります。

お役に立てれば。

[1] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/attrib/gatttool.c
[2] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/
[3] https://github.com/anki/drive-sdk/
[4] https://github.com/anki/drive-sdk/tree/master/deps/bzle/
[5] https://people.csail.mit.edu/albert/bluez-intro/c404.html
[6] https://github.com/gbrault/gattclient
[7] http://gbrault.github.io/gattclient/index.html
[8] https://www.youtube.com/watch?v=tclS9arLFzk
[9] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/gatt-api.txt

10
user1225999

Linuxでシェルスクリプトを記述して、必要なことを実行する方が、間違いなく簡単で迅速です。 BlueZコマンドは比較的単純でわかりやすく、その使用方法に関するチュートリアルや質問がたくさんあります。

チュートリアル:-

http://www.jaredwolff.com/blog/get-started-with-bluetooth-low-energy/https://learn.adafruit.com/reverse-engineering-a -bluetooth-low-energy-light-bulb/control-with-bluezhttps://lilyhack.wordpress.com/2014/02/03/ble-read-write-arduino-raspberry-pi /http://joost.damad.be/2013/08/experiments-with-bluetooth-low-energy.html

質問:-

コマンドを手動で使用することに慣れたら、最小限のシェルスクリプトを記述して、これが自動化されるようにします。

6
Youssif Saeed

あなたの痛みが分かります。カスタムBLEペリフェラル(シンプルなリモートプッシュボタン)からのユーザー入力を、Raspberry Pi上のLinux(Stretch)で実行されている組み込みプログラムに追加する必要がありました。 BlueZ APIの不必要な複雑さとSpartan(褒め言葉ではない)ドキュメントに驚かされました。すべてのBlueZの「例」は、Bluetoothが宇宙の中心であり、ユーザーがこれまでに発明されたすべてのBluetoothデバイスをサポートしたいと考えているという観点から書かれています。私の場合、対話する必要のあるデバイス、サービス、およびGATTの特性を正確に知っていたので、優先度の低いスレッドでその処理を実行する最小限のオーバーヘッドタスクが必要でした。

BLEセントラルクライアントはBlueZを使用すると非常に簡単であることがわかりましたが、リリース5.49のBlueZユーティリティbluetoothctlのソースから始まる困難な道のりでした。 BlueZディストリビューションからの3つの未変更のソースファイルと、追加の3つのソースファイルからの抜粋を使用して、ニーズを達成しました。 BlueZソースはD-BusとGnomeGLibメインループに密接に依存しているので、私はそれらを惜しみなく含めました。

OlivierMの寛大なリードに続いて、そして私の恥ずかしいほど大規模な時間への投資が他の誰かの命を1か月節約することを期待して、私の例のBluetoothBLEクライアントをGitHubに投稿しました: https://github.com/jjjsmit/BluetoothBLEClient

5
JJJSchmidt

GATT C/C++ APIを使用してBLEデバイスと対話するという同様の問題がありました。そのようなAPIは存在しないことに気づきました。私が問題を修正した方法は、独自のGATTライブラリを作成することでした。コードをGithubにプッシュしました: https://github.com/labapart/gattlib

私はこのライブラリを自分のBLEプロジェクトで使用しており、ニーズを満たしています。私はいくつかの例を作成しました https://github.com/labapart/gattlib/tree/master/examples ライブラリを使用して、人々がそれを使用し、より良いフィードバックを得るように促します。

0
OlivierM