2015年8月31日

[nrf52]NFCペアリングサンプルがまだうまくいかない

nRF52832のPreview DKはNFCアンテナが付いているのだが、それを使ったペアリングのサンプルがある。
動かしてみたのだが、前回はうまくペアリングできなかった。
hiro99ma blog: [nrf52][nfc]NFC Pairingサンプルを動かす (1)

NFCのせいかと思い、軽く仕様を確認したのだが、NFCの役割はAndroidに「ペアリングしますか?」の情報を伝えるまでで、ペアリング自体はBLEだけしか関係していないようだった。
hiro99ma blog: [nrf52][nfc]NFC Pairingサンプルを動かす (2)

このときは、シーケンスを見るしかないのかなぁ、と思っていたのだが、私はそんなに詳しくないし、そもそもダメだったとしてもやれることがほとんどない。
それよりも「やり方が悪いだけでは?」という調べ方の方がよかろう、ということで、やり方を見直すことにした。

ぐだぐだ書いたが、「説明を見ながらちゃんとやってみよう」というだけのことだ。


nRF52832のNFCペアリングサンプルは、これだ。
http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk52.v0.9.1%2Fble_sdk_app_hrs_pairing_nfc.html&cp=4_0_0_4_6_0

  1. 起動してもAdvertisingはせずに、NFCタグとして立ち上がる
  2. NFCリーダ(Initiator側ね)で読むと、ペアリングに必要なデータをNFCで送る
  3. タグを読まれるとAdvertisingし始めるので、相手はペアリングできる。
  4. Connectingした後は、普通のHRSサンプルと同じ動きをする
  5. コネクションが切れても自動的にAdvertisingはせず、またNFCタグを読んでもらうことになる

これだけのようだ。

よく読むと、下の方にテスト手順が書かれていた。
読むべきはこちらだったか・・・。

  1. サンプルアプリをコンパイルして、焼く。
  2. NFCアンテナにスマホをタッチして、LED1(BSP_INDICATE_ADVERTISING)が2秒周期のDuty比10%・・・200msec点灯の1800msec消灯になる。NFCタグが搬送波を検知すると、LED4が点灯する。
  3. 'Nordic_HRM'とペアリングするかどうかのポップアップがスマホに表示され、LED1(BSP_INDICATE_CONNECTED)が点灯する。
  4. スマホのnRF ToolboxアプリでHeart Rate Applicationをテストする

つまり、ペアリングはアプリじゃなくてスマホ自体がやるということですな。
やってみると、やはりうまくいかない。

  • LED1は点滅するが、LED4は変化しなかった(光るのが一瞬ぽい感じもする)。まあ、これはよい。
  • LED1の点滅開始と同時に、スマホに「Bluetoothデバイスをペアに設定してもよろしいですか?」が表示される
  • 「はい」にすると、LED1が消えてしまう

うーむ、やっぱりだめか。
BLEモニタを見ると、Connect Update Reqのあと、SMがPairing Reqして待ち状態になっているようなのだ。
Reqを投げているのは、おそらくMaster。
なんで「おそらく」なのかというと、BLEモニタの"Direction"が?になっているからだ。
パケットが壊れているわけじゃないから、そういうものなのか?

 

わからんが、今日はここまでだ。
一応いっておくと、この記事を書く前まではだいたいペアリングができていたのだ。
なので「よくわからないけど、うまくいった」という記事を書くつもりだったのだ。
それが、書きながら順番にやっていくと、できなかったという・・・。

まあ、よくあることだ。

2015年8月30日

[nrf]Advertising開始のAPI

nRF51822でAdvertisingするのにsd_ble_gap_adv_start()を使っていたのだけど、最近はble_advertising_start()が流行りなのかね。
nRF52のサンプルを見ていて気付いた。

なんとなく、過去との互換のためだけに残されている気がする。
するのだけど、examplesにはsd_ble_gap_adv_start()を使ったソースもある。

