Seeed Studio XIAO ESP32C6 でBLEビーコンを試してみる(5)
この記事では、Seeed Studio XIAO ESP32C6を使って、MicroPythonからBluetooth Low Energy(BLE)のアドバタイズを発信し、スマートフォンからビーコンを検出してみます。
この記事で学べること
- Manufacturer Specific Dataについて
- Company ID
- MicroPythonでManufacturer Specific Dataの例
- スマートフォンでの確認方法
- BLEビーコンとの関係
ステップごとの解説
- Manufacturer Specific Dataを使ってみる
前回は、XIAO ESP32C6から発信しているBLE Advertisingデータの中身を確認しました。
Advertisingデータには、
- Flags
- Complete Local Name
- Service UUID
- Manufacturer Specific Data
など、さまざまな種類のデータを含めることができます。
今回は、その中でもBLEビーコンでよく利用される Manufacturer Specific Data を使ってみます。
Manufacturer Specific Dataとは?
Manufacturer Specific Dataは、その名前のとおり、メーカーが独自の情報を入れるためのAdvertisingデータです。
AD Typeには、
FF
が使用されます。
Advertisingデータの構造としては、
┌────────┬────────┬─────────────────────┐
│ Length │ AD Type │ Manufacturer Data │
└────────┴────────┴─────────────────────┘
FF
となります。
例えば、
FF 4C 00 ...
というデータがあった場合、
FF
│
└─ Manufacturer Specific Data
を表します。FFの後ろにメーカーを識別するための情報や、メーカー独自のデータが続きます。
- Company IDとは?
Manufacturer Specific Dataでは、最初に**Company Identifier(Company ID)**を入れるのが一般的です。
Company Identifierは、Bluetooth SIGによって割り当てられている2バイトの識別番号です。
例えばAppleには、
4C 00
というCompany Identifierが割り当てられています。
そのため、Appleが使用するManufacturer Specific Dataでは、
4C 00
から始まるデータが使われることがあります。
ただし、ここで重要なのは、
Manufacturer Specific Dataだからといって、必ず特定メーカーの製品であるとは限らない
ということです。
Advertisingデータを受信した側では、Company IDなどを使ってデータの種類を判断します。
- XIAO ESP32C6からManufacturer Specific Dataを送信する
今回は、XIAO ESP32C6から次のようなデータを送信してみます。
Company ID
1234
Manufacturer Data
01 02 03 04
実験用なので、Company IDには0x1234を使用します。
Advertisingデータとしては、
FF 34 12 01 02 03 04
のようなデータになります。
ここで注意したいのが、Company IDのバイト順です。
0x1234
をBLE Advertisingに入れる場合、
34 12
の順番になります。
これはリトルエンディアンで格納されるためです。
- MicroPythonでManufacturer Specific Dataを作る
それでは、プログラムを作ってみます。
import bluetooth
import time
# BLEを初期化
ble = bluetooth.BLE()
ble.active(True)
# Flags
adv_data = bytearray(b"\x02\x01\x06")
# Manufacturer Specific Data
manufacturer_data = bytes([
0x34, 0x12, # Company ID
0x01,
0x02,
0x03,
0x04
])
# Length + AD Type + Manufacturer Data
adv_data += bytes([len(manufacturer_data) + 1, 0xFF])
adv_data += manufacturer_data
# Advertising開始
ble.gap_advertise(
100000,
adv_data=adv_data
)
print("BLE Advertising started")
while True:
time.sleep(1)
今回は、前回のようなデバイス名は入れていません。
Advertisingデータは、
Flags
+
Manufacturer Specific Data
という構成です。
- プログラムを確認する
まず、
adv_data = bytearray(b"\x02\x01\x06")
で、Flagsを設定しています。
Advertisingデータは、
02 01 06
になります。
次に、
manufacturer_data = bytes([
0x34, 0x12,
0x01,
0x02,
0x03,
0x04
])
で、Manufacturer Specific Dataを作ります。
データは、
34 12 01 02 03 04
です。
先頭の、
34 12
が、Company IDです。
その後ろの、
01 02 03 04
が今回独自に設定したデータです。
AD Type「FF」を追加する
次の部分が重要です。
adv_data += bytes([len(manufacturer_data) + 1, 0xFF])
adv_data += manufacturer_data
Manufacturer Specific DataのAD TypeはFFです。
また、Lengthには、
AD Type
+
Manufacturer Data
の長さが入ります。
今回、
Manufacturer Data
34 12 01 02 03 04
は、6バイトです。
さらに、AD TypeのFFが1バイトあるため、
6 + 1 = 7
となります。
7を16進数で表すと、
07
です。
そのため、
07 FF 34 12 01 02 03 04
となります。
- Advertisingデータ全体
今回のAdvertisingデータは、
02 01 06
07 FF 34 12 01 02 03 04
となります。
これを分解すると、
02 01 06
│ │ └─ Flags
│ └──── AD Type = Flags
└─────── Length
07 FF 34 12 01 02 03 04
│ │ └───────────────── Manufacturer Specific Data
│ └──────────────────── AD Type = Manufacturer Specific Data
└─────────────────────── Length
となります。
Manufacturer Specific Dataの部分だけを見ると、
34 12 01 02 03 04
です。
34 12
↓
Company ID
01 02 03 04
↓
メーカー独自データ
という構造になっています。
- スマートフォンで確認する
XIAO ESP32C6でプログラムを実行したら、スマートフォンのBLEスキャナでAdvertisingを確認します。
今回はデバイス名をAdvertisingに入れていないため、スキャナによっては、
N/A
Unknown
などと表示される場合があります。
そこで、Advertisingの詳細情報を開きます。
Manufacturer Specific Dataの項目に、
34 12 01 02 03 04
のようなデータが表示されていれば成功です。
- 独自のデータを送信する
Manufacturer Specific Dataの面白いところは、自分でデータの意味を決められることです。
例えば、
01
を温度センサーのデータ、
02
を湿度センサーのデータ、
03
をバッテリー残量、
というように、自分でデータフォーマットを設計できます。
例えば、
34 12 19 64 80
を、
34 12
↓
Company ID
19
↓
温度 25℃
64
↓
湿度 100%
80
↓
バッテリー残量 80%
のように定義することもできます。
実際のIoT機器では、このようにAdvertisingにセンサーの状態などを含めることで、接続せずに周囲へ情報を知らせることができます。
- BLEビーコンとの関係
ここまでくると、最初に説明したBLEビーコンとの関係が分かってきます。
BLEビーコンは、Advertisingを利用して周囲に情報を発信します。
そのAdvertisingの中に、
Manufacturer Specific Data
を入れることで、ビーコンを識別するための情報などを送信できます。
今回の実験では、
XIAO ESP32C6
│
│ BLE Advertising
▼
┌────────────────────┐
│ Flags │
│ Manufacturer Data │
└────────────────────┘
│
▼
スマートフォン
│
▼
BLEスキャナ
という流れを確認しました。
まとめ
今回はManufacturer Specific Dataを使って、XIAO ESP32C6から独自のデータをBLE Advertisingとして送信しました。
今回使用したデータは、
02 01 06
07 FF 34 12 01 02 03 04
です。
このうち、
FF
が、Manufacturer Specific Dataを示すAD Typeです。
その後に、
34 12
というCompany IDと、
01 02 03 04
という独自データを入れました。
今回は実験用の値として
0x1234を使用しています。実際の製品でManufacturer Specific Dataを設計する場合は、Bluetooth SIGから割り当てられたCompany Identifierを使用します。
Manufacturer Specific Dataを利用すると、BLE Advertisingを単なる「デバイス名の発信」から、センサー情報などを送信するためのデータ通信として利用できるようになります。
次回は、このManufacturer Specific Dataをさらに発展させ、BLEビーコンでよく使われるiBeacon形式について調べ、XIAO ESP32C6からiBeacon形式のAdvertisingを発信してみます。
