Transceive Failed on ISO15693 / Tag-it HF-I

旧城冷巷雨未停 提交于 2019-12-06 17:53:37

Found some things out, i want to share:

  • Don't Send the Data with LSB first, it seems that the transceive command does this automatically on sending
  • Don't use addressed mode, it seems that the android implementation has some problems with that
  • Set the Option bit (0x40) in the Flags.
  • Fast Mode (0x02) seems to be supported by my tags, so you can set it or not
  • Don't set the CRC16, because it's added by android

But the worst thing at all is, that the Tags does not respond in the time that is compiled into the tag writer. You will get a Tag is lost. Exception but the Data will be written to the Tag! So the solution is to just ignore this exception and maybe validate the data after writing and try again if it doesnt work.

My current write code looks like this:

public static void write(Tag tag, byte[] data) throws IOException, FormatException,
InterruptedException {
if (tag == null) {
    return;
}
NfcV nfc = NfcV.get(tag);

nfc.connect();

Log.d(TAG, "Max Transceive Bytes: " + nfc.getMaxTransceiveLength());

// NfcV Tag has 64 Blocks with 4 Byte
if ((data.length / 4) > 64) {
    // ERROR HERE!
    Log.d(TAG, "too much data...");
}

if ((data.length % 4) != 0) {
    byte[] ndata = new byte[(data.length) + (4 - (data.length % 4))];
    Arrays.fill(ndata, (byte) 0x00);
    System.arraycopy(data, 0, ndata, 0, data.length);
    data = ndata;
}

byte[] arrByte = new byte[7];
// Flags
arrByte[0] = 0x42;
// Command
arrByte[1] = 0x21;

for (int i = 0; i < (data.length / 4); i++) {

    // block number
    arrByte[2] = (byte) (i);

    // data, DONT SEND LSB FIRST!
    arrByte[3] = data[(i * 4)];
    arrByte[4] = data[(i * 4) + 1];
    arrByte[5] = data[(i * 4) + 2];
    arrByte[6] = data[(i * 4) + 3];

    Log.d(TAG, "Writing Data to block " + i + " [" + printHexString(arrByte) + "]");
    try {
    nfc.transceive(arrByte);
    } catch (IOException e) {
    if (e.getMessage().equals("Tag was lost.")) {
        // continue, because of Tag bug
    } else {
        throw e;
    }
    }
}

nfc.close();
}

and it works pretty well. If there is a real error, like the message is not understood, you will get the Transceive Failed message.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!