2014/12/10

[nrf51]BLE_ERROR_GATTS_SYS_ATTR_MISSINGが起きる

BLEの対抗機をNexus5にして、調査を進めることにした。
調査といっても、転送できるデータ量を増やしたいというだけのことだ。
ちゃちゃっとやって次に進もうと思ったのだが・・・ASSERTが発生した。
(ASSERTが発生すると、LEDが点灯するようにしている。)

やったのは、ボタンを押すとNotifyで256バイトのデータを送りつける、という動作だ。
1バイトの時には何もなかったのに。。。

エラーコードは0x3401。
BLE_ERROR_GATTS_SYS_ATTR_MISSINGらしい。
「System Attributes missing」とあるが、はてさて・・・。


検索すると、すぐ出てきた。Nordicの資料なので、ログインしていないと見えないのかも。
GATTS Handle Value Indication or Notification with System Attributes Missing

なんとなく見覚えがあると思ったら、以前調べていた。
hiro99ma blog: [nrf51]BLEスタックのイベントハンドラを見る (6)

一番最後に「サンプルでは、このエラーが発生すると、単にエラーという扱いにしている」と書いているとおり、私もエラーにしている。
sd_ble_gatts_sys_attr_set()を呼んでやりさえすればよいようなんだけど、疑問が残る。

  • なぜサンプルではsd_ble_gatts_sys_attr_set()を呼ぶようにしていないのか
  • なぜイベントとしてではなく戻り値でエラーを返すルートがあるのか
  • なぜ送信データが多くなった場合に発生したのか

これを調べる前の想像では、Notifyで送信しているデータを送信しきっていないのにsd_ble_gatts_hvx()を呼んだからじゃないだろうか、と思ってたんだが、どうなんだろう?
だって、「System Attributeが見当たらない」というのは、データ量に依存しなさそうではないか。
また、IndicationやNotifyのときにわざわざこのエラーを返すというのは、何かしらSystem Attributeと通知の関連が深いことを意味しているのだと思う。
それに、通知のためのインターフェースなら"hvx"などというよくわからない単語は使わないでよいはず。
"send_notify"とか、もっとわかりやすい言葉があるだろうに。

このあたりの理屈がわかることで、BLEかnRF51についての理解が深まるんじゃないか、と勝手に期待している。
では、1回で終わるかどうかわからないが見ていこう。


正常時のシーケンスによると、sd_ble_gatts_hvx()によってATTテーブルを更新し、それによってSoftDeviceがピア側に通知するようだ。
エラーを返す場合、ATTテーブルは更新されない。
だから、sd_ble_gatts_hvx()を呼んでSYS_ATTR_MISSINGが返ってきたときには、sd_ble_gatts_sys_attr_set()を呼んで終わりではなく、またsd_ble_gatts_hvx()を呼ばないと行かんはず。

 

"hvx"は、GATT HVx、らしい。
Core_V4.1を検索したが・・・High quality Voice、くらいしか相当しそうなものが無かった。
と、思ったらNordicの造語か。
what does "HVx" stand for ? [closed] - Nordic Developer Zone
"Handle Value x"で、xは"Indication or Notification"とのこと。
わかるかー。

 

次はSystem Attribute Missingとの関係か。
検索すると出てきた。
nRF51 SDK: Bluetooth Low Energy Pairing Guide
このNordicドキュメント、SDK4, 6, 7にはなく、SDK5に入っている。。。
バージョンごとに入っていたりいなかったりすると、どうしようもない。

大ざっぱに読んだ感じでは、System AttributeというのはGATT Server側が接続しに来たClientごとに持っておくようなデータで、切断前にFLASHに保存するようだ。
Bonding Managerが管理するようなので、Just WorksのBonding無しとかだと関係ないような気がするな。

あ、Bonding有りにしてた・・・。
しかし、無しに戻しても同じエラーが発生した。


よくわからないので、BlueLightを使ってみたら、こっちはエラーにならなかった。
クライアント側の問題??
でも、そこから続けてMaster Controlを使ってもエラーにならなかった。

普通の無線通信だから、パケットを拾って比較していけば違いはわかるんだろうけど、その根気が私にあるかどうか。
接続開始のチャネルが毎回変わるので、スニファで拾うのが大変なのよね・・・。
受信機を3つ用意すればいいんだけど、そんなブルジョアジーなことはしたくないし。

0 件のコメント:

コメントを投稿

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

注: コメントを投稿できるのは、このブログのメンバーだけです。