bluetoothctlにはペアリングなどデバイス間の接続管理だけでなく、データの送受信機能も備わっている。今回は、別のLinuxマシンで動作しているGATTサーバからのデータをbluetoothctlで受信する実験を行ったので、手順をメモしておく。
GATTサーバの準備
GATTサーバ側のLinuxマシンでアドバタイズの有効化とGATTサーバの起動を行う。GATTサーバは例によってBlueZのテストコードとして提供されているダミー心拍センサのPythonコードを利用した。
心拍センサのUUIDについて
BLE心拍センサは、BluetoothのSIGによって以下のようにUUIDが決められている。
Type | UUID | 16bit短縮UUID |
---|---|---|
Service | 0000180d-0000-1000-8000-00805f9b34fb | 180d |
Characteristic | 00002a37-0000-1000-8000-00805f9b34fb | 2a37 |
アドバタイズの開始
サーバ側のLinuxマシンで”sudo bluetoothctl”を実行し、アドバタイズの有効化を行う。詳しい手順は以前の記事と重複するため、以下bluetoothctlコンソール上で行う手順を簡単に箇条書きしておく。
- “menu advertise”アドバタイズのメニューに入る
- “manufacturer 0xffff 0x12 0x34″で(ダミーの)製造者データを設定する
- “name myHRsensor”デバイス名を設定
- “back”でアドバタイズのメニューを抜ける(メインメニューに戻る)
- “advertise on”でアドバタイズの有効化
- (オプション)Bluetoothのハードウエアによっては”pairable on”が必要
GATTサーバの起動
以下を実行する。
sudo python example-gatt-server
GATTサーバにクライアント側から接続する
クライアント側でデバイスのスキャン実行
クライアント側のbluetoothctlコンソールから”scan on”を実行し周辺のデバイスをスキャン開始。見つかったデバイスがズラズラと表示され…
[bluetooth]# scan on
Discovery started
[CHG] Controller E8:48:B8:C8:20:00 Discovering: yes
[NEW] Device 41:FD:55:6C:47:0A 41-FD-55-6C-47-0A
:
[NEW] Device E8:D0:FC:F2:72:DA Name: myHRsensor
ターゲットの”myHRsensor”が見つかる。
GATTサーバに接続
サーバ側/クライアント側双方のbluetoothctlコンソールで以下の手順を実行し、接続する
- クライアント側から”pair <アドレス>”を実行
[bluetooth]# pair A8:D0:09:C8:55:1A
- サーバ側でyesを入力
[agent] Confirm passkey 416660 (yes/no): yes
- クライアント側でyesを入力
[agent] Confirm passkey 416660 (yes/no): yes
無事接続されるとサーバ/クライアント双方のプロンプトが互いの接続相手のデバイス名に変化する。
GATTクライアント側bluetoothctlでデータを受信
以下、クライアント側bluetoothctlコンソールでの操作。
センサ情報の取得
“info”コマンドを実行すると、サーバ側デバイスの情報が表示出来る。色々表示されるが、心拍センサのサービスUUIDである0000180d-0000-1000-8000-00805f9b34fbが含まれることを確認出来ればOK。
GATTメニューに入る
“menu gatt”コマンドを実行すると、bluetoothctlのGATTメニューに入る。
属性情報の一覧表示
“list-attributes”コマンドで相手側デバイスが持っている属性の一覧を表示出来る。かなり沢山表示されるが、以下は心拍センサと関係ありそうな物だけ抜粋。
Primary Service (Handle 0x0000)
/org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f
0000180d-0000-1000-8000-00805f9b34fb
Heart Rate
Characteristic (Handle 0x0000)
/org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f/char0030
00002a37-0000-1000-8000-00805f9b34fb
Heart Rate Measurement
それぞれ本記事冒頭の表に挙げた心拍センサのサービスおよびキャラクタリスティックのUUIDと確認出来る。
GATT詳細情報の取得
上記の”list-attributes”の結果から、心拍センサのキャラクタリスティックを”attribute-info”を使って調べてみる。
[myHRsensor]# attribute-info 00002a37-0000-1000-8000-00805f9b34fb
Characteristic - Heart Rate Measurement
UUID: 00002a37-0000-1000-8000-00805f9b34fb
Service: /org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f
Notifying: no
Flags: notify
MTU: 0x0205
notifyのフラグが付いており、センサの測定データ受信時に通知を受け取れることが分かる。
キャラクタリスティックを選択し通知を受ける
“select-attribute”実行でキャラクタリスティックのUUIDを指定し”notify on”を実行すると、デバイスから受信したセンサデータがおおよそ1秒おきに追加表示されていく。
[myHRsensor]# select-attribute 00002a37-0000-1000-8000-00805f9b34fb
[myHRsensor:/service002f/char0030]# notify on
[CHG] Attribute /org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f/char0030 Notifying: yes
Notify started
[CHG] Attribute /org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f/char0030 Value:
0e 78 00 00 .x..
[CHG] Attribute /org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f/char0030 Value:
06 76 .v
[CHG] Attribute /org/bluez/hci0/dev_E8_D0_FC_F2_72_DA/service002f/char0030 Value:
06 65 .e
[myHRsensor:/service002f/char0030]# notify off
:
この中で”06 65″(2バイト)や”0e 78 00 00″(4バイト)がセンサの測定データ。データが2バイトだったり4バイトだったりマチマチなのは、時々バッテリー残量のデータも送られてくるからだと思われる(詳しくは分からない)。
“notify off”を実行すると、通知が止まる。
まとめ
bluetoothctlでGATTサーバに接続して詳細を調べ、データの受信まで行ってみた。今回行ったような手順を踏めばBLEセンサのUUIDを調べながらデータ送受信のテストまで出来るため、bluetoothctlはBLEのコードを自作するうえで強力なツールになりそうだ。
コメント