らんらん技術日記

日々の学習メモに

Bluetooth meshを試してみたい part5

前回までの話

 BLE meshを試すべく、Laird社のBLEモジュール BL654(USBドングル版)を購入した・・・というのは昔の話。何もすることなく、三ヶ月ほどの時が過ぎていた。さすがにこのままでは不味いということで一年発起、ようやくBLE meshの第一歩 プロビジョニング を完了させたのだった。

エンベデッドシステムスペシャリスト試験 結果報告

 前回の記事で、エンベデッドシステムスペシャリスト試験(以下ES)を受験したことに触れました。なのでBLE meshとはなんの関係もないのですが、結果報告はしておきます。
結果は、
 ・
 ・
 ・
 ・
 合格でした!!ホントに嬉しい!
 点数は午前1:免除、午前2:88、午後1:93、午後2:73でした。午後1の点数が良すぎですね。勉強し過ぎたかもしれません。 過去問数年分解いたのですが、わりと不毛でした。
 ESも取れたことだし、これからは堂々と組み込み系のスペシャリストを名乗っていこうと思います。
 ・・・というのは流石に冗談ですw 仕事では知識不足なことが日常茶飯事で、まだまだ一人前には遠い感じがしています。何ができるようになったら一人前か、と問われると難しいところなんですが。しかし、こうしてES合格という客観的な指標が得られたことは、大きな自信に繋がります。今回の合格で満足するのでなく、これからも精進していきたいですね。

プロビジョニングの詳細

 さて、本題のBLE meshの話になります。今回はプロビジョニングの詳細編、パケットレベルの話を書きたいと思います。
 

スニファ

 パケットレベルの解析といえば、スニファ(Snifferの出番です! スニファとは名前のイメージ通り、空間を飛び交うBLEのパケットを嗅ぎ回して(Sniff)、見つけたパケットをパソコンに流すためのツールです。ポイントは、スニファ自体はBLEのパケットは送信しないし、受信相手でもないことです。要は他所様の通信を盗聴しているだけです。 盗聴というと人聞き悪いですが、別に悪いことをしている訳ではなく、れっきとした開発ツールです。逆に言えば、スニファみたいなことが簡単にできるからこそ、無線通信は暗号化に力を入れているわけですし。
 スニファとして有名なのは、Nordic製のnRF Snifferになります。幸運なことに、千石電商で以下の製品が売っていたので、購入してみました。
 ・Adafruit製 ADA-2269 nRF51822搭載 Bluefruit LE Sniffer
www.sengoku.co.jp

 念のため、nRF SnifferはNordic製ASICおよびFWのことで、Bluefruit LE SnifferはnRF Snifferを搭載した電子基盤のことです。

 製品を購入したらマニュアルに沿ってセットアップしましょう。マニュアルはNordicの公式ページから得られますし、他のブログにも解説記事が載っています。このブログではこれ以上触れるつもりはありません。書くのが面倒というのもありますが、何よりも、


 あまり役に立たなかったからです。


 確かにそこそこは有用だったのですが・・・。肝心のBLE meshに関連したパケットをあまり見ることができませんでした。より具体的には、Advertisingとコネクション開始時のパケットは見れるのに、コネクション確立後のパケットが全然見れないのです。私のセットアップや環境が悪いのかと疑いもしたのですが、ネット上の情報をかき集める感じ、購入した製品に問題がありそうな気がしています。はっきりと言及はされていないのですが・・・。
 てことで、スニファを使えばBLE meshの通信が簡単に見れるじゃん!という目論見は淡くも崩れ落ちました。(もしくは、nRF52832ベースのスニファを買うといいのかも)

追記(2020/6/14)
理由がわかりました。プロビジョナ&BL654はBluetooth5の2M PHY で通信していたせいです。一方で、nRF51822は2M PHY に対応していないため、自ずとスニファも2M PHYのパケットを追えなかったようです。
1M PHYで通信するプロビジョナであれば、スニファで追うことができました。

マニュアルでプロビジョニングに挑戦!

 スニファのあてが外れたので、電文を自分で考えてプロビジョニングに挑戦してみます。ベアラにはGATTを利用することにします。また、簡単のためOOBによる入出力はなしとします。
 プロビジョナにはiPhone8を使用し、アプリはLightBlueというBLEの汎用アプリを使います。BLE meshの機能はないので、BLE meshの仕様に沿った電文はマニュアルで打つ必要があります。
 最初に断っておくと、プロビジョニングの途中までしかやりません。最後までやると暗号化の計算が必要になるので、さすがにやってられませんw 目的がだいたいの雰囲気をつかむことなので、途中までやれば十分というのもあります。

 さて、Mesh Profile Bluetooth Specificationによると、プロビジョニングにおけるプロビジョナとデバイスの通信の流れは以下のようになります。

f:id:yukirunrun:20190623184641p:plain

 「1、Unprovisioned Device Beacon」はAdvertisingで行われます。一般的なBLEと同じですね。GATTベアラでプロビジョニングを行う場合、このUnprovisioned Device Beaconの情報を元に、デバイスとコネクションを張ります。Advertisingベアラでプロビジョニングを行う場合は、コネクションは張りません。以下、GATTベアラの場合で話を進めます。
 iPhone上のアプリ、LightBlueでは次のようにBLE meshデバイスが見えます。タップして、コネクションを張ります。

f:id:yukirunrun:20190623192104j:plain:w300

 コネクション後、キャラクテリスティックの一覧が見えます。
 ・上にある0x2ADBはデータを送信するために使います。
 ・下にある0x2ADCはデータを受信するために使います。

f:id:yukirunrun:20190623192350p:plain:w300

 まずは0x2ADCを開いてNotifyを許可します。Notifyを許可すると、デバイスからデータを受信できるようになります。次に0x2ADBを開いて以下の値を送信します。
 ・0x030005
 するとデバイスから何かしらのデータを受信します。
f:id:yukirunrun:20190623192837j:plain:w300

 実は今送信したデータが「2、Provisioning Invite」、受信したデータが「3、Provisioning Capabilities」に相当します。データの意味を説明します。まず送受信データの先頭は両方とも0x03ですが、これはProxy Protocol(メッシュ仕様の6章に書いてあります)のProxy PDUの内容です。GATTベアラからデータの送受信をするときは、Proxy Protocolを経由するらしいです。次の1byteはProvisioning PDUのデータタイプを意味し、0x00がProvisioning Invite、0x01がProvisioning Capabilitiesとなります。それ以降の意味は仕様書を参照ください。

 次に「4、Provisioning Start」のための電文を送信します。
 ・0x03020000000000
 2byte目の0x02がProvisioning Startを指します。当然のようにデバイスからは反応がないので、続けて「5、Provisioning Public Key」のための電文を送信します。
0x03030A18364B1F3AFFBFE58D000C81CFBA5735C1F324(下に続く)
5F811A0094D369B10486037B511272EACDF6EA1EEEC354(下に続く)
8C6DF8A3B2C90413CCC13F6E7A39459130FDB2118E
 ・・・やたら長いですね。全部で68byteあるのですが、そのうち64byteは暗号化に利用する数値です。送信後、デバイスから同様に長い電文が返ります。「6、Provisioning Public Key」に相当します。2byte目の0x03がProvisioning Public Keyを指します。

f:id:yukirunrun:20190623195132j:plain:w300

 ここから先「7、Provisioning Confirmation」には暗号化の計算が必要になります。めんどうなのでこれ以上はやりませんw

以上、マニュアルでのプロビジョニングでした! 次はプロビジョニングから進んだ段階を試してみたいところですな。