C#でNFC(Felica/Mifare)の読み取り – 実践編 その6 – NDEF用クラスライブラリ

本文上広告1



C#でのNDEF用クラスライブラリ Simple Ndef Parser

C#のNDEF用クラスライブラリ Simple Ndef Parserを作成しました。適宜ダウンロードしてください。一部Type2 Tag用になっている部分もあるかと思いますが、下記のような流れの中で作成したので、そこらへんはご容赦を。MITライセンスなので、適宜よろしくお願いいたします。

経緯

前回の実践編ではNXP21Xのカードの読み・書きをコードを書いて、実践してみました。

今回やること 前回、Mifare Ultra Light(NTAG21x)の仕様をがっつり読みました。 今回は、以下のよ...

その中でNDEFのコードを探してみたのですが、純粋にNDEFを解析・作成できるライブラリが見つけられず、
NDEFの仕様や参考ページを読んで自分で作成することにしました。

andijakl/ndef-nfc はUWPだったのと、機器での読み書きも含めて作成されたライブラリです。使いたかったのですが、諦めました。

大まかな仕様

  • NXP21XはType2 TagのNDEFなので、Lock Control TLVなどを入れていますが、あまり正確な実装ではなく定数として使用。(*1)
  • ControlTLV、MessageTLVも実装しています。
  • NDEFレコードタイプは”U”のみ解釈できるように実装しています。(*2)
  • SR”ショートレコード”のみの対応。
  • テストコードで動きを確認しています。使用したデータのサンプルは、仕様書・ページと実際に書き込んだデータから作成。
  • MITライセンス。

*1 スマホアプリでNPX213への書き込みから知りました。ただし、あまり正確に使用されていない?ようで。すみません、そこまで追いきれませんでした。

*2 適宜 T等も各自で実装いただけると幸いです。

ダウンロード

下記から、ソースコードをダウンロードしてください。
Gitghubでの公開も考えましたが、どれだけ参照・ダウンロードされてかよくわからないので、こちらでの公開のみとしています。

“Simple Ndef Parser Class Lib v1.0” をダウンロード SimpleNdefParserClass_V1.0.zip – 32 回のダウンロード – 889 KB

ダウンロードしたテストを実行すると、『使用できるテストはありません。テスト探索プログラムと実行プログラムが登録されており、プラットフォームとフレームワークのバージョン設定が適切であることを確認して、もう一度お試しください。』といったメッセージが出る可能性がありますが、方法:.NET Framework の旧バージョンを対象とした単体テストを構成するにて、.Netのバージョンを変更するか、新しいプロジェクトでテストを再構成してください。

参考ページと仕様書

主に以下の仕様書とページを参考にさせていただきました。

構造(簡単な解説)

NDEF TLV の中に、NDEF Recordがあり、PayLoadの中にバイト配列化されたデータが存在します。(ただし、LockTLVなどはType2 Tag 専用のようです。)これを一つずつ解析・作成して、読み書きしたデータを扱える形に変えていきます。

クラスの構造は、NDEFの構造を反映した形になっています。

  • NDEF TLV – SimpleNP_NdefTLV.cs
  • NDEF Record – SimpleNP_NdefRecord.cs
  • その他 – SimpleNP_NdefUtility.cs (共通で使用する定数・関数を含んでいます。)

使い方

実際にテストコードをもとに使い方を見ていきます。UnitTest1.cs, UnitTest2.csを参考にご覧ください。

タグからの読み取りで使用

1. NDEFバイト配列から文字列への変換 (NDEF Record)

NdefRecord sample1_record = new NdefRecord(sample1); //①

string answer = "http://www.nfc.com";

Assert.AreEqual(answer, sample1_record.URI, 
                "取得したURIデータが異なります。"); //②

①でSample1のバイト配列から、文字列等へ変換します。
②文字列の比較

2. NDEFバイト配列から文字列への変換 (NDEF TLV)

NdefTLV ndefTLV = new NdefTLV(sample4_MyType2Tag); //①

Assert.AreEqual("https://office-fun.com", ndefTLV.record.URI, 
                "NdefMeasageの解釈でエラーが発生しました。");

①でNDEF TLVと NDEF Recordを解釈して、正しい文字列として変換できているかを確認します。

タグへの書き込みで使用

元のバイト配列と全要素比較して、すべて同じかをテストコードで比較して、クラス・関数が正しく作成できたかを確認しています。

3.文字列からNDEFバイト配列への変換 (Record)

string orgData = "mms://example.com/download.wmv";

NdefRecord sample_ndefData = new NdefRecord(orgData, UriIdentifierCode.UnAbridgedURI);

for (int i = 0; i < sample3.Length; ++i)
{
   Assert.AreEqual(sample3[i], sample_ndefData.RawData[i], 
                   i.ToString() + "番目でエラーが発生しました。");
}

4. 文字列からNDEFバイト配列への変換(NDEF TLV)

string orgData = "https://office-fun.com";

NdefTLV ndefTLV 
  = new NdefTLV(orgData, UriIdentifierCode.UnAbridgedURI, 
                TLVBlock.LockControlTLV);

シェアする

  • このエントリーをはてなブックマークに追加

フォローする