2012年12月4日

[win8][nfc]Windows8+RC-S380のNFC開発ではOS標準機能を使おう

いただいたコメントによると、そういうことらしい(いつも情報ありがとうございます)。

http://hiro99ma.blogspot.jp/2012/12/win8ndef-writernfp.html
(下の方)

 

 

Windows8時代になり、OSがNFC対応になった。
PaSoRiもRC-S380からNFC Forum仕様に対応した。
それに伴い、SDKも意味合いが変わってきたということだ。
感慨深いことである。

まったくチェックしていなかった、PC/SCの勉強もせんといかんなあ、と思った私であった。

2012年12月2日

[win8]NDEF WriterはNFPを有効にしているとうまく動かない?

前回の続きで、追加情報。
うちのWindows8でNDEF Writerがうまく動かせていない件についてだ。

他に同じような話をしている人がいないから、私の環境だけかもしれん。
とりあえず、記録としては残しておく。


XPでやると、RC-S370/PでもRC-S380/Pでも普通に動いた。

Win8+RC-S370/Pでも、普通に動いた。
Win8+RC-S380/Pだと、やっぱりだめ。

デバイスドライバを削除してからやり直したが、変わらない。

なんとなくだけど、NDEF Writerを動作させるときはWin8からPaSoRiのアクセス権をしっかりと奪わないといかんと思うのだが、そこがうまくいってないんじゃなかろうか。


そういえば自己診断をやってなかったことに気付いた。
やってみると・・・

  • NFCカード無し・・・リーダー/ライターとの通信はOKで、カードとの通信は失敗(当たり前)
  • NFCカードあり(非NDEF)・・・どっちもOK
  • NFCカードあり(NDEF)・・・リーダー/ライターとの通信に失敗

ということは、NDEFの場合はWindows8がポーリングによってデバイスを握ってしまい、自己診断ソフトからアクセスできなくなっている、ということなのか。


では、とコントロールパネル「NFCポート/パソリ」から、NFPを無効にした。
チェックボックスを外すだけだ。
再起動せんといかんよ、といわれるが、めんどくさいのでPaSoRiをはずして付け直した。

そうすると、NDEF Writerがうまく動いた。
やはりNFPとの共存がうまくいっていないように見える。
なんだろう、何か標準で必須の機能を削除しすぎたんだろうか。


NFPを無効にしたこととは関係ないようだが、SDK for NFC Starter Kit 2.0で作ったアプリがRC-S380でうまく動かなくなっていた。
FeliCaLibNfcOpen()でエラーが発生。
ドライバエラーで「APIの発行シーケンスが正しくありません」らしい。。。
何のことだかよくわからない。。。

RC-S370は動くんだけどねぇ。
何が原因か、もうわからない・・・。
再インストールするのは、ちょっと気力が足りないところである。

[nfp]NDEFカードを検出するだけのアプリ

どうにかこうにか、Windows8のストアアプリでNDEFカードを検出するだけのアプリができた。

https://github.com/hirokuma/Win8_NdefDetect

「だけ」というのは、中身を解析しないからだ。
そこら辺はOSが提供してくれず、自分で解析せんといかんようだ。
NDEF用ライブラリもNuGetにはあるみたいだが、試してない。


まず、NFP対応アプリを作るためには、Package.appxmanifestへの設定が必要だ。
ダブルクリックして開き、タブ「機能」を選択し、「近接」にチェックを入れる。
(GitHubに置いたものはToastを使うので、タブ「アプリケーションUI」でToastの対応も有効にしておく。)

Toastを使うので、NuGetからNotificationsExtensions.WinRTをインストールしている。

それ以外は、MainPage.xaml.csしか変更していない。
背景が黒いと憂鬱になるので、そこだけMainPage.xamlを変更したくらいだ。

 

MainPage.xaml.csのポイントをいくつか。

コンストラクタ

ここでWindows.Networking.Proximity.ProximityDeviceを取得している。

 

