はじめに
Raspberry PiとnRF52シリーズでのBluetooth Mesh通信を試しました。
試した通信はnRF52シリーズ搭載の評価ボード(サーバ)のLEDをRaspberry Pi(クライアント)からOn/Off制御する内容です。
Bluetooth Mesh通信に関してはまだ詳しくないため苦労しましたが、うまく通信出来るようになりましたので記録を残すため記事を書きました。(そして初Qiitaです)
用意したもの(ハードウェア)
- Raspberry Pi 3 Model B
- 評価ボード MDBT50Q-DB-33(RAYTAC)
SWITCH SCIENCEさん等で入手できます。こちらの評価ボードはnRF52833が搭載されておりますが、nRF52シリーズであれば問題ないと思います。 - Segger J-Link EDU mini - JTAG/SWD デバッガー
マルツオンラインさん等で入手できます。
仕事ではJ-Link EDUを使用しましょう。
用意したもの(評価ボード関連)
- Segger Embedded Studio for ARM 5.60
- nRF5 SDK 17.0.2
NORDIC SEMICONDUCTORのWebサイトからダウンロードできます。 - nRF5 SDK for Mesh 5.0.0
こちらもNORDIC SEMICONDUCTORのWebサイトからダウンロードできます。
用意したもの(Raspberry Pi関連)
- BlueZ 5.62
当時の最新バージョンを
GitHUBからダウンロードしました。 - Kernel 5.10.63-v7
当時の最新バージョンをGitHUBからダウンロードしました。 - Python3
- TeraTerm
評価ボードへプログラムのインストール
開発環境準備
Segger Embedded Studio for ARMはあらかじめインストールしてください。開発環境の構築はこちらの記事が参考になりました。
nRF5 SDKとnRF5 SDK for Meshは対応するバージョンが決まっています。
下記のエクスプローラのようにダウンロードしたnRF5 SDKとnRF5 SDK for Meshを適当なフォルダへ展開します。
nRF5_SDK_17.0.2_d674ddeフォルダ中身の例
nrf5_SDK_for_Mesh_v5.0.0_srcフォルダ中身の例
プログラムの書込み
評価ボードへnRF5 SDK for Meshに付属のサンプルプログラムを書き込みます。
Segger Embedded Studio for ARM のメニューから"Open Solution..."を選択してnRF5 SDK for MeshのSolution File を開きます。
nRF52833の場合は、light_switch_server_nrf52833_xxAA_s113_7_2_0.emProject を開きます。
ビルドが成功したら"Target"メニューの "Connect J-link"でターゲットと接続してプログラムの書込みを行います。
以上で評価ボードへプログラムのインストールが完了となります。
Raspberry Piの準備
Raspberry PiのカーネルビルドとBlueZのインストール
bluetooth.comのPDFファイルに従ってKernelのビルド&インストール、BlueZのビルド&インストールを行います。
説明に記載されているフォルダ名は使用するバージョンに応じて読み替えてください。
12ページのBlueZのインストールまで進めます。
※私がこちらの手順に従って作業した内容は今後、記事にしていきたいと思います。
Raspberry Piでmesh通信のデーモンを起動
ターミナルで下記コマンドを入力してデーモンを起動します。
BlueZのディレクトリ名はお使いのバージョンに応じて読み替えてください。
デーモンが起動した後、こちらのターミナルは閉じないでください。
sudo systemctl stop bluetooth
sudo ~/bluez-5.62/mesh/bluetooth-meshd -nd
その他インストールが必要なソフトウェア
後の説明で実行するサンプルプログラムがPythonで記述されているため、Python3のインストールを行います。
ノードのプロビジョニング
評価ボードのプロビジョニング
mesh-cfgclientを起動するため新しくターミナルを起動して下記コマンドを入力してください。
mesh-cfgclient
正常に起動すると下記のように [mesh-cfgclient]# プロンプトが表示されます。
初めてmesh-cfgclientを起動すると、"Warning: config file "/home/pi/.config/meshcfg/config_db.json" not found"のようなメッセージが表示されます。その場合は下記のコマンドを入力してください。
create
NetKeyとAppKeyを作成するため下記コマンドを入力します。
appkey-create 0 0
評価ボードを探すために下記コマンドを入力します。
discover-unprovisioned on
見つかったら下記コマンドで探すのを中止してください。
discover-unprovisioned off
ターミナルに表示されている緑色の文字が評価ボードの情報になります。表示されているUUIDは後の作業で必要になるのでメモしてください。
評価ボードのプロビジョニングを行うため下記コマンドを入力します。
UUIDは上でメモした16進文字列です。"Provisioning started"というメッセージが表示されてプロビジョニングが開始されます。
provision <UUID>
しばらくするとキーの入力が要求されます。
入力するキーが記載されている箇所はnRF5 SDK for Meshのフォルダ(\nrf5_SDK_for_Mesh_v5.0.0_src\examples\common\include)に格納されているexample_common.hになります。
STATIC_AUTH_DATAというdefine宣言を確認してそちらの値を入力します。
Keyを正しく入力すると下記のように表示されプロビジョニングが完了します。primryの値は後の作業で使用しますのでメモしてください。
評価ボードの設定を行うため下記のコマンドでconfigメニューへ移ります。
menu config
設定対象を評価ボードへ定めるため下記コマンドを入力します。<unicast>となっている箇所にプロビジョニング完了の際に表示されたprimaryの値を指定します。
primaryとはプロビジョニングされたノードの先頭エレメントの番号を示しています。評価ボードにはエレメントが1つしかありませんが、例として、エレメントが2つの場合は2つ目のエレメントのアドレスは00abとなります。
target <unicast>
コマンド実行後にプロンプトが下記の表示のようになっていれば正常に設定されています。
評価ボードへキーを追加するため下記のコマンドを入力します。
私の環境では時々"No response for AppKeyAdd from 00aa"と表示されましたが、再度コマンドを実行することで正常に完了しました。
appkey-add 0
正常に完了すると下記の表示のようになります。
次にAppKeyをモデルへバインドするため下記のコマンドを入力します。
bindコマンドで指定しているパラメータは左から順番に、unicast address、AppKey、Model IDとなります。
composition-get
bind 00aa 0 1000
composition-getコマンドを実行すると下記の表示のように評価ボードの情報が表示されます。
bindコマンドまで完了すると下記の表示のようになります。
ここまでで評価ボードのプロビジョニングが完了となります。
BlueZ付属のサンプルプログラムをプロビジョニング
評価ボードのプロビジョニングで使用したコンソールとBlueZに付属のサンプルプログラムを動作させるコンソールを交互に使用していきます。
そのため、
- 評価ボードのプロビジョニングで使用したコンソール :プロビジョニング用コンソール
- サンプルプログラムを動かすためのコンソール:サンプルプログラム用コンソール
と記載する事とします。
サンプルプログラム用コンソールから、/bluez-5.62/test/test-meshを実行します。こちらはPythonで作成されています。
ディレクトリ名は環境に応じて読み替えてください。
python3 ~/bluez-5.62/test/test-mesh
正常に起動すると下記のようなメニューが表示されます。
プロビジョニングするために下記のコマンドを実行します。
join
表示されたUUIDは後の作業で使用するのでメモします。
プロビジョニング用コンソールへ移って下記コマンドを実行してプロビジョニングを開始します。
UUIDはサンプルプログラム用コンソールで表示されたUUIDを指定します。
※mesh-cfgclientがconfigメニューになっている場合はbackコマンドでメインメニューへ戻ってください。
provision <UUID>
プロビジョニングが開始されるとサンプルプログラム用コンソールに16進の文字列が表示されるので、評価ボードの時と同じくプロビジョニング用コンソールへ入力します。
Keyを入力するとプロビジョニングが完了します。今回はサンプルプログラムの先頭エレメント(parimary)が00abとなりました。
プロビジョニングが完了した後、サンプルプログラム用コンソールにtokenが表示されます。これは2回目以降にサンプルプログラムを起動して同じメッシュネットワークに参加する際に必要となりますのでメモしてください。
プロビジョニング用コンソールでconfigメニューへ移動して設定を行うため下記コマンドを実行します。
menu config
configメニューで下記のコマンドを実行していきます。ターゲットのアドレスが変わる以外は評価ボードの時と同じコマンドを使用します。
target 00ab
appkey-add 0
composition-get
composition-getコマンドを実行するとサンプルプログラムはモデルが2つ存在していることが分かります。
今回使用したい"Generic OnOff Client"は2つ目のエレメントに存在しています。
モデルのバインドを行っていきます。プロビジョニングの際に先頭エレメント(primary)は00abと表示されていたので、"Generic OnOff Client"が存在するエレメントは00acとなります。従ってbindコマンドの指定は下記のようになります。
bind 00ac 0 1001
正常に完了すると下記の表示のようになります。
以上でサンプルプログラムのプロビジョニングが完了です。
これでようやくRaspberry Piのサンプルプログラムと評価ボードのOnOff Serverが通信出来るようになりました。
Raspberry Piと評価ボードの通信
ここからはサンプルプログラム用コンソールを使用していきます。test-meshが起動中の前提で説明を行います。
評価ボードのLEDを制御してみる
サンプルプログラムをbluetooth-meshd daemonへアタッチするため下記のコマンドを実行します。
attach
通信先として評価ボードを指定するため下記のコマンドを実行します。
dest
"Enter 4-digit hex destination address:"と表示されるので、評価ボードのunicast addressである00aaを指定します。
次に、下記のコマンドでOnOff Client Model の動作を指定するためのメニューへ移行します。
client-menu
下記コマンドを実行すると評価ボードのLEDが点灯することを確認できます。
on
LEDが点灯していることを確認できます。
RTT ViewerでもRaspberry Pi側のサンプルプログラムから評価ボードへメッセージが届いていることが確認できます。
参考にした資料など
- エレキジャックIoT No.4 CQ出版
- Nordic社製BLEの開発環境構築と動作確認 @Kosuke_Matsui さん
- Developer Study Guide Using BlueZ as a Bluetooth Mesh Provisioner bluetooth.com
最後に
私が試行錯誤で動作させた手順を振り返って記載しました。
今回のLEDをOn/OffするモデルはGeneric ModeのためSDK等に付属のサンプルプログラムのみで試すことが出来ましたが、まだBluetooth Meshの仕様をよく理解していないため実際に通信を行うまで苦労しました。
次の目標は、既に評価ボード(nRF52833)同士はVendor Modelでの通信を試していますのでBlueZに付属のtest-meshプログラムをベースにVendor ModelでRaspberry Piと評価ボードの通信を行ってみようと考えております。
ご覧いただき、ありがとうございました。