2024年10月20日日曜日

ubuntu22.04でBLEのHIDのReport Mapを確認


背景

BLE接続で使うキーボードの動作確認時に把握したubuntuでのHIDのReport Map確認手順を備忘録として記事に残します。

HID、HOGPとは

HIDはHuman Interface Deviceの略であり、人が操作する装置を意味します。
HOGPはHID Over GAPP Profileの略であり、BLEのGAPPを通して通信する人が操作する装置を意味します。
今回調査するキーボードの他にゲームパッドやヘッドホンなどがHIDに分類されています。

「BLE HID」や「HOGP」のキーワードで今回の記事の内容の調査を始めました。

使ったもの

  • ubuntu22.04のPC
  • HID装置: FMV Mobile Keyboard

標準のHOGP自動掌握を停止

ubuntu22.04のbluetoothのデーモンはHOGPの装置を認識するとそれに関するBLEのserviceやcharacteristicを掌握してしまい、bluetoothctlなどのコマンドで確認できません。
調査には不都合なので下記の操作で自動掌握を停止しました。
注意点としてこの操作を行うとbluetooth接続のマウスやキーボードが使えなくなるので、USBなどの有線の装置やノートパソコンに付いているキーボードが利用できる状況で行ってください。

管理者権限で下記ファイルを書き換えます。
bluetootdの実行コマンドに--nopluginオプションでinpugとhogを除外することでHIDの自動認識を停止します。
/lib/systemd/system/bluetooth.service
ExecStart=/usr/libexec/bluetooth/bluetoothd --noplugin=input,hog
# ExecStart=/usr/libexec/bluetooth/bluetoothd # 元のコマンド

systemの設定を読み直し、bluetooth.serviceを再起動して設定を反映します。
sudo systemctl daemon-reload 
sudo systemctl restart bluetooth.service

これにより自動掌握が止まり、コマンドで内容を確認可能な状態になりました。

参考: On Linux I can't access HID (HOG) device using BlueZ in my application

bluetoothctlでReport Mapを確認

bluetoothctlとはubuntuが利用しているbluetoothライブラリbluezが提供するコマンドです。
これを利用してbluetooth機器との接続や内容確認を行えます。
GUIでも使われているので、bluetoothctlを起動したままGUIでペアリングするとログがどんどん流れていきます。

今回はbluetoothctlを利用してペアリング、接続、Report Mapの表示を行います。

bluetoothctl起動

下記のコマンドを実行してbluetoothctlを起動します。
bluetoothctl

ペアリング

繋ぎたいBLE装置をペアリング状態にして検索します。
GUIなどでペアリング済みなら、この手順は飛ばして接続の処理に進んでください。
bluetoothctl入力画面
scan le


検索情報が流れ続けるとペアリング対象のアドレスをコピーしづらいので、接続対象が表示されたら検索を止めます。
bluetoothctl入力画面
scan no

接続対象のアドレスをコピーして接続コマンドの引数として渡します。
ちなみに、bluetooth機器はペアリングし直すごとにアドレスが変わるものがあるので、つながらない場合はアドレスを再確認するのが良いです。
試したキーボードはどちらもアドレスが変わりました。
bluetoothctl入力画面
pair [接続したい装置のアドレス]

ペアリングコマンドを実行するとキーボードの場合はPassKeyが表示されるので、キーボード側で入力するとペアリングが完了します。
PassKeyは大量の情報で流れていくので、画面をスクロール(マウス操作などで上を見る)して確認してください。


ペアリングが成功すると「Paring successful」と表示されます。

ペアリングを解消したい場合はremoveコマンドで消せます。
bluetoothctl入力画面
remove [ペアリングを解消したい装置のアドレス]

接続


ペアリング直後なら接続状態なので不要ですが、装置との接続が切れていたり、bluetoothctlが他の装置を選択状態の場合は接続処理を行いコマンドの制御対象にします。

ペアリング済みの装置はpaired-devicesコマンドで見れます。
bluetoothctl入力画面
paired-devices