うーん、気にはなるのだが、なんだろうね?

 

ble_advertising_start()を読んでわかったが、これはラッパだ。
中でsd_ble_gap_adv_start()を呼び出している。
単にAdvertisingしたいだけなら、これを呼ぶようにした方がコードを書く量が減らせるということだな。

Advertisingするチャネルを制限して、モニタでつかみやすくしたかったのだけど、sd_ble_gap_adv_start()してるところがなくて困っていたのだ。
そういうのをしたいときは自分でsd_ble_gap_adv_start()を呼ぶようにするか、手抜きしてble_advertising_start()の中身を書き換えるか、だな。


関係ないけど、Keilでソースを開くとこんな警告が出る。

image

コンパイルは通るから、エディタの解析だけなんだろうと思うけど、気持ちが悪いな。

[nrf51]nRF51 SDK v9.0はv8.1の資産がほぼ使える

久しぶりに、nRF51 SDKのバージョンを上げることにした。
最近はBLE自体をやる時間が取れてないのだが、まずは形から入ろう。

nRF51の開発をされた方はおわかりかと思うが、SDKのバージョンアップは頻繁に行われている。
そして、そのたびに苦汁をなめることになっている。

私がnRF51822を入手して、最初にビルドしたのがこのへん(2014/06/28)。
SoftDeviceのバージョンはv7が出始めたくらいなので、安定版はv5とかv6とか。
SDKはv5.2.0なのかな?
hiro99ma blog: [ble]BVMCN5102-BKにビルドして焼く

そして、数日後の07/02にはSDK v6.0.0がリリースされている。
まあ、v5.2.0のリリース日がわかっていないから、これは仕方なかろう。
hiro99ma blog: [ble][nrf51]S110をひもとこうとしているのに・・・
ここで、初めてSDKバージョンアップの苦しみを味わっている。
hiro99ma blog: [ble][nrf51]開発環境アップデート(そして失敗)
hiro99ma blog: [ble][nrf51]nRF51 SDK変わりすぎ・・・

そして、2015/01/20にはSDKv7が出たようだ。
つらかったらしい。
hiro99ma blog: [nrf51]nRF51 SDKがv6からv7になってつらいこと

さらに2015/03/30には、SDKv8.0.0に。
その間に、v7.1.0とv7.2.0が出ていたらしい。
hiro99ma blog: [nrf51]SDK v8.0になって、また仕様が変わる

zipのファイルから、バージョンアップ間隔を見てみよう。

  • v6.1.0 : 2014/08/29
  • v7.1.0 : 2014/11/26
  • v7.2.0 : 2015/01/15
  • v8.0.0 : 2015/03/06
  • v8.1.0 : 2015/05/07
  • v9.0.0 : 2015/07/10

だいたい2ヶ月周期のようだ。


そして今の最新版であるv9.0.0。
v8.1.0との差分を取ったのだが、あまり変わりがない!
過去、フォルダ構成のみならず、APIやマクロの引数仕様すら変わっていたことを考えると、驚くほど変わっていない。
手持ちのソースをビルドしたが、pstorageが変わっていたのでconfigファイルの入替が必要だったが、その程度だ。
まあ、私が作ったソースなんて大したことはしてないからかもしれないのだが、うれしい誤算だ。

とはいえ、まったく変更がないわけではないので、自分で比較された方がよいだろうな。

2015年8月29日

[git]注釈付きタグをGit Extensionsで見たい

外と家で仕事するということは、家でお遊びの開発をしていた時間がなくなるということだなー、と改めて思う。
あと1ヶ月の辛抱だ・・・。

というわけで、家でやってるお仕事の内容は書けないが、git運用は書いてもよかろう。


しばらくは、GitFlowを使ってやっていた。
SourceTreeだと統合されているし、GitExtensionsでもデフォルトのプラグインに入っている。
まあ、GitExtensionsの方は準備をしないと使えなかったので、多少敷居が高いな。

