シングルホップのBLEタグは屋内で10-30メートルの通信範囲を持ちます。20,000 m2の倉庫では、全面カバーに数十台のゲートウェイが必要です。メッシュネットワーキングはこのモデルを転換させます:タグが互いにパケットをリレーし、ホップごとに範囲を拡張してゲートウェイに到達します。BLE Mesh 1.0(2017)はマネージドフラッドリレーを導入し、Mesh 1.1(2023)はディレクテッドフォワーディングを追加しました。資産追跡において、メッシュは3つの問題を解決します:ゲートウェイコストを比例させずにカバレッジを拡張、冗長パスによるフォールトトレランス、個別タグのオフライン時の段階的劣化です。

本記事では、電池駆動の資産タグの観点からメッシュネットワーキングを解剖します。プロトコル内部構造、リレーノード選択、消費電力計算、レイテンシとスループット、100〜5000+ノードのスケーラビリティ限界、大規模プロビジョニング、セキュリティアーキテクチャ、ベンダースタック比較をカバーします。

1. BLE Meshプロトコルスタック

BLE Meshはアドバタイジングチャネル(37/38/39、2402/2426/2480 MHz)上でコネクションレスPDUを使用して動作します。スタックは5層で構成されます:

機能 主要パラメータ
ベアラー ADV/GATT上の転送 ADV: 31バイトPDU, 3ch; GATT: プロキシ, 20バイトMTU
ネットワーク アドレッシング, リレー, TTL 29バイトPDU, 7ビットTTL, 24ビットSEQ, 15ビットユニキャスト
下位トランスポート セグメンテーション, 再構築 12バイトセグメント, 20秒ACK
上位トランスポート アプリキー暗号化 アクセスペイロード暗号化, 4バイトtransMIC
アクセス モデルメッセージ, オペコード ベンダーモデル3バイト, SIGモデル2バイト

ネットワークPDUはコンパクトです:1バイトTTL、3バイトSEQ(リプレイ保護用24ビットシーケンス)、2バイトSRC、2バイトDST、最大12バイトのトランスポートペイロード。PDU全体が128ビットネットワークキーで暗号化されます。リレーノードはアプリケーションペイロードを復号せずにパケットを転送します。

資産タグではADVベアラーが唯一の実用的な選択肢です。GATT接続は接続イベント中に3-5 mAを消費し、コインセルタグには持続不可能です。リレーメカニズムはADVベアラー上でのみ動作します。

2.マネージドフラッド:リレーの仕組み

BLE Meshはルーティングテーブルではなくマネージドフラッドリレーを使用します。リレー機能が有効な全ノードが、3つの制御に従って受信メッセージを再送信します:

  • TTL(Time To Live): 7ビットカウンタ、各ホップで減算。TTLが0に達するとメッセージ停止。倉庫では5-7、キャンパスでは10+。
  • メッセージキャッシュ: 各ノードが(SRC, SEQ)でキー付けされた最近のメッセージをキャッシュ。最小2エントリ、実装では32-256エントリ。重複メッセージはサイレントドロップでループを防止。
  • ネットワークキー一致: 既知のネットワークキーで暗号化されたメッセージのみリレー。

リレー再送タイミング:メッセージ受信後、3.5 ms(固定バックオフ)+ 0-10 msランダム遅延後に3つのアドバタイジングチャネルで再送。ホップあたり総遅延:約4-15 ms。

なぜマネージドフラッドがルーティングより優れているのか?ZigbeeやThreadはルーティングテーブルを使用し、メモリ(エントリあたり8-16バイト)、定期ルート更新(電力消費)、トポロジー変更時の収束時間(秒〜分)が必要です。モバイル資産タグではルーティングテーブル収束は非現実的です。マネージドフラッドは3つすべてを回避します。代償はメッセージ重複とチャネル利用率の上昇です。

3.資産タグのリレーノード選択

全タグがリレーすべきではありません。リレー機能は平均消費電流に200-500 uAを追加し、コインセルタグには致命的です。戦略:インフラノードをリレーに指定し、資産タグは非リレーパブリッシャーとして動作させます。

基準 リレー適格 非リレー
電源 商用電源または大容量バッテリー CR2032, CR2477
移動性 固定インフラ モバイル資産タグ
位置 天井, 廊下, 入口 資産上のランダム
電波環境 安定RSSI (> -70 dBm) 移動による変動

実環境では20-30台の商用電源リレーノードでメッシュバックボーンを構成し、500-2000台の資産タグが非リレーノードとしてデータをパブリッシュします。リレー対タグ比はスケールに依存します:

スケール リレー タグ 比率
小(2,000 m2) 5-8 50-100 ~10%
中(10,000 m2) 15-25 300-500 ~5%
大(30,000 m2) 40-60 1000-2000 ~3%
キャンパス 80-150 3000-5000 ~2-3%