OnNavigatedTo()

よくわからんが、アプリが立ち上がったときに呼ばれるような気がする(調べてない)。
ここに、デバイス検出やメッセージ受信で呼び出されるコールバック関数を登録している。

DeviceArrivedは検出、DeviceDepartedはデバイスの離脱のようだ。
アップしたソースではコメントアウトしているが、これはうっとうしいからそうしているだけだ。

メッセージ受信、というのは、NDEFカードを読んだときに呼び出されるようだ。
NFPは元々、NDEFではなくWindowsのネームスペース検出を目的にできているのか、あんまり親切じゃない。
SubscribeForMessage()の第1引数が検出対象のネームスペース(プロトコル?)で、第2引数がコールバック関数。
NDEFのメッセージだから”NDEF”でいいかと思ったが、そうではなかった。
”NDEF:wkt.T”のように、1つ1つ指定せんといかんみたい。
その代わりといってはなんだが、複数呼び出せば追加で登録できるようだ。


私の興味としては、NFP APIだけでまっさらなNFCカードをNDEFフォーマットできるのか、ということなのだが、まだよくわからない。

カード検出してもしなくても書き込みができるのかな?
そしてバイナリデータを書くことができるのならできるのかもしれない。

が、Type2だから・・・とかType3だから・・・というような識別ができないんだったら、フォーマットはできないように思う。

そう考えると、NFPはカードアクセスよりも、デバイス間の通信に主眼を置いていると考えた方がいいのかね。

[win8]カード検出時のDeviceIdにはNFCIDなどは載らなさそうだ

ようやく、ストアアプリでカード検出したらToastを表示させるアプリを作ることができた。
まあ、実はそんなにコードを書くようなところはないのだが。。。

検出すると、イベントハンドラがコールバックされる。
デリゲート、っていうんだっけ。
引数は、Windows.Networking.Proximity.ProximityDeviceだ。

引数から取得できるプロパティは、BitsPerSecond、DeviceId、MaxMessageBytesの3つだ。
BitsPerSecondは409600、MaxMessageBytesは10240。
そして、DeviceIdにはこんな文字列が入っていた。

\\?\usb#vid_054c&pid_06c3#0008140#{fb3842cd-9e2a-4f83-8fcc-4b0761139ae9}

てっきり、NFCIDが入ってくるんだろうと思っていたのだが、どうもPCD(Proximity Coupling Device)の情報がやってくるらしい。

じゃあどこにNFCIDが載るのか、というのは、今後の課題である。

2012年12月1日

[win8]Toastの表示にはマニフェストの設定が必要

なぜToastと呼ぶのかは知らないが、パン焼き器からぽーん、とパンが飛び出すイメージなのだろうか。
ともかく、Windows8のユーザへの通知方法の1つとして、AndroidにもあるToastが使えるようになった。

http://msdn.microsoft.com/ja-jp/library/windows/apps/hh969156.aspx

これはサンプルからNotificationsExtensionsというライブラリをビルドするようになっている。
そこまでしなくても、NuGetを使って取り込むことが可能だ。

ツール→ライブラリパッケージマネージャー→ソリューションのNuGetパッケージの管理

左側の項目を「オンライン」、右上にある検索窓に「notificationsextensions」と打って検索すると、「Notifications.Extensions.WinRT」という項目が出てくるので、これをインストールする。

使い方は、上のリンクを参照してくれ。


しかし、このリンクに書いていないことがある。
他のサイトを検索するとわかるが、プロジェクトのプロパティに「トースト対応」というのを設定しないといけない。

ソリューションエクスプローラーから「Package.appxmanifest」をダブルクリックすると、設定画面が出てくる。
タブ「アプリケーションUI」に項目があるのだが、そのままだと見えない。
「ビジュアル資産」の下にあるリストボックスで「すべてのイメージ資産」と選択しないと出てこないのだ。

image

