当前位置: 首页 > 知识库问答 >
问题:

ACR122U-A9 读取 NFC 卡 7 字节 UID

艾哲
2023-03-14

我有一个Mifare Ultralight EV1卡,根据文档,它支持7字节UID,但当我使用缓冲区读取它时。从([0xFF,0xCA,0x00,0x00,0x00]中,我只能从APDT命令中获取4个字节。

关于如何获得完整的7字节的任何点,当我使用Android或iOS阅读器他们获取完整的7字节UID,也许扫描仪不支持它?

这是我正在使用的代码: 这里也作为 Pastebin: https://pastebin.com/uaaqX7e6

var pcsc = require('pcsclite');

var pcsc = pcsc();
pcsc.on('reader', function(reader) {

    console.log('New reader detected', reader.name);

    reader.on('error', function(err) {
        console.log('Error(', this.name, '):', err.message);
    });

    reader.on('status', function(status) {
        // console.log('Status(', this.name, '):', status);
        /* check what has changed */
        var changes = this.state ^ status.state;
        if (changes) {
            if ((changes & this.SCARD_STATE_EMPTY) && (status.state & this.SCARD_STATE_EMPTY)) {
                console.log("card removed");/* card removed */
                reader.disconnect(reader.SCARD_LEAVE_CARD, function(err) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log('Disconnected');
                    }
                });
            } else if ((changes & this.SCARD_STATE_PRESENT) && (status.state & this.SCARD_STATE_PRESENT)) {
                console.log("card inserted");/* card inserted */
                reader.connect({ share_mode : this.SCARD_SHARE_SHARED }, function(err, protocol) {
                    if (err) {
                        console.log(err);
                    } else {
                        // console.log('Protocol(', reader.name, '):', protocol);
                        // reader.transmit(Buffer.from([0x1B, 0xFF, 0xFF, 0xFF, 0xFF]), 40, protocol, function(err, data) {
                        //     if (err) {
                        //         console.log(err);
                        //     } else {
                        //         console.log('Data received', data);
                        //         //reader.close();
                        //         //pcsc.close();
                        //     }
                        // });

                        // const packet = new Buffer.from([
                        //     0xff, // Class
                        //     0xca, // INS
                        //     0x00, // P1: Get current card UID
                        //     0x00, // P2
                        //     0x00  // Le: Full Length of UID
                        //   ]);

                          const packet = new Buffer.from([
                            0xff, // Class
                            0xb0, // INS
                            0x00, // P1: Get current card UID
                            0x00, // P2
                            0x00  // Le: Full Length of UID
                          ]);
                          
                        //   reader.transmit(packet, 12,protocol, (err, response) => {
                          
                        //     if (err) {
                        //       console.log(err);
                        //       return;
                        //     }
                          
                        //     if (response.length < 2) {
                        //       console.log(`Invalid response length ${response.length}. Expected minimal length was 2 bytes.`);
                        //       return;
                        //     }
                          
                        //     // last 2 bytes are the status code
                        //     const statusCode = response.slice(-2).readUInt16BE(0);
                          
                        //     // an error occurred
                        //     if (statusCode !== 0x9000) {
                        //       console.log('Could not get card UID.');
                        //       return;
                        //     }
                          
                        //     // strip out the status code (the rest is UID)
                        //     const uid = response.slice(0, -2).toString('hex');
                        //     // const uidReverse = reverseBuffer(response.slice(0, -2)).toString('hex'); // reverseBuffer needs to be implemented
                          
                        //     console.log('card uid is', uid);
                          
                        //   });

                        reader.transmit(packet, 12, protocol, function(err, data) {
                            if (err) {
                                console.log(err);
                            } else {
                                console.log('Data received', data);
                                //reader.close();
                                //pcsc.close();
                            }
                        });
                    }
                });
            }
        }
    });

    reader.on('end', function() {
        console.log('Reader',  this.name, 'removed');
    });
});

pcsc.on('error', function(err) {
    console.log('PCSC error', err.message);
});

共有1个答案

闻人吕恭
2023-03-14

一种方法是读取二进制块0和1

例如APDU = {FF B0 00 00 08}

字节0,1,2,4,5,6,7将是7字节UID。

使现代化

