ISO 15693 NFC标签读取多块返回响应错误码2问题求助
错误原因分析
你收到的ISO15693TagResponseErrorCode=2按照ISO15693国际标准以及Apple CoreNFC框架的定义,代表当前标签不支持你发起的多块读取命令,是ISO15693标签读取的常见报错,和你配置的请求参数、标签本身的能力限制有关。
排查与修复方案
按优先级依次调整:
- 补充必须的请求flag:绝大多数ISO15693标签的多块读取指令要求必须携带
address标识位,你单块读取可以只配置highDataRate,但多块读取必须添加该参数,正确的flag配置为[.highDataRate, .address] - 限制单次读取块数:不同厂商的ISO15693标签支持的单次最大读取块数不同,多数常见型号(比如NXP ICODE系列、TI Tag-it系列)单次最多支持读4块,超出上限就会返回不支持错误,先测试单次读2~4块验证可行性
- 校验块范围合法性:避免读取超出标签总存储块数的范围,可先调用
tag.getSystemInfo()接口获取标签的总块数、块大小参数后再发起读取请求
修复后的多块读取参考代码
tagHandler(NFCISO15693Tag.self, arguments, result) { tag in // 多块读必须包含address标识位,否则多数标签会拒绝响应 let requestFlags: NFCISO15693RequestFlag = [.highDataRate, .address] guard let blockNumber = arguments["blockNumber"] as? Int, let numberOfBlocks = arguments["numberOfBlocks"] as? Int else { result(FlutterError(code: "INVALID_PARAM", message: "块参数无效", details: nil)) return } // 先限制单次最多读4块,确认可行后再根据标签型号调整上限 let safeReadCount = min(numberOfBlocks, 4) let readRange = NSMakeRange(blockNumber, safeReadCount) tag.readMultipleBlocks(requestFlags: requestFlags, blockRange: readRange) { dataBlocks, error in if let error = error { result(getFlutterError(error)) } else { // 如果需要读取超过4块的内容,可在这里递归读取下一段块范围,拼接结果后返回 result(dataBlocks) } } }
特殊情况处理
如果调整参数后仍然报错,说明你使用的标签本身不支持多块读取指令,部分低容量、老版本的ISO15693标签没有实现多块读命令,这种情况可以直接循环调用已经验证可行的单块读取接口,批量读取所需的块内容即可。
内容的提问来源于stack exchange,提问作者Titas Černiauskas
相关产品推荐
相关产品推荐

