Как читать данные из сектора, используя NFC на Android - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь прочитать данные с карты NFC, которая у меня есть для проекта. Он использует Mifare Classic 1K и имеет 16 секторов.

Я могу подключиться к карте и пытаюсь прочитать данные (я знаю, что данные, которые мне нужны, находятся во 2-м секторе - 2-м блоке). Я могу нормально сканировать карту, и она показывает мне размер карты, так что это гарантирует мне, что карта сканируется правильно, но данные, которые я получаю, когда я регистрирую «data.readBlock (2)», точно такие же, как ключЯ использую его для аутентификации ...

Что я понимаю из кода: Карта подключается Auth == true. Я могу получить общие сведения о карте, такие как количество секторов / количество блоков

protected void onNewIntent(Intent intent){
            super.onNewIntent(intent);
            Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            MifareClassic tag = MifareClassic.get(tagFromIntent) ;
            try {
                //Variables
                int sectorCount = tag.getSectorCount();
                int tagSize = tag.getSize();
                boolean auth;
                //Keys
                byte[] defaultKeys = new byte[]{};
                defaultKeys = MifareClassic.KEY_DEFAULT;
                //Connecting to tag
                tag.connect();
                //auth = true
                auth = tag.authenticateSectorWithKeyA(2, defaultKeys);
                byte[] data = tag.readBlock(2);
                Log.i("OnNewIntent", "Data in sector 2: " + Arrays.toString(data));
            } catch (IOException e) {
                e.printStackTrace();
            }

Ожидаемый = "Данные в секторе 2: The data in sector 2 block 2"

Actual = "Данные в секторе 2: [B @ 4df9e32"

Выше Фактический результат изменяется при каждом сканировании карты

Я искал помощи в другом месте, но не смог найти ее, так как моя аутентификация, похоже, отличается от других людей. Любая помощь будет очень признателен, спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я в конце концов исправил эту проблему, преобразовав ячейку памяти в строку, а затем преобразовав эту строку в формат UTF-8. Приветствия за помощь

0 голосов
/ 22 октября 2019

То, что вы получаете, - это ссылка на объект, которую Java использует для хранения в памяти. Чтобы получить читабельную версию данных, вместо этого используйте:

Arrays.toString(data);

Кстати, вы можете изменить свой код, чтобы проверить успешность аутентификации:

authSuccessful = mfc.authenticateSectorWithKeyA(sector, key);

if(authSuccessful){
    // Read the block
    creditBlock = mfc.readBlock(block);

    String bytesString = Arrays.toString(creditBlock);
    Log.i(TAG, bytesString);

} else {
    Log.e(TAG, "Auth Failed");
}

Наконец,Я почти уверен, что вы пытаетесь просто прочитать стандартную карту Mifare, поэтому избегайте поспешных выводов. Как говорят в медицине:

Думай о лошадях, а не о зебрах

...