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を操作することも可能です。
nrf_mesh_prov_init()
でprovisioningコンテキストを初期化します。nrf_mesh_prov_listen()
でprovisioning link接続要求が来るのを待ちます。この関数は、unprovisioned node broadcast beaconの送信を開始します。- provisioningへの招待を受けると、
NRF_MESH_PROV_EVT_INVITE_RECEIVED
イベントが発生します。 - provisioningが開始されると、
NRF_MESH_PROV_EVT_START_RECEIVED
イベントが発生します。 - リンクが確立すると、
NRF_MESH_PROV_EVT_LINK_ESTABLISHED
イベントが発生します。 - static認証の場合、
NRF_MESH_PROV_EVT_STATIC_REQUEST
イベントが発生します。アプリケーションは、nrf_mesh_prov_auth_data_provide()
を通して、認証鍵を送信します。 - 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となります。
nrf_mesh_prov_init()
でprovisioningコンテキストを初期化します。- unprovisioned node broadcast beacoの受信を待ちます。ビーコンを受信すると
NRF_MESH_PROV_EVT_UNPROVISIONED_RECEIVED
イベントが発生します。 nrf_mesh_prov_provision()
を使って、provisioning linkを確立します。- リンクが確立すると、
NRF_MESH_PROV_EVT_LINK_ESTABLISHED
イベントが発生します。 - OOB認証の場合、capabilityを
NRF_MESH_PROV_EVT_CAPS_RECEIVED
イベントで受信します。nrf_mesh_prov_oob_use()
で認証方法を選択します。 - static認証が有効になっている場合、
NRF_MESH_PROV_EVT_STATIC_REQUEST
イベントが発生します。nrf_mesh_prov_auth_data_provide()
を通して、認証鍵を送信します。 - 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が可能になります。