使用 Node.js 的 llrpjs 库,我们尝试从 Zebra FX7500(摩托罗拉?)读取标签。 此讨论指向 RFID 读取器软件接口控制指南第 142-144 页,但不表明设置设备的潜在值。
根据我们收集到的信息,我们应该发出带有自定义参数 (
SET_READER_CONFIG
) 的 MotoDefaultSpec = VendorIdentifier: 161, ParameterSubtype: 102, UseDefaultSpecForAutoMode: true
。 我们是否还需要包含 ROSpec
和/或 AccessSpec
值(是否必需)? 发送 SET_READER_CONFIG
消息后,我们还需要发送常规 LLRP 消息(ADD_ROSPEC
、ENABLE_ROSPEC
、START_ROSPEC
)吗? 如果没有 MotoDefaultSpec
,即使发送常规 LLRP 消息后,发送 GET_REPORT
也不会检索标签,使用 MOTO_GET_TAG_EVENT_REPORT
的自定义消息也不会检索标签。 它们都会触发 RO_ACCESS_REPORT
事件消息,但 tagReportData
为空。
llrpjs 的 README 文件将“供应商定义支持”列为 TODO 项。 虽然这有点模糊,但该库是否可能尚未实现自定义 LLRP 扩展(消息/参数)支持,这就是为什么我们的尝试都不起作用的原因?
MotoDefaultSpec
参数和 MOTO_GET_TAG_EVENT_REPORT
是供应商/芯片组自定义的。 MOTO_GET_TAG_EVENT_REPORT
自定义消息似乎会触发类似于基本 LLRP RO_ACCESS_REPORT
消息的 GET_REPORT
,因此我们假设该部分正在工作。
值得注意的是,Zebra 的 123RFID Desktop 设置和优化工具 按预期连接并读取标签,因此设备和天线正在工作(读取标签)。
这些问题是否与我们正在使用的 ROSPEC 文件有关(见下文)?
{
"$schema": "https://llrpjs.github.io/schema/core/encoding/json/1.0/llrp-1x0.schema.json",
"id": 1,
"type": "ADD_ROSPEC",
"data": {
"ROSpec": {
"ROSpecID": 123,
"Priority": 1,
"CurrentState": "Disabled",
"ROBoundarySpec": {
"ROSpecStartTrigger": {
"ROSpecStartTriggerType": "Immediate"
},
"ROSpecStopTrigger": {
"ROSpecStopTriggerType": "Null",
"DurationTriggerValue": 0
}
},
"AISpec": {
"AntennaIDs": [1, 2, 3, 4],
"AISpecStopTrigger": {
"AISpecStopTriggerType": "Null",
"DurationTrigger": 0
},
"InventoryParameterSpec": {
"InventoryParameterSpecID": 1234,
"ProtocolID": "EPCGlobalClass1Gen2"
}
},
"ROReportSpec": {
"ROReportTrigger": "Upon_N_Tags_Or_End_Of_ROSpec",
"N": 1,
"TagReportContentSelector": {
"EnableROSpecID": true,
"EnableAntennaID": true,
"EnableFirstSeenTimestamp": true,
"EnableLastSeenTimestamp": true,
"EnableSpecIndex": false,
"EnableInventoryParameterSpecID": false,
"EnableChannelIndex": false,
"EnablePeakRSSI": false,
"EnableTagSeenCount": true,
"EnableAccessSpecID": false
}
}
}
}
}
对于遇到类似问题的任何人,我们发现尝试配置比 Zebra 设备连接的天线数量更多的天线会导致整个规范失败。 在我们的例子中,我们连接了两个天线,因此在规格中包含天线 3 和 4 会导致问题。
请参阅下面的工作 ROSPEC。
data.AISpec.AntennaIDs
属性中的额外天线已被移除,并允许我们的应用程序连接和读取标签。
在尝试
STOP_ROSPEC
时,我们仍然遇到 llrpjs 的一些问题,因为它发送了没有 RO_ACCESS_REPORT
值的 resName
响应。 请参阅 GitHub 上的问题了解更多信息。
也就是说,我们的应用程序无需发送
STOP_ROSPEC
命令即可运行。
{
"$schema": "https://llrpjs.github.io/schema/core/encoding/json/1.0/llrp-1x0.schema.json",
"id": 1,
"type": "ADD_ROSPEC",
"data": {
"ROSpec": {
"ROSpecID": 123,
"Priority": 1,
"CurrentState": "Disabled",
"ROBoundarySpec": {
"ROSpecStartTrigger": {
"ROSpecStartTriggerType": "Null"
},
"ROSpecStopTrigger": {
"ROSpecStopTriggerType": "Null",
"DurationTriggerValue": 0
}
},
"AISpec": {
"AntennaIDs": [1, 2],
"AISpecStopTrigger": {
"AISpecStopTriggerType": "Null",
"DurationTrigger": 0
},
"InventoryParameterSpec": {
"InventoryParameterSpecID": 1234,
"ProtocolID": "EPCGlobalClass1Gen2",
"AntennaConfiguration": {
"AntennaID": 1,
"RFReceiver": {
"ReceiverSensitivity": 0
},
"RFTransmitter": {
"HopTableID": 1,
"ChannelIndex": 1,
"TransmitPower": 170
},
"C1G2InventoryCommand": {
"TagInventoryStateAware": false,
"C1G2RFControl": {
"ModeIndex": 23,
"Tari": 0
},
"C1G2SingulationControl": {
"Session": 1,
"TagPopulation": 32,
"TagTransitTime": 0,
"C1G2TagInventoryStateAwareSingulationAction": {
"I": "State_A",
"S": "SL"
}
}
}
}
}
},
"ROReportSpec": {
"ROReportTrigger": "Upon_N_Tags_Or_End_Of_AISpec",
"N": 1,
"TagReportContentSelector": {
"EnableROSpecID": true,
"EnableAntennaID": true,
"EnableFirstSeenTimestamp": true,
"EnableLastSeenTimestamp": true,
"EnableTagSeenCount": true,
"EnableSpecIndex": false,
"EnableInventoryParameterSpecID": false,
"EnableChannelIndex": false,
"EnablePeakRSSI": false,
"EnableAccessSpecID": false
}
}
}
}
}
Llprjs 与 Zebra 阅读器配合得很好吗?我在哪里可以找到有关 Nodejs 的 ROSpec、llpr 等信息?现在,我有一个中国品牌的阅读器,我打算换成斑马的。
谢谢