不同的 NFC ID 和 RFID UID 值
Different NFC ID and RFID UID value
我正在为带有 RFID reader RC522 的 Android Things 设备开发软件。我使用这个库:https://github.com/Galarzaa90/android-things-rc522
我的任务是查询 RC533 RFID reader:
protected Boolean doInBackground(Object... params) {
mRc522.stopCrypto();
while (true) {
........
byte[] uuid = mRc522.getUid();
return mRc522.selectTag(uuid);
}
}
在我的 activity 中,我使用它来将 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
(在智能手机应用程序中)不匹配。
Tag1
tagRC522 = 45DOD86528
tagNFC = 45DOD865
Tag2
tagRC522 = 3567500103
tagNFC = 35675001
Tag3
tagRC522 = 88046f12F1
tagNFC = 046F12CA193A84
Tag4
tagRC522 = 3EBA46D517
tagNFC = 3EBA46D5
为什么两个应用程序的结果不同?我必须如何更改 Android Things 代码? Android mobile 是生产代码,在 tagNFC 版本的 firebase 中有很多数据,我无法更改。
(Image of the tags)
RC522 和 Android 的内置 NFC reader 的结果基本相同。主要区别在于您用于 RC522
的库
- 在 UID 字段中包含校验和 (BCC),并且
- 仅对级联级别 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 个字节,在级联标签前加上 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];
}
不幸的是,反之则不容易做到这一点。 Android Things/RC522 侧缺失的字节不是您可以从其他字节轻松计算出来的。相反,您需要修改库以在防碰撞过程中执行更多的级联级别。只有这样,您才能获得完整的两倍和三倍大小的 UID。
我正在为带有 RFID reader RC522 的 Android Things 设备开发软件。我使用这个库:https://github.com/Galarzaa90/android-things-rc522
我的任务是查询 RC533 RFID reader:
protected Boolean doInBackground(Object... params) {
mRc522.stopCrypto();
while (true) {
........
byte[] uuid = mRc522.getUid();
return mRc522.selectTag(uuid);
}
}
在我的 activity 中,我使用它来将 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
(在智能手机应用程序中)不匹配。
Tag1 tagRC522 = 45DOD86528 tagNFC = 45DOD865 Tag2 tagRC522 = 3567500103 tagNFC = 35675001 Tag3 tagRC522 = 88046f12F1 tagNFC = 046F12CA193A84 Tag4 tagRC522 = 3EBA46D517 tagNFC = 3EBA46D5
为什么两个应用程序的结果不同?我必须如何更改 Android Things 代码? Android mobile 是生产代码,在 tagNFC 版本的 firebase 中有很多数据,我无法更改。
(Image of the tags)
RC522 和 Android 的内置 NFC reader 的结果基本相同。主要区别在于您用于 RC522
的库- 在 UID 字段中包含校验和 (BCC),并且
- 仅对级联级别 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 个字节,在级联标签前加上 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];
}
不幸的是,反之则不容易做到这一点。 Android Things/RC522 侧缺失的字节不是您可以从其他字节轻松计算出来的。相反,您需要修改库以在防碰撞过程中执行更多的级联级别。只有这样,您才能获得完整的两倍和三倍大小的 UID。