2015/12/27

[ble]Prepare Writeしか来なかった

こんなことがありました、という報告。

 

BLE Peripheralの動作確認をしようと、スマホアプリから操作をしていた。
前日にお客さんのところで動作確認したスマホアプリで、Peripheralアプリは更新したものだ。
Advertisingはしてるし、Connectも張れるのだけど、なぜかCharacteristicへの書き込みがうまく行かない。

まずはデバッガで追ってみたところ、nRF51822でAuthorized Write設定していたのに、コールバックではただのWriteとしてやってきていたのだ。
そのため、Replyを返す関数を呼んだときに「そんな状態じゃ無い」というエラーが起きていた。
どこかで設定を間違えたかと思ったが、そこら辺は修正していない。
Characteristicの設定直前に値が書き換えられたのかとも思ったが、そうでもない。
うーむ。

いろいろ見てもわからないので、BLEスニファで流れを見てみることにした。
そうすると、スマホからWriteじゃなくてPrepare Write Requestが飛んできていた。
1バイトのデータなのに!
それならば、このシーケンスになるのは仕方が無い。

 

じゃあスマホアプリが問題かと思ったのだけど、どうもそういうところが見当たらない。
よくわからないので、nRF Master Controlアプリから書込んでみたが、これもだ!
いつも普通に書き込みをしていた彼ですらPrepare Write Requestしてくるのだ。

これはもうおかしいだろうとスマホを再起動すると、直った。


BluetoothのOFF/ONだけで直ったかもしれないので、そこは失敗したな。
しかし、現象としてこういうのが起きてしまうと、ちょっと悩んでしまう。

1byteのデータをLong Writesしてくるというのは、まっとうではないと思うけれども、プロトコルとして間違っているわけでもないと思う。
なので、Centralのスタックが「めんどくさいから常にLong Writesする」みたいな作りになっているものが出てこないとも限らない。
まあ、Long Writesに対応しているPeripheralの方が少ないとは思うのだが、可能性としては、だ。
・・・そこは相手を信用してもよいのかな。
Centralの気持ちがまだわかっていないから、やはりS130で実際にやってみよう。

でも、今回のはAndroidかNexus5のバグだと思う。

0 件のコメント:

コメントを投稿

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

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