NDEF情報とNXP TagInfo

RL-700Sで出力されたRFIDタグのICで使用されている規格であるISO15693(I-CODE SLI)は、かねてからAndroid2.3.3のNFC NDEF実装で読み書き出来ると聞いていたので、テストも兼ねて拙作のNFCTagReaderのWriterにNDEFによる書込み機能(プレーンテキストのみ)を追加することにした。

コードとしては、以下のようにデータ書込み機能をActivityから分離した非同期タスククラス"ISO15693WriteTask"を用意し、その中でNDEFフォーマットでデータを書き出すメソッドを用意した。※1

ISO15693WriteTask#writeNDEF
private String writeNDEF() {
    final EditText editWrite = (EditText) mActivity.findViewById(R.id.edit_write);
    final CharSequence cData = editWrite.getText();
    
    //NDEFRecordを生成
    Charset utfEncoding = Charset.forName("UTF-8");
    Locale locale = Locale.getDefault();
    
    final byte langBytes = locale.getLanguage().getBytes(utfEncoding);
    final byte textBytes = cData.toString().getBytes(utfEncoding);
    final int utfBit = 0;
    final char status = (char) (utfBit + langBytes.length);
    
    ByteBuffer buff = ByteBuffer.allocate(1 + langBytes.length + textBytes.length);
    final byte data =  buff.put((byte) status).put(langBytes).put(textBytes).array();
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN
            , NdefRecord.RTD_TEXT, new byte[0], data);
    try {
        NdefRecord records = {record};
        NdefMessage message = new NdefMessage(records);
        
        TagTechnology tag = Ndef.get(mNfcTag);
        if ( tag == null ) {
            tag = NdefFormatable.get(mNfcTag);
            tag.connect();
            ((NdefFormatable)tag).format(message);
            tag.close();
        } else {
            tag.connect();
            ((Ndef)tag).writeNdefMessage(message);
            tag.close();
        }
        return cData.toString();
    } catch (Exception e){
        e.printStackTrace();
        Log.e(TAG, "writeData", e);
        Toast.makeText(mActivity
                , "書きこみ失敗 : " + e.getMessage(), Toast.LENGTH_LONG).show();
        return null;
    }
}
実行結果


従来と変わらないが、チェックボックスをOnにすることでNDEFフォーマットで書き込むことができる。


NDEFデータが先頭に付加されている。


これでよさげではあるが、書き込んだNDEFデータが正しく書かれているのかを確認したい所だ。これらは自分で検証用のアプリケーションを作っても良いのだが、Android Marketを覗いてみるとNexus SのNFCコントローラチップ(PN544※2)を開発したNXP semiconductors社がまさにうってつけの無償アプリケーションをリリースしていることが解った。


NXP TagInfo - Android マーケット



このアプリケーションではNFCタグの情報を読み取り、それがどのようなものかの情報を解りやすくダンプしてくれる。また、NDEFフォーマットの解析も機能に追加されており、読込ませたNFCタグがNDEFデータを格納していた場合はそれを自動的に検出してくれるのだ。


このようにタグとNDEFを検出できる。


NDEFデータの内容を見てみたが、正しく書けているようだ。



NDEFデータを書き込んだので、サポートしているタグテクノロジが"NdefFormatable"から"Ndef"に変化している("NfcV"はISO15693であり、変わっていない)

さすがチップの製造メーカだけあって素晴らしい出来だ。※3

※1:ベアデータで書き込んでおいてNDEFで読めない(当たり前!)で1日はまったり、初期状態では"NdefFormatable"でNdefでデータを書き込んだ後は"Ndef"とタグテクノロジが変化する等、いろいろと試行錯誤はあった。

※2:http://www.jp.nxp.com/news/content/file_1558.html

※3:このアプリケーション、システムレベルでのディスパッチを使用しているので、他のアプリケーションとインテントの競合になる場合がある。その場合"Foreground only Access"を選択することで、本アプリケーションがフォアグラウンドで動作している時だけ動作するようにも出来る。

同様にデータの書き込みや消去が出来る"NXP TagWriter"もリリースされており、こちらも無料なので、興味のあるNexusSユーザはダウンロードしてみると良いだろう。