Результаты практически одинаковы для RC522 и встроенного считывателя NFC в Android.Основные отличия заключаются в том, что библиотека, которую вы используете для RC522
- , включает контрольную сумму (BCC) в поле UID, а
- выполняет антиколлизию только для каскадного уровня 1.
Это означает, что только первые 4 байта значения, полученного с помощью mRc522.getUid()
, являются значением UID.Последний (5-й байт) является контрольной суммой XOR за предыдущие 4 байта.Это байт 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 уровня.-collision.Следовательно, он состоит из каскадного тега (0x88), за которым следуют первые 3 байта UID, за которыми следует BCC.Следовательно, если вы хотите отобразить значение, которое вы получили через tagFromIntent.getId()
, на значение, полученное из mRc522.getUid()
, вам необходимо извлечь первые 3 байта UID, добавить каскадный тег и добавить 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 двойного и тройного размера.