gpt4 book ai didi

android - 如何使用 NfcA 类读取 Mifare Classic 标签?

转载 作者:行者123 更新时间:2023-11-30 00:25:09 25 4
gpt4 key购买 nike

我有一个支持 NfcAMifareClassic 技术的 NFC 标签。固件更新后,我的手机不再支持 MifareClassic 技术。在较旧的固件上,读取 MifareClassic 标签工作正常。

是否可以使用NfcA类来读取Mifare Classic标签?如何做到这一点?

Mifare Classic A0A1A2A3A4A5技术认证 key (举例)

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) {
}
}

Commands for transceive

最佳答案

首先,为了与 MIFARE Classic 标签进行通信(即验证、执行读/写操作),您将需要一个具有支持 MIFARE Classic 的 NFC 硬件的设备。由于恩智浦的许可政策,这通常只能在配备恩智浦 NFC 芯片组的设备上实现。其他 NFC 芯片组通常只允许您执行防碰撞和枚举(即检测标签并读取其 (N)UID)。

由于您指出访问 MIFARE Classic 的能力(通过 MifareClassic 标签技术对象)由于固件更新而丢失,我假设您的 NFC 芯片组能够访问 MIFARE经典。

NXP 的 NFC Controller 使用 MIFARE 读取器命令(用于身份验证、二进制读/写和值 block 操作的纯文本命令)透明地抽象对 MIFARE Classic 标签的访问。芯片组自动负责将这些抽象命令转换为实际的 MIFARE Classic 命令、相互身份验证和 session 加密。 MifareClassic 标记技术对象实现以下命令:

  • authenticateSectorWithKeyA(sectorIndex, key):
    +----------+-------------+--------------------+-------------------+|   0x60   | BLOCK_INDEX | UID (last 4 bytes) |       KEY_A       || (1 byte) |  (1 byte)   |     (4 bytes)      |     (6 bytes)     |+----------+-------------+--------------------+-------------------+
  • authenticateSectorWithKeyB(sectorIndex, key):
    +----------+-------------+--------------------+-------------------+|   0x61   | BLOCK_INDEX | UID (last 4 bytes) |       KEY_B       || (1 byte) |  (1 byte)   |     (4 bytes)      |     (6 bytes)     |+----------+-------------+--------------------+-------------------+
  • readBlock(blockIndex):
    +----------+-------------+|   0x30   | BLOCK_INDEX || (1 byte) |  (1 byte)   |+----------+-------------+
  • writeBlock(sectorIndex, data):
    +----------+-------------+--------------------+|   0xA0   | BLOCK_INDEX |        DATA        || (1 byte) |  (1 byte)   |     (16 bytes)     |+----------+-------------+--------------------+
  • 增量( block 索引,值):
    +----------+-------------+-------------------+|   0xC1   | BLOCK_INDEX |       VALUE       || (1 byte) |  (1 byte)   |     (4 bytes)     |+----------+-------------+-------------------+
  • 减量(blockIndex,值):
    +----------+-------------+-------------------+|   0xC0   | BLOCK_INDEX |       VALUE       || (1 byte) |  (1 byte)   |     (4 bytes)     |+----------+-------------+-------------------+
  • 传输(blockIndex):
    +----------+-------------+|   0xB0   | BLOCK_INDEX || (1 byte) |  (1 byte)   |+----------+-------------+
  • 恢复( block 索引):
    +----------+-------------+|   0xC2   | BLOCK_INDEX || (1 byte) |  (1 byte)   |+----------+-------------+

对于当前的 NFC Controller (使用 NCI 的 Controller ;不适用于 PN544 等),Android NFC 系统服务将这些命令封装到特殊的 NCI 命令中(参见 phNxpExtns.cphNxpExtns_MifareStd.c)。

根据您的设备无法枚举 MifareClassic 标签技术的原因,您可能很幸运,并且您设备的 NFC 堆栈已经处理了该包装。在这种情况下,您应该能够使用 NfcA 标记对象发送上述命令。

但是,您的设备可能无法枚举 MifareClassic 标签技术,因为它只是将标签检测为常规 Type 2 标签(或其他 NFC-A 标签)。在这种情况下,NativeNfcTag.cpp不会执行额外的包装。您可能仍然能够按照在 phNxpExtns.c 中执行的相同策略实际创建包装命令和 phNxpExtns_MifareStd.c .但是,我不确定不正确的检测可能会产生哪些其他副作用(例如,不同的接口(interface)初始化)。

关于android - 如何使用 NfcA 类读取 Mifare Classic 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523081/

25 4 0