Bluetooth meshってどうよ
2017年7月18日、長いこと蕎麦屋の出前のような状況が続いていた Bluetooth mesh がついに正式発表されました。この記事では Bluetooth mesh について紹介します。
そもそもBluetoothのおさらい
歴史も長く言葉や製品自体はありふれている Bluetooth ですが、色々と複雑な経緯があるのでBluetooth mesh の話をする前におさらいです。
Bluetooth は2.4GHz の周波数帯を利用する無線通信技術です。この2.4GHz という周波数帯は ISM バンドと呼ばれるものの一つで、本来は電子レンジなど無線通信以外に利用することを目的として確保されています。混信が多いという前提の上で、重要性の低い無線通信にも比較的に自由に利用することが多くの国で認められていることから、コードレス電話や無線 LAN などで活用されています。口の悪い人はこの2.4GHz のことを「電波のゴミ溜め」などと揶揄したりするようですが、無線LAN で2.4GHz 帯と5GHz 帯を比較したことがある人は実感があるのではないでしょうか。実際にコミケの会場では2.4GHz 帯は不毛の大地です。
Bluetooth の規格は、3.0までのもの(クラシック Bluetooth)と、4.0以降(Bluetooth Low Energy、BLE)で基本的な仕様がまったく異なります。本当にまったくもって互換性がなく規格の方向性も異なるため、クラシック Bluetooth の最新である3.0+HS と、4.x の両方に対応している機器もあります。どちらも、基本的には「ペアリング」で通信相手を特定して1対1のコネクション型の通信を行います。
これから紹介する Bluetooth mesh は、BLE ベースの規格です。
Bluetooth meshの登場
これまでの Bluetooth は、先ほど書いたとおり1対1の接続を前提としていました。ところが、1対1の通信を始めるときに、主に通信相手を探したりする用途で「アドバタイジング」という1対多の送信をする仕組みが用意されています。
このアドバタイジングのパケットを活用(転用?)したものが、いわゆる「BLE ビーコン」です。Appleが位置測位のために2013年に公開した iBeacon をきっかけとして、一気に普及することになりました。技術的には、大昔から存在するアクティブ型の RFID などと同じです。本来の Bluetooth の1対1の通信の場合は見通しでも20~30メートルぐらいが距離の限界と言われていましたが、短いデータを一方的に繰り返し送信する BLE ビーコンでは見通し100メートルぐらいは届いたりします。
これに目を付けた会社がいくつかあり、Zigbee などで既に研究が進んでいた無線メッシュネットワークの技術を BLE アドバタイジングに転用することにしました。そこから紆余曲折あった結果、Bluetooth の高音質オーディオ CODEC「aptX」などの技術をもつ CSR 社(現在は Qualcomm社が買収)が開発した CSRmesh プロトコルをベースとする形で、Bluetooth mesh として標準規格になりました。
Bluetooth meshの特徴
まず一番の基本的な所として、IPv4/IPv6など他のネットワークプロトコルとの互換性はありません。まったく独自にアドレス体系、ルーティング方式、データフォーマットを持ちます。Bluetooth 4.2で6LoWPAN と呼ばれる方式で IPv6の通信が可能になりましたが、それはあくまでペアリングして1対1の通信を行うためのもので、この Bluetooth mesh とは全くの無関係です。また、2016年に発表された Bluetooth 5とも直接は無関係で、Bluetooth mesh 自体は4.0以降の全てと互換性があります。
Bluetooth mesh は、数台から数千台というレンジをカバーするネットワーク規格です。したがって、インターネットのようなグローバルなものではなく、組織や建物など比較的小さいエリアをカバーするためのものです。アドレスは15ビット分の長さがあるので、規格上は「3万2000ノードまでサポート」という表現がされているようです。後述するように、数万ノードが相互に大量の通信を継続して行うには向いておらず、用途によりけりというところはあります。
メッシュネットワークということで、ルーティングの仕方が一番気になるところだと思います。基本的な考え方は「Managed Flooding」と呼ばれ、いわゆるフラッディング型と呼ばれる方式の一種です。IPネットワークをご存知の方は「一体何なんだ!その乱暴なネットワークは!」と驚くような手法ですが、以下の組み合わせで動いています。なお、Bluetooth mesh ではデータの単位をパケットではなくメッセージと呼びますが、だいたい同じです。
1.誰がどこに居るか気にしない⇒TTLが尽きるまでリレー
IP ネットワークで言うような「経路表」のようなものはもちません。とにかく自分宛でないメッセージを受信したら中継して再送信します。そのときに、メッセージ内の TTL を一つ減らします。TTL の考え方は IP と同じで、最初に送信するときに設定できます。
また、電波ですので指向性とかも気にせず、とにかく TTL が尽きるところまで送られます。TTL が余程低くない限り、基本的に全てのノードが受け取ることになります。これが「フラッディング」と呼ばれる所以です。

