BlueZのbluetoothctlコマンドでGATTサーバのデータを受信する

bluetoothctlにはペアリングなどデバイス間の接続管理だけでなく、データの送受信機能も備わっている。今回は、別のLinuxマシンで動作しているGATTサーバからのデータをbluetoothctlで受信する実験を行ったので、手順をメモしておく。

スポンサーリンク

GATTサーバの準備

GATTサーバ側のLinuxマシンでアドバタイズの有効化とGATTサーバの起動を行う。GATTサーバは例によってBlueZのテストコードとして提供されているダミー心拍センサのPythonコードを利用した。

心拍センサのUUIDについて

BLE心拍センサは、BluetoothのSIGによって以下のようにUUIDが決められている。

TypeUUID16bit短縮UUID
Service0000180d-0000-1000-8000-00805f9b34fb180d
Characteristic00002a37-0000-1000-8000-00805f9b34fb2a37

アドバタイズの開始

サーバ側のLinuxマシンで”sudo bluetoothctl”を実行し、アドバタイズの有効化を行う。詳しい手順は以前の記事と重複するため、以下bluetoothctlコンソール上で行う手順を簡単に箇条書きしておく。

  1. “menu advertise”アドバタイズのメニューに入る
  2. “manufacturer 0xffff 0x12 0x34″で(ダミーの)製造者データを設定する
  3. “name myHRsensor”デバイス名を設定
  4. “back”でアドバタイズのメニューを抜ける(メインメニューに戻る)
  5. “advertise on”でアドバタイズの有効化
  6. (オプション)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コンソールで以下の手順を実行し、接続する

  1. クライアント側から”pair <アドレス>”を実行
[bluetooth]# pair A8:D0:09:C8:55:1A
  1. サーバ側でyesを入力
[agent] Confirm passkey 416660 (yes/no): yes
  1. クライアント側で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のコードを自作するうえで強力なツールになりそうだ。

コメント