【问题标题】:Different NFC ID and RFID UID value不同的 NFC ID 和 RFID UID 值
【发布时间】:2018-11-03 09:26:09
【问题描述】:

我正在为带有 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);
    }
}

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

String tagRC522 = toHexString(mRc522.getUid(), "")

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

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

    String tagNFC = bytesToHex(tagFromIntent.getId());
    ....
}

Play 商店中的其他应用(例如 NFC 工具)给出的结果与上述智能手机应用的代码相同。

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

标签1 标签RC522 = 45DOD86528 标签NFC = 45DOD865 标签2 标签RC522 = 3567500103 标签NFC = 35675001 标签3 标签RC522 = 88046f12F1 标签NFC = 046F12CA193A84 标签4 标签RC522 = 3EBA46D517 标签NFC = 3EBA46D5

为什么两个应用程序的结果不同?我必须如何更改我的 Android Things 代码? Android mobile 是生产代码,并且在 tagNFC 版本的 firebase 中有许多数据,我无法更改。

(Image of the tags)

【问题讨论】:

标签: nfc uniqueidentifier rfid android-things serial-number


【解决方案1】:

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

  1. 在 UID 字段中包含校验和 (BCC),并且
  2. 仅对级联级别 1 执行防冲突。

这意味着只有通过mRc522.getUid()得到的值的前4个字节是UID值。最后一个(第 5 个字节)是前 4 个字节的 XOR 校验和。这是来自原始防冲突帧的 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];
}

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

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

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

    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];
    }

不幸的是,反过来很难做到这一点。 Android Things/RC522 端丢失的字节不是您可以从其他字节轻松计算出来的。相反,您需要修改库以在防碰撞过程中执行进一步的级联级别。只有这样您才能获得完整的双倍和三倍大小的 UID。

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    相关资源
    最近更新 更多