该命令改编自ACR122U手册

在第 5.3 节中

从二进制页面 04h 读取 4 个字节 (MIFARE Ultralight)

APDU={FF B0 00 04 04h}

从二进制页面04h开始读取16个字节(MIFARE Ultralight)(将读取页面4、5、6和7)

APDU = {FF B0 00 04 10h}

不幸的是,该读卡器不完全支持NFC Forum Type 2兼容卡(例如Mifare Ultralight C)或NFC ForumType 2兼容的卡(例如,Mifare Ultralight EV1),它仅完全支持读取Mifare Classic卡,尽管这三种类型的卡之间存在一些共性,因此您应该能够执行一些操作

一个区别是UID的大小与原来的Mifare Classic有一个4字节的UID不同,另一个是身份验证。

对于米夫特超轻EV1,读取超过一次块,您参考的文档表明这是功能有点依赖于实际硬件。

我建议您尝试发送:

< code>FF B0 0 0 00 00读取块00

< code>FF B0 00 01 00读取块01

单独读取2个块中的每一个

您的文档认为NFC Type 2卡的正确性始终受支持。

Mifare Ultralight EV1 的 UID 是块 00 的字节 0,1,2,然后是块 01 的字节 0,1,2,3

更新 2

不幸的是,我不是这种特定读卡器硬件的专家,但答案的主要部分是成立的,根据卡的数据表https://www.nxp.com/docs/en/data-sheet/MF0ULX1.pdf,卡的UID也存储在at块0和1的内存中

如果您在“其他”选项卡中使用NFC工具“读取内存”选项,它将在块0和块1中列出UID

 类似资料:
  • 我在使用ACR122U RFID读卡器时遇到问题。我需要使用PC/SC驱动程序将其连接到Mac。我从ACS网站安装了驱动程序,并确认它正在运行。 但是,每当我使用命令进行测试时,都会出现以下错误: 据我从谷歌上了解,是Mac接管了USB,阻止了PC/SC使用该设备,但我如何才能迫使计算机使用PC/SC驱动程序,而不是默认的Apple USB? PS:我已经安装了

  • 本文向大家介绍Android实现读取NFC卡卡号示例,包括了Android实现读取NFC卡卡号示例的使用技巧和注意事项,需要的朋友参考一下 Android实现读取NFC卡卡号示例,具体如下: 1.权限 2.注册(静态) 3.Activity 初始化 启动 获取数据 解析 4.完整参考 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我正在尝试使用NFC读卡器库读取Mifare超轻型卡的内容。 我对NFC完全陌生,我正在使用这个github存储库开始。 此存储库中的代码允许检测检测到哪种类型的卡(Mifare,Mifare超轻量级......)并读取卡的UID。我添加了以下代码以读取Mifare超轻型卡的内容: 我有一张卡片,上面写着“Hello world”,当我读到它时,上面的代码会打印以下字节: 所以我从我的卡片上读了一

  • 我开发了一个系统,可以使用带有PN532芯片的阅读器读取NFC标签。它工作正常。我可以阅读米费尔经典和米费尔超轻标签。 现在我想使用带有Android 4.4.2的Nexus平板电脑来模拟标签。我没有Android开发经验,但我认为这是可能的。 我已经在Nexus平板电脑中设置了NFC通信,但我想我必须下载或编写一些应用程序来模拟Tag和NDEF通信。 最简单的方法是什么?

  • 我正在使用以下命令从Mifare超轻型标签读取二进制块: 但是现在我想使用ACR1252 NFC阅读器精确地执行存储在Mifare Ultralight标签中的NDEF消息。我必须使用哪个命令来获取完整的 NDEF 消息?NDEF 消息存储在标签中的哪个位置?

  • 问题内容: 我有一个要在Java中读取的2 gb文件(实际上是四个2gb文件)。因此,Java 7中有一个新功能,可以让我一次读取所有字节。 这是一个愚蠢的程序,它将读取文件中预先输入一个字节的文件,然后连续读取该文件,并将读取的内容附加到同一文件中。现在显然,RAM不够大,无法一次读取2gb文件,更不用说其中的四个了,所以我想知道是否有任何快速方法,而无需使用外部库(除非这是唯一方法)来读取四个