4.消費電力:リレー vs 非リレー

非リレータグ(nRF52840)

状態 電流 間隔 平均
スリープ(RAM保持) 1.5 uA 1.5 uA
RC32K + RTC 0.2 uA 0.2 uA
アドバタイズTX (+4 dBm) 4.6 mA 100 ms 24.3 uA
アドバタイズRX 5.2 mA 100 ms 23.4 uA
センサー読取(SHT40) 0.9 mA 10 s 0.18 uA
合計 ~49.6 uA

CR2032(175 mAh実効)、100 ms間隔:

寿命 = 175,000 uAh / 49.6 uA = 3,528時間 = 147日

1秒間隔(低消費電力モード):

合計平均 = 6.5 uA
寿命 = 175,000 / 6.5 = 26,923時間 = 3.1年

リレータグ(nRF52840、連続スキャン)

状態 電流 デューティ 平均
スリープ 1.5 uA 1.5 uA
スキャナRX(3ch) 5.2 mA 30% 1,560 uA
リレーTX 4.6 mA 0.5% 23 uA
自身のアドバタイズ 4.6 mA 0.05% 2.3 uA
合計 ~1,592 uA = 1.59 mA

CR2032:175,000 / 1,592 = 110時間 = 4.6日(非現実的)

単4 x4(2,500 mAh):2,500,000 / 1,592 = 1,571時間 = 65日

商用電源:無制限

結論:リレーノードには外部電源が必要です。コインセルタグはリレーを有効にすべきではありません。実環境では商用電源の専用リレーインフラを使用します。

5.メッセージレイテンシとスループット

ホップあたりレイテンシ

各リレーホップ:受信処理(1-3 ms)+ リレーバックオフ(3.5 + 0-10 ms)+ アドバタイズイベント(1.1 ms)= 5-16 ms標準、20 ms最悪。

5ホップ: 25-80 ms標準, 100-150 ms最悪
10ホップ: 50-160 ms標準, 200-300 ms最悪

チャネル混雑

負荷(msgs/s) 利用率 損失率 備考
50 ~1% <0.1% クリーン
200 ~4% 0.5-1% 500ノードで正常
500 ~10% 2-5% 限界接近
1000 ~21% 8-15% 混雑
2000 ~42% 25-40% 信頼性低下

500ノードメッシュ、5%リレー、TTL=7、1msg/10s:

オリジナル: 500 x 0.1 = 50 msgs/s
リレー増幅: x3.3
合計: 165 msgs/s, 利用率3.4%, 損失<0.5%

1msg/s(リアルタイム追跡):

合計: 1,650 msgs/s, 利用率34%, 損失15-25%(サブネット必須)

6.スケーラビリティ分析

ノード リレー TTL 負荷 損失 P95 評価
100 5 5 33/s <0.1% 40 ms 優秀
500 25 7 165/s 0.5% 80 ms 良好
1000 50 7 330/s 2-3% 120 ms 許容
2000 100 10 660/s 5-8% 200 ms 限界
5000 250 10 1650/s 15-25% 500 ms サブネット必須
5000(5サブネット) 250 7 330/サブ 2-3% 120 ms 良好

サブネット戦略

  • 地理的: 階/建物ごとにサブネット。入口にブリッジノード。
  • 機能的: アプリごとにサブネット。クロストラフィック削減。
  • 階層型: バックボーンサブネット(リレー専用)でタグサブネット接続。最スケーラブル。

各サブネットは32,767ユニキャストアドレスをサポート。実際の制約はアドレス空間ではなくチャネル利用率です。

7.Mesh 1.1ディレクテッドフォワーディング

Mesh 1.1(2023)はディレクテッドフォワーディングを導入:マネージドフラッドの代わりに事前計算パスでユニキャストメッセージを転送。パス上のノードのみがメッセージを転送します。

利点:ユニキャストトラフィックのチャネル利用率60-80%削減、サブネットなしで5000+ノード、レイテンシ20-30%削減。

トレードオフ:ルーティングテーブルメモリ(0.4-3.2 KB RAM)、パス収束(2-10秒)、Mesh 1.1スタック必要。

推奨:固定インフラリレーノードでディレクテッドフォワーディングを有効化、モバイルタグはマネージドフラッドを維持。

8.大規模プロビジョニング

プロビジョニングはユニキャストアドレス、ネットワークキー、アプリキー、IVインデックスを割り当てます。PB-ADV(3-8秒/デバイス)またはPB-GATT(10-20秒)を使用。

バッチプロビジョニング:

順次: 1000 x 5s = 83分
バッチ(10): 8.3分
バッチ(20): 4.2分

