Octane SDK(impinj RFID 阅读器)无法保存设置

问题描述 投票:0回答:2

我有 Speedway R420 RFID 读取器。尝试读取标签。它确实可以在连接到模拟器或真实 Android 设备的真实模型上运行,但在现场测试期间它会失败。通过研究日志,我设法澄清它在足够简单的操作期间失败了。这是草稿代码:

val reader = ImpinjReader()
reader.name = "ATZ Reader"
reader.connectTimeout = 60000
reader.connect(readerHostname) //10.1.30.172
reader.setKeepaliveListener { impinjReader, keepaliveEvent ->
            Timber.d("Keepalive received from %s, %s, %s",
             impinjReader.name, impinjReader.address, keepaliveEvent)
            _connectStatus.tryEmit(RfIdStatus.Success)
}
reader.setConnectionLostListener {
            if(!it.isConnected) {
                logger.logRFID("Los connection ${it.name}, ${it.address}")
                _connectStatus.tryEmit(RfIdStatus.Disconnected)
            }
            else
                _connectStatus.tryEmit(RfIdStatus.Success)
        }
reader.tagReportListener = tagReportListener
val settings = reader.queryDefaultSettings()
reader.applySettings(settings) //Exception thrown at this line
reader.saveSettings()
reader.start()
CoroutineScope(newSingleThreadContext("rfid reader")).launch {
            while (true) {
                delay(10000)
                try {
                    reader.queryTags()
                    _connectStatus.emit(RfIdStatus.Success)
                    logger.logRFID("Tags queried")
                } catch (e: OctaneSdkException) {
                    logger.logRFID("Tags query error ${e.message}")
                    reader.disconnect()
                    break
                }
            }
}

这是堆栈跟踪:

OctaneSdk exception: <?xml version="1.0" encoding="UTF-8"?>
<llrp:ADD_ROSPEC_RESPONSE xmlns:llrp="http://www.llrp.org/ltk/schema/core/encoding/xml/1.0" xmlns:Impinj="http://developer.impinj.com/ltk/schema/encoding/xml/1.46" Version="1" MessageID="5">
  <llrp:LLRPStatus>
    <llrp:StatusCode>M_FieldError</llrp:StatusCode>
    <llrp:ErrorDescription>LLRP [420] : //C1G2RFControl/ModeIndex : out-of-range</llrp:ErrorDescription>
    <llrp:ParameterError>
      <llrp:ParameterType>177</llrp:ParameterType>
      <llrp:ErrorCode>P_ParameterError</llrp:ErrorCode>
      <llrp:ParameterError>
        <llrp:ParameterType>183</llrp:ParameterType>
        <llrp:ErrorCode>P_ParameterError</llrp:ErrorCode>
        <llrp:ParameterError>
          <llrp:ParameterType>186</llrp:ParameterType>
          <llrp:ErrorCode>P_ParameterError</llrp:ErrorCode>
          <llrp:ParameterError>
            <llrp:ParameterType>222</llrp:ParameterType>
            <llrp:ErrorCode>P_ParameterError</llrp:ErrorCode>
            <llrp:ParameterError>
              <llrp:ParameterType>330</llrp:ParameterType>
              <llrp:ErrorCode>P_ParameterError</llrp:ErrorCode>
              <llrp:ParameterError>
                <llrp:ParameterType>335</llrp:ParameterType>
                <llrp:ErrorCode>P_FieldError</llrp:ErrorCode>
                <llrp:FieldError>
                  <llrp:FieldNum>1</llrp:FieldNum>
                  <llrp:ErrorCode>A_OutOfRange</llrp:ErrorCode>
                </llrp:FieldError>
              </llrp:ParameterError>
            </llrp:ParameterError>
          </llrp:ParameterError>
        </llrp:ParameterError>
      </llrp:ParameterError>
    </llrp:ParameterError>
  </llrp:LLRPStatus>
