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

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

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

Тег должен обрабатываться с помощью класса NfcV Android, а его таблица данных доступна здесь, но трудно найти какой-либо рабочий пример кода, использующий 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.. Это результат всех байтовых массивов, которые я пробовал (приведенный выше вряд ли верен, но за последние дни я попробовал несколько других, которые все показали одно и то же поведение.

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


person Raphael Michel    schedule 28.03.2013    source источник
comment
Я даже написал NXP по электронной почте, но они связали меня с таблицей данных, которая у меня уже была, и предложили спросить здесь, в StackOverflow ;-)   -  person Raphael Michel    schedule 28.03.2013


Ответы (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();
          }
        }
      }
    }
}
person NFC guy    schedule 28.03.2013
comment
Отличная работа, я добавил несколько небольших изменений, необходимых для того, чтобы он работал «из коробки» (надеюсь, они будут приняты). Просто вызовите processNfcIntent (намерение) в onNewIntent (намерение намерения) или в любом другом месте, где вы хотите его использовать. - person David Corsalini; 19.10.2013