いまはgitのサーバとしてBitbucketを使っているのだが、注釈付きtagをやっても、その注釈が見えない気がする。
「git tag -n」と打つと出てくるので打ち込んではいるのだけど、もしかしたらpushしたtagには注釈が入らないのだろうか?
しかし、gitのタグ説明でも、ちゃんと記録されるようなことが書いてある。
うーむ。

「注釈付きタグ」は、英語だとannotated tagらしい。
それで検索すると、出てきた。
なんだ、こういう選択があるのか、と思って探したが出てこない。
うちのGit ExtensionsはVersion 2.48.05で、今(2015/08/29)の最新っぽいのだが。。。

上記のリンクは、私がよくわかってない「プルリクエスト」のもののようだ。
私のイメージでは、プルリクエストは「すてきなソースを公開してくれてありがとう! こんな機能を付けてみた/バグっぽいので直してみたので、よかったらマージしてね」だ。

2ヶ月くらい前のものだから、そのうち最新版に取り込まれるかもしれないけど、今のところその機能はないということだな。

2015年8月25日

[win10]T61でうまく動かないところ

デスクトップPCへのインストールは当面見送ったものの、ノートPCのThinkPad T61にはインストールしたままだ。
また数ヶ月後にはデスクトップへインストールしてみることになるので、現状を書いておこう。

  • キーボードが106として認識してくれないときがある。
    これは、Win8をインストールしたときもそうだった記憶がある。
    英語配列になってしまうのだ。
    毎回というわけではないのだが、起動時に決定するようだ。
  • 指紋認証を受け付けてくれないことがある。
    これも起動時に決定しているようだ。
    キーボードが106じゃないときに同時に発生するのかと思っていたけど、そうでもなかった。
  • タスクバーの文字が黒かった。
    これはデスクトップにインストールしたときのことだが、タスクバーに表示されているアプリ名の文字色が黒色で、見づらかった。
    でも、ノートの方は白色だったのであれこれやったところ、テーマを変更すると白くなった。
    なので、これは困ってないけど、忘れたときのために記録しておこう。
  • 電源OFF時、ちょっとだけスリープLEDが点滅する。
    困っているというか、そういうものなのか判断できてない。
    T61はスリープ中を示すLEDがあり、スリープ状態に遷移するときや休止状態に遷移するときは点滅するようなのだ(休止状態の場合は、休止したら消灯する)。
    ハイブリッドスリープはOFFにしたのに・・・と調べていたら、もう1つ「高速スタートアップ」もあった。
    これがよろしくなかったのか?

というわけで、キーボード周りが片付けば、そこまで困らない気がする。
あとは、作業用に使い始めたらどうなるか、というところか。

ああ、困っているわけではないが、ちょっとうっとうしいときもあるのが、Alt+Tabを押したときのアプリ一覧表示かな。
ウィンドウのスクリーンショットも表示されるので、わかりやすいといえばわかりやすいのだが、目がどこを探していいのか追いつかない(加齢の問題か?)。
Win+Tabだとタスクビューが動くので、以下でレジストリをいじって旧タイプにしておこうかな。
http://winaero.com/blog/how-to-get-the-old-alt-tab-dialog-in-windows-10/

2015年8月23日

[win7]Windows10から戻す

結局、またWindows7に戻した。

さて、Windows10でインストールしていたアプリがどうなるかというと、全部無くなった。
正確には、Windowsのインストーラを使ってインストールしたものは消えたようだ。
手動でインストールしたものは、残っている。
その前のWindows7時代にインストールしていたものは、それはそれで元に戻ったようだ。
まあ、そうなるわな。

では、最初からやり直しですな。


それはよいのだが、Windows7のシステムファイルか何かが変なのか、Windows Updateがうまくいかない。
IE11がインストールされているのに、IE11をインストールしようとして、IE11があるからインストールできず失敗。
「プログラムと機能」の「Windowsの機能の有効化または無効化」にはIE11が出ているものの、「インストールされた更新プログラムを表示」には出てこない。
だから、アンインストールもできない。
うーむ。。。

