Идентификатор карты отличается, когда я использую NFC-ридер на Android и RFID-ридер на ПК - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь создать приложение для Android, чтобы считывать некоторые карты RFID с помощью считывателя NFC.

Когда я читаю чип RFID на моем ПК, считыватель возвращает идентификатор 3853004524 для карты.Когда я пытаюсь прочитать ту же карту с помощью моего приложения, я получаю другой идентификатор ( 23646168229 ).

В своем приложении я использую дополнительное значение NfcAdapter.EXTRA_ID для получения идентификаторакарта.Я преобразую этот байтовый массив в строку, используя метод:

private String byteArrayToDecimal(byte[] barray) {
    String result="";
    for (byte b : barray) {
        result = result + (b & 0xff);
    }
    return result;
}

protected void onNewIntent(Intent intent) {
    if (intent.getAction().equals(NfcAdapter.ACTION_TAG_DISCOVERED)) {
        Toast.makeText(G.context,"NFC Tag\n" +
                byteArrayToDecimal(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID)),Toast.LENGTH_LONG).show();//ByteArrayToDecString
    }
}

Почему я получаю два разных идентификатора для одной и той же карты?Как я могу получить тот же идентификатор, который я получаю на своем ПК через приложение?

1 Ответ

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

Оба значения (3853004524 и 23646168229) по сути являются одним и тем же значением идентификатора. Причина, по которой вы получаете такое странное значение из своего приложения, заключается в том, что вы используете довольно странный метод преобразования для преобразования байтового массива в строку.

Давайте сначала посмотрим на значение 3853004524, которое вы получаете от считывателя RFID на вашем ПК. Кажется, это десятичное представление идентификатора карты. Чтобы лучше соответствовать тому, что вы получаете в Android, давайте преобразуем его в шестнадцатеричное представление: 0xE5A82EEC. Это может быть действительный 4-байтовый UID (как он используется, например, в NFC-A).

Давайте теперь посмотрим на вашу довольно странную функцию преобразования:

private String byteArrayToDecimal(byte[] barray) {
    String result="";
    for (byte b : barray) {
        result = result + (b & 0xff);
    }
    return result;
}

Этот метод берет каждый байт из входного байтового массива, преобразует его в беззнаковое десятичное целое число и добавляет десятичное представление к строке. Если мы попробуем это с идентификатором карты, который вы получите на своем ПК, это приведет к:

  • 0xE5 получает «229»
  • 0xA8 получает «168»
  • 0x2E получает "46"
  • 0xEC получает "236"

Когда вы посмотрите на значение, которое вы получили в своем приложении, вы поймете, что все эти десятичные числа объединяются в вашем результате. Более того, вы увидите, что все числа были объединены в обратном порядке. Это означает, что байтовый массив, который вы получили из intent.getByteArrayExtra(NfcAdapter.EXTRA_ID), был

{ (byte)0xEC, (byte)0x2E, (byte)0xA8, (byte)0xE5 }

Чтобы преобразовать это значение в значение, которое печатает ваше приложение для ПК, вы можете использовать что-то вроде этого:

private String byteArrayToDecimal(byte[] barray) {
    if (barray == null) return "";
    long result = 0;
    for (int i = barray.length - 1; i >= 0; --i) {
        result <<= 8;
        result |= barray[i] & 0x0FF;
    }
    return Long.toString(result);
}
...