はじめに
Bluetooth Meshの仕様について、Bluetooth SIGで公開されている「Mesh Profile Specification 1.0.1」に基づき、学習を兼ねて記載して行こうと思っています。本文章では、5章の「プロビジョニング」の次の節について記載いたします。
- 5.1 エンディアン
- 5.2 プロビジョニングベアラレイヤー
5.3 汎用プロビジョニングレイヤー
記載内容に誤り等がありましたら、ご連絡いただければ幸いです。
5 プロビジョニング
プロビジョニングは、プロビジョニングされていないデバイスをメッシュネットワークに追加するプロセスであり、プロビジョナーによって管理されます。プロビジョナーは、プロビジョニングされていないデバイスに、メッシュノードになることを可能にするプロビジョニングデータを提供します。プロビジョニングデータには、ネットワークキー、現在のIVインデックス、および各エレメントのユニキャストアドレスが含まれます。
プロビジョナーは通常、スマートフォンまたはその他のモバイルコンピューティングデバイスです。ネットワーク上でプロビジョニングを行うために必要なプロビジョナーは1つだけですが、複数のプロビジョナーを使用できます。キャッシュされたデータを共有し、複数のプロビジョナー間で調整する方法は、実装によって異なります。
デバイスをプロビジョニングするには、プロビジョニングベアラをプロビジョナーとデバイスの間に確立する必要があります。デバイスは、そのデバイスUUIDおよびその他の補足情報によってプロビジョナーに識別されます。
プロビジョニングベアラが確立された後、プロビジョナーは、楕円曲線ディフィーヘルマン(ECDH)プロトコルを使用してデバイスとの共有シークレットを生成します。次に、そのデバイスに固有のOOB情報を使用してデバイスを認証します。このようなOOB情報には、デバイスの公開鍵、長いシークレット、デバイスに値を入力するための要件、またはそのデバイスに値を出力するための要件が含まれる場合があります。このようなOOB情報により、そのデバイスの認証が可能になります。デバイスが認証されると、プロビジョニングデータは、その共有シークレットから導出されたキーで暗号化されてデバイスに送信されます。デバイスキーは、ECDHSecretおよびProvisioningSaltから導出されます。
プロビジョニングでは、図5.1に示すように、階層化アーキテクチャを使用します。デバイスのプロビジョニングは、プロビジョニングPDUを送信するプロビジョニングプロトコルを使用して行われます。プロビジョニングPDUは、汎用プロビジョニングレイヤーまたはプロキシプロトコルレイヤーを使用して、プロビジョニングされていないデバイスに送信されます。これらのレイヤーは、プロビジョニングPDUがセグメント化および再構築可能なトランザクションとして送信される方法を定義します。これらのトランザクションは、プロビジョニングベアラを介して送信されます。プロビジョニングベアラは、汎用プロビジョニングレイヤーからのトランザクションを単一のデバイスに配信できるようにセッションを確立する方法を定義します。最後に、プロビジョニングアーキテクチャの最下部にはベアラがあります。
5.1 エンディアン
特に明記されていない限り、セクション3.1.1.1で説明されているように、このレイヤーのすべてのマルチオクテット数値は「ビッグエンディアン」でなければなりません。
5.2 プロビジョニングベアラレイヤー
プロビジョニングベアラレイヤーにより、プロビジョナーとプロビジョニングされていないデバイス間でプロビジョニングPDUを転送できます。 2つのプロビジョニングベアラが定義されています。
- PB-ADV(セクション5.2.1を参照)
- PB-GATT (セクション5.2.2を参照)
プロビジョニングされていないデバイスは、PB-ADVをサポートし、PB-GATTをサポートする場合があります。PB-ADVとPB-GATTをサポートすることを強くお勧めします。
プロビジョナーは、PB-ADVまたはPB-GATTの少なくとも1つをサポートするものとします。 プロビジョナーは、PB-ADVをサポートすることを強くお勧めします。
5.2.1 PB-ADV
PB-ADVは、アドバタイズチャネルを介してGeneric Provisioning PDU(セクション5.3を参照)を使用してデバイスをプロビジョニングするために使用されるプロビジョニングベアラです。プロビジョニングメカニズムはセッションベースです。プロビジョニングされていないデバイスは、一度に1つのセッションのみをサポートする必要があります。プロビジョナーにはそのような制限はありません。リンク確立手順を使用してセッションが確立されます(セクション5.3.2を参照)。
PB-ADVベアラは、Generic Provisioning PDUの送信に使用されます。 PB-ADVベアラMTU(最大伝送ユニット)のサイズは24オクテットです。
PB-ADVを使用する場合、Generic Provisioning PDUは、[4]で定義されているように、«PB-ADV»で識別されるPB-ADV ADタイプを使用して送信されます。
PB-ADVをサポートするデバイスは、着信しているGeneric Provisioning PDUの欠落を回避するため、可能な限り100%に近いデューティサイクルでパッシブスキャンを実行する必要があります。
PB-ADV ADタイプには、PB-ADV PDUが含まれています。このADタイプのフォーマットは、表5.1に定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Length | 1 | AD TypeとContentsの長さ |
AD Type | 1 | «PB-ADV» |
Contents | 可変長 | PB-ADV PDU |
PB-ADV ADタイプを使用するアドバタイズメントは、接続不可でスキャン不可の無向アドバタイジングである必要があります。 ノードが接続可能またはスキャン可能なアドバタイジングイベントでPB-ADV ADタイプを受信した場合、メッセージは無視される必要があります。
PB-ADV PDUのフォーマットは表5.2に定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Link ID | 4 | リンクの識別子 |
Transaction Number | 1 | トランザクションを 識別するための番号 |
Generic Provisioning PDU | 1 – 24 | 転送される Generic Provisioning PDU |
Link IDは、2つのデバイス間のリンクを識別するために使用されます。
Transaction Numberフィールドには、デバイスによって送信された個々のGeneric Provisioning PDUを識別するために使用される1オクテットの値が含まれます。 単一のPB-ADV PDUに適合しないプロビジョニングPDUがセグメント化されると、すべてのセグメントが同じトランザクション番号フィールド値を使用して送信されます。 Provisioning PDUが再送信される場合、Transaction Numberフィールドは変更されません。
トランスポート固有のメッセージは、2つのデバイス間のリンクを確立および終了するように定義されています(セクション5.3.1.4を参照)。
PB-ADV PDUを送信するときは、次のルールを実装する必要があります:
PB-ADV PDUにProvisioning Bearer Control PDUが含まれている場合、Transaction Numberフィールドは0に設定され、受信時に無視されます。
プロビジョナーがOpen Provisioning Linkを介してProvisioning PDUを初めて送信するとき、Transaction Numberフィールド値0x00で開始する必要があります。 プロビジョナーは、プロビジョニングリンクの期間中に送信する新しいProvisioning PDUごとにフィールド値を1ずつインクリメントする必要があります。 フィールド値が0x7Fに達した場合、次のProvisioning PDUの送信時に0x00にラップします。
プロビジョニングされていないデバイスが、Open Provisioning Linkを介してProvisioning PDUを初めて送信する場合、Transaction Numberフィールド値0x80で開始する必要があります。 デバイスは、プロビジョニングリンクの期間中に送信する新しいProvisioning PDUごとにフィールド値を1ずつインクリメントします。 フィールド値が0xFFに達した場合、次のProvisioning PDUの送信時に0x80にラップします。
デバイスがProvisioning PDUを受信しているとき、デバイスは、Transaction Numberフィールドを、トランザクション中に受信されているPB-ADV PDUのTransaction Numberフィールドの値に設定する必要があります。
デバイスがTransaction Acknowledgement PDUを送信している場合、Transaction Numberフィールドは、確認応答されているProvisioning PDUを転送しているPB-ADV PDUのTransaction Numberフィールドの値に設定されます。
5.2.2 PB-GATT
PB-GATTは、Proxy PDU(セクション6.3を参照)を使用してデバイスをプロビジョニングし、メッシュプロビジョニングサービス(セクション7.1を参照)内にProvisioning PDU(セクション5.4を参照)をカプセル化するために使用されるプロビジョニングベアラです。
PB-GATTは、アプリケーションインターフェイスの制限のためにプロビジョナーがPB-ADVをサポートしない場合のサポートのために提供されます。
注:プロビジョナーとデバイス間の接続の接続間隔は、デバイスの非常に低電力の動作を可能にし、アイドルリンクを維持するために多大なエネルギーを浪費することなく、デバイスがDiffie-Hellman共有シークレットを計算できるようにするために、250〜1000ミリ秒(実装固有)にすることをお勧めします。
メッシュプロビジョニングサーバは、単一の書き込みコマンドATT PDUで単一のProxy PDU(セクション6.3を参照)を受信できる必要があります。
メッシュプロビジョニングサーバは、Provisioning PDUをプロビジョナーに送信するため、単一のHandle Value Notification ATT PDUを使用します。
ネゴシエートされたATT_MTUが必要なProxy PDUサイズよりも小さい場合、Mesh Provisioning Data InおよびMesh Provisioning Data Out特性の送信は、常にフラグメント化して再アセンブルする必要があります。 各PDUは、処理前に完全に再組み立てする必要があります。
メッシュプロビジョニングサーバは、1つまたは複数のATT PDUでProxy PDUを受信できる必要があります。 メッシュプロビジョニングサーバは、メッセージのサイズとネゴシエートされたATT_MTUに応じて、1つまたは複数のハンドル値通知ATT PDUを使用してProxy PDUをプロビジョニングクライアントに送信します。
Mesh Provisioning Data InおよびMesh Provisioning Data Out特性フォーマットは、セクション6.3.1で定義されたProxy PDUフォーマットを使用しています。
5.3 Generic Provisioning layer
Generic Provisioningレイヤーは、信頼性の低いコネクションレス型プロビジョニングベアラを介したGeneric Provisioning PDUの転送を担当します。 このレイヤは、Generic Provisioning PDUも定義します。
Generic Provisioning PDUのフォーマットは、図5.2に示され、表5.3で定義されているように、Generic Provisioning Control(GPC)フィールドとそれに続く可変長のGeneric Provisioning Payloadフィールドで構成されます。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Generic Provisioning Control | 1 – 17 | Generic Provisioning Controlフィールド |
Generic Provisioning Payload | 0 – 64 | Generic Provisioning Payload (Provisioning PDUのセグメント) |
Generic Provisioning Controlフィールドの最初のオクテットの最下位2ビットには、Generic Provisioning Controlフィールドのフォーマットを決定するGeneric Provisioning Control Format(GPCF)フィールドが含まれています。 GPCFフィールドは、表5.4に示されている値の列挙型です。
値 | 説明 |
---|---|
0b00 | Transaction Start |
0b01 | Transaction Acknowledgment |
0b10 | Transaction Continuation |
0b11 | Provisioning Bearer Control |
各フォーマットタイプのGPCフィールドのフォーマットは、セクション5.3.1で定義されています。
5.3.1 Generic Provisioning PDU types
5.3.1.1 Transaction Start PDU
Transaction Start PDUは、セグメント化されたメッセージの送信を開始するために使用されます。 Transaction Start PDUのGeneric Provisioning Controlフィールドを図5.3に示し、表5.5に示します。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
SegN | 6 | 最後のセグメント番号 |
GPCF | 2 | 0b00 = Transaction Start |
TotalLength | 16 | Provisioning PDUの オクテット数 |
FCS | 8 | Provisioning PDUの フレームチェックシーケンス |
SegNフィールドは、このトランザクションの最後のセグメント番号(ゼロベース)に設定されます。
GPCFフィールドは0b00に設定されます。
TotalLengthフィールドは、プロビジョニングPDUのオクテット数に設定する必要があります。
PB-ADVを使用して送信される場合、FCSフィールドは、多項式(x8 + x2 + x1 + 1)を使用して3GPP TS 27.010で定義されているように計算され、Provisioning PDUでのみ計算されます。
Generic Provisioning Payloadには、Provisioning PDUのセグメント0が含まれている必要があります。
5.3.1.2 Transaction Acknowledgment PDU
Transaction Acknowledgement PDUは、Provisioning PDUを確認するために使用されます。 Transaction Acknowledgement PDUのGeneric Provisioning Controlフィールドを図5.4に示し、表5.6に示します。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
Padding | 6 | 0b000000; 他のすべての値は禁止されています |
GPCF | 2 | 0b01 = Transaction Acknowledgment |
GPCFフィールドは0b01に設定されます。
Generic Provisioning Payloadの長さはゼロです。
5.3.1.3 Transaction Continuation PDU
Transaction Continuation PDUは、Provisioning PDUの追加セグメントを送信するために使用されます。 Transaction Continuation PDUのGeneric Provisioning Controlフィールドを図5.5に示し、表5.7に示します。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
SegmentIndex | 6 | トランザクションのセグメント番号 |
GPCF | 2 | 0b10 =Transaction Continuation |
SegmentIndexフィールドは、このPDUに含まれるセグメント番号に設定されます。
GPCFフィールドは0b10に設定されます。
Generic Provisioning Payloadには、Provisioning PDUのセグメントSegmentIndexが含まれている必要があります。
5.3.1.4 Provisioning Bearer Control
Provisioning Bearer Control PDUは、固有のセッション管理を持たないベアラ上のセッションを管理するために使用されます。 Provisioning Bearer Control PDUのGeneric Provisioning Controlフィールドを図5.6に示し、表5.8に示します。 Provisioning Bearer Control PDUは、次のセクションで定義されています。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
BearerOpcode | 6 | Provisioning Bearer Control PDU のオペコード |
GPCF | 2 | 0b11 = Provisioning Bearer Control |
Parameters | 可変長 |
BearerOpcodeの値は、表5.9で定義されています。
値 | メッセージ | 説明 |
---|---|---|
0x00 | Link Open | デバイスのベアラで セッションを開く |
0x01 | Link Ack | ベアラのセッションに 応答する |
0x02 | Link Close | ベアラのセッションを 閉じる |
0x03 – 0x3F | RFU | 将来の使用のために予約済み |
GPCFフィールドは0b11に設定されます。
Generic Provisioning Payloadの長さはゼロです。
各メッセージのパラメータは、次のセクションで定義されています。
5.3.1.4.1 Link Open message
Link Openメッセージは、プロビジョナーとプロビジョンされていないデバイス間のリンクを確立するために使用されます。 デバイスは、このメッセージをLink ACKメッセージで応答する必要があります。 Link OpenメッセージのParametersフィールドは表5.10で定義されており、メッセージは図5.7に示されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Device UUID | 16 | これは、選択したプロビジョニングされていない デバイスのデバイスUUIDです |
5.3.1.4.2 Link ACK message
Link Ackメッセージは、Link Openメッセージの受信に応答するために送信されます。
このメッセージのパラメータはありません。
Link Ackメッセージを図5.8に示します。
5.3.1.4.3 Link Close message
Link Closeメッセージは、リンクを閉じるために使用されます。 このメッセージは確認応答されないため、送信者はこのメッセージを少なくとも3回繰り返す必要があります。 リンクの両側がこのメッセージを送信する場合があります。 このメッセージは、Reasonフィールドの設定に関係なく受け入れられ処理されます。
Link CloseメッセージのParametersフィールドは表5.11で定義されており、メッセージは図5.9に示されています。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
Reason | 1 | リンクを閉じた理由 |
Reasonフィールドの値は、表5.12で定義されています。
値 | メッセージ | 説明 |
---|---|---|
0x00 | Success | プロビジョニングは 成功しました |
0x01 | Timeout | プロビジョニングトランザクションが タイムアウトしました |
0x02 | Fail | プロビジョニングに 失敗しました |
0x03 – 0xFF | Unrecognized | 将来定義される可能性のある 認識されない理由。 |
5.3.2 Link Establishment procedure
リンク確立手順は、固有のセッション管理を持たないベアラのセッションを確立するために使用されます。 セッションは、セッションの間、静的であり、セッション間の衝突を防ぐためにランダムに生成されるLink IDを使用して識別されます。
プロビジョニングメッセージを送信するために、プロビジョナーとプロビジョニングされていないデバイスの間にリンクが確立されます。 プロビジョニングされていないデバイスは、デバイスUUIDによって識別されます(セクション3.10.3を参照)。
プロビジョナーは、プロビジョニングされていないデバイスをスキャンする必要があります。 プロビジョニングされていないデバイスビーコンを受信すると、プロビジョナーはデバイスUUIDによって識別されるデバイスとのリンクを確立できます。
デバイスがLink Openメッセージに対するLink ACKを送信すると、デバイスのリンクがオープンになります。 Link Openメッセージで送信されたLink IDと等しいLink IDを持つLink ACKが受信されると、プロビジョナーに対してリンクが開かれます。 リンクが開いていて、デバイスがProvisioning PDUを受信している場合、デバイスはプロビジョニングされています。
リンクが開いておらず、デバイスがLink Openメッセージを受信した場合、デバイスは、PB-ADV PDUで設定された同じLink IDを持つLink ACKメッセージで応答することによって、このメッセージを受け入れる必要があります。 リンクが開いていて、デバイスがプロビジョニングされておらず、デバイスが同じLink IDのLink Openメッセージを受信した場合、デバイスはPB-ADV PDUに設定された同じLink IDのLink ACKメッセージで応答する必要があります。
リンクが開いたとき、デバイスは60秒に設定されたリンクタイマーを開始します。 リンクタイマーが時間切れになると、デバイスはリンクを閉じます。 デバイスがProvisioning PDUまたはLink Closeメッセージを受信すると、デバイスはリンクタイマーをキャンセルします。
リンクを開くため、プロビジョナーは60秒に設定されたリンク確立タイマーを開始し、Link Openメッセージの送信を開始します。 プロビジョナーは、いつでもこの手順を中止できます。 Link Openメッセージには、デバイスのデバイスUUIDが含まれています。 PB-ADVでは、PB-ADV PDUのフォーマットにLink IDフィールドが含まれます。
リンク確立タイマーが時間切れになると、リンクは開いていないと見なされ、手順が再開される場合があります。 リンクが開いている場合、プロビジョナーはリンク確立タイマーをキャンセルします。
リンクは、Link Closeメッセージを送信することにより、リンク確立後いつでも閉じることができます。 リンクのどちらの側でも、Link Closeメッセージを送信できます。
Link Open、Link ACK、およびLink Closeメッセージは、セクション5.3.1.4で定義されています。
プロビジョナーとプロビジョンされていないデバイス間のIDによるリンクを確立するためのメッセージシーケンスを以下の図5.10に示します。
5.3.3 Generic Provisioning behavior
各Generic Provisioning PDUは、20〜50ミリ秒のランダムな遅延の後に送信されます。
各Provisioning PDU(セクション5.4を参照)は、個別のトランザクションとして送信されます。トランザクションは、1つ以上のセグメントで構成されている場合があります。
Provisioning PDUを送信するために必要なセグメントの数は、Provisioning PDUのサイズによって決まります。 セグメントには0から63までのインデックスが付けられます。セグメント0は、Transaction Start PDUを使用して送信されます。 他のすべてのセグメントは、Transaction Continuation PDUを使用して送信されます。 Provisioning PDUの各セグメントは、それぞれのGeneric Provisioning PDUのGeneric Provisioning Payloadフィールドに配置されます。
各ベアラには、そのベアラが送信できるGeneric Provisioning PDUの最大サイズに独自の制約があります。 各Generic Provisioning PDUは、トランザクションの最後のセグメントを除いて、そのベアラの完全なMTUの長さでなければなりません。
送信者は、トランザクションのすべてのセグメントを順番に送信する必要があります。 送信者がTransaction Acknowledgmentメッセージを受信しない場合、送信者はトランザクションのすべてのセグメントを再送信する必要があります。
送信者がTransaction Acknowledgmentメッセージを受信した場合、トランザクションは完了しています。
送信者が他のPDUタイプのメッセージを受信した場合、そのメッセージは無視されます。
送信者がトランザクションの最初のメッセージを送信してから30秒以内にTransaction Acknowledgment messageメッセージを受信しない場合、送信者はトランザクションをキャンセルし、プロビジョニングプロセスをキャンセルして、リンクを閉じる必要があります。
受信者は、Transaction Start PDUからトランザクションのセグメント数を決定する必要があります。
PB-ADVベアラでは、受信者がトランザクションのすべてのセグメントを受信すると、受信者は受信したProvisioning PDUのFCSを計算し、Transaction Start PDUのFCSフィールドと一致する場合は、20〜50ミリ秒のランダムな遅延の後、Transaction Acknowledgment PDUを送信する必要があります。
特定のトランザクションに対してTransaction Acknowledgement PDUが送信され、同じトランザクションの別のセグメントが受信された場合、別のTransaction Acknowledgement PDUが送信され、受信したセグメントは無視されます。