Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用NfcA类读取Mifare Classic标记?_Android_Authentication_Nfc_Mifare_Low Level - Fatal编程技术网

Android 如何使用NfcA类读取Mifare Classic标记?

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的许可政策,这通常只

我有一个NFC标签,支持
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(块索引)
  • 增量(块索引,值)
  • 传输(块索引)
对于当前的NFC控制器(使用NCI的控制器;不适用于例如PN544),这些命令由Android NFC系统服务包装成特殊的NCI命令(请参阅和)

取决于您的设备未能枚举
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) | +----------+-------------+