NTAG I2C FAST_READ 在特定页面地址后出错

NTAG I2C FAST_READ is erring out after a particular page address

我正在使用 NTAG I2C plus 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

提前致谢。

来自标签的 datasheet

Remark: The FAST_READ command is able to read out the entire memory of one sector with one command. Nevertheless, the receive buffer of the NFC device must be able to handle the requested amount of data as no chaining is possible

当我在本机代码中对 Android 上的类似标签类型执行 FAST_READ 时,我执行 getMaxTransceiveLength 以找出缓冲区有多大并将其除以 4,然后向下舍入以找到 FAST_READ 一次可以完成的最大页数,并在必要时分解为多个 FAST_READ。

通常,最大收发长度为 253 字节 Android 或 63 页。

Android 的 react-native-nfc-manager API 在 API 中也有 getMaxTransceiveLength 所以你可以对最大页数做同样的计算FAST_READ 可以在您的硬件上完成。

我还没有在 iOS 上完成 FAST_READ,但预计会有类似的限制(它确实有一个错误代码,用于收发数据包太大,但我还没有找到办法在发送命令之前询问它的最大收发长度)

虽然可能 getMaxTransceiveLength 是指发送命令的大小,但由于发送和接收数据速率相同,因此在达到收发超时之前应该能够返回此字节数。

使用react-native-nfc-manager可以设置收发超时API

在 iOS 中同样没有更改任何超时值的选项,但有一个错误表明与标签的通信已超时。

因此您可以尝试增加 Android 的超时值,而不是分解为多个 FAST_READ,但计算出超时应该有多长可能很困难,而且可能有如果设置太大会产生负面影响。

对于 Android,假设最大发送大小也可以安全接收可能更容易。对于 iOS,假设您的实验中的最大接收大小或处理错误并使用回退算法重新读取。