らんらん技術日記

日々の学習メモに

Bluetooth meshを試してみたい part4

前回までの話

 BLE meshを試すべく、Laird社のBLEモジュール BL654(USBドングル版)を購入した。まずはセットアップに取り組むも、これが非常に手間のかかる作業であった。苦労の末にBL654をBLE meshデバイスとして動作させることに成功、ついにBLE meshの世界に踏み入れる時がきた!(part3までBLE meshの話はほとんどなし)

久々の更新

 約3月ぶりの更新になるでしょうか。なんというか、BLE meshなんかやっている場合じゃねーぞ!って状態でした。仕事でBLE meshに携わっている訳でもないし、エンベデッドスペシャリストの受験もあったし、誰かブログを見ている訳でもないし等々、どうやってモチベーション上げればいいんだって感じですw
 特にエンベデッドスペシャリスト。去年は落ちてしまったので、今年こそは絶対に受かりたいんです! 試験が終わって1週間は経つんですけど、結果が気になって、頭から離れんのです。名前を書き忘れていたことに気づいて、受験に落ちたことを悟った夢も見ました。ホントに夢でよかったです。正夢じゃないといいんですが・・・。こういうのを一日千秋の想いというのでしょうか? 他のことを考えている余裕なんてないんです!
 そんな感じで放置していたところ、意外とBLE mesh系の記事がアクセスされていることに気づきました。誰もアクセスしない記事だと思っていたので、嬉しいものですね。 やる気も少し出たことだし、久々に更新してみたいと思います。

プロビジョニング

 前回までの記事で、BL654をBLE meshデバイスとして動作するように設定を行いました。今回はBL654をメッシュネットワークに参加させる作業、プロビジョニング(Provisioning)を行おうと思います。
 簡単にプロビジョニングとは何かを説明しますと、メッシュネットワークを構成するノードを登録する作業のことです。メッシュネットワークに登録されているBLE meshデバイスのことをノードと呼びます。逆に、登録されていないデバイスをUnprovisioned Deviceと呼びます。プロビジョニングを行うことで、BLE meshデバイスは「Unprovisioned Device」から「meshネットワークのノード」へと変換される訳です。
 プロビジョニングを行うデバイスのことを、プロビジョナ(Provisioner)と呼びます。プロビジョナはスマホタブレットが担当することが多いようです。

 詳細な説明はBluetooth SIGが発行している仕様書を参考くださいな。
www.bluetooth.com
 特に Mesh Profile Specification を読むことを推奨します。私はリビジョン1.0.1を落としました。内容はまだ少ししか読んでいませんが・・・これを好んで読もうなんて人は、狂人か相当な暇人だと思いますw とはいえBLE meshは現状ではマイナー技術のようで、あまり解説記事が豊富ではありません。意外と仕様書を読むのが効率的と思います。とりあえず2章 mesh system architecture、5章Provisioningを読んでおけば十分だと思います。一応ですが、BLE meshを理解するには、前提としてBLEそのものへの理解も当然必要です。

実機(BL654)でテスト

実機でプロビジョニングを試したいと思います。環境は以下の通り。

・プロビジョナ:iPhone8
・プロビジョニング用アプリ:nRF Mesh
・BLE meshデバイス:BL654(Server, Client)
・BLE mesh用スニファ:BL654(Sniffer
・BL654用コンソールプログラム:Uw TerminalX

nRF MeshはNordic Semiconductorが出しているスマホ用アプリです。Apple Store等からダウンロードできます。

 まずはBL654のServer, Client、Sniffer全ての電源を入れます。PCとシリアル通信するために(ログを見るだけなので必須ではないですが)、USBポートに挿しておきます。
f:id:yukirunrun:20190505005834j:plain

 電源投入後、ServerとClientはUnprovisioned Deviceであることをアドバタイズし始めます。Uw TerminalXでSnifferのポートを開くと、その様子を確認できます。

f:id:yukirunrun:20190131232624p:plain

 画面内の1行が、1つのパケットに対応しています。
 2列目には、PB-ADVあるいはPB-GATTの文字が見えます。これはプロビジョニングを実現するための方法を示しています。より厳密には、provisioning bearerの種類を示しています。
 PB-ADVではアドバイタジングを利用してプロビジョニングを行います。Bluetooth SIGのHPを見ると、AD Type の0x29にPB-ADVが割り当てられていることが確認できます。一般的なBLE MeshデバイスはPB-ADVに対応していることが望ましいようです。
 PB-GATTGATTを利用してプロビジョニングを行います。専用のAD Typeは用意されていませんが、UUIDの0x1827にMesh Provisioning Serviceが割り当てられています。レガシーなスマホでもプロビジョニングを行えるようにするため、このような仕組みが用意されているようです。
 私のiPhone8はレガシーなスマホだったので、PB-GATTを利用してプロビジョニングを行います。というかPB-ADVに対応したスマホって存在すんの・・・?
 プロビジョニングを進めるために、iPhone8でnRF Meshを起動して、Scannerタブを開きます。

f:id:yukirunrun:20190211191818p:plain:w300

 リストにはPB-GATTに対応したアドバタイジングをしているデバイスの一覧が表示されています。まずはLS P-SERVERを選びます。

f:id:yukirunrun:20190505121421p:plain:w300

 ノードセッティング画面に遷移しました。デバイスのmeshネットワーク内における名称、Unicast AddressAppKeyを設定できるようです。
 名称はアプリの機能でしょうか? メッシュ仕様には該当する記述が見つかりません。
 Unicast Addressは、ここではノード内のprimary elementのUnicast Addressを指します。ノード内のsecondary elementは逐次的にアドレスが割り振られれます。メッシュネットワークの通信はエレメント単位で行われるので、ノードではなく、エレメントにUnicast Addressが割り振られます。
 AppKeyは、エレメント間の通信データを暗号化するための数字列です。
 続いて、右上のIdentifyを押します。

f:id:yukirunrun:20190505121601p:plain:w300

 画面下にIDENTIFICATIONのリストが追加されました。ここで書かれている内容は大雑把に、
 ・ノード内のエレメントの数
 ・暗号化の方式
 ・対応している認証方法(OOB)
になります。OOBはOut Of Bandの略で、通信帯域幅の外、つまりはBluetooth以外の入出力手段という意味です。詳細はMesh Profile SpecificationのProvisioning Capabilitiesに書かれています。
 今回のLS P-SERVERに関してわかることは、エレメント数は1つで、暗号化にはFIPS P-256 Elliptic Curveアルゴリズムを使い、OOBの手段はないということです。OOBの手段は特にないので、右上のProvisionを押すだけで、プロビジョニングが開始されます。

f:id:yukirunrun:20190505121730p:plain:w300

 しばらく時間経過すると、プロビジョニングが完了し、上の画面に遷移します。メッシュネットワークにLS P-SERVERが追加されたことが確認できます。同様の手続きをLS P-CLIENTにも実施した結果が以下になります。

f:id:yukirunrun:20190505121756p:plain:w300

今回はここまで

 以上でプロビジョニングが完了しました。実はプロビジョニングが完了したからといって、何ができる訳でもありませんw メッシュネットワークに2つのノードが登録されただけなのです。
 メッシュネットワーク内のノード同士が通信を始めるには、さらに設定が必要になるのですが、長くなりそうなので一旦区切ります。
 次回はプロビジョニングの補足について書こうと思います。