近距離無線

ビーコン(iBeacon / Eddystone)

位置情報を発信する小型BLE機器。

概要

ビーコン(Beacon)とは、BLE(Bluetooth Low Energy)アドバタイズ機能を利用して位置情報・識別情報を定期的に発信する小型機器またはその技術の総称です。発信専用で一方向のブロードキャストのみを行い、接続を受け付けないシンプルな動作が特徴です。

代表的な規格として、Appleが2013年に発表したiBeaconとGoogleが2015年に発表したEddystoneがあります。どちらもBLEのManufacturer Specific DataまたはService Dataフィールドに識別子を格納し、受信したスマートフォンがアプリ側で位置・コンテンツ情報と紐付ける仕組みです。

主な活用場面は屋内測位・近接通知・資産管理・スマート小売・博物館/美術館のガイドシステムなどです。GPSが届かない屋内環境での位置情報提供手段として広く使われています。

歴史・背景

BLEの登場(2010年)により、コイン電池で1〜2年動作する超小型無線発信機の実現が可能になりました。2013年、AppleがiOS 7とiPhone 4S以降向けにiBeacon APIを発表。BLEを使った屋内測位・近接通知のエコシステムを切り拓きました。

2015年、GoogleはEddystoneをオープン仕様として公開。URLビーコン(Physical Web)の概念を推進し、専用アプリなしでビーコン近くのWebコンテンツを表示できる仕組みを提案しました。ただしPhysical Webプロジェクトは2018年に終了し、現在はEddystoneはIoT/資産管理用途が中心です。

2016年以降はBluetooth 5.0の長距離・高精度化、2019年以降はBluetooth 5.1のAoA/AoD方向探知機能によりビーコン測位精度が向上しています。

技術仕様

iBeacon パケット構造

iBeaconはBLEのManufacturer Specific Data(AD Type: 0xFF)を使用します:

BLE Advertising PDU Payload(31バイト以内)

[AD Structure: Flags]
01 02 | 01 | 06
(len) (type)(flags: LE general discoverable, BR/EDR not supported)

[AD Structure: Manufacturer Specific Data]
1A | FF | 4C 00 | 02 15 | <16バイトUUID> | <Major 2B> | <Minor 2B> | <TX Power 1B>
(len)(type)(Apple CompanyID)(iBeacon type)(Proximity UUID)(主要区分)(副区分)(TX電力)

フィールド説明:
- Proximity UUID(16バイト): ビーコングループの識別子(会社・施設単位)
- Major(2バイト): グループ内の中区分(店舗・フロアなど)
- Minor(2バイト): グループ内の小区分(棚・席など)
- TX Power(1バイト): 1m距離での基準RSSI(符号付き整数、dBm)

iBeaconの識別例:

Proximity UUID: E2C56DB5-DFFB-48D2-B060-D0F5A71096E0
Major: 1        → 1号店
Minor: 101      → 棚番号101
TX Power: -59   → 1m時の基準RSSI: -59dBm

Eddystone パケット構造

EddystoneはBLEのService Data(AD Type: 0x16)を使用。3種類のフレームタイプがあります:

Eddystone-UID(識別子ビーコン)

Service Data(20バイト)
┌─────────────┬───────────────┬────────────────┬────────────────┐
│ Frame Type  │ TX Power(1B)  │ Namespace(10B) │ Instance(6B)   │
│ 0x00(1B)    │               │                │                │
└─────────────┴───────────────┴────────────────┴────────────────┘
- Namespace: 10バイトの識別子(企業・サービス識別)
- Instance: 6バイトの個体識別子

Eddystone-URL(URLビーコン)

Service Data(4〜20バイト)
┌────────────┬──────────────┬──────────────┬──────────────────────┐
│ Frame Type │ TX Power(1B) │ URL Scheme   │ Encoded URL          │
│ 0x10(1B)   │              │ (1B)         │ (最大17バイト)        │
└────────────┴──────────────┴──────────────┴──────────────────────┘
URL Scheme: 0x00="http://www.", 0x01="https://www.", 0x02="http://", 0x03="https://"

Eddystone-TLM(テレメトリ)

Service Data(14バイト)
含まれる情報: バッテリー電圧、温度、アドバタイズカウント、稼働時間
センサーデータとして使用可能

