Чтение тега NXP ICODE SLI-L с Android

Я пытаюсь прочитать тег NFC, разработанный NXP, в моем приложении для Android. С Android можно прочитать тег: приложение от NXP и еще один читают его правильно.

Точный тип тега - "ICODE SLI-L (SL2ICS50)", а технология RF - "Тип V / ISO 15693" (данные взяты из этих рабочих приложений). Память состоит из 2 страниц по 4 блока в каждой, блоки по 4 байта в каждой - я просто хочу хранить целые данные в памяти.

Тег должен быть обработан с помощью Android NfcV класс и таблица данных тега доступны здесь, но трудно найти какой-либо пример работающего кода, используя NfcV, Я попробовал несколько вещей, которые я сам заключил в техническом описании, и я попробовал образцы связи из этого PDF-файла, который я нашел с Google, но ничего не работает.

Соответствующий метод в моей деятельности (я использую NFC Foreground Dispatch) выглядит следующим образом:

public void onNewIntent(Intent intent) {
    android.nfc.Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    NfcV tech = NfcV.get(tag);
    try {
        tech.connect();
        byte[] arrByt = new byte[9];
        arrByt[0] = 0x02;
        arrByt[1] = (byte) 0xB0;
        arrByt[2] = 0x08;
        arrByt[3] = 0x00;
        arrByt[4] = 0x01;
        arrByt[5] = 0x04;
        arrByt[6] = 0x00;
        arrByt[7] = 0x02;
        arrByt[8] = 0x00;
        byte[] data = tech.transceive(arrByt);
        // Print data
        tech.close();
    } catch (IOException e) {
        // Exception handling
    }
}

Метод вызывается правильно, когда я помещаю свой телефон в тег, но transceive() метод NfcV объект всегда генерирует IOException: android.nfc.TagLostException: Tag was lost., Это результат всех байтовых массивов, которые я пробовал (вышеприведенный код маловероятен, но в последние дни я пробовал кучу других, которые все привели к тому же поведению.

Из того, что я прочитал в Интернете, я пришел к выводу, что ошибка возникает из-за того, что я посылаю неправильные команды тегу - но я просто не могу найти правильные. Есть идеи?

1 ответ

Решение

ISO 15693 определяет различные команды чтения, и производители также могут определять собственные команды чтения. Все теги ICODE поддерживают команду чтения одного блока ISO 15693. Вы можете отправить его следующим образом:

public static void processNfcIntent(Intent intent){
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    if(tag != null){
      // set up read command buffer
      byte blockNo = 0; // block address
      byte[] readCmd = new byte[3 + id.length];
      readCmd[0] = 0x20; // set "address" flag (only send command to this tag)
      readCmd[1] = 0x20; // ISO 15693 Single Block Read command byte
      byte[] id = tag.getId();
      System.arraycopy(id, 0, readCmd, 2, id.length); // copy ID
      readCmd[2 + id.length] = blockNo; // 1 byte payload: block address

      NfcV tech = NfcV.get(tag);
      if (tech != null) {
        // send read command
        try {
          tech.connect();
          byte[] data = tech.transceive(readCmd); 
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          try {
            tech.close();
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }
}
Другие вопросы по тегам