Как я могу написать в классический тег MIFARE?
Как я могу написать в классический тег MIFARE?
Я написал этот код, но writeBlock
приводит к ошибке "java.io.IOException: transceive fail".
Как это можно решить?
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);
}
1 ответ
Прежде всего, вы проходите аутентификацию не в том секторе. Здесь вы аутентифицируетесь в секторе 1 с ключом A:
auth = mfc.authenticateSectorWithKeyA(1, MifareClassic.KEY_DEFAULT);
Как вы проходите if (auth)
Я предполагаю, что аутентификация с KEY_DEFAULT
как ключ A для сектора 1 является успешным.
Но затем вы пытаетесь записать в блок 2, который находится в секторе 0:
mfc.writeBlock(2, toWrite);
Поскольку вы аутентифицированы в секторе 1, запись в сектор 0 не удастся. Вы можете писать только в блоки в секторе, в котором вы последний раз проходили аутентификацию. Для сектора 1 это будут блоки с 4 по 7. Обратите внимание, что вы столкнетесь с той же проблемой, если аутентифицируетесь в секторе 2 и попытаетесь записать блок 4 (который находится в секторе 1).
Если я правильно прочитал комментарии ниже вашего поста, вы также попытались пройти аутентификацию в секторе 1 и получить доступ к блоку 4, что привело к той же ошибке. Если это так, то условия доступа сектора 1 запрещают операции записи для ключа A.