こういうときは、「sfc.exe /scannow」で修復できるようなことが書いてあったので、試してみた。
これをやると、なぜかフォントファイルのハッシュ値がおかしい、と出てきた。
しかし、前動いていたWindows7からファイルをコピーしてきても直らない。

dism.exeというツールもあるようなので「dism /Online /Cleanup-Image /scanhealth」とすると、

(f)    CBS MUM Corrupt    0x00000000    servicing\Packages\Microsoft-Windows-IE-Hyphenation-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.mum        Expected file name Microsoft-Windows-IE-Hyphenation-Parent-Package-English~31bf3856ad364e35~neutral~~11.2.9412.0.mum does not match the actual file name
(f)    CBS MUM Corrupt    0x00000000    servicing\Packages\Microsoft-Windows-IE-Spelling-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.mum        Expected file name Microsoft-Windows-IE-Spelling-Parent-Package-English~31bf3856ad364e35~neutral~~11.2.9412.0.mum does not match the actual file name

とか、

Unavailable repair files:
    servicing\packages\Microsoft-Windows-IE-Hyphenation-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.mum
    servicing\packages\Microsoft-Windows-IE-Spelling-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.mum
    servicing\packages\Microsoft-Windows-IE-Hyphenation-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.cat
    servicing\packages\Microsoft-Windows-IE-Spelling-Parent-Package-English~31bf3856ad364e35~~~11.2.9412.0.cat

とか出ている。
IEって出てるから、こっちの方が原因みたいだけど、どうしたらいいんだろうね?
システム更新準備ツールを使ったけど、だめだったし。


よくよく思い出すと、最初のWindows7はメモリに異常がある状態でインストールしたものだったのだ。
だから、変だったとしてもおかしくないと思う。

よし、インストールし直そう!

2015年8月22日

[win10]ドライバが見つからん

開発マシンをWindows10にしたが、いろいろ問題あり。

  • INTERNAL_POWER_ERRORがまだ解決しない。
    よく考えたら、前の対策はグラフィックドライバの削除だったが、うちはnVIDIAなのだ。
    AMDじゃないから、この対策ではだめなのか。
    あるいは、他のAMD関係のドライバがまだよろしくないのか・・・。
  • CC2540 USB Dongleが認識してない?
    Windows8.1(32bit)で使えるようにしたままアップデートしたPCでは動いている。
    ならば、Windows8で動くドライバを入れるとよいのだろうけど・・・
    あ、TIのBLEスニファをインストールしてなかった!
    インストールしたら認識しましたよ、ええ。
  • ProlificのUSBシリアルケーブルが認識してない?
    これがよくわからない。
    デバイスマネージャではCOMポートの番号まで出ているのに、認識していない扱い。
    TeraTermでも一覧に出てこないから、ダメなんだろう。

Prolificで疑わしいのは、これ。

image

なんとなく検索して「pl2303hxa_windows_8_driver_installation.zip」というファイルを使って手動でドライバを指定したら、なんとかなった。
ドライバを変えれば動くってことは、ハードウェアとかソフトウェアとかの制約じゃなくて、権利とかそういう感じの制約なんだろうね。


そういうわけで、INTERNAL_POWER_ERROR問題だけが残った。
これがどうやって回避したらよいのかがわかっていない。
Googleで検索すると、こんな感じ。
https://www.google.co.jp/search?q=windows10+internal_power_error&ie=utf-8&oe=utf-8&hl=ja

うちは、再起動を繰り返したりとか、Windows10のインストール中にとかではなく、何かすると発生しているようだ。
記憶にあるのは、ゴミ箱を削除したときと、エクスプローラでピン止めしたときだ。
ただ、JTAGデバッガをつないで、専用の開発統合環境でデバッグをしていたときかもしれない。
それはそれで、あやしい。

 