項目が出てこないので、てっきりなくなったんだと思っていた。。。
そして、Toastが出てこずにかなり悩んでいた。

[nfp]シミュレーターではNFPアプリが動かない?

NFPアプリではNDEFカードしか検出しないのか、ということを調べようとNFPサンプルを動かした。
シミュレーターを開いて、アプリを起動して、カードをかざして・・・もメッセージが出てこない。
NDEFカードをかざしてもだめ。

むむ、どうもシミュレーターではNFPアプリが動かないというか、カード検出を捕捉できないようだ。
検出できるのはアクティブなアプリだけ、という決めごとはあるのだが、シミュレーターではそれができないということなのか・・・。

シミュレーターの説明にはそこら辺は書いていないが、そういうものだろうという気はする。
うーん、リモートコンピュータを使ってデバッグするのが効率がいいんだろうが、うちにそういう環境はないんだよなあ。

[nfp]NFPはNDEFしかサポートしないのかもしれない

Windows8に、何も書いていないNFCカードをかざしても、検知した音がしない。
NDEFしかサポートしていないようだけど、正式に書いた資料はないだろうか。。。

near-field-proximity-implementation-spec-windows-8.docxの「2. NFC Provider Mode」に、こんな記述があった。

Because NFC is a leading standard in the NFP space, the device interface supports specific NFC behavior by giving an NFP provider the ability to handle native NDEF packets.

なんとなく、NDEFしか扱わんよ、といっているような気がする。

最初に発生するイベントは、DeviceArrived、らしい。
NFPサンプルでも、それを捉まえて文字列を表示させているのだが、それが呼ばれないってことはOSレベル(ドライバレベル)で通知していないということだろう。

ポーリング周期の決めごとなんかはあるのだが(推奨は1秒間に4、5回)、ポーリングしてどういう検出を行うという記述は見つけられていない。
DeviceArrivedを発行する厳密な条件も見つからない。

うーん、これはSONYのドライバではそうなっているということなのか、Windows8としてそうしているということなのか・・・。

[win8]ボタンを押すとメッセージを表示するアプリ

Windowsストアアプリを、とりあえず作ってみよう。

VS Express 2012 for Windows8を起動して、プロジェクトを新規作成。
いくつか基本形を選択できるが、ここではC#の単一画面を選択した。

とりあえずビルドできるものが自動生成されるので、三角形の実行ボタンを押す。
・・・画面が切り替わって、起動したっぽい。
真っ黒画面で、何が何だかよくわからない・・・。

デスクトップとアプリを行ったり来たりするのは、どうにも面倒だ。
デバッグも大変だなあ、と思って画面を見ていると、さっき押した三角形のボタンに「ローカルコンピュータ」と書いてある。
プルダウンすると項目が出てきた。
「シミュレーター」「ローカルコンピュータ」「リモートコンピュータ」が選択できる。
もしかして、このシミュレーターというのは・・・。

「シミュレーター」を選択してからクリックすると、ちっこい画面が出てきた。

image

マウスを右下に持っていくと、ちゃんと右側になんか出てくる(名前がわからん)。
上から3番目の「スタート」をクリックすると、アプリ一覧が出てきて、その一番最後にデバッグさせようとしているアプリも載っていた。

image

なるほど、こうすればデスクトップ画面でストアアプリをデバッグできるのか。


真っ黒だと面白くないので、ボタンを押してメッセージボックスが表示されるアプリにしておこう。

ソリューションエクスプローラーから「MainPage.xaml」をダブルクリックすると、デザイン画面が開く。
これが・・・かなり待たされる。
うちのPCだと、1分くらい待ったような気がする。

まず、背景色を変更しよう。
真っ黒いところをクリックすると、右側にプロパティが出てくる。ここら辺は、前のVSと同じだ。
「ブラシ」の「Background」から、適当に色を変更させる。
変更は、デザイン画面に反映される。

