2015/08/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/08/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/08/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/08/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/08/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/08/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/08/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/08/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ではダメだったのだろう?
タグの読込はできていたように見えるので、シーケンスのところがうまくいっていないのかもしれない。
うーん、そうなるとスニファでちゃんと見ないといかんのかなぁ。

2015/08/04

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

仕事が忙しいとか、税金が取られてしまうとか、そんな鬱鬱したことは開発して忘れてしまえ!
ということで、久々にnRF52832のPreview DKを動かすことにした。
nRF52 SDK v0.9.1がリリースされて結構経ったのだが、まだ触っていなかったのだ。

v0.9.1の特長は、なんといってもNFCサポート
Errataに、NFCがどうのこうの書いてあったから使えないかも、と心配していたのだが、とりあえずペアリングのサンプルがあるから動かせるようだ。
まずは、サンプルを動かしてみよう。

こんな名前のが、サンプルだ。
examples\ble_peripheral\experimental_ble_app_hrs_pairing_nfc

とりあえず、Keilでビルドして焼く。
だが、BLEスニファに何も出てこない。
うむむ・・・これは・・・。
Android端末を、nRF52のNFCアンテナに近づけると・・・Advertisingが始まった!
NXP TagInfoアプリで見ると、Type2ということなので、情報とあってる。
NDEFとして見えていて、データもWiFi接続させようとしたときのに似ていた。

では、と普通にAndroidと接触させると、ペアリングしてよいか確認するダイアログが出てきた。
だけど、うちのNexus5ではうまくペアリングできなさそうだった。。。
たしかに、Galaxy S6でしかテストしてないとあるが、もうちょっと動いてもよさそうな。

OOBのParingのシーケンスを確認しないといけないが、NFCは最初しか関係してなかったように思う。
だとしたら、「ペアリングしよう!」と出てきた時点でNFCの役割は終わっているはずだ。

でも、自信がないので、そこらへんから調べていくことにしよう。
こうやって、アプリの開発とかよりも、内側の方に入り込んでいってしまうんだよなぁ。

2015/08/02

[nrf52]Cortex-M4って、どういうものだろう?

nRF52832は、Cortex-M4が載っている。

nRF51822はCortex-M0だった。
私のイメージとしては、Cortex-M3から命令数などを削ったものだ。
BLEが使えればいいや、と思って、あまり調べてないのだな。
そのせいか、あまり思い入れがないのだよなぁ。

それではもったいないので、nRF52832はまだあまり使っていないから、まずはCortex-M4ってものを調べて、もう少し身近に感じられるようにしておこう。


まずは、本家ARMのページを見よう。
http://www.arm.com/ja/products/processors/cortex-m/cortex-m4-processor.php

デジタル信号制御向けらしい。
幅が広いな、デジタル信号って。
無線で飛び交ってる信号も、ある程度はデジタル信号だし、音声だってデジタル化すればデジタル信号だ。
画像だって、2次元のデジタル信号と見なせる。
ああ、なんでもかんでもデジタル信号なのだよ。

Cortex-M4のブロック図が載っていた。

http://www.arm.com/ja/assets/images/processor/Cortex-M4-chip-diagram-LG.png

これを見ると、デジタル信号処理用の機能があるというよりも、命令としてデジタル信号処理で使うものが増えている、ということなのだろう。
Intelのチップも、そういう時代があったよなぁ。
1回の命令で行列計算をするのが得意なSIMD命令とか。

 

こちらは、NXPのページ。
http://www.nxp-lpc.com/lpc_micon/

一番下にCortex-M4が載っている。
Cortex-M4Fのことも書いてあり、M4Fは浮動小数演算ユニットが載ったものとのこと。
整数演算だけで除ければF無し、浮動小数ありならF有り、というところか。

 

ARM Partner Successというサイトがあった。
インスケイプ株式会社、という会社なのかな?
http://www.aps-web.jp/academy/cortex-m/01/g.html

表になっていてわかりやすい。
M3やM4は除算器を持ってるんだねぇ。


そんなわけで、nRF52にも信号処理をさせてあげたいところだ。
とはいえ、「信号処理ユニット」みたいなものがあるわけじゃないので、コードの書き方かコンパイラの機能で対応しないと意味がないと思う。

