nRF5 SDK for Meshで学ぶBluetooth mesh④~light switch demo doc~

はじめに

Bluetooth Meshを理解するために、nRF5 SDK for Meshでサンプルを動かしながら、動作を解析していきます。

tomo-wait-for-it-yuki.hatenablog.com

前回、2台のnRF52840 DKを使って、Bluetooth Meshのlight switch demoを動かすことに成功しました。 今回は、light switch demoドキュメントの内容を理解していきます。

Mesh provisioner

Android端末のnRF Meshアプリケーションが担う役割です。 Provisionerは、デモMeshネットワークを構築するために、ノードのProvisionと設定を行います。

Provisioning process and APIs

ProvisioningのAPIレベルの説明は、Provisioning process and APIsにあります。 下記に、シーケンス図を転載します。

Provisioning procedure

Provisioningを受けるノード (Provisionee)は、Provisionされるまで、自身がProvisionされていないことを知らせるビーコン(unprovisioned node broadcast beacon)を発信します。 ビーコンを受けたアプリケーションは、Provisioning link接続(PB-ADV; Provisioning Barer Advertise link)を開始します (nrf_mesh_prov_provision())。PB-ADVリンクが確立できると、Provisioningを開始します。

Provisionerは、Provisioneeを、Provisioningに招待します。Provisioneeは、Provisionで利用可能な方法(capabilities)をProvisionerに通知します。上図では、OOB (out-of-band) methodsを使っています。 Provisioneeから受信したcapabilityを使って、Provisioningを開始します (nrf_mesh_prov_oob_use())。

次に公開鍵を交換し、認証を行います。上図では、staticな要素で認証しているため、プログラムにハードコーディングされた鍵の交換でProvisioningが完了します。 Provisioningのときに、ディスプレイに数字を出すなどして、ユーザーに入力を求め、認証することもできます。

Provisioningが完了すると、PB-ADVリンクを切断します。

Provisionees

Provisioneeは、mesh_provisionee_prov_start() API関数によって、static認証を開始します。 provisioning APIを使うことで、手動でprovisioningを操作することも可能です。

  1. nrf_mesh_prov_init()でprovisioningコンテキストを初期化します。
  2. nrf_mesh_prov_listen()でprovisioning link接続要求が来るのを待ちます。この関数は、unprovisioned node broadcast beaconの送信を開始します。
  3. provisioningへの招待を受けると、NRF_MESH_PROV_EVT_INVITE_RECEIVEDイベントが発生します。
  4. provisioningが開始されると、NRF_MESH_PROV_EVT_START_RECEIVEDイベントが発生します。
  5. リンクが確立すると、NRF_MESH_PROV_EVT_LINK_ESTABLISHEDイベントが発生します。
  6. static認証の場合、NRF_MESH_PROV_EVT_STATIC_REQUESTイベントが発生します。アプリケーションは、nrf_mesh_prov_auth_data_provide()を通して、認証鍵を送信します。
  7. provisioningが正常に終了すると、NRF_MESH_PROV_EVT_COMPLETEイベントが発生します。provisioning dataとdevice keyが提供されます。provisioning dataは、access layerのモジュールが利用するため、device state managerに格納する必要があります。この時点から、deviceは、configuration modelを通してさらなる設定を受信することができます。

Provisioners

Provisionerは、ネットワーク内の他ノードを設定する責務を負っています。また、多くの場合、meshネットワークと別のネットワークとのブリッジを提供するgateway deviceとなります。

  1. nrf_mesh_prov_init()でprovisioningコンテキストを初期化します。
  2. unprovisioned node broadcast beacoの受信を待ちます。ビーコンを受信するとNRF_MESH_PROV_EVT_UNPROVISIONED_RECEIVEDイベントが発生します。
  3. nrf_mesh_prov_provision()を使って、provisioning linkを確立します。
  4. リンクが確立すると、NRF_MESH_PROV_EVT_LINK_ESTABLISHEDイベントが発生します。
  5. OOB認証の場合、capabilityをNRF_MESH_PROV_EVT_CAPS_RECEIVEDイベントで受信します。nrf_mesh_prov_oob_use()で認証方法を選択します。
  6. static認証が有効になっている場合、NRF_MESH_PROV_EVT_STATIC_REQUESTイベントが発生します。nrf_mesh_prov_auth_data_provide()を通して、認証鍵を送信します。
  7. provisioningが完了すると、NRF_MESH_PROV_EVT_COMPLETEイベントが発生します。

State machine

light switch serverのprovisioningと設定を行うprovisionerの状態遷移は、下図のようになります。

provisioning状態の詳細は、上述の通りです。

configuring状態では、light switch server/clientの設定を行います。 ここでは、同じアプリケーションだけが共有するapp keyを追加、bindし、pub/subするためのアドレス設定を行います。 このように、provisionerで設定を行うと、server/client間でデータのpub/subが可能になります。