</llrp:ADD_ROSPEC_RESPONSE>


    at com.impinj.octane.ImpinjReader.addRoSpec(ImpinjReader.java:1220)
    at com.impinj.octane.ImpinjReader.applySettingsWithOptionalFactoryReset(ImpinjReader.java:1050)
    at com.impinj.octane.ImpinjReader.applySettings(ImpinjReader.java:1008)
    at com.impinj.octane.ImpinjReader.applySettings(ImpinjReader.java:1068)
    at ru.avangard.refueler.features.datacollector.service.RfidReaderClient.setVariantA(RfidReaderClient.kt:70)
    at ru.avangard.refueler.features.datacollector.service.RfidReaderClient.start(RfidReaderClient.kt:48)
    at ru.avangard.refueler.features.datacollector.service.DataCollectorService$startRfidReaderClient$1.invokeSuspend(DataCollectorService.kt:131)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
    at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
    at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)

有什么想法、提示、线索吗?

更新:

从设备读取的设置如下:

{
  "antennas": {
    "antennaCollectionCreatedBySerializer": false,
    "antennaConfigs": [
      {
        "enabled": true,
        "isMaxRxSensitivity": true,
        "isMaxTxPower": true,
        "portName": "Antenna Port 1",
        "portNumber": 1,
        "rxSensitivityinDbm": 0.0,
        "txPowerinDbm": 0.0
      },
      {
        "enabled": true,
        "isMaxRxSensitivity": true,
        "isMaxTxPower": true,
        "portName": "Antenna Port 2",
        "portNumber": 2,
        "rxSensitivityinDbm": 0.0,
        "txPowerinDbm": 0.0
      },
      {
        "enabled": true,
        "isMaxRxSensitivity": true,
        "isMaxTxPower": true,
        "portName": "Antenna Port 3",
        "portNumber": 3,
        "rxSensitivityinDbm": 0.0,
        "txPowerinDbm": 0.0
      },
      {
        "enabled": true,
        "isMaxRxSensitivity": true,
        "isMaxTxPower": true,
        "portName": "Antenna Port 4",
        "portNumber": 4,
        "rxSensitivityinDbm": 0.0,
        "txPowerinDbm": 0.0
      }
    ],
    "isMaxRxSensitivity": true,
    "isMaxTxPower": true,
    "polarizationEnabled": false,
    "rxSensitivityinDbm": 0.0,
    "txPowerinDbm": 0.0
  },
  "autoStart": {
    "firstDelayInMs": 0,
    "gpiPortNumber": 0,
    "mode": "Immediate",
    "periodInMs": 0,
    "utcTimestamp": 0
  },
  "autoStop": {
    "durationInMs": 0,
    "gpiPortNumber": 0,
    "mode": "None",
    "timeout": 0
  },
  "filters": {
    "Mode": "None",
    "TagFilter1": {
      "BitCount": 0,
      "BitPointer": 0
    },
    "TagFilter2": {
      "BitCount": 0,
      "BitPointer": 0
    },
    "tagSelectFilterList": []
  },
  "gpis": {
    "gpiCollectionCreatedBySerializer": false,
    "gpiConfigs": [
      {
        "debounceInMs": 0,
        "isEnabled": false,
        "portNumber": 1
      },
      {
        "debounceInMs": 0,
        "isEnabled": false,
        "portNumber": 2
      },
      {
        "debounceInMs": 0,
        "isEnabled": false,
        "portNumber": 3
      },
      {
        "debounceInMs": 0,
        "isEnabled": false,
        "portNumber": 4
      }
    ]
  },
  "gpos": {
    "gpoCollectionCreatedBySerializer": false,
    "gpoConfigs": [
      {
        "gpoPulseDurationMsec": 0,
        "mode": "Normal",
        "portNumber": 1
      },
      {
        "gpoPulseDurationMsec": 0,
        "mode": "Normal",
        "portNumber": 2
      },
      {
        "gpoPulseDurationMsec": 0,
        "mode": "Normal",
        "portNumber": 3
      },
      {
        "gpoPulseDurationMsec": 0,
        "mode": "Normal",
        "portNumber": 4
      }
    ]
  },
  "holdReportsOnDisconnect": true,
  "keepalives": {
    "enableLinkMonitorMode": false,
    "enabled": false,
    "linkDownThreshold": 0,
    "periodInMs": 0
  },
  "lowDutyCycle": {
    "EmptyFieldTimeoutInMs": 0,
    "FieldPingIntervalInMs": 0,
    "IsEnabled": false
  },
  "readerMode": "AutoSetDenseReaderDeepScan",
  "reducedPowerFrequenciesInMhz": [],
  "report": {
    "includeAntennaPortNumber": false,
    "includeChannel": false,
    "includeCrc": false,
    "includeDopplerFrequency": false,
    "includeFastId": false,
    "includeFirstSeenTime": true,
    "includeGpsCoordinates": false,
    "includeLastSeenTime": true,
    "includePcBits": false,
    "includePeakRssi": false,
    "includePhaseAngle": false,
    "includeSeenCount": true,
    "mode": "Individual",
    "optimizedReadOps": []
  },
  "searchMode": "DualTarget",
  "session": 2,
  "tagPopulationEstimate": 32,
  "truncatedReply": {
    "bitPointer": 32,
    "epcLengthInWords": 0,
    "gen2v2TagsOnly": false,
    "isEnabled": false,
    "tagMask": ""
  },
  "txFrequenciesInMhz": [],
  "xArray": {
    "spatialConfig": {
      "direction": {
        "diagnosticReportEnabled": false,
        "enabledSectors": [],
        "entryReportEnabled": true,
        "exitReportEnabled": true,
        "fieldOfView": "READER_SELECTED",
        "isMaxTxPower": true,
        "mode": "HighPerformance",
        "tagAgeIntervalSeconds": 2,
        "txPowerinDbm": 0.0,
        "updateIntervalSeconds": 2,
        "updateReportEnabled": true,
        "userTagPopulationLimit": 0
      },
      "location": {
        "computeWindowSeconds": 10,
        "diagnosticReportEnabled": false,
        "disabledAntennaList": [],
        "entryReportEnabled": true,
        "exitReportEnabled": true,
        "isMaxTxPower": true,
        "locationAlgorithmControl": [],
        "tagAgeIntervalSeconds": 20,
        "txPowerinDbm": 0.0,
        "updateIntervalSeconds": 5,
        "updateReportEnabled": true
      },
      "mode": "Inventory",
      "placement": {
        "facilityXLocationCm": 0,
        "facilityYLocationCm": 0,
        "heightCm": 400,
        "orientationDegrees": 0
      }
    }
  }
}
java kotlin rfid
2个回答
0
投票

