NTAG I2C FAST_READ выдает ошибку после определенного адреса страницы

#nfc #react-native-nfc-manager

Вопрос:

Я использую тег памяти NTAG I2C плюс 2k и могу успешно выполнить FAST_READ для определенного диапазона адресов страниц, но сразу за пределами диапазона я получаю ошибку.

iOS

Начальный адрес 0x04 и конечный адрес 0x46 успешно считываются

 await cmd([0x3a, 0x04, 0x46]);
 

в то время как начальный адрес 0x04 и конечный адрес 0x47 завершаются ошибкой с

 await cmd([0x3a, 0x04, 0x47]);
 

Ошибка

 input bytes: 3A0C0C
input bytes: 3A0447
[CoreNFC] 00000002 816c6760 -[NFCTagReaderSession transceive:tagUpdate:error:]:771  Error Domain=NFCError Code=100 "Tag connection lost" UserInfo={NSLocalizedDescription=Tag connection lost}
 

Android

Начальный адрес 0x04 и конечный адрес 0x49 успешно считываются

 await cmd([0x3a, 0x04, 0x49]);
 

в то время как начальный адрес 0x04 и конечный адрес 0x4b завершаются ошибкой с

 await cmd([0x3a, 0x04, 0x4b]);
 

Ошибка

 D/NfcService: Transceive start
D/NfcService: Transceive End, Result: 0 mTransceiveSuccess: 1 mTransceiveFail: 0
D/NfcService: Transceive start
D/NfcService: Transceive End, Result: 2 mTransceiveSuccess: 1 mTransceiveFail: 1
D/ReactNativeNfcManager: transceive fail: android.nfc.TagLostException: Tag was lost.
I/ReactNativeJS: Error: transceive fail
 

Заранее спасибо.

Ответ №1:

Из таблицы тегов

Примечание: Команда FAST_READ способна считывать всю память одного сектора одной командой. Тем не менее, буфер приема устройства NFC должен быть способен обрабатывать запрошенный объем данных, поскольку цепочка невозможна

Когда я выполняю FAST_READ для аналогичного типа тегов на Android в машинном коде, я делаю getMaxTransceiveLength это, чтобы узнать, насколько велик буфер, и делю его на 4 и округляю, чтобы найти максимальное количество страниц, которые FAST_READ может выполнить одновременно, и при необходимости разбить на несколько FAST_READ.

Как правило, максимальная длина приемопередатчика составляет 253 байта на Android или 63 страницы.

API react-native-nfc-manager для Android также имеет свой API, getMaxTransceiveLength поэтому вы можете выполнить тот же расчет максимального количества страниц, которое может выполнить FAST_READ на вашем оборудовании.

Я не делал FAST_READ на iOS, но ожидаю, что существует аналогичный предел (у него есть код ошибки для слишком большого пакета приемопередатчика, но я не видел способа задать ему максимальную длину приемопередатчика перед отправкой команды).

Хотя, вероятно getMaxTransceiveLength , это относится к размеру команды отправки, это количество байтов должно быть возвращено до истечения времени ожидания приемопередатчика, так как скорость передачи и приема данных одинакова.

Тайм-аут приемопередатчика может быть установлен, но не получен с помощью API react-native-nfc-manager

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

Таким образом, вы можете попробовать увеличить значение тайм-аута на Android вместо того, чтобы разбиваться на несколько FAST_READ, но определить, как долго должен длиться тайм-аут, может быть сложно и может оказать негативное влияние, если вы установите его слишком большим.

Для Android, вероятно, проще предположить, что максимальный размер отправки также безопасен для приема. Для iOS предположите максимальный размер приема от ваших экспериментов или обработайте ошибку и перечитайте с помощью алгоритма возврата.