1

如何写入 MIFARE Classic 标签?

我已经编写了这段代码,但writeBlock导致错误“java.io.IOException:transceive failed”。

如何解决?

MifareClassic mfc = MifareClassic.get(mytag);
boolean auth = false;
mfc.connect();
auth = mfc.authenticateSectorWithKeyA(1,MifareClassic.KEY_DEFAULT);
if (auth) {
    String text = "Hello, World!";
    byte[] value  = text.getBytes();
    byte[] toWrite = new byte[MifareClassic.BLOCK_SIZE];        

    for (int i=0; i<MifareClassic.BLOCK_SIZE; i++) {
        if (i < value.length) toWrite[i] = value[i];
        else toWrite[i] = 0;
    }           

    mfc.writeBlock(2, toWrite);
}
4

1 回答 1

1

首先,您正在对错误的扇区进行身份验证。在这里,您使用密钥 A 对扇区 1 进行身份验证:

auth = mfc.authenticateSectorWithKeyA(1, MifareClassic.KEY_DEFAULT);

当您通过 时if (auth),我假设使用KEY_DEFAULT密钥 A 对扇区 1 进行的身份验证是成功的。

但是,您正在尝试写入位于扇区 0 中的块 2:

mfc.writeBlock(2, toWrite);

当您通过扇区 1 进行身份验证时,写入扇区 0 将失败。您只能写入您上次验证的扇区中的块。对于扇区 1,这将是块 4 到 7。请注意,如果您对扇区 2 进行身份验证并尝试写入块 4(位于扇区 1 中),则会遇到同样的问题。

如果我正确阅读了您帖子下方的评论,您还尝试对扇区 1 进行身份验证并访问块 4,从而导致相同的错误。如果是这种情况,扇区 1 的访问条件禁止对密钥 A 进行写操作。

于 2014-04-15T15:59:34.737 回答