experimental_ble_app_hrs_pairing_nfcで流しているタグを解析した。
解析した、というと格好が良いが、単に読んで調べただけだ。
BLEというより、NDEFだ。
NDEFレコードが3つあるNDEFメッセージになっている。
1番目は、Handover Select Record。
これが先頭にあるので、Handoverの種類としてはStaticになる。
バージョンは1.3。
1.2とあまり変わらないようだが、BR/EDRのDevice IDが使えるのが1.3からのようだ。
Handover Select Record自体は大した情報がなくて、接続する相手の情報がこのIDのレコードに書かれていますよ、というインデックス的な役割程度だ。
アクティブなCarrier RecordがIDの'0'と'1'にありますよ、と書いてある。
ID'0'は、BLE関連が書かれている。
見分け方は、TNF=2となってMIME-Typeを指定するようになっていることと、MIME-Typeが'application/vnd.bluetooth.le.oob'になっていることだ。
ペイロードの部分はAdvertisingと同じく、Length-Type-Value、という構造になっている。
Typeも、AD-TypeなのでAdvertisingと同じだ。
ここでは、TK value、LE Role, LE Bluetooth Device Address, Appearance, Flags, Complete Local Nameが入っている。
ID'1'は、BR/EDR関連が書かれている。
見分け方は、TNF=2となってMIME-Typeを指定するようになっていることと、MIME-Typeが'application/vnd.bluetooth.ep.oob'になっていることだ。
ペイロードの部分はBluetooth BR/EDR Secure Simple Pairing OOB Dataのフォーマットになっている。
といっても、Bluetooth Device Address以降はLength-AD Type-Valueという形式だ。
なんで同じ形式にしなかったんだろうね。。
入っているのは、Security Manager OOB Flags, Device ID, Appearance, Complete Local Nameだ。
サンプルでタグの用途はもう1つあって、それは「アプリを起動させる」だ。
起動時にペアリング情報が存在したり、接続時にペアリング成功の経路を通った場合は、アプリを起動させるタグに書き換えている。
Androidだと、AARというのだっけ。
それと、Windowsのタグが入っている。
Windowsの方は知らないけど、タグが入っているから、読んだら立ち上がるのかもね。
実装しか見てないので、よくわからんです。
Static Handoverなのでタグを1回読んでしまえばNFCの部分は終わりだ。
だから、Androidで「ペアリングしますか?」というダイアログが表示された時点で、NFCの役割は終わっている。
ということは、ペアリングがうまく行かないのは、
- タグを読んだけど、正しく読めていない
- Androidが悪い
のどっちかだろう。
logcatを見る限りでは、タグはちゃんと読んでいる。
デバイス名とデバイスアドレスが出ているからだ。
では、やはりAndroidか。
bondStateChangeCallbackのnewStatusが1とか2とか、その辺で結果が違うのはわかっている。
ただ、もうここはアプリで制御できるところではない。
ずっと失敗するなら、それはそれで原因がありそうだけど、成功するときもあるのだ。
そのときは、いつの間にか成功している気がする。
ピクトに、Smart Lockとして使えますよ、と表示されていて気付くのだ。
なにが・・・何が違うのだ・・・。
あっ。
失敗するとき
成功するとき
ダイアログにデバイス名が表示されている!
しかし・・・ダイアログにデバイス名が表示される条件は、なかなか難しそうだ。
タグから取得した名前ではなく、BLEから取得したデバイス名で表示しているような感触なのだ。
Nexus5でBLE機器名が見つけられるタイミングを見ると、なんとなくBluetoothをONにしてすぐくらいしかやってくれていないように感じる。
すでにAdvertisingしている状態でBluetoothをONにすると、Bluetooth設定アプリの「使用可能なデバイス」に名前が出てくる。
でも、NFCペアリングサンプルの動作仕様は、タッチしたときにペアリングを開始する、だから、タッチする前はAdvertisingをしていないのだ。
いまのNexus5の動作としては、Advertisingしている機器に対してNFCペアリングを行ったときにしか成功しないような感じがしている。
もしかしたら、NFCタグから読んだデバイス名&アドレスの情報と、実際にAdvertisingしているデバイス名&アドレスの情報を見比べてからペアリングしようとしているのかもしれない。
だったら、一致しない間はダイアログを表示しなければ良いだけの話だ。
何度か試したが、標準のBluetooth設定アプリはBLE機器の捕捉があまり強くない感触だ。
nRF Master Control...じゃなくて、nRF Connectアプリでは確実に捕捉しているからな。
ここをうまくやらないと、NFCペアリングはうまくいかないと思う。
でも、市販されている機器もあるし。。。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。