接続対象のアドレスをコピーしてconnectコマンドに渡します。
bluetoothctl入力画面
connect [繋ぎたい装置のアドレス]

成功するとbluetoothctlのコマンド入力行の左側の文字が装置の名前に変わり制御対象になります。
ペアリングしているのに繋がらない場合は、装置を触って起こしたり、ペアリングをやり直したりしてください。

gatt menuでReport Mapを読み込み

bluetoothctlの操作画面はmenu選択があり、今回はgatt menuを使います。

gatt menuに移ります。
bluetoothctl入力画面
menue gatt

paired-devicesなど初期のコマンドを実行したい場合はgatt menuを解除します。
backのコマンドでgatt menuを解除できます。
bluetoothctl gatt menu 入力画面
back

gatt menuで装置の要素一覧表示を行います。
bluetoothctl gatt menu 入力画面
list-attributes

長いので必要箇所だけ抜粋します。
Report Mapと説明された下記のcharacteristicの内容を確認します。
FMV mobile keyboardはなぜかHID serviceが2つあるため、Report Mapも2つあります。
Characteristic (Handle 0x0000)
/org/bluez/hci0/dev_6D_DF_EC_F1_FB_80/service002e/char0031
00002a4b-0000-1000-8000-00805f9b34fb
Report Map
Characteristic (Handle 0x0000)
/org/bluez/hci0/dev_6D_DF_EC_F1_FB_80/service0053/char0056
00002a4b-0000-1000-8000-00805f9b34fb
Report Map

characteristicを選択してreadして内容を読み込みます。
readは2回値を読み込むため読みづらく感じるので、下記のコマンドではattribute-infoで読み込んだ値を再表示させています。
bluetoothctl gatt menu 入力画面
select-attribute /org/bluez/hci0/dev_6D_DF_EC_F1_FB_80/service0053/char0056
read
attribute-info
下記の内容を読み取れました。
Characteristic - Report Map
UUID: 00002a4b-0000-1000-8000-00805f9b34fb
Service: /org/bluez/hci0/dev_6D_DF_EC_F1_FB_80/service002e
Value:
05 01 09 06 a1 01 85 01 15 00 25 01 05 07 1a e0 ..........%.....
00 2a e7 00 75 01 95 08 81 02 75 08 95 01 81 01 .*..u.....u.....
05 07 19 00 2a 91 00 16 00 00 26 ff 00 75 08 95 ....*.....&..u..
06 81 00 05 08 75 01 95 03 19 01 29 03 25 01 91 .....u.....).%..
02 95 05 91 01 c0 05 0c 09 01 a1 01 85 02 19 00 ................
2a ff 03 75 0c 95 01 15 00 26 ff 03 81 00 75 04 *..u.....&....u.
95 01 81 01 c0 05 01 09 02 a1 01 85 03 09 01 a1 ................
00 05 09 19 01 29 07 15 00 25 01 95 07 75 01 81 .....)...%...u..
02 95 01 75 01 81 01 05 01 09 30 09 31 16 01 80 ...u......0.1...
26 ff 7f 75 10 95 02 81 06 09 38 15 81 25 7f 75 &..u......8..%.u
08 95 01 81 06 a1 00 95 01 75 08 05 0c 0a 38 02 .........u....8.
15 81 25 7f 81 06 c0 c0 c0 ..%......
Flags: read
MTU: 0x00f7 (247)

もう片方の読み取りコマンドと結果も残します。
bluetoothctl入力画面
select-attribute /org/bluez/hci0/dev_6D_DF_EC_F1_FB_80/service0053/char0056
read
attribute-info

