概要
BLE(Bluetooth Low Energy)は、Bluetooth 4.0(2010年)で導入された低消費電力向けの無線通信規格です。単三電池1本で数ヶ月〜数年の動作を可能にする超省電力設計が特徴で、IoTセンサー・ウェアラブルデバイス・医療機器・スマートホームデバイスなど、電池駆動が求められる機器の定番通信手段となっています。
Bluetooth Classicとは同じ2.4GHz帯を使用しながら、通信プロトコルを根本から再設計した別規格です。消費電力は数µA〜数mAレベルで、同じBluetooth規格ながらClassicとは互換性がありません(デュアルモードチップは両方をサポート)。
スマートフォン・PC・タブレットのほぼ全機種がBLEに対応しており、専用アプリや専用ゲートウェイなしでも既存スマートフォンからセンサーデータを取得できる点が大きな強みです。
歴史・背景
BLEの前身は、2006年にNokiaが独自に開発した「Wibree」です。Nokiaは2007年にBluetooth SIGにWibreeの仕様を提供し、「Bluetooth Ultra Low Power(ULP)」として標準化作業が始まりました。2010年、Bluetooth 4.0仕様の一部として「Bluetooth Low Energy」が正式採用されました。
その後の主なバージョン進化:
- Bluetooth 4.0(2010年): BLE初版。最大1Mbps PHY、最大通信距離約10〜30m
- Bluetooth 4.1(2013年): マスター/スレーブの同時動作、接続パラメータ改善
- Bluetooth 4.2(2014年): パケットサイズ拡大(最大251バイト)、IPv6 over BLE(6LoWPAN)対応、セキュリティ強化
- Bluetooth 5.0(2016年): 2Mbps PHY、LE Coded PHY(長距離最大400m)、広告チャンネル拡張
- Bluetooth 5.1(2019年): AoA/AoD方向探知、アドバタイズ間隔の細分化
- Bluetooth 5.2(2020年): LE Audio(LC3コーデック)、EATT、LE Power Control
- Bluetooth 5.3(2021年): 接続サブレーティング、チャンネル分類改善
- Bluetooth 5.4(2023年): PAwR(Periodic Advertising with Responses)、双方向放送通信
技術仕様
物理層(PHY)
| PHY種別 | データレート | 距離目安 | 用途 |
|---|---|---|---|
| LE 1M PHY | 1 Mbps | 〜30m | 標準(Bluetooth 4.x) |
| LE 2M PHY | 2 Mbps | 〜20m | 高スループット(Bluetooth 5.0+) |
| LE Coded PHY (S=2) | 500 kbps | 〜100m | 長距離(Bluetooth 5.0+) |
| LE Coded PHY (S=8) | 125 kbps | 〜400m | 超長距離(Bluetooth 5.0+) |
周波数チャンネル
2.4GHz帯の40チャンネルを使用:
- アドバタイジングチャンネル: 3チャンネル(ch37: 2402MHz、ch38: 2426MHz、ch39: 2480MHz)
- Wi-Fiの主要チャンネル(1/6/11)と干渉しない周波数を選択
- データチャンネル: 37チャンネル(2MHz間隔)
- FHSS(Frequency Hopping Spread Spectrum)で干渉回避
パケット構造
BLE パケット(最大255バイト)
┌─────────────┬─────────────┬──────────────────┬──────────────┐
│ Preamble │ Access Addr │ PDU │ CRC │
│ (1バイト) │ (4バイト) │ (2〜257バイト) │ (3バイト) │
└─────────────┴─────────────┴──────────────────┴──────────────┘
消費電力
BLEの消費電力の目安:
| 状態 | 消費電流(目安) |
|---|---|
| Deep Sleep / オフ | 0.1 µA 以下 |
| アドバタイズ(1秒間隔) | 平均 5〜30 µA |
| 接続待機(スレーブ) | 5〜50 µA |
| 接続・データ送受信時 | 3〜15 mA |
| アドバタイズ送信ピーク | 10〜20 mA(数ms) |
コイン電池(CR2032、225mAh)で計算すると、1秒間隔アドバタイズ+10秒に1回センサー送信なら、1〜2年以上の動作が可能です。
動作原理
プロトコルスタック
アプリケーション
├── Profiles(Health Thermometer / Heart Rate / Battery など)
├── GATT(Generic Attribute Profile):データの読み書き
├── GAP(Generic Access Profile):接続管理・アドバタイズ
├── SM(Security Manager):ペアリング・暗号化
├── ATT(Attribute Protocol):属性データの交換
├── L2CAP(Logical Link Control and Adaptation Protocol)
├── HCI(Host Controller Interface)
└── LL(Link Layer):物理層制御・チャンネルホッピング
接続モードとロール
BLEデバイスは以下のいずれかのロールで動作します:
- Broadcaster(送信専用): アドバタイズパケットのみ送信。接続を受け付けない(ビーコンなど)
- Observer(受信専用): アドバタイズパケットを受信するだけ
- Peripheral: アドバタイズを送信し、接続を受け入れる(センサーなど、旧称スレーブ)
- Central: スキャンしてPeripheralに接続を開始する(スマートフォンなど、旧称マスター)
接続シーケンス
Central(スマートフォン) Peripheral(センサー)
| |
| ADV_IND | ← アドバタイズ送信(定期的)
|<-----------------------------|
| |
| CONNECT_IND | ← 接続要求
|----------------------------->|
| |
| 接続確立(Connection) |
|<===========================> |
| |
| ATT Read / Write | ← GATTでデータ交換
|<===========================> |
コネクションレス通信(アドバタイズ)
接続を確立せず、アドバタイズパケットだけでデータを配信するモードです。電力効率が非常に高く、ビーコンやアドバタイズによる位置情報発信・センサーデータのブロードキャストに使用されます。
用途・ユースケース
ウェアラブル・ヘルスケア
- スマートウォッチ・フィットネストラッカー: 心拍数・歩数・血中酸素濃度の計測・通知
- 血糖値モニター(CGM): 植え込み型センサーからスマートフォンへのリアルタイム送信
- 血圧計・体重計: 計測データをスマートフォンアプリへ自動転送
- 補聴器: 低遅延音声ストリーミング(LE Audio / LC3)
スマートホーム・建物管理
- スマートロック: スマートフォンでドア施錠・解錠
- 照明制御: BLE Meshによる複数ライトの一括制御
- 環境センサー: 温湿度・CO2・PM2.5モニタリング
- 資産管理: タグをつけた物品のロケーショントラッキング
産業・物流
- 工場内センサー: 振動・温度・圧力センサーのワイヤレス化
- 物流トラッキング: パレット・コンテナへのタグ取り付け
- 工具管理: 工具の使用状況・所在地管理
位置情報・近接検知
- 屋内測位: BLEアンカーの電波強度(RSSI)または方向探知(AoA/AoD)で位置推定
- スマートフォンへの近接通知: 小売店でのクーポン配信など
実装・開発のポイント
代表的な開発ボード・モジュール
| 製品 | メーカー | SoC | 特徴 |
|---|---|---|---|
| nRF52840 DK | Nordic | nRF52840 | BLE5 + Thread + Zigbee + USB |
| nRF52 DK | Nordic | nRF52832 | BLE5 標準的な開発ボード |
| ESP32 | Espressif | ESP32 | Wi-Fi + BT Classic + BLE |
| Arduino Nano 33 BLE | Arduino | nRF52840 | ArduinoフォームファクターでBLE |
nRF5 SDK を使ったPeripheral実装例(C言語)
#include "nrf_sdh.h"
#include "nrf_sdh_ble.h"
#include "ble_advdata.h"
#include "ble_advertising.h"
#define APP_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) // 100ms間隔
#define APP_ADV_DURATION 18000 // 180秒間アドバタイズ
static ble_uuid_t m_adv_uuids[] = {
{BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE}
};
void advertising_init(void) {
ble_advertising_init_t init;
memset(&init, 0, sizeof(init));
init.advdata.name_type = BLE_ADVDATA_FULL_NAME;
init.advdata.include_appearance = true;
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;
init.srdata.uuids_complete.uuid_cnt = ARRAY_SIZE(m_adv_uuids);
init.srdata.uuids_complete.p_uuids = m_adv_uuids;
init.config.ble_adv_fast_enabled = true;
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
init.config.ble_adv_fast_timeout = APP_ADV_DURATION;
ble_advertising_init(&m_advertising, &init);
}
ESP32-Arduino でBLE Notifyを使う例
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
BLEServer* pServer = nullptr;
BLECharacteristic* pCharacteristic = nullptr;
bool deviceConnected = false;
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) override {
deviceConnected = true;
}
void onDisconnect(BLEServer* pServer) override {
deviceConnected = false;
pServer->startAdvertising(); // 切断後、再アドバタイズ
}
};
void setup() {
BLEDevice::init("ESP32-BLE-Sensor");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService* pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(true);
BLEDevice::startAdvertising();
}
void loop() {
if (deviceConnected) {
float temperature = readTemperatureSensor();
String value = String(temperature, 2);
pCharacteristic->setValue(value.c_str());
pCharacteristic->notify(); // 接続中のCentralへ通知
delay(1000);
}
}
BLE Mesh(Bluetooth Mesh)
Bluetooth 5.x以降ではBLE Meshが標準化され、メッシュネットワーク構成が可能です。数十〜数百台のBLEデバイスが中継しあい、広い範囲をカバーします。スマートビルの照明・ビルオートメーションで採用が増えています。
OTAアップデート
組み込みBLE機器のファームウェア更新にはOTA(Over-The-Air)更新が重要です。NordicのDFU(Device Firmware Update)、ESP32のOTA更新機能などを利用できます。
他技術との比較
BLE vs Bluetooth Classic vs Wi-Fi
| 項目 | BLE | Bluetooth Classic | Wi-Fi |
|---|---|---|---|
| 消費電力 | 非常に低い(µA〜mA) | 中〜高(mA〜百mA) | 高め(十〜数百mA) |
| スループット | 1〜2 Mbps | 最大3 Mbps | 数十Mbps〜数Gbps |
| 通信距離 | 10〜400m(PHYによる) | 10〜100m | 数十〜数百m |
| 主用途 | センサー・IoT・ウェアラブル | 音声・ストリーミング | データ通信全般 |
| インフラ不要 | はい | はい | 通常AP必要 |
BLE vs Zigbee
| 項目 | BLE | Zigbee |
|---|---|---|
| スマートフォン対応 | ネイティブ対応 | ゲートウェイ必要 |
| メッシュ | BLE Mesh(5.x以降) | 標準でメッシュ対応 |
| 消費電力 | 低い | 非常に低い |
| エコシステム | 非常に大きい | スマートホームに特化 |
ZigbeeはBLEよりも古くからメッシュに対応し、スマートホーム用途ではMatter規格の採用も進んでいます。スマートフォンとの直接接続が必要な場合はBLEが有利です。