前回は、M5Stackに送信させたBLEのアドバタイジングパケットを「手動」で解析しました。「納得感」はあったのだけれど疲れました。今回は、同じことをツールにお願いしてやってもらいます。受信側(解析側)は、Raspberry Pi3です。WiFiにもBluetoothにも対応のモジュールを搭載しているので、この手の仕事はバッチリ?
※「IoT何をいまさら」投稿順Indexはこちら
まず、Raspberry Pi 3、OSはRaspbian上でのBluetooth用のツールのインストール状況を確かめます。手元のマシン(多分、デフォルト設定のまま)では以下のような状態でした。
-
- hciconfigは、既にインストールされていた
- hcitoolは、インストールされていなかった
- Wiresharkもtsharkもインストールされていなかった
hciconfigは、ifconfigのbluetooth版みたいなツールだと理解しています。EhternetやWiFi使うときにifconfig無いわけにいかないように、Bluetoothのためにはhciconifgが無いわけにはいかないのでしょう、流石に。
Wiresharkは、LANのパケットの解析の定番ツールです。私も10年くらい前にお世話になっていた気がします。しばらく遠ざかっていました。EthernetやWiFiが主なのですが、Bluetoothのパケット解析もできるのでした。今回は、手動の代わりにWresharkとtsharkを使おうということであります。
hciconfigを使えば、インタフェースの諸元が明らかにできる筈。こんな感じ。
$ hciconfig -a hci0: Type: Primary Bus: UART BD Address: B8:27:EB:XX:XX:XX ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:835 acl:0 sco:0 events:57 errors:0 TX bytes:2542 acl:0 sco:0 commands:55 errors:0 Features: 0xbf 0xfe 0xcf 0xfe 0xdb 0xff 0x7b 0x87 Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 Link policy: RSWITCH SNIFF Link mode: SLAVE ACCEPT Name: 'XX' Class: 0x480000 Service Classes: Capturing, Telephony Device Class: Miscellaneous, HCI Version: 5.0 (0x9) Revision: 0x122 LMP Version: 5.0 (0x9) Subversion: 0x6119 Manufacturer: Cypress Semiconductor Corporation (305)
なお一部Xでプライベートな部分を消してあります(以降すべて)。あら、チップはCypress製なのね。。。
ラズパイ搭載のBluetoothインタフェースについては分かりました。しかし、実際に飛んでいるBLEのパケットを「スキャン」するためには、hcitoolというものが必要です。パッケージ的には bluez で検索すると良いのではないかと思います。bluezはbluetooth用のプロトコルスタック、ドライバ、ツールなどを含んでいるようです。その中のツール hcitool を使って「LEスキャン」(LEは bluetooth LE のLEでしょう)をしてみると、
$ sudo hcitool lescan LE Scan ... A4:CF:12:44:XX:XX M5Stack
しっかり、前回作成したアドバタイジングパケットを垂れ流しているM5Stackを発見することができました。なお、実はM5Stack以外にも結構沢山のデバイスが見えてました(余計なものは消しました)。よく考えてみるとスマホ関係とかbluetooth使っているもの結構あるので、改めてスキャンするとその多さにちょっとビックリ。
蛇足ですが、最初、M5Stackが見つからずに結構焦りました。理由は簡単、VS Codeの回でM5Stackに別なコードを書きこんだことを忘れていたから。ソフトを書き込んでないのでパケットが見えるわけがない。
さて、M5Stackが電波だしていることが確認できたので、早速、パケットをダンプしてみます。まずは、コマンドライン版のtsharkを使用してみます。Windows版のWiresharkではWiresharkをインストールすると自動的にtsharkもインストールされるみたいですが、Raspberry Piでは別々だと思います。なお、手元のラズパイ3ではbluetoothのインタフェースは5番だったので、-i 5 としています。この辺はtshark に-Dオプション付ければ列挙されます。
$ sudo tshark -i 5 -V ~途中略~ Bluetooth HCI H4 [Direction: Rcvd (0x01)] HCI Packet Type: HCI Event (0x04) Bluetooth HCI Event - LE Meta Event Code: LE Meta (0x3e) Parameter Total Length: 20 Sub Event: LE Advertising Report (0x02) Num Reports: 1 Event Type: Connectable Undirected Advertising (0x00) Peer Address Type: Public Device Address (0x00) BD_ADDR: Espressi_44:XX:XX (a4:cf:12:44:XX:XX) Data Length: 8 Advertising Data Flags Length: 2 Type: Flags (0x01) 000. .... = Reserved: 0x0 ...0 .... = Simultaneous LE and BR/EDR to Same Device Capable (Host): false (0x0) .... 0... = Simultaneous LE and BR/EDR to Same Device Capable (Controller): false (0x0) .... .1.. = BR/EDR Not Supported: true (0x1) .... ..1. = LE General Discoverable Mode: true (0x1) .... ...0 = LE Limited Discoverable Mode: false (0x0) Manufacturer Specific Length: 4 Type: Manufacturer Specific (0xff) Company ID: For use in internal and interoperability tests (0xffff) Data: 33 [Expert Info (Note/Undecoded): Undecoded] [Undecoded] [Severity level: Note] [Group: Undecoded] RSSI: -34dBm
前回、手作業でHEXダンプから解読した、フラグとか、マニュファクチャラ・スペシフィック・データなどがちゃんと解読されて表示されていることが分かると思います。やっぱり、ツールにお願いするのが一番だ。
しかし、~途中略~と書いてある部分には膨大なレコードがありました。何とかフィルタできないものかと思ったのですが、BLEのフィルタのかけ方が良く分からなかったので、さっさとGUIベースのWireshark様へ行きました。Wiresharkでキャプチャした結果から、M5Stackがアドバタイジングしているパケットを見つけて表示させたところ。
やっぱり、GUIは楽です。フィルタの仕方が分からなくても、適当にフィールドをクリクリしていけば目的のパケットが直ぐに見つけられます。ま、そのために Raspberry Pi 3 に普段は接続していないモニタ、キーボード、マウスを接続しましたが。
何年ぶりだろ、Wireshark、もう一度、使い方を復習しないといけません。ほぼ完全に忘れている。歳だ。