Seeed Studio XIAO ESP32C6 でBLEビーコンを試してみる(4)
この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のアドバタイズを発信し、スマートフォンからビーコンを検出してみます。
この記事で学べること
- Advertisingデータの中身
- Advertisingデータ全体
ステップごとの解説
- Advertisingデータの中身を見てみる
前回は、Seeed Studio XIAO ESP32C6からBLE Advertisingを発信し、スマートフォンのBLEスキャナで、「XIAO-ESP32C6」というデバイス名を確認しました。
Advertisingデータはどのような構造になっている?
BLEのAdvertisingデータは、いくつかのデータブロックに分かれて構成されています。
それぞれのブロックは、基本的に次のような構造になっています。
|
Length |
AD Type |
AD Data |
- Length : このデータブロックの長さ
- AD Type : このデータが何を表しているか
- AD Data : 実際のデータ
例えば、今回のAdvertisingでは、
02 01 06
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
というデータを送信しています。
これを分解してみましょう。
- Flags
最初の3バイトは、
02 01 06
です。
これを分解すると、
02 01 06
│ │ └── Flagsの値
│ └────── AD Type
└────────── Length
となります。
Length:02
最初の02は、このAD Structureの長さを表します。
Lengthには、AD TypeとAD Dataの長さが含まれます。
今回の場合、
AD Type = 1バイト
AD Data = 1バイト
なので、
1 + 1 = 2バイト
となり、
02
になります。
AD Type:0101は、Flagsを表すAD Typeです。
つまり、
02 01 06
↑
Flags
ということです。
AD Data:06
最後の06がFlagsの値です。
今回のAdvertisingでは、
02 01 06
というFlagsを送信しています。
このFlagsによって、このAdvertisingがLEに対応していることなどを示します。
今回の実験では、Flagsの各ビットを細かく扱う必要はないので、まずは、
01はFlagsを表すAD Typeで、06がその値
と理解しておけば十分です。
- デバイス名のデータ
続いて、
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
を見てみます。
一見すると意味のわからない16進数が並んでいます。
しかし、これも分解すると、
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
│ │ └─────────────────────┘
│ │ デバイス名
│ └──────────────── AD Type
└──────────────────── Length
となっています。
Length : 0D
最初の0Dは16進数です。
10進数に変換すると、
0D = 13
です。
Lengthには、AD Typeの1バイトも含まれるので、
AD Type
1バイト
デバイス名
12バイト
合計
13バイト
となります。
そのため、
0D
になっています。
AD Type:09
次の09は、Complete Local Nameを表します。
つまり、
0D 09
↑
Complete Local Name
という意味です。
「Local Name」は、BLE機器がAdvertisingで通知する名前です。
今回は、
XIAO-ESP32C6
という名前を設定しました。
16進数を文字に変換してみる
では、残りのデータを見てみましょう。
58 49 41 4F 2D 45 53 50 33 32 43 36
これはASCII文字コードで表された文字列です。
それぞれ変換すると、
|
16進数 |
ASCII文字 |
|
58 |
X |
|
49 |
I |
|
41 |
A |
|
4F |
O |
|
2D |
– |
|
45 |
E |
|
53 |
S |
|
50 |
P |
|
33 |
3 |
|
32 |
2 |
|
43 |
C |
|
36 |
6 |
となります。
つなげると、
X I A O - E S P 3 2 C 6
つまり、
XIAO-ESP32C6
になります。
普段スマートフォンの画面で見ている
XIAO-ESP32C6
という名前は、実際にはAdvertisingデータの中に、このようなバイト列として含まれています。
- Advertisingデータ全体を確認する
今回のAdvertisingデータをまとめると、次のようになります。
02 01 06
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
これを意味ごとに分けると、
┌───────────────┐
│ 02 01 06 │ Flags │
├───────────────┤
│ 0D │ Length
│ 09 │ Complete Local Name
│ 58 49 41 4F │ XIAO
│ 2D │ -
│ 45 53 50 │ ESP
│ 33 32 │ 32
│ 43 36 │ C6
└───────────────┘
となります。
つまり、XIAO ESP32C6は単純に「XIAO-ESP32C6」という文字を送信しているわけではありません。
BLEの決められたデータ構造に従って、バイト列としてAdvertisingを発信しています。
- MicroPythonのプログラムとの関係
前回作成したプログラムをもう一度見てみます。
name = "XIAO-ESP32C6"
adv_data = bytearray(b"\x02\x01\x06")
name_bytes = name.encode()
adv_data += bytes([len(name_bytes) + 1, 0x09])
adv_data += name_bytes
最初に、
adv_data = bytearray(b"\x02\x01\x06")
で、
02 01 06
というFlagsを追加しています。
次に、
name_bytes = name.encode()
によって、
XIAO-ESP32C6
をバイト列に変換しています。
そして、
adv_data += bytes([len(name_bytes) + 1, 0x09])
で、
0D 09
を追加しています。
最後に、
adv_data += name_bytes
で、
58 49 41 4F 2D 45 53 50 33 32 43 36
を追加しています。
その結果、
02 01 06
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
というAdvertisingデータが完成します。
「デバイス名」はどこから来ている?
スマートフォンのBLEスキャナでは、
XIAO-ESP32C6
と表示されました。
これは、スキャナがAdvertisingデータの中にある、
AD Type = 09
を見つけて、
58 49 41 4F 2D 45 53 50 33 32 43 36
を文字列として解釈しているためです。
つまり、
XIAO ESP32C6
│
│ Advertising
▼
02 01 06
0D 09
58 49 41 4F 2D 45 53 50 33 32 43 36
│
▼
XIAO-ESP32C6
│
▼
スマートフォンに表示
という流れになっています。
Advertisingには名前以外の情報も入れられる
今回のAdvertisingには、
Flags
+
Complete Local Name
だけを入れました。
しかし、BLEのAdvertisingには、これ以外にもさまざまな情報を入れることができます。
例えば、
- Manufacturer Specific Data
- Service UUID
- Service Data
- TX Power
- Shortened Local Name
などがあります。
特にManufacturer Specific Dataは、BLEビーコンでよく利用される重要なデータです。
ここに機器固有の情報などを入れることで、
ビーコンA
ビーコンB
ビーコンC
のように、それぞれのビーコンを識別することができます。
まとめ
今回は、XIAO ESP32C6が発信しているBLE Advertisingデータの中身を確認しました。
今回使用したデータは、
02 01 06
0D 09 58 49 41 4F 2D 45 53 50 33 32 43 36
です。
これを分解すると、
02 01 06
↓
Flags
0D 09
↓
Complete Local Name
58 49 41 4F 2D 45 53 50 33 32 43 36
↓
XIAO-ESP32C6
となります。
このようにBLE Advertisingは、単なる文字列ではなく、「Length」「AD Type」「AD Data」という構造を持ったデータとして送信されています。
次回は、このAdvertisingデータの中でも特にビーコンで重要になるManufacturer Specific Dataを使って、XIAO ESP32C6から「ビーコンらしい情報」を発信してみます。続く