CPUとノースブリッジとかサウスブリッジとかは、AMDのものだ。
グラフィックボードはnVIDIAで、ネットワークはオンボードのRealtekだ。
そういうところも、疑わしいのかもしれない。

つまり、疑うと、きりが無いのだ。
Windows10を組込み環境で使うには、まだ自分で情報を探す余地が大きいという意味で、ちょっと時期が早いかもしれないな。

[win10]よくわからないが、よく落ちる

とりあえず、今までのうちのPCは、メモリが異常だったことがわかったので、そのメモリを外してWindows7をインストールした。
そして、とうとうWindows10にまで上げてしまった。
ちょっと早まったか、とは思うが、もう悩んでも仕方ない。

 

メモリは2GBくらいしかないのだが、ほどほど順調にインストールはできて、動いている。
しかし、よくわからないのだが、急にブルースクリーンになってしまうことがある。
タイミングはよくわからず。

再起動しないようにして内容を確認すると、INTERNAL_POWER_ERRORとある。
初めて見るエラーだが、検索するとこんな対策方法が出てきた。

  1. msconfig.exeで、セーフモード(最小)にして立ち上げる
  2. devmgmt.mscでグラフィックドライバを削除して、再起動
  3. msconfig.exeを元に戻して再起動

なんじゃこりゃ?と思い、他の方法を探そうとしたのだけど、どこもこの手順しか書いてなさそうだった。
YouTubeにあがってる動画すら、これだったのだ。

うちのマザーボードはGA-MA785GM-US2Hで、AMDのCPU/チップセットが載っている。
AMDだと、何かあるのかなぁ。
http://www.gigabyte.com/products/product-page.aspx?pid=3266#ov

先ほど、2と3を同時(グラフィックドライバを削除して、msconfig.exeを戻して再起動)にやったのがまずかったのか、またINTERNAL_POWER_ERRORでブルースクリーンになってしまった。。。。

Windows10のブルースクリーンって、原色の青じゃなくて、ふわっとした青であるところがなんとなく腹立たしい。
たぶん、原色だと「ああ、最後の力を振り絞ってメッセージを出したんだ」みたいな気持ちになるけど、ちょっと柔らかみがあると「まだ余力あるくせに!」みたいに思ってしまうからだろう。

ともかく、今は再起動して様子見をしているところだ。

2015年8月19日

[win][memo]Windows7SP1をインストールし直す

うちの開発メインPCが不調なので、あきらめることにした。
インストールし直す。

ただ、せっかくだからWindows10にしてしまおう、と思ったのだが、その安易さがよくなかった。
作っていたDVD-ROMでインストールさせようとしたものの、全部インストールが終わって最後の準備か何かをしているときに、またWin7に戻されてしまっている感じがする。

ネットで調べると、HDDの構成でそういうエラーが出ることもある、ということだったので、アドバイスに合わせて変更したところ、今度はアップデートするアプリが途中で終了するようになってしまった。
エラーも何も出ずに終わっているので、よくわからない。

じゃあ、もうDVD-ROMから起動してインストールしてしまえ!とやけになってみたのだが、それはそれでうまくいかない。
プロダクトキーはWin8.1にインストールしたときのものが使えたので進んだのだけど、HDDをフォーマットして、ファイルがコピーされて、ではインストールのために自動再起動、となったあと、再起動してもHDDから起動してくれない・・・。


めんどうになったので、もうWindows7Sp1からインストールし直すことにした。
急がば回れ、という感じだ。
もう一度同じ目にあうかわからないが、新規インストールして通常通りに戻るまでのメモを残しておこう。

 

  • Microsoftに認証してもらわないと、Windows Updateがうまくいかない(やってくれてなかったみたい)
  • システム更新準備ツール、というのを新しくインストールしないといけなさそう。x64ベースシステム用、というのがあったので、そっちをダウンロード中
  • それはそれでよいとして、.Net FrameworkがWindows Updateでうまく入らないようなので、オフラインインストーラをダウンロードしてインストール
  • Windows UpdateのFixItがあり(2種類くらいあるみたい)、それを何度もやっているが、何がうまく行かないのかわからないけど、Windows Updateのエラーが出る
  • 「そういえばMotherBoard依存のファイルをインストールしていなかった」とインストールするも、状況変わらず。
  • ときどきWindows10を試すが、やはり失敗する

 

