GATT Tableを書きながら、まだまだBLEの勉強中。
今日はCCCD。
Client Characteristic Configuration Descriptionの略で、CCCD。
NotifyでCentralに通知したいときには準備する、くらいの認識だったが、もう少し調べてみた。
CCCDは2byte分のValueを持つCharacteristicだ。
中身はビットで、Notifyを許可するか、Indicateを許可するか、を表すことになっている。
だから、NotifyするCharacteristicにはCCCDを用意するのだ。
Permissionは、Readについては認証など不要で許可する。
Writeについては、アプリレベルでの認証というかがいるようだ。ただ「or is implementation specific」ともあるので、Writeは許可しなくてもよいのかもしれない。
Writeを許可するとどんなよいことがあるかというと、Notify/Indicateの有無をCentralから制御できることになる(Peripheralの意思に因るが)。
Central側が「もう来ないで!」と言って、Peripheralのアプリがそれを受け入れたら、PeripheralはNotify/Indicateを送らなくすることができる。そうすると、お互いの電力消費を抑えることができそうだ。
もしCCCDでNotify/Indicateが許可されていなければ、nRF51822ではsd_ble_gatts_hvx()でNRF_ERROR_INVALID_STATEを返すらしい。
How to know if the Notification/Indication of a Characteristic is enabled? - Nordic Developer Zone
なので「間違えてNotifyしてしまった!」ということは心配しなくてもよいが、戻り値をAPP_ERROR_CHECKマクロでチェックしてしまうとまずいかもしれない。
今日のまとめ。
- CCCDは、現在Notify/Indicateができるかどうかを表している
- 許可されていない場合に通知しようとすると、nRF51 SDK/SoftDeviceでエラーにしてくれる
- CCCDに書込みを許容していると、Centralからも制御できる(CCCDのデフォルト値は通知不可)
- 書き込みの際はアプリなどへの承認が必要っぽい
そうか、デフォルトで通知しないようになってるから、対向アプリで通知開始ボタンを押してやらないといけないのだな。
どうでもよいが、L2CAPとかI2CとかE2Pとかは省略したがるのに、CCCDはC3Dにならないのは不思議だ(発音の関連か)。
私は「I2C」は「あいつーしー」だし、「E2P」は「いーつーぴー」だ。
でも入社したときの上司が「E2P」を「E二乗P」と呼んでいたので、私は発音だけで「EGOP」と覚えてしまっていた。
まあ「いーすくうぇあぴー」を日本版にするとそうなるんだろうな。
インターネットで調べるのが普通になりつつある時代だったけど、さすがにEGOP-ROMでは検索はできなかったし、会話だけだと誰と話しても気付かれなかったし。
懐かしい話だ。
BluezでBLEの勉強中でCCCDで見つけて参りました。
返信削除CCCDに0x02を書き込めといわれたのですが、一体どこに書き込んだらいいのかわかりません。
私も記憶にないのですが、こちらにCCCDに0x01を書いたときの操作を書いていました。
削除参考になるのではないでしょうか。
https://hiro99ma.blogspot.jp/2015/05/bluez-10-gatttool.html