RSSI距離推定

ビーコンの距離推定は受信信号強度(RSSI)を使用します:

距離推定式(フリスの伝搬式をベースにした近似):
distance = 10 ^ ((TxPower - RSSI) / (10 * n))

パラメータ:
- TxPower: 1m距離での基準RSSI(iBeaconのTX Powerフィールド)
- RSSI: 実測の受信電力(dBm)
- n: 環境係数(自由空間=2、室内=2.0〜3.5程度)

例: TxPower=-59dBm、RSSI=-75dBm、n=2.5の場合
distance = 10 ^ ((-59 - (-75)) / (10 × 2.5))
         = 10 ^ (16/25) = 10 ^ 0.64 ≈ 4.4m

RSSIは壁・人体・電波干渉の影響を受けやすく、精度は1〜3m程度です。精度を上げるには複数ビーコンのトライラテレーションや機械学習を使ったフィンガープリント法が使われます。

AoA/AoD方向探知(Bluetooth 5.1)

Bluetooth 5.1では電波の到来方向を検知するAoA(Angle of Arrival)とAoD(Angle of Departure)が標準化されました:

  • AoA: 複数アンテナを持つLocatorがビーコンの電波到来方向を計算(精度1〜2°)
  • AoD: ビーコン側が複数アンテナから交互に送信し、Receiverが方向を計算

これにより理論上10〜30cm精度の測位が可能になりました。

動作原理

ビーコンの動作フロー

ビーコンデバイス                    スマートフォン/ゲートウェイ
      |                                     |
      |--- ADV_NONCONN_IND(100ms毎)------> |  ← 受信・RSSI測定
      |--- ADV_NONCONN_IND(100ms毎)------> |
      |--- ADV_NONCONN_IND(100ms毎)------> |  ← UUID/Major/Minorを解析
      |                                     |
      |                        アプリがバックエンドAPIへ問い合わせ
      |                        → 位置・コンテンツ情報取得
      |                        → 近接通知・処理実行

三点測位(トライラテレーション)

3台以上のビーコンの距離を組み合わせて位置を推定します:

ビーコンA (3m) ──┐
ビーコンB (5m) ──┼── 交差点 = 推定位置
ビーコンC (4m) ──┘

計算式(2D):
(x - xa)² + (y - ya)² = da²
(x - xb)² + (y - yb)² = db²
(x - xc)² + (y - yc)² = dc²
→ 連立方程式を解いて(x, y)を求める

用途・ユースケース

小売・商業施設

  • 棚近接通知: 特定商品の棚に近づいたユーザーへクーポン配信
  • フロアマップ案内: ショッピングモール内の現在地表示・ナビゲーション
  • チェックイン自動化: 店舗入店を自動検知してポイント付与
  • 待ち時間表示: レジ・サービスカウンターの待ち時間リアルタイム通知

博物館・美術館・テーマパーク

  • 展示物案内: 展示物の前に近づくと自動的に解説コンテンツを表示
  • 子どもの迷子防止: 保護者・子どものビーコンが離れたら通知
  • 入場者分析: 展示物ごとの滞在時間・人流データ収集

医療・介護

  • 患者・スタッフ追跡: 院内での位置情報管理
  • 資産管理: 車椅子・医療機器の所在管理
  • 手指衛生コンプライアンス: 処置前後の手指消毒確認

物流・倉庫

  • 資産・パレット管理: 倉庫内の物品位置追跡
  • フォークリフト動線管理: 作業効率化・安全管理
  • 入出庫自動記録: ゲートへの接近を検知して自動記録

実装・開発のポイント

iBeaconの実装(ESP32)

#include <BLEDevice.h>
#include <BLEAdvertising.h>

