2015/02/11

[ble]CCCDへなぜ書き込みをしたいのか?

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では検索はできなかったし、会話だけだと誰と話しても気付かれなかったし。
懐かしい話だ。

2 件のコメント:

  1. BluezでBLEの勉強中でCCCDで見つけて参りました。
    CCCDに0x02を書き込めといわれたのですが、一体どこに書き込んだらいいのかわかりません。

    返信削除
    返信
    1. 私も記憶にないのですが、こちらにCCCDに0x01を書いたときの操作を書いていました。
      参考になるのではないでしょうか。
      https://hiro99ma.blogspot.jp/2015/05/bluez-10-gatttool.html

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。