ncs: どのくらいserviceの実装に書くのか

2024/09/25

BLEのサービスは、主に ATT の定義を規定して、それに沿って実装していくだろう。
ATT に書き込むとどうだとか、読み込むとどうだとかあるとは思うが、それは実装した後のことで Central と Peripheral としては ATT 定義を信用して作業することになる。

そうなると、ncs で service の実装をするとき、ATT の部分を処理するところと、その前後で処理をするところに分けられるだろう。
このサービスはこの Peripheral でしか動かないからサービスと一緒にハードウェアの処理も実装してしまえ、なんて考えてしまったので反省するために文章としてつらつらと書くことにした次第である。

まあ、どこででも言われる、実装はなるべく疎結合にしておけ、というやつだ。
わかっているつもりだけどやってしまうのは、わかってないんだろうなぁ。

nrf のサービス実装を見てみる

せっかくなので既存の実装を見ておこう。

LBS

BMS

NUS

user_data

LBS は グローバル変数のbutton_stateは更新しかしないというのがあやしい。
予想ではBT_GATT_SERVICE_DEFINE()でCharacteristic定義のBT_GATT_CHARACTERISTIC()最後のパラメータ”user_data”がattr->user_dataになる、だ。 bt_gatt_attr_read()の説明には「Read attribute value from local database storing the result into buffer」などと書いてあるが、local database ってどこにあるんだ、となるではないか。

DevAcademy BLE Lesson 4 Exercise 2 のコードを使って確認しよう。 この辺attr->user_databutton_stateのアドレスを出力させる。

<inf> Lesson4_Exercise2: attr->user_data=0x0x200032bd, &button_state=0x0x200032bd

うむ、予想通り一致した。

user_dataを使ったりグローバル変数の方を使ったりとまちまちなのは何でだろう?
この表を見ると type によって user_data の意味が違うようだ。 自分でサービスを制御する場合はどうでもよいけど、CCCD みたいにお任せするときは適切なデータが入っているようになっているのだろう。
しかしこの表は GATT Client の方にあるのだが GATT Server でも同じと思っていてよいのだろうか。 ページが広すぎてとても読みきれない。。。

おわりに