不同的NFC ID和RFID UID值

1 rfid serial-number uniqueidentifier nfc android-things

我正在为带有RFID阅读器RC522的Android Things设备开发软件.我使用这个库:https://github.com/Galarzaa90/android-things-rc522

我的任务是查询RC533 RFID阅读器:

protected Boolean doInBackground(Object... params) {
    mRc522.stopCrypto();
    while (true) {
        ........
        byte[] uuid = mRc522.getUid();
        return mRc522.selectTag(uuid);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的活动中,我使用它将UID值转换为字符串:

String tagRC522 = toHexString(mRc522.getUid(), "")
Run Code Online (Sandbox Code Playgroud)

我们生态系统中的另一个应用程序用于扫描Android智能手机上的NFC标签:

public void onNewIntent(Intent intent) {
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

    String tagNFC = bytesToHex(tagFromIntent.getId());
    ....
}
Run Code Online (Sandbox Code Playgroud)

Play商店中的其他应用程序(例如NFC工具)提供与上述智能手机应用程序代码相同的结果.

我现在面临的问题是tagRC522(使用RC522的Android Things设备上的值)与值tagNFC(在智能手机应用程序中)不匹配.

Tag1  
    tagRC522 = 45DOD86528
    tagNFC   = 45DOD865

Tag2 
    tagRC522 = 3567500103
    tagNFC   = 35675001

Tag3
    tagRC522 = 88046f12F1
    tagNFC   =   046F12CA193A84

Tag4
    tagRC522 = 3EBA46D517
    tagNFC   = 3EBA46D5

为什么两个应用程序之间的结果不同?我该如何更改Android Things代码?Android手机是生产代码和tagNFC版本的firebase中的许多数据,我无法改变它.

(标签的图像)

Mic*_*and 5

RC522和Android的内置NFC读卡器的结果基本相同.主要区别在于您用于RC522的库

  1. 包括UID字段中的校验和(BCC),以及
  2. 仅对级联级别1执行防冲突.

这意味着只有通过获得的值的前4个字节mRc522.getUid()是UID值.最后一个(第5个字节)是前4个字节的XOR校验和.这是来自原始反collsion帧的BCC字节.如果要计算通过的值tagFromIntent.getId(),可以执行以下操作:

byte[] uid = tagFromIntent.getId();
byte[] uidWithBCC = new byte[5];
for (int i = 0; i < 4; ++i) {
    uidWithBCC[i] = uid[i];
    uidWithBCC[4] ^= uid[i];
}
Run Code Online (Sandbox Code Playgroud)

同样,为了将值从中mRc522.getUid()转换为值tagFromIntent.getId(),您可以删除最后一个字节:

byte[] uidWithBCC = mRc522.getUid();
byte[] uid = new byte[4];
for (int i = 0; i < 4; ++i) {
    uid[i] = uidWithBCC[i];
}
Run Code Online (Sandbox Code Playgroud)

此外,对于具有双倍或三倍大小UID的标签,返回mRc522.getUid()的值是PICC对casecade级别1防冲突的值原始响应.因此,它由级联标记(0x88)和UID的前3个字节组成,后跟BCC.因此,如果要将接收tagFromIntent.getId()到的值映射mRc522.getUid()到从中获取的值,则需要提取UID的前3个字节,添加级联标记并附加BCC:

    byte[] uid = tagFromIntent.getId();
    if (uid.length > 4) {
        uid[0] = (byte)0x88;
    }
    byte[] trimmedUidWithBCC = new byte[5];
    for (int i = 0; i < 4; ++i) {
        trimmedUidWithBCC[i] = uid[i];
        trimmedUidWithBCC[4] ^= uid[i];
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这反过来也不容易做到.Android Things/RC522端缺少的字节不是您可以从其他字节轻松计算的.相反,您需要修改库以在防冲突过程中执行更多级联级别.只有这样,您才能获得完整的双倍和三倍大小的UID.