据我所知,您的 C1G2RFControl 的 ModeIndex 似乎超出了范围。 LLRP 标准历来将 ModeIndex 和 ModeIdentifier 混合在一起,我发现在选择读取器模式时,在某些情况下,这充其量是非常模糊的方向,这会令人困惑。您是否正在处理大量库存?如果是这样,请尝试 --mode-identifier N 而不是 -mode-index ,看看是否有帮助。如果您想通过 C1G2RFControl 选项找出特定 Impinj 读卡器型号支持的模式名称,请检查读卡器的文档或在读卡器上运行 sllurp --debug inventory 命令以获取支持模式的转储。让我知道这是否有帮助。


0
投票

我在 C# 中使用从 GitHub 下载的 RFID 项目时也遇到了类似的 Impinj OctaneSDK 问题。

代码连接到阅读器的速度很慢,然后使用 reader.ApplySettings 抛出空引用异常。读取器和设置对象看起来已完全填充。

像OP一样,我将其范围缩小到简单地应用我刚刚从阅读器中检索到的未更改的设置。还是失败了。

事实证明,该项目中包含的 OctaneSDK.dll (2.0.0.6) 和 LLRP.dll (10.16.0.240) 是旧版本,在应用于新的 Impinj R700 阅读器时失败。使用 Nuget 分别更新到 3.7.0.0 和 10.46.0 解决了该问题。

该项目适用于 .Net 4.62,3.7.0.0 是 .Net classic 的最新支持版本。 Octane 4.x 适用于 Net 5/6。

更新到可用的最新 Octane 2.x 版本使连接速度更快,但 ApplySettings 仍然引发空引用异常。

© www.soinside.com 2019 - 2024. All rights reserved.