// iBeacon送信
void startIBeacon(
    const char* uuidStr,   // Proximity UUID
    uint16_t major,        // Major値
    uint16_t minor,        // Minor値
    int8_t txPower         // 1m時の基準RSSI
) {
    BLEDevice::init("");
    BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();

    // iBeaconペイロード構築
    uint8_t beaconData[25];
    beaconData[0] = 0x02;  // iBeacon type
    beaconData[1] = 0x15;  // iBeacon length (21 bytes)

    // UUID文字列をバイト列に変換(簡略化)
    // 実際はuuidStrをパースして16バイトに変換
    uint8_t uuid[16] = {0xE2,0xC5,0x6D,0xB5,0xDF,0xFB,0x48,0xD2,
                        0xB0,0x60,0xD0,0xF5,0xA7,0x10,0x96,0xE0};
    memcpy(&beaconData[2], uuid, 16);

    beaconData[18] = major >> 8;
    beaconData[19] = major & 0xFF;
    beaconData[20] = minor >> 8;
    beaconData[21] = minor & 0xFF;
    beaconData[22] = (uint8_t)txPower;

    BLEAdvertisementData advData;
    // Apple Company ID: 0x004C
    std::string mfgData;
    mfgData += (char)0x4C;
    mfgData += (char)0x00;
    for(int i = 0; i < 23; i++) mfgData += (char)beaconData[i];
    advData.setManufacturerData(mfgData);

    pAdvertising->setAdvertisementData(advData);
    pAdvertising->setAdvertisementType(ADV_TYPE_NONCONN_IND);  // 接続不可
    pAdvertising->setMinInterval(160);  // 100ms
    pAdvertising->setMaxInterval(160);
    pAdvertising->start();
}

Eddystone-URL の実装(ESP32)

void startEddystoneURL(const char* url, int8_t txPower) {
    BLEDevice::init("");
    BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();

    BLEAdvertisementData advData;
    advData.setFlags(0x06);

    // Eddystone Service UUID: 0xFEAA
    std::string serviceUUID;
    serviceUUID += (char)0xAA;
    serviceUUID += (char)0xFE;
    advData.setCompleteServices(BLEUUID((uint16_t)0xFEAA));

    // Service Data
    std::string serviceData;
    serviceData += (char)0xAA;  // Eddystone UUID下位
    serviceData += (char)0xFE;  // Eddystone UUID上位
    serviceData += (char)0x10;  // Frame Type: Eddystone-URL
    serviceData += (char)txPower;
    serviceData += (char)0x03;  // URL Scheme: "https://"
    serviceData += url;         // エンコード済みURL
    advData.setServiceData(BLEUUID((uint16_t)0xFEAA), serviceData);

    pAdvertising->setAdvertisementData(advData);
    pAdvertising->start();
}

ビーコン密度の設計

屋内測位システムを設計する際の考慮点:

推奨ビーコン配置間隔:
・RSSI測位(精度3〜5m): 5〜10m間隔
・高精度測位(精度1〜2m): 3〜5m間隔
・AoA/AoD測位(精度0.1〜0.3m): アンカーアレイ設置

アドバタイズ間隔の推奨:
・移動体追跡: 100〜200ms(更新頻度重視)
・省電力設置型: 500ms〜1s

バッテリー寿命

コイン電池(CR2032)搭載の典型的なビーコン:

アドバタイズ間隔推定電池寿命
100ms(0dBm)約12〜18ヶ月
300ms(0dBm)約24〜36ヶ月
1000ms(0dBm)約36〜60ヶ月
100ms(+4dBm)約9〜12ヶ月

他技術との比較

ビーコン vs NFC

項目BLEビーコンNFC
通信距離1〜数十m数cm以内
一方向 vs 双方向一方向発信双方向
アクティブ操作不要(自動検知)タッチ動作必要
バッテリー電池必要(パッシブタグなし)パッシブタグあり(電池不要)
精度RSSIは数m誤差非常に高い(物理接触レベル)
主用途屋内測位・近接通知決済・認証・URL起動

NFCは確実な近距離識別に強く、BLEビーコンは能動的な近接通知・屋内測位に強みがあります。

ビーコン vs UWB

項目BLEビーコンUWB
測位精度1〜5m(RSSI)、0.1〜0.3m(AoA)10〜30cm
コスト低(数百円〜)高め(数千円〜)
スマートフォン対応iOS/Android標準iPhone11+、Android一部
電力消費非常に低いBLEより高め
主用途屋内測位・近接通知高精度測位・デジタルキー

UWBはより高精度な測位が可能ですが、コストと普及度でBLEビーコンが優位です。用途の精度要件に応じて選択します。

関連用語

参考リンク