微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android NFC标签ID标识不同的NFC卡类型

如何解决Android NFC标签ID标识不同的NFC卡类型

我想在我的应用中使用NFC读取功能,在该应用中读取NFC卡的ID。 我有2张不同的NFC卡。 当我用USB NFC读卡器在计算机上读取它们时,两张卡都有9位数字,这很酷。我可以根据该号码识别卡。

当我想在我的应用中阅读它们时,就会出现问题,如下所示:

                            new NfcAdapter.ReaderCallback() {
                                @Override
                                public void onTagdiscovered( final Tag tag ) {
                                    runOnUiThread(new Runnable() {

                                        @Override
                                        public void run() {
                                            System.out.println(tag.toString());

                                            // I get the ID here to identify the card
                                            String id = Long.toString(Utils.toDec(tag.getId())).trim();
                                        }
                                    });

                                }
                            },1 | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,options);

当我记录发现的TAG的toString()方法时,我会在第一张卡片上得到它:

Tech [android.nfc.tech.NfcA,android.nfc.tech.mifareClassic]

当我读到String id = Long.toString(Utils.toDec(tag.getId())).trim();下面的ID时,得到的9位数字与我的计算机一样,那太好了,这是卡的唯一ID。

第二张卡的toString()

Tech [android.nfc.tech.IsoDep,android.nfc.tech.NfcA]

当我读取标签ID时,我得到的是17位数字而不是9位... 我试图将所有内容记录在发现的TAG中,但是我找不到可以通过USB阅读器从计算机中的该卡读取的9位数字。因此我无法识别这张NFC卡。

我该如何解决?我想通过USB读卡器和我的应用程序识别卡,所以两个数字必须相同,就像第一张卡...

谢谢! :)

解决方法

因此,根据其数据表https://www.nxp.com/docs/en/data-sheet/MF3DX2_MF3DHX2_SDS.pdf的7.4节(以及根据亚马逊清单),此卡的UID为7字节UID

因此,它不是具有多个ID的卡以实现兼容性,但是它所使用的标准确实允许4,7,10字节UID 参见http://emutag.com/iso/14443-3.pdf

的标准第19页

根据ISO 1444-3标准,较大的UID分为多个部分和数据表发送

在第一个防冲突循环期间,根据ISO / IEC 14443-3,级联标签返回值88h,还返回UID,UID0至UID2和BCC的前3个字节。第二个防冲突循环将字节UID3返回到UID6和BCC

在应用笔记https://www.nxp.com/docs/en/application-note/AN10927.pdf

中说明了该过程,并说明了问题

因此在应用笔记3.2节中

在某些情况下,阅读器基础结构可能能够处理Double Size UID,但是(后台)系统只能处理4字节UID。反之亦然,阅读器基础结构可能无法处理Double Size UID,但是(后台)系统需要唯一性并且可以处理Double Size UID。

因此,USB读取器和运行它的代码可能在执行防冲突操作时出错,因为它无法处理返回的4Byte以上的UID,它可能无法响应卡返回的数据并处理级联标记位(因此它实际上只能返回7字节UID的前3个字节。

您没有提供所使用的USB阅读器(制造商和型号)或用于读取它的源代码或应用程序的详细信息,因此无法帮助您查看它是否可以返回正确大小的UID。

但是,应用笔记附录6给出了将7字节UID转换为4字节UID的代码(不幸的是,这是C语言而不是Java语言,但是您应该能够将其转换为Java语言),但是USB阅读器可能返回了正确的信息还有4个字节的UID,所以这可能无济于事。

为了更好的诊断,将值打印为十六进制而不是十进制,这样可以更好地告诉您发生了什么。

已添加
一种将字节数组转换为可打印的十六进制字符串https://stackoverflow.com/a/332101/2373819

的方法

如果您还提供了来自卡的实际UID值的更多信息,则可能可以查看USB读取器出了什么问题(即UID 88h的第一个字节?)

更新说明 其他卡很容易看到,它是Mifare Classic,较新的版本,例如EV1也具有7字节的UID(非常旧的型号具有4字节的UID),因此还应显示更大的十进制UID(如果是像EV1版本的现代卡) ),但它也具有4字节的UID,这是7字节中的前4个字节,以便与旧版本兼容。

由于您正在使用通用标签技术类型读取UID,因此可能会将其截断为4个字节,或者它可能是旧版本。在使用getID例如

之前,请尝试在正确的特定类中获取标签
MifareClassic mMifareClassic = MifareClassic.get(tag);
byte[] uid = mMifareClassic.getID();

您可以使用开关tag.getTechList();为每种标签类型使用正确的标签技术类

或尝试阅读Block 0直接获取UID。

摘要
问题是,当USB读卡器只有7字节UID的NXP Mifare Desfire卡时,USB读卡器给出的似乎是4字节UID。

在MifareClassic卡上,它应该是7字节UID的前4个字节,因为这是较新的7字节UID卡被设计为与旧的4字节UID卡兼容,因此您可以将阵列的一部分用于使它们匹配。

是NXP Mifare Desfire卡上的

A)第一个防冲突命令的4个字节? (其中包括层叠的Tag 88h值)

B)7字节UID的前4个字节?因此,您可以再次切片以使其匹配。

注意
这些值的某种表示方式是先给出最高有效位,而不是最低有效位。

例如,从您的注释中,长UID之一是十进制36125410196403972,十六进制是8057DE821F3704,但数据表说最低有效字节应该是04,标识NXP为制造商,但您可以从8057DE821F37 04中看到,因为最高有效位在前,最低有效位在后。

因此,您可以尝试仅使用前4个字节(带和不带反转)的组合进行试验,以查看是否可以使它们全部匹配。

或者让USB阅读器为两张卡读取正确的完整7字节UID(因为仅使用4字节并不能保证唯一性(即使7字节UID或任何大小的UID也不应该用于唯一性和安全性,因为它们太容易伪造))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。