Android 如何使用NfcA类读取Mifare Classic标记?
我有一个NFC标签,支持Android 如何使用NfcA类读取Mifare Classic标记?,android,authentication,nfc,mifare,low-level,Android,Authentication,Nfc,Mifare,Low Level,我有一个NFC标签,支持NfcA和MifareClassic技术。固件更新后,我的手机不再支持MifareClassic技术。在较旧的固件上,读取MifareClassic标记工作正常 是否可以使用NfcA类读取Mifare Classic标记?如何做到这一点 Mifare经典A0A1A2A34A5技术认证的关键(例如) 首先,为了与MIFARE Classic标签进行通信(即验证、执行读/写操作),您需要一台具有支持MIFARE Classic的NFC硬件的设备。由于NXP的许可政策,这通常只
NfcA
和MifareClassic
技术。固件更新后,我的手机不再支持MifareClassic
技术。在较旧的固件上,读取MifareClassic
标记工作正常
是否可以使用NfcA
类读取Mifare Classic标记?如何做到这一点
Mifare经典A0A1A2A34A5技术认证的关键(例如)
首先,为了与MIFARE Classic标签进行通信(即验证、执行读/写操作),您需要一台具有支持MIFARE Classic的NFC硬件的设备。由于NXP的许可政策,这通常只能在使用NXP NFC芯片组的设备上实现。其他NFC芯片组通常只允许您执行防碰撞和枚举(即检测标签并读取其(N)UID) 由于您指出固件更新导致访问MIFARE Classic(通过
MIFARE Classic
tag technology对象)的功能丢失,因此我假设您的NFC芯片组能够访问MIFARE Classic
NXP的NFC控制器使用MIFARE阅读器命令(用于身份验证、二进制读/写和值块操作的纯文本命令)透明地抽象访问MIFARE经典标记。芯片组自动负责将这些抽象命令转换为实际的MIFARE经典命令、相互认证和会话加密。MifareClassic
标记技术对象实现以下命令:
:使用KEYA验证扇区(扇区索引,密钥)
:readBlock(块索引)
:增量(块索引,值)
:传输(块索引)
MifareClassic
标记技术的原因,您可能很幸运,并且您的设备的NFC堆栈已经处理了该包装。在这种情况下,您应该能够使用NfcA
标记对象发送上述命令
但是,您的设备可能无法枚举
MifareClassic
标记技术,因为它只是将标记检测为常规类型2标记(或其他NFC-A标记)。在这种情况下,将不执行附加包装。通过遵循和中执行的相同策略,您可能仍然能够准确地创建包装的命令。但是,我不确定错误检测可能会有哪些其他副作用(例如不同的接口初始化)。为什么不使用MifareClassic标记技术实例提供的高级接口?@MichaelRoland实现附加功能是必要的,谢谢。我不知道如何实现它,我希望得到您的帮助。您希望为mifare classic实现mifare classic标记技术尚未涵盖的其他哪些功能?@MichaelRoland我的手机不支持mifare classic读取技术(在新固件上)。如果通过NFCA类实现读取。行吗?在较旧的固件上,读取MifareClassic标记工作正常
public static String[] readTag(Tag tag) {
byte[] readedData;
byte[] PASSWORD = new byte[]{(byte) 0xA0, (byte) 0xA1, (byte) 0xA2, (byte) 0xA3, (byte) 0xA4, (byte) 0xA5};
NfcA nfca = NfcA.get(tag);
try {
nfca.connect();
readedData = nfca.transceive(new byte[]{
(byte) 0x30,
(byte) (0 & 0x0ff),PASSWORD // (for example)
});
} catch (Exception e) {
}
}
+----------+-------------+--------------------+-------------------+
| 0x60 | BLOCK_INDEX | UID (last 4 bytes) | KEY_A |
| (1 byte) | (1 byte) | (4 bytes) | (6 bytes) |
+----------+-------------+--------------------+-------------------+
+----------+-------------+--------------------+-------------------+
| 0x61 | BLOCK_INDEX | UID (last 4 bytes) | KEY_B |
| (1 byte) | (1 byte) | (4 bytes) | (6 bytes) |
+----------+-------------+--------------------+-------------------+
+----------+-------------+
| 0x30 | BLOCK_INDEX |
| (1 byte) | (1 byte) |
+----------+-------------+
+----------+-------------+--------------------+
| 0xA0 | BLOCK_INDEX | DATA |
| (1 byte) | (1 byte) | (16 bytes) |
+----------+-------------+--------------------+
+----------+-------------+-------------------+
| 0xC1 | BLOCK_INDEX | VALUE |
| (1 byte) | (1 byte) | (4 bytes) |
+----------+-------------+-------------------+
+----------+-------------+-------------------+
| 0xC0 | BLOCK_INDEX | VALUE |
| (1 byte) | (1 byte) | (4 bytes) |
+----------+-------------+-------------------+
+----------+-------------+
| 0xB0 | BLOCK_INDEX |
| (1 byte) | (1 byte) |
+----------+-------------+
+----------+-------------+
| 0xC2 | BLOCK_INDEX |
| (1 byte) | (1 byte) |
+----------+-------------+