【C#】.NET 8のWPFでNFCのデータを読んだり書いたりしてみた
前回の続編です。
作ったもの
こんな感じです。


NFCのデータ構成について
ここが詳しかったです。
今回テストに使用したのはNFC Type-AのNTAG 215でした。なので全体の領域は540バイト、データ領域は先頭の使用済み領域16バイトと末尾の20バイトを引いて504バイトということでした。
やる気があれば公式のデータシートを読み込んでおきます。
こちらの「8.5 Memory organization」というセクションにそれっぽいことが書いてありそうです。
前回からの更新箇所
「今後やりたいこと」に列挙していたことは大体実装できたかなと思います。
ログとかちゃんとする
NLogで実装済みです。
汎用ホスト化
対応済みです。
以下などのサイトを参照してProgram.csを作ったり色々頑張っていたのですが、結局WPF UIのサンプルコードにあったのをほぼそのままパクる形になりました。
ApplicationHostServiceに初期表示のためViewクラスを直接指定してしまっている辺りが微妙い感じ。まぁ動いているのでヨシとします。
カード置き待ちをちゃんとやる
対応済みです。
Readページ内でカードリーダーの状態変化をモニターしておき、何かのイベントが飛んできたらデバイス状態とかカード情報とかを都度更新するようにしました。
なお、作っている過程で、スマホみたいに「ある一定時間は置き待ちして、カードが検出されたら置き待ちをやめる」みたいな仕組みを作りたかったのですが、どうも一度モニターをやめると(イベントをデタッチすると、かも?)同じプロセス中に再度置き待ちを実行すると何か上手くカードが検出されない問題に出くわしたのですが、私の呼び出しシーケンスが悪いのですかね。
もうちょっと有益そうな情報を出す
対応済みです。
とりあえずバイナリ単位でIC内のすべてのデータを表示するようにしました。
なお、見やすいとは言っていない。
書き込みに対応する
対応済みです。
PaSoRiが4バイト(1ページ)単位での書き込みしかサポートしていないので、他は試していません。
一応何でもできるようにMSB、LSBと書き込むバイト配列を直接指定できるようにしておきました。
何かエラーがあればExceptionで捕捉してテキストボックスに表示します。
フォーカスアウトしたらバリデーションかけるとかインテリジェンスなことはやっていません。
何らかのUIフレームワークを使ってかっちょいくする
かっちょいくしました。
UIフレームワークには WPF UI を使用させていただいています。
所感
読み取り機能の送信コマンドについてはレングスなどまだ上記のNTAG215にしか対応できていないというのと、テストしたデバイス(PaSoRi)の仕様に若干つられているフシがあり、16バイト区切りでの読み込みを前提に作ってしまっていますので、他のデバイスで動かすと予期せぬ動作になる可能性があります。
またそれ以外も、ステータスワードを直接表示していたり、書き込みについてもMSB、LSBを指定させたりと各方面の仕様書を読み解いていかないと何のこっちゃ分からんUIになっているので、ツールとしてはまだまだ改善の余地があります。
なお、PaSoRiの仕様はSONYが販売しているSDK for NFCの評価版を入手すると同梱されています。
※利用者登録で住所氏名などの情報が必要です(無料)
PCSCのドキュメントの「2.2.6 独自定義(拡張)コマンド」というセクションが非常に有用です。
今後の方針
以下などを見てNDEFの読み書きに対応したいと思います。