Meshを極めよう(無理)

#モデル
BLE Meshはフラッド通信ということもあってBLEとは全く考え方が異なっています。Meshではあらかじめモデルと呼ばれる、BLEでいうところの標準サービスに相当するものがあります。各モデルは機能がガチガチに決められており、その定められた機能に従って動かすというものです。
例えばGeneric OnOff ServerはON/OFFの二値ステータスを、紐づいているGeneric OnOff Clientに対して送信します。**それ以外のことはできません。**
##モデル一覧
最新版の実装済みModel一覧はこちらです。nRF SDK for Mesh時代はSensor Modelsまででしたが、こちらは現在進行中のSDKということもあって実装が進んでいます。

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.8.0/nrf/libraries/bluetooth_services/mesh/models.html

#Mesh用語
Meshを理解するために最初にぶち当たる壁として、BLEでは出てこなかった用語がこれでもかというくらいいっぱい出てきます。2～3回くらい読んだ程度ではどれが何を指しているのかさっぱり分かりませんが、100回くらい読めばきっと少しずつ分かってくるはずです(笑)
##Provisioner
Meshネットワークにおけるマスターデバイスのことを指しています。ほとんどの場合、PCやスマートフォンがその役割を担いますが組み込み機器でもできないわけではありません。ProvisionerはUnprovisioned Device(どこにも所属していないデバイス)を自身のMeshネットワークに参加させる手続きをすることができます。
また、MeshネットワークはProvisionerを起点として構成されるためUnicast Addressとして必ず0x0001が割り振られています。Unicast Addressを変更することは可能です。
##Network Key(NetKey)
Provisionerが生成するMeshネットワークを識別するためのキーであり、Provisionerと同一のNetwork Keyを持つデバイスは同一ネットワークに参加していることを示します。ただし、自分で手動でNetwork Keyを設定しても参加することはできない。理由は・・・秘密鍵があるんだっけ？(自信なし)
Network Keyは追加することが可能で、2個目以降のNetwork KeyはSubnet Keyと呼ばれます。Network KeyおよびSubnet KeyはApp Keyに紐づけることができます。
##App Key(s)
Publish/Subscribeをしたときにこのキーが一致しているメッセージを自分宛のメッセージとして処理することができます。Publishの場合は1個だけ、Subscribeの場合は複数のApp Keyを指定できます。App KeyはNetwork Key/Subnet Keyと対になっており、App KeyとNetwork Keyの両方が一致したノードだけがメッセージを受け取ることが可能となっています。
##Unprovisioned Device
BLE Meshネットワークに参加可能なデバイスのうち、どのMeshネットワークにも所属していないデバイスを指します。
##Node
Meshネットワークに参加しているデバイスのことです。一度参加手続きをしたデバイス(Node)を再びUnprovisioned Deviceに戻すにはリセットする必要があるため、デバイスは何らかの形で自身のリセットをする機能が必須です。
Provisionerは不要なデバイスをはじき出すために対象デバイス以外のNetwork Keyを変更することができます。そのような形でネットワークから排除されてもNodeはUnprovisioned Deviceには戻れない(誰もいないNetwork Key上でNodeとして存在し続けることになる)ので必ずリセットが必要です。
##Provisioning
Unprovisioned DeviceをNodeにするための手続きを指します。
##Element
Nodeを構成する一つ一つの要素のことです。例えばGeneric OnOff Clientを持つスイッチであったり、Generic OnOff Serverを持つ電球であったりします。一つのNodeが複数のエレメントを持つこともありますが、同一NodeがClientとServerのElementを同時に持つのはよい設計とは言えなさそうです。(禁止はされていません)
##Model
各Elementが持つプロパティ(のようなもの)を指します。
Generic OnOff Server・・・On/Offの状態を受信する(Subscribeに割り当てる)
Generic OnOff Client・・・On/Offの状態を送信する(Publishに割り当てる)
Generic Level Server・・・8bit/16bitの値を受信することができる
Generic Level Client・・・8bit/16bitの値を送信することができる

:::note info
Bluetooth Low energyと違ってカスタムUUIDみたいなのを作ることはできないと思われますが、仮想アドレスというのがなんなのか分からないのでまだ確定ではありません。
:::

##Address
Meshデバイスは必ず固有のアドレス(Unicast Address)を一つ持っています。Meshネットワーク内のデバイスはこのAddressを使ってデバイス間の送受信を行います。
###ユニキャストアドレス
NodeおよびProvisionerに割り当てられる個別アドレスで0x0001～0xBFFFの範囲で任意の値を一つ持つことができます。他デバイスとの重複は不可ですが、実際に存在している場合にどういう挙動になるかは調べていません。(要確認)
###グループアドレス
アドレス0xC000～0xFEFFの範囲でユーザー独自のグループを生成できます。PublishやSubscribeをグループアドレス宛にすることで、Nodeの追加や削除を簡単にできたり、複数のデバイスからのPublishを受け取ったり、複数のデバイスがSubscribeをできるようになります。
グループアドレスのうち以下のアドレスは仕様により固定されています。
####0xFF00-0xFFFB
RFU(将来使用のため予約)
####0xFFFC
All-proxies：Proxy機能が有効になっている全ノードに送信
####0xFFFD
All-friends：Friend機能が有効になっている全ノードに送信
####0xFFFE
All-relays：Relay機能が有効になっている全ノードに送信
####0xFFFF
All-nodes：全ノードに送信
####仮想アドレス(？)
BLEで使われていたUUID形式のアドレスらしいですが、詳細は不明です。
##Publish(パブリッシュ)
メッセージを送信すること。
送信アドレス(Address)とAppKeyを指定することでPublish(送信)ができます。
グループの説明のところでも記載しましたが、送信アドレスにユーザーグループを指定しておくと、複数のデバイスにSubscribeしてもらえたり、自分以外のデバイスからのPublishも同じServerが受信できたりします。また、デバイスを交換した際にもAddressを変更する必要がないです。
(ユニキャストアドレスを使っていると、故障などでデバイスを交換してAddressが変わった時にSubscribe側のデバイスの設定も変更する必要があります)
##Subscribe(サブスクライブ)
メッセージを受信すること。
受信アドレス(Address)とAppKeyを指定しておくと、指定したアドレスからパブリッシュがあった場合に自動的に受信します。
送信アドレスと同様に、受信アドレスもユニキャストで動作しますが、汎用性を考慮するとユーザーグループを使用したほうがよいです。
#Appendix
##nRF Connect SDK

https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_bt_mesh_concepts.html

##Bluetooth

https://www.bluetooth.com/learn-about-bluetooth/recent-enhancements/mesh/mesh-glossary/