Чтение тега 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();
}
}
}
}
}