BlueZのPythonテストコードでGATTサーバを動かす

「GATTサーバ」はBLE通信を用いてGATTクライアントからの接続要求に応じると共にデータをGATTクライアントに送信する。例えば、BLE対応の体温計などのセンサ類はGATTサーバの役割を担い、それらのデータを受け取るスマホはGATTクライアント、といった具合だ。

今回は、Linuxマシン上でBlueZのPythonテストコードを走らせることにより、このGATTサーバを動かしてみたので手順のメモを残しておく。

スポンサーリンク

Linux上でBLEを動かすための基礎知識

GATTなどBLEに関する基礎の基礎は別途記事にまとめた。

趣味の電子工作向けBLE情報のまとめ
BLE(BluetoothLowEnergy)を支える要素技術はアナログ無線通信からスマホのプログラミングまで多岐に渡る。電子工作の一環で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を扱うためのコマンド実行例や解説がまとめられており、参考になる。

D-Bus のはなし|Wireless・のおと|サイレックス・テクノロジー株式会社
サイレックスの無線LAN開発者が語る、無線技術についてや製品開発の秘話、技術者向け情報、新しく興味深い話題、サイレックスが提供するサービスや現状などの話題などを配信していきます。

BlueZのテストコードでGATTサーバを動かす

BlueZテストコードの取得

BlueZテストコードはGitHubのtest/ディレクトリ下に置かれている。

https://github.com/bluez/bluez/tree/master/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ステップを実行してペアリングを行う。

  1. スマホでmyHRsensorを探してペアリングのリクエストをする
  2. bluetoothctlのコンソールに確認メッセージが表示されるのでyesと答える

スマホアプリのGATTクライアントでデータを取得

心拍センサのプロファイルに対応しているBLEアプリなら何でも良いのだが、たまたま手元にインストールしてあったNordicのnRF Toolboxでデータの取得を行った。

nRF Toolbox for Bluetooth LE - Google Play のアプリ
nRFToolboxでBluetoothLowEnergyデバイスを探索します。

ペアリングをした後、nRF Toolboxのメニュー画面からHeart Rate(赤枠)を選択する。

メニュー画面

Heart Rateを選択すると、デバイスの選択画面が表示されるので”myHRsensor”を選択すると、以下のような画面が開き心拍グラフとバッテリー値が表示される。

アプリ画面

まとめ

上記の手順で大体うまく行くようだが、GATTサーバの開始とアドバタイズを開始する順番が違ったり、スマホからペアリングを行うタイミングが変わったりすると、スマホからデータがうまく取得出来ない場合もあった。(正しい手順は謎)

また、テストプログラムがPythonコードなので、これを改造して自作のGATTサーバを作る事も出来そうだ。今回は特に触れなかったが、次回以降PythonによるBLEプログラミングについても記事にしていきたい。

コメント