You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:06:04