2.メッセージキャッシュ
先ほどの図で、中央のノードが中継した TTL=15のメッセージは、左上でも受信できるんじゃないの?と思った方、正解です。そういうループを避けるため、自分が転送したメッセージを全てのノードはキャッシュします。
メッセージ全体をキャッシュするのはさすがに効率が悪いので、全てのメッセージにはシーケンス番号という連番が設定されています。このシーケンス番号と送信者のアドレスのペアをキャッシュして、既に中継したメッセージかどうかを判別します。
この TTL とメッセージキャッシュに基づいて、とにかく「既に宛先に届いたかどうかにかかわらずネットワーク全体にメッセージを行き渡らせる」のが Managed Flooding の方針です。固定した「経路」などをもたないため、ノードが居たはずなのに突然居なくなったり、あるいは増えたりしても、特に何か新しいトポロジ変更のような処理は必要ありません。基本的には、物理的に電波が冗長に届くように配置する前提で、このような割り切りになっています。その分「不必要」なメッセージが飛び交っているため、2.4GHz 帯には余り優しく無いとも言えますが、BLE 自体の通信時間は極めて短いため、それほどでもないようです。
Bluetooth meshのセキュリティ
いまどき新しく開発されるプロトコルなので当然ながら暗号学的に正しく設計されています。
Bluetooth mesh は3つの鍵で保護されています。そのうち一つはノードがネットワークに参加するときの確認に使われる「デバイスキー」で、残りの二つが実際にネットワーク上を流れるメッセージの内容を保護するための「ネットワークキー」と「アプリケーションキー」です。
メッシュネットワーク上のメッセージは全て、ネットワークキーとアプリケーションキーの二つで、入れ子上に暗号化されています。ネットワークキーは、そのアドレス空間を構成するネットワーク全体で共通のものです。ネットワークキーを知らなければ転送元、転送先を含む全ての情報を知ることができません。Managed flooding の転送処理はこのネットワークキーを復号した状態で行われ、再び暗号化されて無線送信されます。
名前の通りですが、その中のアプリケーションデータを守るのがアプリケーションキーです。この二重構造により、単にリレーだけするようなノードはアプリケーションデータを知ることができません。見通しで100メートルぐらい届くことがあるとはいえ、建物の内部などでは数十メートルがいいところですから、アプリケーションとして実際に役割を果たすノードの他に、電球などにリレー専用のノードをばらまくことが考えられます。そのような「メッシュネットワークインフラ」を想定しているのだと思います。
ちなみに、この二重暗号化のモデルどこかで見たことありますね、そうです、本書の前の方で特集している SORACOM も使っている LoRaWAN です。あちらも、ネットワーク全体のキーとアプリケーション毎のキーが分かれています。そもそも長距離でスター型の LPWA と、短距離でメッシュ型のBluetooth mesh で似たようなアーキテクチャになってくるのは興味深いところです。
で、なにができるの?
注意深くプレスリリースや概要資料等では隠されていますが、そもそも Bluetooth 4.0でのアドバタイジングは最大で31バイトしか入りません。というわけで、Bluetooth 4.x を使っている限りは実際の転送能力もお察しの通りです。ただし、規制の厳しいサブギガ帯を使う LPWA などと異なり送信間隔などの制限はない(かわりに混信しやすい)ので、転送能力の総量は LPWA より多くなります。
あくまで Bluetooth mesh の規格としては、途中の Upper Transport 層での暗号化時に380バイトという制限がありますが、それは Bluetooth 5以降でのアドバタイジングの長さ拡張が前提となります。Bluetooth 4.x の場合は、パラメータ設定によって異なりますが、だいたい実際のデータ本体としては1回に10バイトぐらいが限界のようです。LPWA と同じく「1ビットは血の一滴」を要求される世界ですね。
実際のメッセージで送ることができるデータは、「Mesh Model」という仕様において「モデル」という枠組みで定義されています。色々と、ありがちなデータのパターンがモデルとして定義されているので、眺めてみると「奴等はこんな利用ケースを想定しているのか」ということが大変よく分かります。というか照明制御好き過ぎでしょ。
たかが1回10バイトでも制約が少なく自由に飛ばせるので、デバイス側で必要な有効数字に落とし込んで送ったりする分には十分ですし、通知や制御にも十分活用ができると思います。LPWA 以上に、パズルが楽しい技術ではあります53。