FeliCa Liteデバイスに書き込み成功

ようやくできた。
FeliCa Liteは内部ブロックに読み書きのできる"スクラッチパッド"という名前の領域が確保されており、明示的にリードオンリーに初期化しなければユーザ側で自由に読み書きをすることができる。

ブロック番号 名称 有効バイト数
00h S_PAD0 16
01h S_PAD1 16
02h S_PAD2 16
03h S_PAD3 16
04h S_PAD4 16
05h S_PAD5 16
06h S_PAD6 16
07h S_PAD7 16
08h S_PAD8 16
09h S_PAD9 16
0ah S_PAD10 16
0bh S_PAD11 16
0ch S_PAD12 16
0dh S_PAD13 16

FeliCa/FeliCa Lite/FeliCa Plug 技術情報 - Sony Japan

現在クラス構成を見直しているnfc-felicaではnfcで扱うタグ情報によってクラスを継承階層にわけており、

このようにFeliCaFeliCa Liteのクラスを分割することにした。また、ルートクラスのNfcTagを含めて全てのクラスはインタフェースParcelableを実装しており、サービス間で引き渡すことができるようにしている。

新たなFeliCaLiteTagクラスによるデータのポーリング、リード、ライトは以下のようなコードとなるだろう。

NFCFeliCaReader.javaより
//FeliCa Lite polling
FeliCaLiteTag tag = new FeliCaLiteTag(this.nfcTag);
IDm idm = tag.pollingAndGetIDm();

//read block 0
ReadResponse resp = tag.readWithoutEncryption((byte)0);

//read MemoryConfigurationBlock
MemoryConfigurationBlock mb = tag.getMemoryConfigBlock(); 

//encode charactor (変数"data"に文字列が入っている)
Charset utfEncoding = Charset.forName("UTF-8");
byte[] textBytes = data.toString().getBytes(utfEncoding);

//write data to S_PAD0
WriteResponse result = tag.writeWithoutEncryption((byte)0, textBytes);
if ( result.getStatusFlag1() == 0 ) {
    //正常処理
} 

先日書いたようにFeliCa Liteはシステムコードとサービスコードが固定のため、コードパラメタが少なく、かなりすっきりしたものになるのが判るだろう。

ちなみに、上述したスクラッチパッドエリアのアクセス方法を設定しているMC(メモリコンフィグレーションブロック)をダンプすると以下のようになった。 

全てがRW (リードライト)で初期化されていることが判る。

以上、コードの変更は近いうちにリポジトリにアップできそうだ。