そういえば、Interface誌にCortex-M4で信号処理する連載が載っていたよな、と思って読み返してみた。
近くにあった2015年4月号では、FFTをやっている。
一部のソースファイルが載っているが、特殊な命令を使っている感じはしない。
ただ、C++でcomplexクラスを使っていたり、その要素がfloatなので、M4Fの浮動小数演算ユニットは使っているだろうし、もしかするとcomplexクラスの中ではすごいことをやってるのかもしれない。

こういう「コンパイラが賢い」というものは、なんとなくGCCなんかは不利で、メーカーが出してるコンパイラが有利な気がしてしまう。
http://stackoverflow.com/questions/16768235/cortex-m4-gcc-float-behavior
FPUの有無でコンパイルオプションが変わってくるけど、対応はしているようですな。

[win10]見栄えをいくつか載せる

うちのWindows10だけかどうか知らないが、エクスプローラのツリービューに表示されるアイコンが、欠けたように見える。

image

ツリーのルートはちゃんと表示されているが、ノードに当たる部分が欠けているのだ。
エクスプローラを立ち上げてから、表示が確定するまでの一瞬はちゃんと出ているので、その上に何かが載っているのだろうと思うけど、それが何かわからない。

 

あと、デフォルトのフォントがYuなんとかというのになったらしい。
私はMS Pゴシック好きなので、フォントを変更するツールで変えてみた。
デスクトップなどのだいたいは変わってくれるのだが、コンテキストメニューのフォントは変わってくれないようだ。

image

まあ、そんなに困るものでもないのだがね。

2015/08/01

[win10]あまり理解せずに再インストールした話

おとといだったか、インストールしたばかりのWindows10 Proだが、再インストールする羽目になった。
最初にいっておくと、これは私が悪い。
だから、Windows10が原因というわけでもなく、これ以降に出てくる"Ribbon Disabler"が悪いわけでもない。

では、経緯を話そう。

Windows8.1を、既存の設定などを残したままWindows10にアップグレードできた。
特に動きに問題はないのだが、エクスプローラ(IEじゃなくて、ファイルを見る方)のツリービューで、アイコンが欠けたように見えるのだ。
よくよく見ると左下から正方形に白い四角が載っているようにも見える。
これは、オーバーレイアイコンではなかろうか?

前のWindows8.1ではClassicShellをインストールしていたのだが、もう1つ似た部類のアプリを入れていた。
それが「Ribbon Disable」だ。
Win8をインストールして比較的すぐに入れたので記憶にないのだが、Explorerのリボンを使わないようにしてくれるアプリだったと思う。

そしてなんとなく「このRibbonDisablerをインストールしていたので、オーバーレイアイコンがおかしくなったのでは?」と思ったのだ。
まあ、軽い気持ちだったことは書いておこう。
Win8.1のときに解凍したままだったRibbonDisablerを起動して、設定を元に戻すと・・・Explorerが起動しなくなった。

 

現象としては、ログイン画面は出てきて、パスワードなどの入力もできるのだが、正しいパスワードを入力してログインが進んでいっても、画面が黒いままで何も出てこなくなった(画面が黒いのは、壁紙が黒だったせいかも)。
キーボードは使えるのだが、Explorerもないので、タスクバーすら出てこない。
ただ、キーボードは使えるので、タスクマネージャの起動はできた。

できたからといって、劇的に変わるわけではない。
ただ、新しいタスクを起動する画面は出てくるので、そこにフルパスを突っ込めばアプリが起動する。


そうやって、別のファイラを起動させると、ExplorerFrame.DLLが見つからない、みたいなことを言ってくる。
検索してみると、Windowsのテーマ的な動きを変えるのにExplorerFrameがどうのこうの、という記事が出てきた。
ということは、RibbonDisablerもExplorerFrame.DLLを置き換えるなりパッチを当てるなりするんじゃなかろうか?
そして、私が今回やった「RibbonDisablerの動作を元に戻す」は、Win8.1のExplorerFrame.DLLに当てていたと想定して元に戻そうとしているが、実は私がWin10にアップグレードしたことでシナリオが崩れたのではないだろうか。

そんなわけで、管理者権限でコマンドプロンプトを立ち上げ、Windows\System32からExplorerFrame.DLLを削除(実際は別の場所に移動)し、DVDに焼いていたWin10のインストールを再度行った。

インストールには最終的には失敗したというメッセージが出たが、とにかくExplorerが起動するようになった。
やれやれだぜ・・・。

こういう風に、よくわかってないのにあれこれやると失敗する、というよい例だった。
でも、こうやって失敗しないとわからないことも多いしね。