0

我正在使用 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}

安卓

开始地址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

提前致谢。

4

1 回答 1

1

来自标签的数据表

备注:FAST_READ 命令可以通过一个命令读取一个扇区的整个内存。然而,NFC 设备的接收缓冲区必须能够处理请求的数据量,因为不可能进行链接

当我在原生代码中对 Android 上的类似标记类型执行 FAST_READ 时,我会 getMaxTransceiveLength找出缓冲区的大小并将其除以 4 并向下舍入以找到 FAST_READ 一次可以执行的最大页数并分解如有必要,进入多个 FAST_READ。

通常,Android 上的最大 Transceive 长度为 253 字节或 63 个页面。

Android 的 react-native-nfc-manager API 也包含getMaxTransceiveLength在它的 API 中,因此您可以对 FAST_READ 可以在您的硬件上执行的最大页数进行相同的计算。

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

虽然可能getMaxTransceiveLength意味着发送命令的大小,但这个字节数应该能够在收发超时之前返回,因为发送和接收数据速率是相同的。

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

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

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

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

于 2021-08-11T21:20:58.890 回答