nRF5 SDK for Meshで学ぶBluetooth mesh①~プロトコル概要~
実装を見てみないと、どういうものなのかよくわからないので、NordicのSDKを解析しながら、どういうものか理解していきます。
はじめに
Bluetooth meshは、2017年夏に採用された新しい規格です。Bluetooth Low Energyの技術を応用して、メッシュネットワークを構築します。 早い話が、BLEデバイス同士が通信して、より遠くへ通信できるようになります。
今回はソースコードに手を付ける前に、Bluetooth SIGのBluetooth meshネットワークを読んで、Bluetooth meshの要点をまとめていきます。
Bluetooth meshの基本
概念と用語
meshとポイントツーポイント
BLEは、P2Pの1対1通信を行い、これを「ピコネット」と呼んでいます。 一方、meshネットワークは多対多接続になるため、mesh内の各デバイスはどれでも互いに通信できます。 メッセージは中継転送できるため、エンドツーエンドの通信距離が各ノードの通信領域をはるかに超えます。
デバイスとノード
meshネットワーク内のデバイスはノード
、そうでないデバイスはプロビジョニングされていないデバイス
と呼びます。
デバイスをノードに変えるプロセスをプロビジョニング
と呼びます。
プロビジョニングは、プロビジョニングされていないデバイスに一連の暗号化キーを渡し、プロビジョナー
デバイス(スマートフォンやタブレット)に認識させるセキュリティ手順です。
暗号化キーには、NetKey
と呼ばれるものがあります。このキーを所有することでノードとして認められます。
エレメント(要素)
ノードには、複数の部分から構成されていて、各部分を個別に制御できるものがります。このような構成部分をエレメント
と呼びます。
メッセージ
他のノードにステータスを問い合わせたり、他のノードを制御する場合、該当するタイプのメッセージを送信します。
メッセージには大きく肯定応答要求
と肯定応答不要
の2種類に分類できます。
アドレス
メッセージはアドレス間で送受信されます。 Bluetooth meshには3種類のアドレスが定義されています。
- ユニキャストアドレス:個々のエレメントを一意に識別するアドレスです。
- グループアドレス:1つまたは複数のエレメントを示すマルチキャストアドレスです。Bluetooth SIGが定義した
SIG Fixed Group Address
と動的に割り当てられたアドレスがあります。 - 仮想アドレス:1つまたは複数のノード内の1つまたは複数のエレメントに割り当てることができます。エレメントを関連付けることのできるUUIDで、ラベルのようなものです。
パブリッシュ / サブスクライブ
メッセージを送信することをパブリッシュ
、特定アドレスに送られたメッセージを選んで処理することをサブスクライブ
と呼びます。
メッセージはグループアドレスか仮想アドレス宛に送信されます。ドキュメント内の図を参照すると理解しやすいです。
ステートとプロパティ
エレメントが持つ状態をステート
という概念で表します。ステート
は、利用できるコンテキストが限られており、例えば、On / Offといった状態を定義します。
プロパティ
はBLEのキャラクタリスティック(特性)
相当のものです。プロパティ
は、エレメントに関連した値であり、例えば、センサの現在の温度
といったものを表現します。
プロパティは、読み取り専用のManufacturer
と、読み書き可能なAdmin
の2種類があります。
メッセージ、ステート、プロパティ
meshでは、操作はメッセージによって開始します。メッセージは、GET / SET / STATUSの3つのタイプに分けられます。
- GET: ノードに対して指定したステートの値を要求します。応答はSTATUSメッセージとして送信されます。
- SET: ノードの指定したステート値を変更します。肯定応答要求のSETメッセージに対しては、STATUSメッセージが返されます。
- STATUS: GET/SETに対する応答、または、タイマなどにより独立して送信されます。
ステートの指定は、メッセージ内のオペコードを使います。プロパティの指定は、16ビットのプロパティIDを使います。
ステートの遷移、バインドされたステート
ステートの遷移は、瞬時に起きることも、遷移時間
と呼ばれる時間を経て起きることもあります。
1つのステートの変更が、別ステートの変更を引き起こすような関係を、ステートがバインドされている
と言います。
モデル
まだ、いまいちしっくり来ていません。
モデルは以上の概念をひとまとめにしたものです。モデルには3つのカテゴリがあります。
- サーバーモデル
- クライアントモデル
- コントロールモデル
モデル
はイミュータブルです。
汎用項目
異なる種類のデバイス間でも、同じ意味合いを持つステートがあります。例えば、オン
とオフ
です。
Bluetooth meshのモデルの仕様で、Generic OnOffや、Generic Levelのように再利用可能なステートが、各種定義されています。
このようなGenericステートに対するGenericメッセージも定義されています。
シーン
シーン
は複数のステートを保存したもので、特別なタイプのメッセージを受信したときや、指定された時間に呼び出すことができます。
16ビットのシーンナンバー
で識別されます。
シーンを使うことで、予め用意されたステートを複数のノードに一度に設定できます。
プロビジョニング
デバイスがノードになるプロセスです。5つのステップを経て進められます。
- ビーコニング
- インビテーション
- パブリックキーの交換
- 認証
- プロビジョニングデータの配布
ビーコニング
<<meshビーコン>>ADタイプを使用したアドバタイジングパケットを送信します。 新しいデバイスのアドバタイジングは、ユーザー側でボタンを押すなどの操作をして、開始する必要があるかもしれません。
インビテーション
プロビジョナーがデバイスに、Provisioning Invite PDUでインビテーションを送ります。 デバイスは、これに応答して、Provisioning Capabilities PDUで自身の情報を返します。
パブリックキーの交換
プロビジョナーとデバイスはお互いのパブリックキーを交換します。
認証
デバイスは、LEDを点滅されるなど、デバイスの機能を使って、1桁以上のランダムな数値をユーザーに示します。 ユーザーはデバイスから示された数値をプロビジョナーに入力します。 プロビジョナーとデバイスとの間で、その数値に関係した暗号化通信が行われ、それを通してお互いの認証が完了します。
プロビジョニングデータの配布
認証が済むと、デバイスのプライベートキーと、交換されたお互いのパブリックキーを使ってセッションキーが生成されます。 セッションキーを使って、セキュアなプロビジョニングプロセス完了のデータ配布を行います。このデータには、NetKeyも含まれます。
プロビジョニングが完了すると、デバイスは、ネットワークのNetKey、IVIndexと呼ばれるセキュリティパラメータ、プロビジョナーから割り当てられたユニキャストアドレスを持つことになり、デバイスはノードになります。
機能
ノードに、4つのオプション機能を持たせることができます。
- Relay
- Proxy
- Friend
- Low Power
Relayノード
Relay
ノードは、受信したメッセージを転送できます。
このリレー機能によって、メッセージはノード間をホップし、meshネットワーク全体を横断して宛先に届きます。
Low PowerノードとFriendノード
電力が限られていて、可能な限り節電するようなノードはLow Powerノード (LPN)
に指定します。LPNは、電力制約のないFriendノード
と連携して機能します。
Friendノードは、LPNノードに対して送信されたメッセージを保管し、LPNからポーリングされると、保管したメッセージを送信します。
LPNとFriendノードの関係がフレンドシップ
です。
Proxyノード
Bluetooth meshのプロトコルスタックを備えていないBLEデバイスが、meshネットワークと通信できるようにするノードをProxyノード
と呼びます。
Proxyノード
は、GATTインタフェースを提供し、プロキシプロトコル
に対応します。
meshのシステムアーキテクチャ
Bluetooth meshのアーキテクチャについて見ていきます。
meshアーキテクチャの最下層は、Bluetooth LEです。これは、BLEのスタック全体であり、meshアーキテクチャに必要な基本的な無線通信能力を提供します。
ベアラ層
meshのメッセージ送受信をするためのベースとなる通信システムです。 アドバタイジングベアラとGATTベアラが定義されています。
アドバタイジングベアラは、Bluetooth LEのGAPのアドバタイジング機能とスキャニング機能を使って、meshのPDUを送受信します。
GATTベアラは、アドバタイジングベアラに対応していないデバイスが、間接的にmeshネットワークのノードと通信できるようにします。 プロキシプロトコルは、特別に定義されたGATT特性を利用して、通信します。
ネットワーク層
メッセージアドレスタイプとネットワークメッセージ形式を定義します。 複数のベアラに対応でき、それぞれのベアラには、同じノード内のエレメント間通信に使用されるインタフェースを含む、複数のネットワークインタフェースを対応させます。
ネットワーク層では、どのネットワークインタフェースを介してメッセージを出力するかを決めます。ベアラ層から届いたメッセージには入力フィルタが適用され、ネットワーク層で処理する必要があるか判定されます。出力もフィルタが適用され、ドロップするかどうかの判定が行われます。
リレー機能とプロキシ機能は、ネットワーク層で実装されます。
下位トランスポート層
必要であればPDUのセグメント化と再組立てを行います。
上位トランスポート層
アクセス層とやりとりするアプリケーションデータの暗号化、複号、認証を行います。 また、トランスポートコントロールメッセージも扱います。 これは、フレンドシップやハートビートに関連するメッセージがあります。
アクセス層
アプリケーションが上位トランスポート層をどのように利用できるかを定義します。
- アプリケーションデータの形式の定義
- 暗号化、複号プロセスの定義と制御
- 認証
基盤モデル層
meshネットワークの構成と管理に関連するモデルの実装を扱います。
モデル層
モデル層はモデルの実装、すなわち、1つまたは複数のモデル仕様で定義された動作、メッセージ、ステート、ステートのバインド等の実装を扱います。
セキュリティ
Bluetooth LEでは、セキュリティはオプションとして存在します。
Bluetooth meshでは、セキュリティは必須です。
meshセキュリティの基本
- meshの全メッセージは暗号化され、認証されなくてはならない
- ネットワーク、アプリケーション、デバイスのセキュリティはそれぞれ別に扱う
- セキュリティキーは、meshネットワークができた後も、Key Refreshを通して変更できる
- メッセージを難読化すると、ネットワーク内で送られたメッセージを追跡することが難しくなり、ノードの追跡を困難にするプライバシーの仕組みとなる
- meshのセキュリティはネットワークをリプレイ攻撃から守る
- デバイスをmeshネットワークに追加してノードにするプロセスのものが安全なプロセスである
trashcan攻撃
を防ぐ方法としてノードはネットワークから安全に外すことができる
懸念の分離とmeshのセキュリティキー
3つのセキュリティーを組み合わせて使用することで、meshの異なる側面のセキュリティを保護します。
このことにより、懸念の分離
というmeshセキュリティにおいて重要な点を実現します。
meshネットワークの全ノードは、ネットワークキー (NetKey) を持っています。この共通のキーを持っていることで、ノードはネットワークの一員になります。 NetKeyを持つノードは、データを複号してネットワーク層までの認証を行い、中継などのネットワーク機能を実行できます。しかし、アプリケーションデータの複合はできません。 ネットワークはサブネットに分割できます。そのサブネット内では、メンバーのみに与えられるNetKeyを使います。
特定のアプリケーションデータを複号できるのは、適切なアプリケーションキー (AppKey) を持ったノードだけです。AppKeyは、そのアプリケーションに関わることができるタイプのノードのみが所有できます。例えば、照明は照明アプリケーションのAppKeyを持ちますが、暖房システムのAppKeyは持ちません。 AppKeyは、上位トランスポート層がメッセージをアクセス層に引き渡す前に、複号、認証するために使用されます。
最後の1つは、デバイスキー (DevKey) です。これは特別なアプリケーションキーです。各ノードは、プロビジョナーのみに知られている一意のDevKeyを持ちます。 DevKeyはプロビジョニングのプロセスでセキュリティを確保するために使用されます。
ノードの削除、キーリフレッシュ、ごみ箱攻撃
ノードを破棄する場合や、ノードを売却する場合、ノードのデバイスと中のキーが元のネットワークへの攻撃に使用できないようにすることが重要です。
プロビジョナーのアプリケーションがノードをブラックリストに追加することで、Key Refresh Procedureと呼ばれる手順が開始し、ノードをネットワークから削除します。 Key Refresh Procedureにより、ブラックリストに載っているノード以外のネットワーク内の全ノードに新しい、ネットワークキーやアプリケーションキーが支給されます。
プライバシー
NetKeyから生成されるプライバシーキーは、送信元アドレスなどのネットワークPDUのヘッダー値を難読化するために使用されます。 そのため、たまたま傍受されることがあっても、デバイスなどを追跡するには使用できないことが保証できます。 トラフィック分析に基づいた攻撃も難しくします。
リプレイ攻撃
リプレイ攻撃とは、通信を傍受した者が、後でメッセージを再送信することによってなりすます攻撃方法です。
Bluetooth meshには、リプレイ攻撃への防御機能が備わっています。防御機能のベースは、Sequence Number (SEQ) とIV Indexと呼ばれるネットワークPDUの2つのフィールドです。 このSEQとIV Indexが、前回の有効なメッセージから受け取ったSEQとIV Index以下であった場合、リプレイ攻撃に関連している可能性が高いため、メッセージを破棄します。
Bluetooth meshの仕組み
Bluetooth meshはmanaged flooding
と呼ばれる手法を使ってメッセージを配信します。
メッセージはブロードキャスト配信され、無線範囲内にある全ノードがメッセージを受け取り、中継機能が設定されていれば、メッセージを中継します。
managed floodingにより、メッセージは、ネットワーク内の複数の経路を通って宛先に届きます。これは、ネットワークの信頼性を非常に高めます。
Managed Flooding
Bluetooth meshネットワークでは、floodingの強みを活用しながら、最適化を図ることで、信頼性と効率性を高めています。
ハートビート
ノードはハートビートメッセージを定期的に送り、ノードがアクティブであることを知らせます。
TTL (Time to Live)
TTL (有効生存時間) は、Bluetooth meshのすべてのPDUに含まれるフィールドで、メッセージを中継するホップ数の上限を指定します。 メッセージが必要以上に中継されるのを避け、中継と省電力をコントロールします。
メッセージキャッシュ
全ノードに実装されなければならないものです。 最近受け取ったメッセージが保存され、同じメッセージが届いた場合、すぐに破棄されます。
フレンドシップ
Bluetooth meshネットワークで最も重要な最適化の仕組みと言えます。 Friendノードと連携することで、Low Powerノードはかなりの電力を節約できます。
次回から、nRF5 SDK for Meshを見ていきます。