2013/11/24

[ble]BLEを試してみたい (5)

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.」

image

image

ここのLengthだろう。
scanRecordが37byteで、それはFigure 2.2のPayloadにあたるのであれば、Figure 2.3は関係ないな。

スキャンした結果が返ってきたのならば、p.2206のSCAN_RSPになるのか。

image

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つ。

image

このうち、_INDがAdvertising PDUだそうな。
Payloadは、AdvAはどれもあり、違いはAdvDataがあったり別だったりするくらいだ。

image

で、どれもホストからのデータというくらいで、詳細は無い。
先ほどのリンクを読むと、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。

image

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 件のコメント:

コメントを投稿

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

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