ISO15693のオプションフラグには気をつけろ(マルチブロックの読込み)
ISO15693はそのコマンドの直前に設定する「リクエストフラグ」のビットにより、コマンドの戻り値が変わるので注意が必要だ。
-
- ISO15693 Request Flags
Bit1 | Bit2 | Bit3 | Bit4 | Bit5 | Bit6 | Bit7 | Bit8 |
---|---|---|---|---|---|---|---|
サブキャリアフラグ | データレートフラグ | インベントリフラグ | プロトコル拡張フラグ | セレクトフラグ | アドレスフラグ | オプションフラグ | RFU |
例えば、複数のメモリブロックを読み込む"Read Multiple Blocks"コマンドだが、オプションフラグ(Bit7)がOnの場合、各データブロックの先頭にブロックがロックされているかを示すセキュリティステータスが付加される。
-
- Read Multiple Blocks (オプションフラグ:On)
8Bits | 8Bits | Block Length | 8Bits | Block Length | ・・・ |
---|---|---|---|---|---|
フラッグ | ブロックセキュリティステータス1 | ブロックデータ1 | ブロックセキュリティステータス2 | ブロックデータ2 | ・・・ |
-
- Read Multiple Blocks (オプションフラグ:Off)
8Bits | Block Length | Block Length | ・・・ |
---|---|---|---|
フラッグ | ブロックデータ1 | ブロックデータ2 | ・・・ |
これだけではないが、リクエストフラグによって戻り値のデータ構造がかなり変わるので、それぞれのコマンドの仕様をよく読む必要がある。
ええ、また見逃して1時間程はまってましたよ。
-
- ISO15693.java ( #readMultipleBlock )
public ReadMultipleBlocksResponse readMultipleBlock(byte blockNumber , byte blockSize, byte numberOfBlock) throws ISO15693Exception { if ( mNfcTag == null ) { throw new ISO15693Exception("tagService is null. no read execution"); } // read multiple block ReadMultipleBlocksRequest req = new ReadMultipleBlocksRequest*1; return new ReadMultipleBlocksResponse(result, blockSize, numberOfBlock); } catch (NfcException e) { throw new ISO15693Exception(e); } }
ということでマルチブロツクの読込みには成功した。
マルチブロック読込み実行結果 (〜27ブロック)
25,26,27ブロックにデータが見えるのはなぜ?....
参考:「ISO/IEC FCD 15693-3」Identification cards ― Contactless integrated circuit(s) cards - Vicinity cards ― Part 3: Anti-collision and transmission protocol
*1:byte) //オプション(コマンド)フラグをOnにする (( DATA_RATE_HIGH | ADDRESSED_MODE | OPTION_COMMAND_ON) & 0xff) , mUID , blockNumber , numberOfBlock); try { byte[] result = ISO15693Lib.transceive(mNfcTag, req.getBytes(