実用上限:20並列セッション(チャネル混雑による失敗防止)。

アドレス割り当て

範囲 目的
0x0001-0x00FF プロビジョナー 255
0x0100-0x0FFF リレー/インフラ 3,840
0x1000-0x7EFF 資産タグ 28,160
0x7F00-0x7FFF 予約 256

9.セキュリティアーキテクチャ

キー スコープ 目的
デバイスキー(128bit) デバイスごと、プロビジョナーのみ 設定、ノードリセット
ネットワークキー(128bit) サブネットごと、全ノード ネットワーク層暗号化
アプリキー(128bit) アプリごと アクセス層、センサーデータ

リレーノードはネットワークキーでメッセージを転送しますが、アプリケーションペイロードは復号できません。侵害されたリレーはネットワークアクセスを得るがセンサーデータは読めません。

IV更新

24ビットSEQがリプレイ保護を提供。IVインデックス(32ビット)がSEQ空間をリセットするために増分。最小間隔96時間。1msg/10sでSEQオーバーフローまで1,942日(5.3年)。資産タグではIV更新は稀です。

マルチテナント分離

複数のアプリキーが論理的分離を提供。各テナントが固有のアプリキーを持ち、同じネットワークキーとリレーインフラを共有してもタグは互いのデータを読めません。

10.BLE Mesh vs Thread vs Zigbee

パラメータ BLE Mesh Thread Zigbee 3.0
PHY速度 1-2 Mbps 250 kbps 250 kbps
リレー マネージドフラッド/ディレクテッド RPLルーティング ツリー+メッシュ
ルーティング状態 0 KB 1-4 KB 2-8 KB
最大ノード 1000-5000/サブネット 250-500 250-500
スリープ電流 1.5-5 uA 3-10 uA 2-5 uA
TX電流(+4dBm) 4.6 mA 8.0 mA 8.0 mA
モバイルノード 優秀 不良 不良

BLE Meshは資産タグで3点で優位:最低TX電流(1 Mbps PHY vs 250 kbps)、モバイルノードの即時適応(フラッド vs ルーティング収束)、ネイティブBLE無線互換性。

11.ゲートウェイ統合

メッシュゲートウェイはメッシュに参加し(ネットワークキー保持)、IP接続(Ethernet, Wi-Fi, セルラー)を持ちます。メッシュメッセージを受信しMQTT/HTTPSでクラウドに転送します。

2つの設計:(1) プロキシゲートウェイ(GATTプロキシサービス、アドホック電話アクセス用);(2) 組み込みゲートウェイ(nRF52840 + Wi-Fi、24/7 MQTTブリッジ)。

ゲートウェイ密度:200-500メッシュノードあたり1台。複数ゲートウェイで冗長性、クラウドは(SRC, SEQ)で重複排除。

タグ --> リレー --> リレー --> ゲートウェイ --> MQTT --> ダッシュボード
エンドツーエンド: 200-800 ms

12.ベンダーメッシュスタック比較

ベンダー SDK SoC Mesh 1.1 RX電流 備考
Nordic NCS 2.5+ nRF52840/nRF5340 Yes 5.2 mA 最良ドキュメント、Zephyr
Silicon Labs GSDK 4.3+ EFR32BG22/BG24 Yes 4.8 mA 低RX、BG24 96KB RAM
TI BLE-STACK 5.x CC2642R/CC2652R 部分 5.9 mA SimpleLink
Espressif ESP-IDF ESP32-C3/C6 No(1.0) 8-12 mA Wi-Fi+BLEゲートウェイ

資産タグではNordic nRF52840がデフォルト:成熟したスタック、最良ドキュメント、最低スリープ+スキャン電流。SiLabs EFR32BG24はディレクテッドフォワーディング用(大RAM)。ESP32-C3/C6はWi-Fiが必要なゲートウェイに最適。

13.コード例

リレー設定(nRF Connect SDK / Zephyr)

#include 

static void configure_relay_node(uint16_t addr)
{
    int err;
    uint8_t count, intvl;
    
    err = bt_mesh_cfg_relay_set(net_key_idx, addr,
        BT_MESH_RELAY_ENABLED,
        BT_MESH_TRANSMIT(1, 10),
        &count, &intvl);
    if (err) {
        printk("Relay set failed: %d", err);
        return;
    }
    
    err = bt_mesh_cfg_ttl_set(net_key_idx, addr, 7);
}

センサーデータパブリッシュ

#define SENSOR_DATA_OP  BT_MESH_MODEL_OP_2(0x12, 0x00)

struct __attribute__((packed)) sensor_payload {
    int16_t temperature;
    uint16_t humidity;
    uint16_t battery_mv;
};

