I got Speedway R420 RFID reader. Trying to read tags. It does work on a real model connected to emulator or real Android device, but during field test it fails. Studying logs I managed to clarify that it fails during simple enough operation. Here's draft code:
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
}
}
}
Here's stacktrace:
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)
Any ideas, hints, clues?
Update:
Settings read from device are following:
{
"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
}
}
}
}
By the way, I have managed to fix problem after upgrading Impinj Reader firmware to latest one.