ボタンを置くのも、前と同じ要領で、ツールボックスからドラッグする。
これも色を変えたかったので、「ブラシ」の「Background」で変更。

デフォルトだと「Button」となっているので、これは「共通」の「Content」を変更。
気付いたのだが、このテキストボックスではATOKが有効にならない。。。
MSIMEだとわからないが、とにかくATOKは起動しなかったので、日本語が打てない。
別のテキストエディタを開いて日本語を打ち、ペーストすることはできた。
まあ、簡単なのは、デザイン画面の下に出てくるXAMLエディタの「Content」を直接変更することだろう。

ボタンをダブルクリックすると、自動的にクリックされたときのメソッドが追加された。
たぶん、前と同じようにプロパティ画面の雷アイコンをクリックして、メソッドを追加する方法でもいけるだろう。

 

さて、困ったのはメッセージボックス。
MessageBox、と打っても、候補が出てこない。。。
ネットで調べると、MessageDialogなるものを使うらしい。
打ち込んでみたが、赤い波線が出てきて、そんなのないよ、といわれてしまう。
これはusingが足りないので、右クリック→競合の解決、からusingを追加すればよい。

使い方は、ネットのものをまねした。

   1: private async void Button_Click_1(object sender, RoutedEventArgs e)
   2: {
   3:     MessageDialog dlg = new MessageDialog("よろしく", "Hello");
   4:     await dlg.ShowAsync();
   5: }

ポイントは、ShowAsync()には「await」がいるのと、メソッドに「async」がいるということ。
awaitはVSのエラーメッセージでわかったのだが、asyncは付ける場所が最初わからんかった。
メソッドにつけてください、というのは、このメソッドにつけてね、という意味だったのか。

 

実行してボタンを押すと、こんなのになる。

image

ブレークポイントをクリックメソッドに置いておくと、ちゃんとそこで止まるので、思った通りのデバッグができるようだ。

[win8?]NDEF Writerがうまく動かない・・・

誰か助けてくれるかもしれないので、記事にしておこう。

Windows8 Pro(32bit) + PaSoRi RC-S380/Pで、NDEF Writerを使おうとしているのだが、うまく動いていない。

買ってから特に使っていないMIFARE Ultralightタグがあるのでやってみると・・・。

image

むう。
では、FeliCa Liteに替えてみよう。このカードはNDEFデータを書き込み済みのようだ(Textかな?)。

image

うーん。。。
では、NDEFを書き込んでいないFeliCa Liteを使ってみよう。

image

うーーーん・・・・・。
もう1枚FeliCa Liteがあるので、試してみるか。

image

システムブロックの書き込み禁止は、困るな・・・。
不思議なのは、このダイアログが出るカードと出ないカードがあるということだ。
後ろにうっすらとエラーが見えるが、このエラーログが出力された後でダイアログが出てくるので、カードの何かを読んでから判断しているのだとは思う。
それが何だかわからない・・・。

まだWindows8をインストールしたばかりで、比較的きれいな環境だと思うのだ。
だから自分のマシンを信じたいのだが・・・だいたいそういうときはなんかの設定がうまくいってないとか、やったらいかんことをやったとか、そんなことが多い。

なので、とりあえず状況を書いておいたら誰か助けてくれんかな-、というところだ。
自分で解決したら、それを書くと役立つかもしれんしね。


追加情報。

XPでやると、RC-S370/PでもRC-S380/Pでも普通に動いた。

Win8+RC-S370/Pでも、普通に動いた。
Win8+RC-S380/Pだと、やっぱりだめ。

デバイスドライバを削除してからやり直したが、変わらない。

なんとなくだけど、NDEF Writerを動作させるときはWin8からPaSoRiのアクセス権をしっかりと奪わないといかんと思うのだが、そこがうまくいってないんじゃなかろうか。

[win8]Windows8にインストールしたソフトたち

安定して使えているかどうかはよくわからないが、今のところインストールしているソフトたちを書いておこう。
そうしないと、再インストールしたときに忘れてしまいそうだ・・・。


