概要
アドバタイズ(Advertising)は、BLE(Bluetooth Low Energy)デバイスが自分の存在・サービス・データを周囲に定期的にブロードキャストする仕組みです。Peripheralデバイスがアドバタイズパケットを送信し、Central(スマートフォンなど)がスキャンして受信することで、接続前の機器発見が可能になります。
アドバタイズはBLEの基本動作であり、接続なしでデータを一方向配信する「コネクションレス通信」としても使われます。ビーコン(iBeacon / Eddystone)・センサーデータのブロードキャスト・近接通知など、BLEの多くのユースケースがアドバタイズを基盤にしています。
歴史・背景
BLE(Bluetooth 4.0)の設計当初から、省電力でのデバイス発見を実現するためにアドバタイズが設計されました。Bluetooth Classicのインクワイアリ(Inquiry)プロセスは双方向かつ電力消費が大きかったのに対し、BLEのアドバタイズはPeripheral側が一方的にパケットを送出するシンプルな設計です。
Bluetooth 5.0(2016年)では広告チャンネルを3から37に拡張できるLE Extended Advertisingが導入され、より大きなペイロードと高速・長距離PHYへの対応が可能になりました。Bluetooth 5.1では送信間隔をより細かく制御できる機能が追加されました。Bluetooth 5.4では双方向通信を可能にするPAwR(Periodic Advertising with Responses)が追加されました。
技術仕様
アドバタイジングチャンネル
BLEは2.4GHz帯の40チャンネルのうち3チャンネルをアドバタイジング専用に使用します:
| チャンネル | 周波数 | Wi-Fi ch(2.4GHz)との関係 |
|---|---|---|
| 37 | 2402 MHz | Wi-Fi ch1(2412MHz)より低い帯域 |
| 38 | 2426 MHz | Wi-Fi ch6(2437MHz)とch1の間 |
| 39 | 2480 MHz | Wi-Fi ch13(2472MHz)より高い帯域 |
Wi-Fiの主要チャンネルとの干渉を避けるよう意図的に配置されています。
アドバタイズパケット構造
BLE Advertising PDU(最大37バイト / Extended Advertisingは最大255バイト)
┌──────────────┬──────────────────────────────────────────────────┐
│ ヘッダー(2B) │ ペイロード(最大37バイト) │
└──────────────┴──────────────────────────────────────────────────┘
ペイロード内のアドバタイズデータ構造(AD Structure):
┌────────────┬──────────────┬────────────────────────────────┐
│ Length(1B) │ AD Type(1B) │ AD Data(Length-1 バイト) │
└────────────┴──────────────┴────────────────────────────────┘
複数のAD Structureを連結して最大31バイト(Advertising Data)
+ 最大31バイト(Scan Response Data)
主要なAD Type
| AD Type | 値 | 内容 |
|---|---|---|
| Flags | 0x01 | LE対応フラグ(接続可否・発見モード) |
| Incomplete List of 16-bit UUIDs | 0x02 | サービスUUID(一部) |
| Complete List of 16-bit UUIDs | 0x03 | サービスUUID(全て) |
| Complete Local Name | 0x09 | デバイス名 |
| TX Power Level | 0x0A | 送信電力(RSSIと組み合わせ距離推定に) |
| Manufacturer Specific Data | 0xFF | メーカー独自データ(iBeacon等) |
| Service Data – 16-bit UUID | 0x16 | Eddystone等 |
アドバタイズタイプ
| タイプ | PDUタイプ | 説明 |
|---|---|---|
| ADV_IND | 汎用アドバタイズ | 接続可能・スキャン応答可能 |
| ADV_DIRECT_IND | 指向性アドバタイズ | 特定デバイスへの接続要求 |
| ADV_NONCONN_IND | 非接続アドバタイズ | 接続不可(ビーコンなど) |
| ADV_SCAN_IND | スキャン可能アドバタイズ | 接続不可だがScan Response可能 |
アドバタイズ間隔
アドバタイズ間隔は625µs単位で設定します(100ms = 160):
- 最小: 20ms(0x0020)
- 最大: 10,240ms(0x4000)
- 推奨: 100ms〜数秒
間隔が短いほど発見されやすいが消費電力が増加。間隔が長いほど省電力だが発見に時間がかかります。ランダムな遅延(0〜10ms)が自動付加され、複数デバイスの衝突を軽減します。
動作原理
アドバタイズのタイミング
時間軸 →
| 100ms | 100ms | 100ms |
ch37送信 → ch38送信 → ch39送信 ← アドバタイズイベント1回
(3チャンネルを短時間で順次送信)
次のアドバタイズイベントまで睡眠
1回のアドバタイズイベント所要時間: 0.5〜1ms程度
消費電力のほとんどは送信ピーク時の数ms
スキャンプロセス(Central側)
1. Passive Scan: アドバタイズパケットを受信するだけ
2. Active Scan: ADV_INDまたはADV_SCAN_INDに対してSCAN_REQを送信し
Scan Response(追加データ)を要求
3. Connect: ADV_INDへのCONNECT_INDで接続開始
LE Extended Advertising(Bluetooth 5.0+)
Bluetooth 5.0で導入されたExtended Advertisingでは:
- アドバタイズチャンネルは3チャンネルのまま(制御用)
- データチャンネル(37チャンネル)でAuxiliaryパケット送信
- ペイロード最大255バイト(従来は31バイト)
- 2M PHY / LE Coded PHYでアドバタイズ可能
ADV_EXT_IND(ch37/38/39) → AUX_ADV_IND(データch、大容量ペイロード)
Periodic Advertising(Bluetooth 5.0+)
定期的な間隔でアドバタイズを送信し、Observerが同期してスキャンする仕組みです。低電力で多数のObserverへのブロードキャストに適しています。
用途・ユースケース
デバイス発見・接続確立
最も基本的な用途で、スマートフォンがBLEセンサーを発見して接続する際に使用します。一般的なセンサーノードは:
- アドバタイズを送信(100ms間隔など)
- Centralが接続要求
- 接続確立後にアドバタイズを停止
コネクションレスデータ配信
接続なしでアドバタイズパケット内にセンサーデータを含めて送信します。消費電力が非常に低く、多数のObserverへ同時配信できます:
// nRF5 SDK: Manufacturer Specific DataにセンサーデータをのせてADV送信
uint8_t adv_data[31];
uint8_t idx = 0;
// Flags
adv_data[idx++] = 2; // Length
adv_data[idx++] = 0x01; // AD Type: Flags
adv_data[idx++] = 0x06; // LE General Discoverable, BR/EDR Not Supported
// Manufacturer Specific Data
uint16_t company_id = 0xFFFF; // テスト用
int16_t temperature = 2540; // 25.40℃ を 100倍整数
adv_data[idx++] = 6; // Length: 1(type) + 2(company) + 2(temp) + 1(seq)
adv_data[idx++] = 0xFF; // AD Type: Manufacturer Specific
adv_data[idx++] = company_id & 0xFF;
adv_data[idx++] = (company_id >> 8) & 0xFF;
adv_data[idx++] = temperature & 0xFF;
adv_data[idx++] = (temperature >> 8) & 0xFF;
adv_data[idx++] = seq_num++; // シーケンス番号
ble_advdata_set(adv_data, idx, NULL, 0);
Bluetooth Mesh のアドバタイズ
BLE Mesh(メッシュネットワーク)では、アドバタイズチャンネルを使ってメッセージをブロードキャスト・中継します。接続ベアラーとアドバタイズベアラーの2方式があり、多くの実装でアドバタイズベアラーが使われます。
実装・開発のポイント
アドバタイズ間隔の選定
用途別の推奨アドバタイズ間隔:
・接続用センサーノード : 100ms〜500ms(発見速度 vs 電力のバランス)
・コネクションレスセンサー : 1s〜10s(省電力優先)
・ビーコン(位置測位) : 100ms〜200ms(測位精度確保)
・iBeacon(アップル推奨) : 100ms(100msが標準)
・BLE Mesh(中継ノード) : 20ms〜50ms(メッシュ遅延最小化)
ESP32でのアドバタイズ設定例
#include <BLEDevice.h>
#include <BLEAdvertising.h>
void setup() {
BLEDevice::init("MyDevice");
BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
// アドバタイズデータ設定
BLEAdvertisementData advData;
advData.setFlags(0x06); // LE General Discoverable
advData.setName("MyDevice");
// Manufacturer Specific Data
std::string mfgData;
mfgData += (char)0xFF; // Company ID下位
mfgData += (char)0xFF; // Company ID上位(テスト用0xFFFF)
mfgData += (char)0x01; // カスタムデータ
advData.setManufacturerData(mfgData);
pAdvertising->setAdvertisementData(advData);
// アドバタイズ間隔: 160 × 0.625ms = 100ms
pAdvertising->setMinInterval(160);
pAdvertising->setMaxInterval(200);
pAdvertising->start();
}
Scan Response データの活用
アドバタイズパケット(最大31バイト)が不足する場合は、Scan Response(追加31バイト)を使ってデバイス名やサービスUUIDを補完できます:
BLEAdvertisementData scanResponse;
scanResponse.setName("LongDeviceName-SensorV2"); // 長い名前はScan Responseへ
scanResponse.setCompleteServices(BLEUUID(SERVICE_UUID));
pAdvertising->setScanResponseData(scanResponse);
電力消費の計算
コイン電池(CR2032: 225mAh)での動作時間目安:
アドバタイズ消費電流の計算例(1秒間隔、0dBm出力):
- 送信時ピーク電流: 約15mA × 0.75ms(3ch×0.25ms) = 0.01125 mAs/回
- 1秒間の平均: 0.01125mAs / 1000ms ≈ 11.25µA
Deep Sleepリーク: 1µA
平均消費電流: 約12µA
動作時間 = 225mAh / 0.012mA ≈ 18,750時間 ≈ 2年以上
(実際はセンサー読み取り・通信等のオーバーヘッドあり)
他技術との比較
アドバタイズ vs 接続(GATT通信)
| 項目 | アドバタイズ(コネクションレス) | 接続(GATT) |
|---|---|---|
| 消費電力 | 非常に低い | アドバタイズより高め |
| データ量 | 最大31バイト(Extended: 255B) | 理論上無制限 |
| 受信者数 | 無制限(ブロードキャスト) | 原則1対1 |
| 双方向性 | なし(Bluetooth 5.4 PAwR除く) | あり |
| セキュリティ | 暗号化なし(標準) | ペアリング暗号化可能 |
BLE アドバタイズ vs Wi-Fi Beacon
Wi-Fiのビーコンフレームと同様の役割ですが、BLEアドバタイズは消費電力が数十〜数百分の1です。Wi-Fiはインフラ構築用、BLEアドバタイズは超省電力のデータ配信・デバイス発見用と使い分けます。