読み取り結果です。
Characteristic - Report Map
UUID: 00002a4b-0000-1000-8000-00805f9b34fb
Service: /org/bluez/hci0/dev_6D_FE_EC_F1_FB_80/service0053
Value:
05 01 09 06 a1 01 85 01 15 00 25 01 05 07 1a e0 ..........%.....
00 2a e7 00 75 01 95 08 81 02 75 08 95 01 81 01 .*..u.....u.....
05 07 19 00 2a 91 00 16 00 00 26 ff 00 75 08 95 ....*.....&..u..
06 81 00 05 08 75 01 95 03 19 01 29 03 25 01 91 .....u.....).%..
02 95 05 91 01 c0 05 0c 09 01 a1 01 85 02 19 00 ................
2a ff 03 75 0c 95 01 15 00 26 ff 03 81 00 75 04 *..u.....&....u.
95 01 81 01 c0 05 01 09 02 a1 01 85 03 09 01 a1 ................
00 05 09 19 01 29 07 15 00 25 01 95 07 75 01 81 .....)...%...u..
02 95 01 75 01 81 01 05 01 09 30 09 31 16 01 80 ...u......0.1...
26 ff 7f 75 10 95 02 81 06 09 38 15 81 25 7f 75 &..u......8..%.u
08 95 01 81 06 a1 00 95 01 75 08 05 0c 0a 38 02 .........u....8.
15 81 25 7f 81 06 c0 c0 c0 05 0d 09 05 a1 01 85 ..%.............
04 09 22 a1 02 15 00 25 01 09 47 09 42 95 02 75 .."....%..G.B..u
01 81 02 09 51 95 01 75 04 25 70 81 02 75 01 95 ....Q..u.%p..u..
02 81 03 05 01 15 00 26 0f 05 75 10 55 0e 65 11 .......&..u.U.e.
09 30 35 00 46 b6 03 95 01 81 02 15 00 26 25 02 .05.F........&%.
46 90 01 09 31 81 02 c0 05 0d 09 22 a1 02 15 00 F...1......"....
25 01 09 47 09 42 95 02 75 01 81 02 09 51 95 01 %..G.B..u....Q..
75 04 25 70 81 02 75 01 95 02 81 03 05 01 15 00 u.%p..u.........
26 0f 05 75 10 55 0e 65 11 09 30 35 00 46 b6 03 &..u.U.e..05.F..
95 01 81 02 15 00 26 25 02 46 90 01 09 31 81 02 ......&%.F...1..
c0 05 0d 09 22 a1 02 15 00 25 01 09 47 09 42 95 ...."....%..G.B.
02 75 01 81 02 09 51 95 01 75 04 25 70 81 02 75 .u....Q..u.%p..u
01 95 02 81 03 05 01 15 00 26 0f 05 75 10 55 0e .........&..u.U.
65 11 09 30 35 00 46 b6 03 95 01 81 02 15 00 26 e..05.F........&
25 02 46 90 01 09 31 81 02 c0 05 0d 09 22 a1 02 %.F...1......"..
15 00 25 01 09 47 09 42 95 02 75 01 81 02 09 51 ..%..G.B..u....Q
95 01 75 04 25 70 81 02 75 01 95 02 81 03 05 01 ..u.%p..u.......
15 00 26 0f 05 75 10 55 0e 65 11 09 30 35 00 46 ..&..u.U.e..05.F
b6 03 95 01 81 02 15 00 26 25 02 46 90 01 09 31 ........&%.F...1
81 02 c0 55 0c 66 01 10 47 ff ff 00 00 27 ff ff ...U.f..G....'..
00 00 75 10 95 01 05 0d 09 56 81 02 09 54 25 7f ..u......V...T%.
Flags: read
MTU: 0x00f7 (247)

Report mapを確認できました。

余談: Bluetoothの通信内容監視: btmon

bluetoothの通信内容を監視できます。
キーボードからnotificationとして送信されるキーやマウスの操作情報を確認できます。
sudo btmon


おわり

bluetoothの通信処理が掌握して確認できなかったHIDのReport Mapを、自動読み込みを停止して確認できました。
数年前にubuntuでble関係の調査に取り組んだ際はgatttoolを使ったのですが、ubuntu22.04ではそれは使えなかったのでbluetoothctlの使い方を把握しました。

参考

On Linux I can't access HID (HOG) device using BlueZ in my application

0 件のコメント :