Bluetooth Mesh 仕様 – Provisioning(その1)

仕様

はじめに

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:プロビジョニングプロトコルスタック

プロビジョニングでは、図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)
説明
Length1AD TypeとContentsの長さ
AD Type1«PB-ADV»
Contents可変長PB-ADV PDU
表5.1:PB-ADV ADタイプ

PB-ADV ADタイプを使用するアドバタイズメントは、接続不可でスキャン不可の無向アドバタイジングである必要があります。 ノードが接続可能またはスキャン可能なアドバタイジングイベントでPB-ADV ADタイプを受信した場合、メッセージは無視される必要があります。

PB-ADV PDUのフォーマットは表5.2に定義されています。

フィールドサイズ
(octets)
説明
Link ID4リンクの識別子
Transaction Number1トランザクションを
識別するための番号
Generic Provisioning PDU1 – 24転送される
Generic Provisioning PDU
表5.2:PB-ADV 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フィールドで構成されます。

図5.2:Generic Provisioning PDUのフォーマット
フィールドサイズ
(octets)
説明
Generic Provisioning Control1 – 17Generic Provisioning Controlフィールド
Generic Provisioning Payload0 – 64Generic Provisioning Payload
(Provisioning PDUのセグメント)
表5.3:Generic Provisioning PDUのフォーマット

Generic Provisioning Controlフィールドの最初のオクテットの最下位2ビットには、Generic Provisioning Controlフィールドのフォーマットを決定するGeneric Provisioning Control Format(GPCF)フィールドが含まれています。 GPCFフィールドは、表5.4に示されている値の列挙型です。

説明
0b00Transaction Start
0b01Transaction Acknowledgment
0b10Transaction Continuation
0b11Provisioning Bearer Control
表5.4:Generic Provisioning Control Formatのフィールド値

各フォーマットタイプの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に示します。

図5.3:Transaction Start PDU
フィールドサイズ
(オクテット)
説明
SegN6最後のセグメント番号
GPCF20b00 = Transaction Start
TotalLength16Provisioning PDUの
オクテット数
FCS8Provisioning PDUの
フレームチェックシーケンス
表5.5:Transaction Start PDUのGeneric Provisioning Controlフィールド

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に示します。

図5.4:Transaction Acknowledgement PDU
フィールドサイズ
(オクテット)
説明
Padding60b000000; 他のすべての値は禁止されています
GPCF20b01 = Transaction Acknowledgment
表5.6:Transaction Acknowledgement PDUのGeneric Provisioning Controlフィールド

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に示します。

図5.5:Transaction Continuation PDU
フィールドサイズ
(オクテット)
説明
SegmentIndex6トランザクションのセグメント番号
GPCF20b10 =Transaction Continuation
表5.7:Generic Provisioning Control field for Transaction Continuation PDU

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は、次のセクションで定義されています。

図5.6:Provisioning Bearer Control PDU
フィールドサイズ
(オクテット)
説明
BearerOpcode6Provisioning Bearer Control PDU
のオペコード
GPCF20b11 = Provisioning Bearer Control
Parameters可変長
表5.8:Provisioning Bearer Control PDUのGeneric Provisioning Controlフィールド

BearerOpcodeの値は、表5.9で定義されています。

メッセージ説明
0x00Link Openデバイスのベアラで
セッションを開く
0x01Link Ackベアラのセッションに
応答する
0x02Link Closeベアラのセッションを
閉じる
0x03 – 0x3FRFU将来の使用のために予約済み
表5.9:BearerOpcodeフィールド値

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 UUID16これは、選択したプロビジョニングされていない
デバイスのデバイスUUIDです
表5.10:Link Openメッセージのパラメータフィールド
図5.7:Link Openメッセージのフォーマット
5.3.1.4.2 Link ACK message

Link Ackメッセージは、Link Openメッセージの受信に応答するために送信されます。

このメッセージのパラメータはありません。

Link Ackメッセージを図5.8に示します。

図5.8:Link Ackメッセージのフォーマット
5.3.1.4.3 Link Close message

Link Closeメッセージは、リンクを閉じるために使用されます。 このメッセージは確認応答されないため、送信者はこのメッセージを少なくとも3回繰り返す必要があります。 リンクの両側がこのメッセージを送信する場合があります。 このメッセージは、Reasonフィールドの設定に関係なく受け入れられ処理されます。

Link CloseメッセージのParametersフィールドは表5.11で定義されており、メッセージは図5.9に示されています。

フィールドサイズ
(オクテット)
説明
Reason1リンクを閉じた理由
表5.11:Link Closeメッセージのパラメータフィールド

Reasonフィールドの値は、表5.12で定義されています。

メッセージ説明
0x00Successプロビジョニングは
成功しました
0x01Timeoutプロビジョニングトランザクションが
タイムアウトしました
0x02Failプロビジョニングに
失敗しました
0x03 – 0xFFUnrecognized将来定義される可能性のある
認識されない理由。
表5.12:Reasonフィールドの値
図5.9:Link Closeメッセージのフォーマット

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.10:プロビジョナーとプロビジョンされていないデバイス間のIDによるリンクの確立

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が送信され、受信したセグメントは無視されます。

タイトルとURLをコピーしました