Различные значения NFC ID и RFID UID - PullRequest
0 голосов
/ 24 мая 2018

Я занимаюсь разработкой программного обеспечения для устройства Android Things с RFID-ридером RC522.Я использую эту библиотеку: https://github.com/Galarzaa90/android-things-rc522

Моя задача опроса RFID-считывателя RC533:

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

В своей деятельности я использую это для преобразования значения UID в строку:

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

Другое приложение в нашей экосистеме, используемое для сканирования тегов NFC на смартфоне Android:

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

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

Другие приложения из Play Store (например, Инструменты NFC ) дают те же результаты.как приведенный выше код приложения для смартфона.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что значение tagRC522 (на устройстве Android Things с RC522) не соответствует значению 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, я не мог этого изменить.

( Изображение тегов )

1 Ответ

0 голосов
/ 24 мая 2018

Результаты практически одинаковы для RC522 и встроенного считывателя NFC в Android.Основные отличия заключаются в том, что библиотека, которую вы используете для RC522

  1. , включает контрольную сумму (BCC) в поле UID, а
  2. выполняет антиколлизию только для каскадного уровня 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 двойного и тройного размера.

...