Windows7SP1をインストールしてアップデートしかさせてないつもりなのだけど、それでこんなにうまくいかないとは想像してなかった。。
ここまで来ると、さすがにハードウェアの不調を疑った方がよいのかもしれない。

ようやく、memtest86+で試してみることにした。
うん・・・こんなにErrorsが出るとは思ってもいなかったよ・・・。
3分くらいたったのだが、5000個を超えてしまった。あ、9000・・・9500・・・。
こりゃ、だめだわ。

うちのマザーボードには4枚ささっているので、1組2枚を抜いてみた。
ああ、エラーが出ない。
これが普通の状態なんだ・・・。

そのままWindowsUpdateしているのだが、ああ、普通に、進む・・・。
メモリがダメだったら全然動かなくなるものだと思っていたのだけど、そういうわけでもないのだねぇ。
どうやって回避してるんだろう? MMUってだけでは説明できない気がする。

2015年8月10日

[nrf52][nfc]NFC Pairingサンプルを動かす (2)

さて、前回はnRF52のサンプルを使ってNexus5とペアリングしようとして、失敗した。
Nexus7でもやってみたけど、タブレットってNFCのポイントを明示してくれないと、どこにかざしていいかわからんですな。
背中が広いので、アンテナも強そうな感じはするんだけど、かざし方が悪いのか、動作としてペアリングできないのかの区別が付かなかった。
もうちょっと、かざして!ってサインを出してくれないとなぁ。

その辺は、ペアリングのしくみがわかれば何とかなるかもしれないので、今回は仕様の方を見ていこう。


http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk52.v0.9.1%2Fble_sdk_app_hrs_pairing_nfc.html&cp=4_0_0_4_6_0

これが試したサンプルのページなのだが、これを読んでも方法がわからない。
手持ちの資料が古いかもしれないが、NFCでのハンドオーバーは、

  • Netotiated Handover
  • Static Handover
  • Mediated Handover

の3種類がある。
調べていた当時の私は、Bluetoothに興味がなかったので、手抜きな調べ方しかしていない。
(というより、なぜHandoverを調べていたのか記憶がない。。)

hiro99ma blog: [nfc]BluetoothのStatic Handover

とはいっても、nRF52のサンプルがどういうペアリングをしてくるかわからないと、調べようがないな。


http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk52.v0.9.1%2Fgroup__nfc__modules.html

こちらが、現在(nRF52 SDK v0.9.1)でのNFC関連のモジュールらしい。
NDEFとかOOBとかの見知ったキーワードは出てくるのだが、HandoverとかSSPとか、そういう関連用語が出てきてないように見える(探せないだけかもしれんが)。

サンプルソースから見ると、先にAdvertisingするメッセージを作り、それをnfc_ble_pair_msg_create()に食わせることでNDEFのペイロードデータを作ろうとしているようだ(nfcSetPayload()で渡してるので)。

application/vnd.bluetooth.le.oob で、NFC_BLE_PAIR_MSG_BLUETOOTH_LE_SHORTとNFC_BLE_PAIR_MSG_BLUETOOTH_LE_FULLがあるようだ。
それらの値の説明を見ると、AD-BTSSP_1_1とNFC Forumドキュメント名が書いてあるので、SSP(Simple Secure Pairing)であることは間違いなさそうだ。

ただ、SSPのドキュメントを読んでもわかるもんじゃないので(SSPは「このHandover方式で」などは決めていない)、やはりソースを読まないとどうやっているかわからないようだ。
まあ、読んだからといっても、ライブラリで隠蔽しているところがあるとわからないだろうがね。


