Bluetooth mesh 技術

プロビジョニングとコンフィグレーション

Provisioning  &  Configuration
nRF52

プロビジョニング

プロビジョニングは、Bluetooth meshネットワークの構築に必要な機能です。
BLEでいうところのペアリング的な機能になります。
プロビジョニングには、mashデバイスの他にプロビジョナーが必要となります。(下図 全体構成 参照)
手順は、大きく2つあり、

  • ① meshデバイスは、プロビジョニンされていない時に自分の

                     -   固有ID(UUID)のアドバタイズパケット

    を送信し続けます。

  • ② プロビジョナーは、meshデバイスのアドバタイズパケットを受けると、そのmeshデバイスに対して

                     -   ネットワークKey

                     -   ユニキャストアドレス

    を送り、ネットワークへ接続への許可をします。


となります。

コンフィグレーション

コンフィグレーションは、プロビジョニングされたmeshデバイスに対して設定を行います。
設定には、大きく2つあり

  • アプリーケーションKey
  • グループ


となります。

全体構成

構成は、

  • ① meshデバイス
  • ② プロビジョナー


の他に、パソコンで動作する

  • ③ Pythonスクリプト
  • ④ JSONファイル
  • ⑤ ログファイル


となります。

なお、

③ Pythonスクリプトは、USB接続されたプロビジョナーのコントロールに
④ JSONファイルは、プロビジョニングやコンフィグレーションの情報取得に
⑤ ログファイルは、プロビジョナーとのやり取りの記録に
使用します。

② プロビジョナー

プロビジョナーは、Nordic提供の「Serial Libraries」を使用します。
Serial Librariesは、

  • Device commands(ビーコン送受信)
  • Configuration commands(アドバタイズパケット設定、送信電力設定、UUID設定)
  • Provisioning commands(プロビジョニング、ネットワークKey設定)
  • Bluetooth Mesh commands(メッシュパケット、アプリケーションKey設定)
  • Direct Firmware Upgrade commands(DFU)
  • Access Layer commands(エレメント、モデル設定)


などの機能があります。
この中から、主にProvisioning commandsとBluetooth Mesh commandsを利用して、プロビジョニングとコンフィグレーションを行っていきます 

③ Pythonスクリプト

Pythonスクリプトは、Nordic提供の「nteractive_pyaci.py」を使用します。
nteractive_pyaci.pyは、ipython上でPythonコードを実行させ、② プロビジョナーで動作しているserialライブラリーと連携してプロビジョニングやコンフィグレーションを行います。

手順として、
プロビジョニングは、

  • ④ JSONファイルから設定の読み込み、オブジェクトのインスタンス
  • ② プロビジョナーからUUID読み込み、プロビジョナーへネットワークKeyとアプリケーションKeyの設定
  • 未プロビジョニングの ① meshデバイスのスキャン(アドバタイズパケットのスキャン)
  • スキャンに成功した① meshデバイスに対してネットワークKeyとユニキャストアドレス等の書込み
  • プロビジョニングに成功したmeshデバイスの情報をJSONファイルへ書込み


コンフィグレーションは、

  • ④ JSONファイルから① meshデバイスの情報を読み込み
  • ① meshデバイスへアプリケーションKeyの書込み
  • ① meshデバイスへグループの書込み


となります。

④ JSONファイル

Pythonスクリプトは、Nordic提供の「databese.json」を使用します。
初期状態は、

  • netKeys(ネットワークKey)
  • appKeys(アプリケーションKey)
  • groups(グループアドレス)
  • allocatedGroupRange(グループアドレスの最小最大)
  • allocatedUnicastRange(ユニキャストアドレスの最小最大)
  • nodes(個々デバイスの情報、最初は空っぽ)


などが記述されています。

そこから、1個づつデバイスのプロビジョニングやコンフィグレーションを行うと、

nodesの中に

  • UUID(デバイスの個別ID)
  • elements(エレメント、モデルの集合)
  • models(モデル、機能そのもの)
  • netKeys(ネットワークKey)
  • appKeys(アプリケーションKey)
  • unicastAddress(ユニキャストアドレス)
  • subscribe(グループ、メッセージ受信)
  • publish(グループ、メッセージ送信)


が追記されていきます。

追加で1個デバイスのプロビジョニングを行うと、nodesの中に新しい記述が増えていきます。

このJSONファイルを見ることによって、meshネットワーク全体のデバイスの構成がわかるものとなります。

ログファイル

ログファイルは、ログファイルとの仮想COMポート(USB)のログが記録されています。
動作がおかしいかな?と思ったときに詳細を確認することができます。
また、
Pythonスクリプトのコマンド引数に使用する、address_handleやdevkey_handleなどが記録されています。