Classic Shell

Windowsストアアプリが並んでる画面(メトロUIって呼んでたやつ)でやれることが私にはほとんどないので、いきなりデスクトップ画面が出てくれるようにインストールしている。

ついでにスタートメニューも出てくれるし、エクスプローラで上の階層に上がるボタンが出てくれるので助かる。

 

あふw

ファイラ。
使っている人は多くないのかもしれないが、私は気に入ってる。

 

ThunderbirdとFirefox

XPから使っているので、もうこれにしている。
特に困ってない。

 

ATOK2012

IME。
インストールするだけだとすんなり使えないので、あれこれやらんといかん。
ジャストシステムのサポートページにあるので、そのままやったらよい。

それと「アプリごとにIMEの設定を覚える」みたいなやつを有効にしておいたほうがよい。
Windowsストアアプリの画面にいくと、あっちではATOKが使えないのでMS-IMEに戻されてしまうのだ。

 

Bluewind

ランチャーアプリ。
文字列で選択できるので、キーボードから手を離さなくてよいのが助かる。

 

Windows Defender

標準で入っているセキュリティソフト。
Avast!を使っていたのだが、Live Writerがうまく動かなくなったので、ひとまずアンインストールしたのだ。

 

COMODO Firewall

XPから使っているので、同じくインストールした。
私は、ネットにつなぐアプリは全部登録しておきたいので、勝手にスルーされたくないのだ。
ただ、そうしておくと頻繁にポップアップウィンドウが表示されて全然だめだったので、しばらく自動登録させる設定で運用してから、元に戻すことにした。

NFPサンプルがWindowsストアアプリなので、毎回画面があっち側に移ってしまうのだが、そうなるとファイアウォールの警告に気付かなかったりするように思う。
まだ試行錯誤しているところだ。

COMODO FirewallのDefender+という機能と、Windows Defenderが衝突するようで、最初はWindows Defenderが動かせなくて困っていた。
でも、今はなんか動いているような・・・。
まあ、こういう細かいところがまだよくわかっていないということだ。

 

AutoHotkey

キーカスタマイズ。
私は、Ctrl+Fで右矢印キーと同じ動きになるなど、変なアサインになれてしまっている。
XPでは「窓使いの憂鬱」を使っていたのだが、Windows8では動かないのでAutoHotkeyにした。
CapsLockとCtrlの入れ替えは、ChgKeyでレジストリを書き換えたような気もするが、よく覚えてない。
AutoHotkeyにもあるので、それを使ったかもしれん。

 

VS Express for Desktop

VS Express for Windows 8

Visual Studio 2012 Express。
for Desktopはいいとしても、for Windows8ってのはもっと別の名前がなかったのだろうか・・・。

for Desktopで、SDK for NFC Starter Kit用に作っていたプロジェクトを開いて保存して、それをXPのVS Express 2010で開くと、うまいこと開いてくれた。
どこかで、2012で作ったものは2010では使えないと書いてあったように思うが、あれは新規作成した場合なのかな?

 

TTClock

右下に表示される時計のカスタマイズ。
私は日付と秒数をどうしても表示してほしいのであった。


他にもあるのだが、とりあえずこんだけ入っていると、前の環境に近くなった。
SnoopyProやzadigも動くので、いろいろ安心?だ。

困っているのが、ファイルのアクセス権。
このWindows8は、WindowsXPが動いている環境をアップデートしたものだ。
そのときにファイルを全部消せばよかったのだが、面倒なので継承するものは残しておいたのだ。
そうすると・・・前から残ったファイルのアクセス権がうまくいっておらず、削除しようとしても権限が泣くて怒られる、ということになっている。

残念ながら、私はWindowsのアクセス権限がどうあるべきなのかよくわかっていない・・・。
(他のならわかるのか?といわれると困るが。)
cygwinもせっかく残ったのだが、削除してやり直しだな。