サンプルソースでは、Just Worksでペアリングしようとしている。
これが、NFC ForumのConnectionHandoverドキュメントも、BTSSPドキュメントも、「Just」ですら検索が引っかからない。
なので、NFCとしてはBluetoothの認証方式自体にはそれほど興味がないように見える。
まあ、そもそも「Bluetoothの認証」なので、NFCとしては言われた通りにデータを通信するだけだろう。

Just Works時に設定しているのは、MITM(Man In The Middle)の設定と(何も無し)、OOBの設定(何も無し)だ。
何にも無しの、なしなしだ。

ただ、基本的な設定となるNFC_BLE_PAIR_MSG_CONFIG_MSG_TYPEだが、サンプルソース中には定義がない。
これはシステムで持っているようだ。
パスでいえば、components\libraries\experimental_nfc\connection_handover\nfc_ble_pair_msg_config.hにある。
将来的なことはわからないが、今のところはライブラリに依存しているということらしい。
ただ、サンプルソースの中でifdefを見ているところからすると、将来的にはユーザ定義で選べるようになるのではないだろうか。

んで、これをキーワードにソースを検索すると、components\libraries\experimental_nfc\connection_handover\nfc_ble_pair_msg.cが出てきた。
これのndef_msgは、最初が0x91から始まっている。
そう、この数字は見慣れたNDEFなのだ。
0xD2とか0x91とか見ると落ち着くよね、ふふふ(変な人)。


LE_SHORTの場合、ndef_msg[]はこうなっている。

static uint8_t ndef_msg[NFC_BLE_PAIR_MSG_LEN] =
{
    0xD2,       //NDEF record header - TNF + Flags: MB=1b ME=1b CF=0b SR=1b IL=0b TNF=010b (MIME media-type)
    0x20,       //NDEF record header - Record Type Length = 32 octets
    0x00,       //MUST BE CHANGED! - NDEF record header - Payload Length = x octets (1 byte in size because SR=1b)
                //NDEF record header - ID Length missing since it is optional (IL=0b)
                //NDEF record header - Record(Payload) Type = 疎pplication/vnd.bluetooth.le.oob・
    0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74,
    0x69, 0x6F, 0x6E, 0x2F, 0x76, 0x6E, 0x64, 0x2E,
    0x62, 0x6C, 0x75, 0x65, 0x74, 0x6F, 0x6F, 0x74,
    0x68, 0x2E, 0x6C, 0x65, 0x2E, 0x6F, 0x6F, 0x62
                //NDEF record header - Payload ID missing since it is optional (IL=0b)
                //NDEF record payload - add here Bluetooth AD types
};

コメントに「section 4.3.2 of [NFC BTSSP]」とあるので参照すると、ようやくNDEFのメッセージがわかった。

また、nfc_ble_pair_msg_create()も同じソースに全部あるので、おおよその内容がわかる。
BTSSP v1.1のp.32からLEの場合のタグデータが載っているが、オフセットの35byte目以降をAdvertisingデータで埋めているのだろう。

そして、BTSSPの4.1章がNegotiated Handover、4.2がStatic Handoverだ。
じゃあ、4.3章はなんなのか?
NegotiatedがRequest RecordとConfiguration Recordを、Static HandoverがSelect MessageとConfiguration Recordを持っているのだが、4.3章ではConfiguration Recordしか持たない例になっている。
「Handover Selectorデバイスが1つの(例えばBLEのみ)にしか対応しないなら、Select Record無しもいけるよ」とあるので、まさにそれだろう。


じゃあ、標準じゃないやり方でペアリングしているわけではないということになるが、それならなぜNexus5ではダメだったのだろう?
タグの読込はできていたように見えるので、シーケンスのところがうまくいっていないのかもしれない。
うーん、そうなるとスニファでちゃんと見ないといかんのかなぁ。