首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO 15693读取多个块返回标记响应error=2

ISO 15693读取多个块返回标记响应error=2
EN

Stack Overflow用户
提问于 2021-11-11 09:03:48
回答 1查看 521关注 0票数 2

我试图从ISO-15693 NFC标记读取多个块,每当我开始读取它时,我就会得到这个错误。

Domain=NFCError Code=102“标记响应错误”UserInfo={NSLocalizedDescription=Tag响应错误,ISO15693TagResponseErrorCode=2}

我就是这么读的

代码语言:javascript
复制
 tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
       let requestFlags = getRequestFlags(arguments["requestFlags"] as! [String])
      let blockNumber = arguments["blockNumber"] as! Int
      let numberOfBlocks = arguments["numberOfBlocks"] as! Int
        tag.readMultipleBlocks(requestFlags: requestFlags, blockRange: NSMakeRange(blockNumber, numberOfBlocks)) { dataBlocks, error in
        if let error = error {
          result(getFlutterError(error))
        } else {
          result(dataBlocks)
        }
      }
    }

不过,我通过将请求标志更改为.highDataRate来读取单个块,但此更改对readMultipleblocks命令没有帮助。

代码语言:javascript
复制
 tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
     let requestFlags = getRequestFlags(arguments["requestFlags"] as! [String])
     let blockNumber = arguments["blockNumber"] as! UInt8

     tag.readSingleBlock(requestFlags: [.highDataRate], blockNumber: blockNumber) { dataBlock, error in
       if let error = error {
         result(getFlutterError(error))
       } else {
         result(dataBlock)
       }
     }
   }

我找不到关于从ISO-15693标签读取多个块的示例或资源,所以任何信息或示例都会有帮助!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-19 09:41:27

因此,通过使用带有异步线程的readSingle块,我设法找到了一个解决办法。读取50个街区大约需要0.6秒。我不太熟悉快速语言,所以我敢打赌这可能会得到更好的优化。

代码语言:javascript
复制
  @available(iOS 13.0, *)
  private func handleIso15693ReadSingleBlock(_ arguments: [String : Any?], result: @escaping FlutterResult) {
    tagHandler(NFCISO15693Tag.self, arguments, result) { tag in
        let accessQueue = DispatchQueue(label: "NFCManager.accessQueue")
        let blockCount = arguments["blockNumber"] as! UInt8

        var dataBlocks = [Data]()
        let group = DispatchGroup()

        group.enter();
        
        for i in 3...blockCount{
            accessQueue.async {
                tag.readSingleBlock(requestFlags: [.highDataRate], blockNumber: UInt8(i)) { dataBlock, error in
                  if let error = error {
                    result(getFlutterError(error))
                  } else {
                    dataBlocks.append(dataBlock)
                    if (i == blockCount){
                        group.leave();
                    }
                  }
                }
            }
        }
        group.wait()

        group.notify(queue: .main) {
               result(dataBlocks)
           }
    }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69925645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档