IoT何をいまさら(54) BluetoothLE, RAWDATAを読む

JosephHalfmoon

「バイナリ」好きなので、たまにビット列とかHEXの数字の列とか触りたくなるのです。今回は、Bluetooth LE(Low Energy)がアドバタイジングしている時のRAWDATAを手動で読んでみました。まあ、後でWireshark様とかにもっと効率のよい解析をお願いする前振りであるのですが。BLEのパケットを虚空に放つのには、なんでも簡単にできてしまう M5Stackにやっていただきます。さて、ちゃんと読めるのか。

BLEでアドバタイジングパケットを垂れ流す(双方向で通信するわけではなくて、単方向で一方的にパケットを発信する)コードは以下のようなものです。ArduinoIDE上で、M5Stack Gray用にビルドしています。このコード自体は「みんなのM5Stack入門」P.198に出ていたセンサデータを垂れ流すサンプルプログラムのセンサ制御とかを全て毟りとってしまってBLEのアドバタイジングだけにしてしまったものです。(下島先生ありがとうございます。)

M5Stack BLE Advertising

やっていることと言えば、1バイトのシーケンス番号を4秒に1回の割合でインクリメントしながら「アドバタイズ」する、というだけのもの。それでもM5Stackの開発環境が裏でいろいろ準備済なお陰で、このように30行ほどで収まっています。いつものことながら楽ちん。

しかし、生成されたコードサイズを見ると、やはり裏の準備は大変なようです。以下、この短いスケッチが使用しているメモリサイズを御覧ください。まあ、荒業使えばこの倍量は入るのでしょうが、普通のスケッチとしてはかなりデカイ。BLE advertising program size

ともかく、ビルド成功したので、M5Stackに書き込み動作させます。LCD画面を見ると、予定どおり、STARTとSTOPを繰り返しているのが分かります。

次回あたり、Windows上かLinux上のソフトウエアでパケットをキャプチャして解析するようにしたいと思っているのですが、今回は、スマホのアプリ

BLE Scanner

というものを使ってみます。これも先ほどのM5Stackの教科書のお勧めアプリ。起動すれば、特に問題もなく、M5Stackという名で「飛ばしている」デバイスを発見。先ほどのスケッチの8行目で”M5Stack”と名乗らせているので当然です。そこでパケットのRAW DATAを表示させました。これぞ、アドバタイジング・パケットが運んでいるPAYLOAD。BLE Advertising RAW Data

1行目の真ん中辺に、04FFFFFFCDとあるのが、スケッチの16行目から20行目で設定しているデータだと直ぐに見極めがつきます。何度かRAW DATAを表示させていると、最後のCDの部分が、インクリメントされていることが分かります。

ちゃんとブロードキャストしとるの~

しかし、前後にずらずらと一杯あるのは何でしょう。ここですね、楽しくHEXの羅列を解読していくのは、

まず先頭の

0x020106

0x02はLengthで2オクテッド(通信なので、1オクテッドのことをバイトと呼んでしまうような乱暴なことはしないのでしょう。私は乱暴なマイコン屋なのでバイト、と心の中で唱えますが。)、その2オクテッドの最初のバイト(すみません)が0x01、これが AD Typeでしょう。0x01を調べると Flags だそうです。そしてFlagsの実体は 0x06

0000 0110 (心休まるバイナリだあ)

ビット2はBR/EDR Not Supported、ビット1はLE General Discoverable Modeだそうです。2つあわせて、

BLEはサポートすっけど、昔の(?)Bluetooth(BR/EDR)はサポートせんからね

という意味のようです。よし、解釈できた。次行ってみよう。

0x04FFFFFFCD

ここは、自分で設定している部分なので迷いませぬ。04で4オクテッド。最初のオクテッドFFは、Manufacture Specific、次のFFFFはテスト用い割り当てられているCompany ID、そして最後のCDはインクリメントされるシーケンス番号。

さらに次、

08 09 4D 35 53 74 61 63 6B

08 — 8オクテッド

09 — AD type: Local Name

4D — ‘M’
35 — ‘5’
53 — ‘S’
74 — ‘t’
61 — ‘a’
63 — ‘c’
6B — ‘k’

ちゃんとお名前、復元できたな~。こうして解読していくのがバイナリ読んでいるときの嬉しい感じだね。でもね、疲れるねえ。昔は何Mバイトのバイナリもなんでもなかったのだが(言い過ぎか。)たったの十数バイト読んだだけですが、このくらいで投げ出します。

やっぱり次回からは、本題、ツールを使って通信をモニタすることといたしましょう。

IoT何をいまさら(53) M5StickC、PIR Hat へ戻る

IoT何をいまさら(55) ラズパイWiresharkでBLEパケット解析 へ進む