nRF Connect SDK:本気出してBLE Mesh

# 前書き
なんだよお前Matterの登場でBLE Mesh死んだって言ったじゃねぇか(笑)
それでもやらないといけない時はあるのです！(キリッ

https://qiita.com/yoshihiro0709/items/eb4aadb375be929e6773

ちなみに過去に少しだけBLE Meshに触れた記事もありますのでよかったらそちらもどうぞ。

https://qiita.com/yoshihiro0709/items/b083ced947927be44c45

https://qiita.com/yoshihiro0709/items/0dd6e70e6df15379934f

ただですね…改めて自分の書いた記事を読んでみると、上記の記事に書いてある内容と現在の動作状態が違うところがいくつかある気がするんですよね。しばらく触っていなかったのは事実なので、もしかしたらその間に仕様変更があった可能性もあります。

::: note
ちなみに僕が以前に触っていたときはBLE MeshアプリはVer 1.0.0でした。
現在は3.3.0になっています。
:::

# BLE MeshはnRF Meshを使う
以前の記事でも書きましたがBLE Meshは従来のBLEとは通信方式が全く異なるため使用するアプリも異なります。
BLEではnRF Connect for mobileというアプリを使っていましたが、BLE MeshではnRF Meshを使います。
## 立ち上げてみると…
早速アプリをインストールして立ち上げてみますが何も表示されていません。なんやこれ…とは思ったものの、世の中にBLE Meshがほとんど存在していないことを考えても不思議ではないかな…と思いつつ
![Screenshot_20230704-140755.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/4f00385d-e4a4-a7bf-ba62-86442823e267.png)
nRF Connect for mobileにはデバイスがいっぱい表示されて動いている感が得られる(笑)のを考えると、最初からなんだかとっつきにくいアプリではあります。

::: note
仮にMeshデバイスがいっぱいあってもこのスタートアップ画面には出ませんけどね(笑)
:::

# Meshデバイスのサンプル
nRF Connect SDKにはBLE Meshのサンプルも用意されています。ここでは一番分かりやすくLight Switchのサンプルを使いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/c7b15568-6984-a2ea-c597-47754dfe811c.png)

::: note warn
Meshは最低でも2台のデバイスが必要になります。
このあとLightデバイスも作ります。
:::

コンパイルしてフラッシュに書き込んで…何も出てこないですね。でもそれは正しい状態でnRF Meshのトップ画面はProvisioned Device(ネットワークに参加しているデバイス)を表示する画面であるため、まだ誰もネットワークに参加していない状態では何も表示されません。
ネットワークにデバイスを参加させるには右下の＋ボタンを押します。すると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/cbd0b384-f073-e802-542f-69b1e2ff894b.png)
先ほどコンパイルしてフラッシュに書き込んだファームウェアがちゃんと動いているようです。
この状態はまだUnprovisioned Device(ネットワークに未参加のデバイス)なのでデバイスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/baf8efc4-4d37-f2c4-06ef-30df9dbc8698.png)
この画面ではデバイス名称を変更したり割り当てるApp Keysを変更したりできるのですが、とりあえずこのままでIDENTIFYをタップし、続いてPROVISIONをタップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/2426b392-93ae-2ed1-6daf-2c9b0e1cbecf.png)
OOB(Out of Band)はNo OOBで大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/683fe9cb-8f9f-faf9-4ac0-1d3466bdb719.png)
ネゴシエーションが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/3c9447be-0530-4273-bcfc-b8b5d4efc858.png)
と思いきや…なんやこれ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/e111a625-3e20-cdf3-0b95-6aee7b1f4743.png)
こんなのnRF5 SDK for Meshの時は一度も見たことがないけど…何かミスったんかな…。と思いつつ数回Provisioningをやり直してみても変わらず。気を取り直して(諦めて)書いてあるとおりにGET COMPOSITION DATAを押してみましたが何も反応がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/de129e09-cc09-9c49-f663-429ab3d7c3af.png)
ここらへんでさすがに変だなぁと思ったのでデバッグログを確認してみると…なんやこれ！Fatal Error吐き出しとるやんけ！(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/b6c7e28c-612d-272c-3631-ba35838798f5.png)
そりゃあ動くわけないですよ、ええ…。

