2015/09/13

[nfc/ble]NFCペアリングがまだまだだめだ

nRF52でNFCペアリングがうまくいかないシリーズ。

[nrf52][nfc]NFC Pairingサンプルを動かす (1)
[nrf52][nfc]NFC Pairingサンプルを動かす (2)
[nrf52]NFCペアリングサンプルがまだうまくいかない
[nrf52]まだNFCペアリングできないのだ

  • Peripheral
    • nRF52 Preview DK
    • SoftDevice S132 v1.0.0-3alpha
    • nRF52 SDK v0.9.1
  • Central
    • Nexus5
    • Android 5.1.1 (Build : LMY48l)

やりたいことは、「Nexus5でnRF52 Preview DKにNFCタッチしてペアリングしたい」だ。

  • できていること
    • nRF52 Preview DKがNFCタグで動く
    • NFC ForumのSimple Secure Paringに書いてあるタグの内容が読める
    • タグの内容をNexus5で読んで「ペアリングしますか?」と聞いてくる
    • nRF52 Preview DKでAdvertisingが開始する
  • できていないこと
    • AndroidのBluetooth設定画面で「ペアリングされたデバイス」に出てこない

nRF52 Preview DK側の動き

  1. NFCタッチ待ち
  2. タッチされてタグが読まれるとAdvertisingを開始する
  3. Connectしたら、HRSサンプルと同じ動きをする

Androidに載っているHRSアプリとしては、Connectしてしまえば使うことができる。
nRF52 Preview DKのアプリも同じだ。
だから、ペアリングしようとすまいと、HRS自体は動くのだと思う。
実際に動いてるし。

そもそも、ペアリングって何だ?


Interface誌2015年8月号のBLE特集を読むと、暗号通信をするときには鍵交換する必要があり、その鍵交換の手順をペアリング(Bonding)と呼ぶ、とある。
なるほど、では、暗号化されたデータを使わないならペアリングは不要ということか。
ただ、「暗号化しない」という情報を交換するかもしれない。

このNFCペアリングサンプルがどういうやりかたをしているのか、調べる必要がありそうだ。
ソースを読むしかないかと思ったが、Note欄の下に書いてあった。

このアプリはデフォルトではJust Worksペアリングを行う(Android端末でテストを行う準備をするため)。

"prepared for testing with Android device"は、「Android端末でテストする準備」でよい?
ペアリングする準備とかじゃ無くて、テストする準備?
もう少し先を読んでみよう。

OOBペアリングを行うようにするには、main.cに適切なTK値を定義し、NFC_BLE_PAIRING_TYPEとOOB_AUTH_KEYを使うようにする。

ソースを見ると、NFC_BLE_JUST_WORKS_PAIRINGとNFC_BLE_OOB_PAIRINGがコンパイルオプションとしてあり、JUST_WORKSの方はTK値が常に0、OOB_PAIRINGはTK値が設定できる、とコメントにある。
OOB_PAIRING有効時の設定を見ると、SEC_PARAM_OOBが有効になって、OOB_AUTH_KEYが定義されるようになっていた。

じゃあ、とコンパイルオプションを変更したが、結果としては同じだった。
そうですか。

ただ、NFCタグの中身は増えていた。
キーを渡しているのだろうね。

 

ちゃんと、ペアリングしよう、という意思はあるようなのだ。
こんなパケットが出てる。

image

ただ、ここから先、MasterがRETRYを繰り返しているだけで終わってしまう。
MasterはNexus5のはずだから、nRF52 Preview DKが返事をしていないっぽい。
これって、Nordicのシーケンスでも一番最初のところですな。

main.cを見ても、sd_ble_gap_sec_params_reply()を使っているところが無いのだけど、それがよくないのかい?
SECなイベントとしては、BLE_GAP_EVT_AUTH_KEY_REQUESTだけをさばいているようなのだけど、シーケンスに書いてあるBLE_GAP_EVT_SEC_PARAMS_REQUESTはやってない。

main.cではやってないのだけど、device_manager_peripheral.cではやっていそうだ。
dm_ble_evt_handler()にcase文としてあるし、main.cはble_evt_dispatch()でdm_ble_evt_handler()を呼んでいる。
じゃあ、ここがうまく動いていないということか?

 

device_manager_peripheral.cはログを出すようなので、見てみよう。
(これでやっていたのが「hiro99ma blog: [nrf52]app_uart_fifo.cが2つある」だ。)

[DM]: >> BLE_GAP_EVT_SEC_PARAMS_REQUEST

このログは出た。
出たなら、sd_ble_gap_sec_params_reply()も実行しているはずなのだ。

[DM]:[CI 0x00]:[DI 0x00]: Bonded!

こんなログも出てるし。
わからん、わからんのだぁぁぁぁ

0 件のコメント:

コメントを投稿

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