「GATTサーバ」はBLE通信を用いてGATTクライアントからの接続要求に応じると共にデータをGATTクライアントに送信する。例えば、BLE対応の体温計などのセンサ類はGATTサーバの役割を担い、それらのデータを受け取るスマホはGATTクライアント、といった具合だ。
今回は、Linuxマシン上でBlueZのPythonテストコードを走らせることにより、このGATTサーバを動かしてみたので手順のメモを残しておく。
Linux上でBLEを動かすための基礎知識
GATTなどBLEに関する基礎の基礎は別途記事にまとめた。
以下、Linux上でBLEを動かすために必要なBlueZとD-Busのごく簡単な解説。
BlueZ
BlueZはLinuxで動作するオープンソースのBluetoothプロトコルスタック。
Linuxで動作するBluetoothアプリは基本BlueZ上に構築されている。
BlueZではドライバ層(bluetoothd)が提供するAPIをアプリから直接叩くのではなく、必ずD-Busというプロセス間通信を介する仕組みになっている。
D-Bus
D-BusはLinuxで動作するプロセス間通信(IPC: Inter Process Communication)システムで、元々GUIウィンドウシステムの制御を目的として開発されたが、今ではLinux上の各種サービスインターフェースとして応用範囲が広がっている。
このD-Busは操作するために冗長で呪文のような文字列によるやりとりが必要な曲者。だが上述の通りBlueZはドライバ層とアプリ層の間をD-Busが取り持つ構造ゆえ、BlueZを触るうえでD-Busを避けて通れない。以下の記事にD-Busを介してBLEを扱うためのコマンド実行例や解説がまとめられており、参考になる。
BlueZのテストコードでGATTサーバを動かす
BlueZテストコードの取得
BlueZテストコードはGitHubのtest/ディレクトリ下に置かれている。
この中のexample-gatt-serverが今回GATTサーバを動かすためのPythonコード。
Ubuntu系(Armbianや多分Raspbianも)であればパッケージが用意されており以下のコマンド実行でインストール出来る。
sudo apt install bluez-tests
インストール先はdpkg -L bluez-testsで確認出来る。
自分の環境では/usr/share/doc/bluez-tests/examplesにインストールされてた。が、何故かexample-gatt-serverがgzipで圧縮されていたためgzip -dで解凍した。
Pythonコードexample-gatt-serverを実行しGATTサーバ開始
以下のコマンド実行でGATTサーバが実行される。
sudo python example-gatt-server
今回はPythonコードの中身について詳しく触れないが、コードで生成された疑似データがGATTサーバから心拍センサとバッテリー残量のデータとしてGATTクライアントに供給される。
bluetoothctlでアドバタイズをOnしスマホとペアリングする
bluetoothctlはBlueZの付属コマンドラインツールで、対話型コマンドによってBlueZが提供する各種機能の操作が出来る。
BlueZは大抵はOSと一緒に自動でインストールされるが、以下のコマンド実行で簡単にインストール出来る。
sudo apt install bluez
対話型のbluetoothctlはシェルコマンドラインから”sudo bluetoothctl”で起動出来る。
アドバタイズの開始
以下のコマンドでアドバタイズのメニューに入る。
menu advertise
製造者データの設定。(ダミーデータ)
manufacturer 0xffff 0x12 0x34
デバイス名の設定。
name myHRsensor
アドバタイズのメニューを抜ける。(メインメニューに戻る)
back
アドバタイズの有効化。
advertise on
Bluetoothのハードウエアによっては、以下の実行も必要のようだ。
pairable on
スマホとペアリング
スマホなどからBluetoothデバイスmyHRsensorが見えるようになるので、以下の2ステップを実行してペアリングを行う。
- スマホでmyHRsensorを探してペアリングのリクエストをする
- bluetoothctlのコンソールに確認メッセージが表示されるのでyesと答える
スマホアプリのGATTクライアントでデータを取得
心拍センサのプロファイルに対応しているBLEアプリなら何でも良いのだが、たまたま手元にインストールしてあったNordicのnRF Toolboxでデータの取得を行った。
ペアリングをした後、nRF Toolboxのメニュー画面からHeart Rate(赤枠)を選択する。
Heart Rateを選択すると、デバイスの選択画面が表示されるので”myHRsensor”を選択すると、以下のような画面が開き心拍グラフとバッテリー値が表示される。
まとめ
上記の手順で大体うまく行くようだが、GATTサーバの開始とアドバタイズを開始する順番が違ったり、スマホからペアリングを行うタイミングが変わったりすると、スマホからデータがうまく取得出来ない場合もあった。(正しい手順は謎)
また、テストプログラムがPythonコードなので、これを改造して自作のGATTサーバを作る事も出来そうだ。今回は特に触れなかったが、次回以降PythonによるBLEプログラミングについても記事にしていきたい。
コメント