将 Mifare Ultralight 格式化为 NDEF 抛出 IO 异常
Formatting a Mifare Ultralight to NDEF throw IO Exception
我想使用以下代码格式化一张从未使用过的 MIFARE Ultralight 卡:
NdefFormatable formatable = NdefFormatable.get(tag);
if (formatable != null) {
String result = "Afifly";
try {
formatable.connect();
try {
formatable.format(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));
} catch (Exception e) {
// let the user know the tag refused to format
System.out.println("error ");//+getStackTrace(e));
result = "Fail 1";
}
} catch (Exception e) {
// let the user know the tag refused to connect
System.out.println("eeeerrror 2"+e);
result = "Fail 2";
} finally {
try {
formatable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return;
}
但是在调用方法 formatable.format(...)
.
时它总是抛出 IOException(没有任何有意义的消息)
我尝试了其他几张卡,结果都一样。但是,这些卡可以使用 NXP TagWriter 等进行格式化。
我已经找到了 question/answer“”,但是这个解决方案对我不起作用。我仍然得到相同的 IOException。
标签的前四页(第 0-3 页)包含以下字节:
04 F1 E9 94
42 AB 4A 80
23 48 00 00 (all lock-bits cleared)
00 00 00 00 (no capability container)
因此,标签为空且未锁定。
在空 MIFARE Ultralight 标签上调用 NdefFormatable.format()
时出现 IOException
的最可能原因是您的设备不支持 "formatting"(即初始化为 NFC Forum Type 2标签)那种类型的标签。如果是这样的话,你连NdefFormatable
技术都看出来了,这分明是个BUG。
在这种情况下,您唯一的选择是手动执行格式化程序(有关详细信息,请参阅 NFC 论坛 2 类标签操作规范)。这也是各种标签编写应用程序(例如 NXP TagWriter)所做的。对于 MIFARE Ultralight (MF0ICU1) 标签(不要尝试将它用于更大的标签!),像这样的东西会起作用:
NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
try {
nfcA.connect();
nfcA.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)0x03, // page = 3
(byte)0xE1, (byte)0x10, (byte)0x06, (byte)0x00 // capability container (mapping version 1.0, 48 bytes for data available, read/write allowed)
});
nfcA.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)0x04, // page = 4
(byte)0x03, (byte)0x00, (byte)0xFE, (byte)0x00 // empty NDEF TLV, Terminator TLV
});
} catch (Exception e) {
} finally {
try {
nfcA.close();
} catch (Exception e) {
}
}
}
我想使用以下代码格式化一张从未使用过的 MIFARE Ultralight 卡:
NdefFormatable formatable = NdefFormatable.get(tag);
if (formatable != null) {
String result = "Afifly";
try {
formatable.connect();
try {
formatable.format(new NdefMessage(new NdefRecord(NdefRecord.TNF_EMPTY, null, null, null)));
} catch (Exception e) {
// let the user know the tag refused to format
System.out.println("error ");//+getStackTrace(e));
result = "Fail 1";
}
} catch (Exception e) {
// let the user know the tag refused to connect
System.out.println("eeeerrror 2"+e);
result = "Fail 2";
} finally {
try {
formatable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return;
}
但是在调用方法 formatable.format(...)
.
我尝试了其他几张卡,结果都一样。但是,这些卡可以使用 NXP TagWriter 等进行格式化。
我已经找到了 question/answer“
标签的前四页(第 0-3 页)包含以下字节:
04 F1 E9 94 42 AB 4A 80 23 48 00 00 (all lock-bits cleared) 00 00 00 00 (no capability container)
因此,标签为空且未锁定。
在空 MIFARE Ultralight 标签上调用 NdefFormatable.format()
时出现 IOException
的最可能原因是您的设备不支持 "formatting"(即初始化为 NFC Forum Type 2标签)那种类型的标签。如果是这样的话,你连NdefFormatable
技术都看出来了,这分明是个BUG。
在这种情况下,您唯一的选择是手动执行格式化程序(有关详细信息,请参阅 NFC 论坛 2 类标签操作规范)。这也是各种标签编写应用程序(例如 NXP TagWriter)所做的。对于 MIFARE Ultralight (MF0ICU1) 标签(不要尝试将它用于更大的标签!),像这样的东西会起作用:
NfcA nfcA = NfcA.get(tag);
if (nfcA != null) {
try {
nfcA.connect();
nfcA.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)0x03, // page = 3
(byte)0xE1, (byte)0x10, (byte)0x06, (byte)0x00 // capability container (mapping version 1.0, 48 bytes for data available, read/write allowed)
});
nfcA.transceive(new byte[] {
(byte)0xA2, // WRITE
(byte)0x04, // page = 4
(byte)0x03, (byte)0x00, (byte)0xFE, (byte)0x00 // empty NDEF TLV, Terminator TLV
});
} catch (Exception e) {
} finally {
try {
nfcA.close();
} catch (Exception e) {
}
}
}