Android-приложение для чтения и записи данных в NFC - PullRequest
0 голосов
/ 29 октября 2019

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

это код, который я использую (WRITE):

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
        Toast.makeText(this, R.string.message_tag_detected, Toast.LENGTH_SHORT).show();
    }

    Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    byte[] id = currentTag.getId();
    String myData = "ABCDEFGHIJKL";

    for (String tech : currentTag.getTechList()) {
        if (tech.equals(NfcV.class.getName())) {
            NfcV tag5 = NfcV.get(currentTag);
            try {
                tag5.connect();
                int offset = 0;  
                int blocks = 8;  
                byte[] data = myData.getBytes();
                byte[] cmd = new byte[] {
                        (byte)0x20,
                        (byte)0x21, 
                        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
                        (byte)0x00,
                        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00     
                };
                System.arraycopy(id, 0, cmd, 2, 8);

                for (int i = 0; i < blocks; ++i) {
                    cmd[10] = (byte)((offset + i) & 0x0ff);
                    System.arraycopy(data,  i, cmd, 11, 4);

                    response = tag5.transceive(cmd);
                }

            }
            catch (IOException e) {
                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                return;
            }
        }
    }
}

Когда я читаю тег в приложении TagInfo, вывод будет:

[00]. 41 42 43 44 [ABCD]

[01]. 42 43 44 45 [BCDE]

[02]. 43 44 45 46 [CDEF]

[03]. 44 45 46 47 [DEFG]

[04]. 45 46 47 48 [EFGH]

[05]. 46 47 48 49 [FGHI]

[06]. 47 48 49 4A [GHIJ]

[07]. 48 49 4A 4B [HIJK]

[08]. 00 00 00 00 [. ,,.]

. ,,

Является ли этот вывод правильным?

Если 'НЕ', то где я иду не так?

1 Ответ

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

Мне это кажется неправильным, но не специалист по NfcV использовал только карты NDEF NFC.

[00]. 41 42 43 44 [ABCD]

[01]. 45 46 47 48 [EFGH]

[02]. 49 4A 4B 4C [IJKL]

Поскольку то, что на самом деле вы хотите сделать

Я думаю, что проблема заключается в System.arraycopy(data, i, cmd, 11, 4);

Вы копируете 4байтов данных из вашего исходного массива данных, но только увеличивая начальную позицию на 1 байт данных, следовательно, следующий блок начинается с буквы позже.

Я думаю, System.arraycopy(data, i*4, cmd, 11, 4); даст желаемые результаты.

Поскольку это увеличивает начало массива в исходных данных на количество байтов, которые вы уже сохранили.

Поскольку у вас 12 байтов данных и каждый блок хранит 4 байта, вам нужно использовать только 3 блока,так что зацикливайтесь только 3 раза, задав int blocks = 3;, иначе у вас закончатся данные для копирования в cmd для отправки на карту, генерирующую IndexOutOfBoundsException из arraycopy

Если у вас нет кратного4 байта данных, вам нужно заполнить данные нулями, кратными 4 байтам ИЛИ обработать IndexOutOfBoundsException из arraycopy, чтобы правильно скопировать оставшиеся байты.

...