static int publish_sensor(int16_t temp, uint16_t hum, uint16_t batt)
{
    struct sensor_payload p = { temp, hum, batt };
    struct bt_mesh_msg_ctx ctx = {
        .addr = 0xC001,
        .send_ttl = 7,
        .app_idx = app_key_idx,
    };
    
    BT_MESH_MODEL_BUF_DEFINE(buf, SENSOR_DATA_OP, sizeof(p));
    bt_mesh_model_msg_init(&buf, SENSOR_DATA_OP);
    net_buf_simple_add_mem(&buf, &p, sizeof(p));
    return bt_mesh_model_publish(&sensor_model);
}

Python: スケーラビリティ推定

class MeshScalability:
    def __init__(self, n_nodes, relay_ratio, ttl, msg_interval_s, subnets=1):
        self.n = n_nodes
        self.relays = int(n_nodes * relay_ratio)
        self.ttl = ttl
        self.interval = msg_interval_s
        self.subnets = subnets
        self.capacity = 4800
    
    def relay_amp(self):
        return 1 + self.relays * 0.3 * min(self.ttl / 7.0, 1.0)
    
    def total_load(self):
        per_subnet = self.n / self.subnets
        return (per_subnet / self.interval) * self.relay_amp()
    
    def utilization(self):
        return self.total_load() / self.capacity
    
    def loss(self):
        u = self.utilization()
        if u < 0.04: return u * 0.1
        elif u < 0.10: return 0.004 + (u - 0.04) * 0.3
        elif u < 0.21: return 0.022 + (u - 0.10) * 0.5
        else: return 0.077 + (u - 0.21) * 1.2

m = MeshScalability(500, 0.05, 7, 10)
print(f"Load: {m.total_load():.0f} msgs/s, Loss: {m.loss()*100:.1f}%")

14.デバッグと診断

  • メッシュスニッファ: Wireshark用nRF SnifferでBLE。TTL減算、リレー再送、キャッシュヒットを確認。
  • ハートビート監視: リレーノードからハートビートパブリケーションを設定。TTLとRSSIでネットワーク健全性を可視化。
  • リレー統計: ノードごとのリレー数、キャッシュヒット率、再送失敗を追跡。高ヒット率は良好なカバレッジ、低ヒット率はカバレッジギャップを示す。
  • 一般的な問題: TTL枯渇(TTL増加かリレー追加)、キャッシュオーバーフロー(サイズ増加)、チャネル混雑(公開レート削減かサブネット)、プロビジョニングタイムアウト(バッチサイズ削減)。

15.生産設計チェックリスト

  • [ ] リレー/非リレー比の決定(目標3-10%)
  • [ ] 消費電力計算:リレーノードは外部電源必須
  • [ ] TTL設定:単一建物5-7、キャンパス10+
  • [ ] メッセージキャッシュ設定:最小32エントリ(192バイトRAM)
  • [ ] 1000ノード超はサブネットアーキテクチャ計画
  • [ ] バッチプロビジョニングワークフロー設計(最大20並列)
  • [ ] マルチテナント分離用キー階層設定
  • [ ] 公開間隔設定:監視10s、リアルタイム1s(サブネット必要)
  • [ ] 混雑ストレステスト:想定トラフィックの2x注入で損失測定
  • [ ] ゲートウェイ密度計画:200-500ノードあたり1台、冗長性あり
  • [ ] ハートビート監視有効化
  • [ ] 2000ノード超はMesh 1.1ディレクテッドフォワーディング検証
  • [ ] モバイルタグ動作テスト:ゾーン間移動時のパス適応確認
  • [ ] IV更新手順とキーリフレッシュスケジュール文書化
  • [ ] ファームウェアOTA:バルクアップデート用メッシュモデル配布

結論

BLEメッシュネットワーキングは資産追跡をシングルホップ・ゲートウェイ飽和モデルからスケーラブルな自己修復ネットワークに変革します。主要な設計決定は:(1) リレーノードに商用電源インフラを使用、コインセルタグは不可;(2) リレーノード対タグ比を3-10%に設定;(3) 1000アクティブノード超はチャネル利用率監視とサブネット;(4) 2000ノード超はMesh 1.1ディレクテッドフォワーディング活用;(5) 生産展開用バッチプロビジョニングとゲートウェイ冗長性計画。

消費電力分析は厳しいものです:リレー有効CR2032タグは4.6日、非リレータグは1秒間隔で3.1年。この2400倍の違いがアーキテクチャを決定づけます:商用電源のインフラリレー、バッテリータグは非リレーパブリッシャー。この分離を正しく行えば、メッシュが残りを処理します。50台の倉庫タグでも5000台の工場キャンパスでも、これらの原則が実環境で動作するBLEタグメッシュネットワークの構築を支援します。