我正在尝试在 Android 手机上使用 NFC 将 RFID 标签的应用程序系列标识符从
0x07
更改为 0xC2
,然后再更改回来。我已经阅读了标准以及在线支持信息,并且同事给了一些命令规范,但无论我做什么,我总是遇到 I/O 错误。
我正在通过 NFC Tools android 应用程序发送命令
00:27:C2
- 但是我也被提示尝试(并失败)22:27:C2
和 27:C2
。这些标签是新的,所以我 98% 确定它们没有被锁定,但这是有可能的,而且我还没有找到可靠的来源来了解如何发现它们是否被锁定。我有一些 ICODE SLIK 类型的标签,还有一些实现 ISO 标准的未知类型。
NFC 工具的日志始终如下(根据我使用的芯片 ID 不同):
> Waiting
> Chip detected: 24:03:F9:64:50:01:04:E0
> Available I/O Class: NfcV
> Connecting NfcV
> Connected
> Sending «command»
> Error: I/O failure
开头警告:我的答案取决于 NfcV 标签 ICODE SLIX (SL2S2002) 类型,因此如果您使用其他类型,请不要依赖参数。请仔细查看标签的数据表。如果您不确定标签类型,我推荐 NXP TagInfo 应用程序,可在应用程序商店中找到。
写入 NfcV 标签与其他(存储)标签有很大不同,尤其是在写入 AFI 等“管理数据”时。不仅有命令(它是 0x27h),还有 Iso15693Flags。对此标志使用错误的设置可能会损坏您的标签!
我编写此方法是为了在 Android/Java 上使用,以使用 默认选项集(标志) 写入新的 AFI 值。这需要在全局变量 (tagUid) 中提供 TagUID,并将其复制到 tagUid 占位符中(占位符只是一个空的 UID)。
public boolean writeAfi(byte afi) {
// written for ICODE SLIX (SL2S2002)
byte[] cmd = new byte[] {
/* FLAGS */ (byte)0x20, // flags: addressed (= UID field present), use default OptionSet
/* COMMAND */ WRITE_AFI_CCOMMAND, //(byte)0x27, // command write afi
/* UID */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
/* OFFSET */ afi
};
System.arraycopy(tagUid, 0, cmd, 2, 8); // copy tagId to UID
byte[] response;
try {
response = nfcV.transceive(cmd);
} catch (IOException e) {
errorCode = RESPONSE_FAILURE;
errorCodeReason = "writeAfi IOException: " + e.getMessage();
Log.e(TAG, "writeAfi IOException: " + e.getMessage());
return false;
}
if (!checkResponse(response)) return false; // errorCode and reason are setup
Log.d(TAG, "afi written successfully");
errorCode = RESPONSE_OK;
errorCodeReason = RESPONSE_OK_STRING;
return true;
}
如果失败,有以下几个原因:
a) TagUID 错误 - 仔细检查,例如标签信息
b) AFI 已锁定。 AFI 可以通过编程方式锁定,这是一个“一次性”命令,无法逆转(“解锁”)。一张全新的卡不应该被锁定,但是当使用这样的标签玩时......
c) AFI 受密码保护,这意味着您只有在成功验证后才能写入此字段。与b)相同,默认情况下全新标签不受保护。