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で扱うタグ情報によってクラスを継承階層にわけており、
このようにFeliCaとFeliCa 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 (リードライト)で初期化されていることが判る。
以上、コードの変更は近いうちにリポジトリにアップできそうだ。