【问题标题】:ISO 15693 Read multiple blocks returns Tag response error=2ISO 15693 读取多个块返回标签响应错误=2
【发布时间】:2021-11-11 09:03:48
【问题描述】:

我正在尝试从 ISO-15693 NFC 标签读取多个块,每当我开始读取它时都会收到此错误

Error Domain=NFCError Code=102 "标签响应错误" UserInfo={NSLocalizedDescription=标签响应错误, ISO15693TagResponseErrorCode=2}

这就是我尝试阅读它的方式

 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 命令没有帮助


 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 标签中读取多个块的示例或资源,因此任何信息或示例都会有所帮助!谢谢!

【问题讨论】:

    标签: swift nfc iso-15693


    【解决方案1】:

    所以我设法通过使用带有异步线程的 readSingle 块找到了解决方法。读取 50 个块大约需要 0.6 秒。我不熟悉 swift 语言,所以我敢打赌这可以更好地优化。

      @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)
               }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多