#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 предположите максимальный размер приема от ваших экспериментов или обработайте ошибку и перечитайте с помощью алгоритма возврата.