::: note warn
NCS 2.4.0時点での状態でバグだと思われます。
普通の人はここで諦めます(笑)
:::

# とりま修正を試みる
ということで詳細は割愛しますが以下の修正を実施することで動くようになります。

``` prj.conf
CONFIG_NCS_SAMPLES_DEFAULTS=n
```

::: note warn
単純に上記のコンフィグをOFFにするとLOGもOFFになってしまうのでほとんど何も表示されなくなります。
とりあえず今はこのままで。
:::

無事コンフィギュレーションが終わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/30ea5c8a-8ddc-e32f-0c5d-985cae6fa33e.png)

# これだけでは何もできない
最初のほうにも書きましたがBLE Meshの動作を確認するには最低でも2台デバイスが必要になります。ここまでの作業でセットアップしたのはLight Switchですが、このデバイスが持つElementを見てみるとGeneric OnOff Clientが4つあります。名前の通り照明用スイッチの役割を持ち、照明デバイスに対してOn or Offのステータスを送信する(Publish)側のデバイスです。この照明用スイッチデバイスが本当に送信しているかどうかを確認するためには、受信する(Subscribe)側のGeneric OnOff ServerのElementを持つデバイスが必要になります。それがLightというプロジェクトになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/0d0948a5-12b8-be41-eb31-ffd8f73836ce.png)
# Lightデバイスのセットアップ
ここまでの流れと全く同じ感じで今度はLightデバイスをセットアップします。基本的な部分は全く一緒なので説明は省略します。あ、もちろんですが

``` prj.conf
CONFIG_NCS_SAMPLES_DEFAULTS=n
```

も同様に必要です。
# やっと準備が整った
Lightデバイスも登録して準備ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/1e764300-ecdd-c7a8-4d08-26a35f356722.png)
ここから本格的な設定に入ります。Light Switchデバイスのほうは先ほどちょっとだけ見ましたがElementを4つ持っていました。これはそのまんまでスイッチが4つあることと同義になります。評価ボードにはボタンが4つ付いているので各ボタンにElementが1個ずつ割り当てられます。
Lightデバイスのほうも見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/e65a5cde-1fc0-ebf7-d079-aaa6d95342ed.png)
同じように4つのElementがあり、それぞれのLEDに割り当てられています。ちなみにElement Nameのところにある0x0006などの数値はUnicast Addressになります。

::: note warn
名前を変更するとこの数字を消すこともできます。
ただし、Elementのどこを見てもこの数字は見つかりません(笑)。
:::
# PublishとSubscribeの設定
どちらから設定してもよいのですが、その前にLight Switchデバイスの評価ボードに付いているボタンを押してみましょう。ん？何も起きない？正しいです。なぜなら何も設定していないからです。
ということで、まずはLight Switchのほうから設定していきましょう。Publish側です。
設定をするのはElement: 0x0002を開いたところにあるGeneric On Off Clientです。これをタップすると詳細設定の画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/93e478e5-b35c-74ee-45b7-d8e25b6089e3.png)
App KeysにあるBIND KEYを押してApplication Key1を選択します。ちなみにApplication Keyはもっといっぱい持たせることができるのですが、ここではこのまま選択します。
次にPublish Addressを設定します。ここではLightデバイスが持っている0x0006にPublishします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/416ec637-bee1-1a16-c426-c857e1b382f1.png)
よし！できた！と思ったそこのあなた、ボタンを押してみてください。あれ、自分自身の評価ボードのLEDがON/OFFするだけ…？はい、まだ設定は終わっていません。Lightデバイス側が受信できるように設定する必要があります。
Lightデバイスが持つElement: 0x0006内にあるGeneric On Off ServerをタップしてApplication Keyを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340602/44c94c57-3259-fff9-4e4a-6acc05699b79.png)
Unicast Addressでメッセージを送っているので設定はこれだけでOKです。そしてボタンを押してみると…お、Lightデバイス上のLEDが点灯しました！もう一度押すと消えます。これがBLE Meshの基本になります。
# 余談
BLE Meshは仕様が複雑すぎて、最初に動かせるようになるまでの色々なパラメーターの理解と設定だけで挫折できます(笑)。
僕も最初にここに辿り着くまでに1年くらい挫折と挑戦を繰り返しました。