iOSはまあ何とかなりそうなので、Androidを進めていこう。
いや、うちのMac miniは遅くてイライラしてしまうのだ。
SSDにすべきかなぁ。
そうそう、スキャンして目的のデバイスを見つけることについて考えないと。
今は、デバイス名だけを見比べて、一致したらやめている。
でも、同じBLEデバイスが何台も置いてあるという状況もあるだろう。
そう考えると、デバイス名だけってのは乱暴そうだ。
ならば、デバイス一覧を表示させて、ユーザに選んでもらうしかない。
ペアリングの入力無しで、デバイスに対しても個別の設定が不要なのであれば、見つけたものをどんどん処理していけばよいだろう。
そのときは、デバイスのハードウェアアドレスで見分けるしかないのかもしれないが、外見ではどれがどのデバイスかを見分けるのは難しいだろう。
なるべく安く作りたいとしても、LEDくらいはつけておいて、自分の状態を表現できた方がよさそうに思う。
あ、デバイスを作るときのことね。
さて、スキャンした結果がコールバックされたとき、引数が3つついてくる。
onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
deviceとrssiはいいのだが、scanRecordはなんだ?
「The content of the advertisement record offered by the remote device.」とあるので、Advertisingのときに送られてきたデータなのだろう。
RC-S390の場合、37byte返ってきているみたいだ(配列要素は62あるけど、37byteまでデータが詰まってて、残りは0x00だった)。
バイナリ値があれば解析をする・・・それが刑事の哀しい性(?)だ。
Core_V4.0の仕様書を「37」で探したところ、p.2202がそれっぽい。
「 The valid range of the Length field shall be 6 to 37 octets.」
ここのLengthだろう。
scanRecordが37byteで、それはFigure 2.2のPayloadにあたるのであれば、Figure 2.3は関係ないな。
スキャンした結果が返ってきたのならば、p.2206のSCAN_RSPになるのか。
AdvAはランダムだかなんだかのデバイスアドレス、ScanRspDataはAdvertiseしたホストからのデータ。
ということは、RC-S390が私に送ってくれた何かということになる。
scanRecordを眺めてみたが・・・さっぱりわからん。
最後の6byteが「PaSoRi」という文字になっているということはわかった。
SCAN_RSPでネットを調べると、私が思い違いをしているようだ。
http://reinforce-lab.github.io/blog/2013/02/07/ble-linklayer/
AdvertisingとScanは別の動作らしい。
p.2203によると、PDUの種類は7つ。
このうち、_INDがAdvertising PDUだそうな。
Payloadは、AdvAはどれもあり、違いはAdvDataがあったり別だったりするくらいだ。
で、どれもホストからのデータというくらいで、詳細は無い。
先ほどのリンクを読むと、LengthとDataが並んでいるらしい(Dataは、AD TypeとAD Dataから成る)。
Core_V4.0をAD Typeで検索すると、p.1735が出てきた。
1octのLengthと、そのLength長のData。Dataはn octのAD TypeとLength-n octのAD Data。
AD Typeはこちらの一覧を見るらしい。
いやあ、ここまで書かれてあると非常に助かりますわい。
で、これを見ながら解析していったのだが・・・あわない。
AdvAが無いものとして解析するとちょうどよさそうなのだ。
どうも、引数のscanRecordは、AdvertisingのパラメータとScanの結果が一緒に入ってきてるような気がする。
サイズも62byte分ということで合うし。
ということは・・・「37」って数字でそれっぽいところが引っかかったのは、単なる偶然だったのか・・・。
おそろしや・・・。
入っていたのは、こんな情報。
- BR/EDR Not Supported
- Incomplete List of 128-bit Service Class UUIDs
- Slave Connection Interval Range : 20ms~300ms
- Tx Power Level : 0 dBm
- Complete Local Name : PaSoRi
BluetoothDevice.getName()に入ってるのは、このLocal Nameなのかな。
このデータをアプリがどのくらい管理しないといかんのかはわからないが、あまり気にしなくてもよさそうな気はする。
さて、次はConnectionだ。
Androidのサンプルはなんか難しいので、こちらを見てやっていくことにする。
http://blog.fenrir-inc.com/jp/2013/10/bluetooth-le-android.html
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。