LLRP 实战:协议本身简单,配置模型不简单
LLRP 实战:协议本身简单,配置模型不简单
技术深度

LLRP 实战:协议本身简单,配置模型不简单

LLRP 看起来吓人,是因为它的二进制 TLV 编码;但真正会用到的集合很小:五条配置消息、一个 ROSpec、一个 AccessSpec 和一个上报选择器。本文给出一张实用的协议地图、真正会改变行为的字段,以及值得处理的那些状态码。

12 min· By SpidersRFID Editorial Team

LLRP 有个「难」的名声,而这个名声一半是有道理的:编码是二进制的,消息目录很长,文档读起来像标准委员会写的——因为它确实是。但一个能跑起来的部署所需的子集很小,一旦把这个子集弄明白,协议就会变成项目里最不有趣的那部分。

本文就是那张子集地图:配置什么、按什么顺序、以及哪些字段真正会改变读写器的行为。

LLRP 是什么,处在哪一层

LLRP 是「主机—读写器」协议,不是应用协议,守住这个区分能省掉大量设计混乱。

  • 它由 EPCglobal 定义,标准化为 LLRP 1.0.1,1.1 增加了更细的控制与更好的扩展支持。
  • 它默认跑在 TCP 5084 端口上,消息编码为二进制 TLV(类型—长度—值)结构。
  • 它的职责是配置射频并投递标签上报,而不是决定一次读取意味着什么。
  • 几乎所有企业级固定式读写器都支持它,正因为如此,LLRP 代码可以跨品牌移植。
  • 在 LLRP 之上你仍然需要自己的网关:去重、业务映射与 ERP 写入都在协议之外。

消息模型:请求、响应与上报

三个消息家族覆盖一切,分清楚谁是谁,能避免大部分困惑。

  • 请求带一个消息标识,并且只期待一个标识相同的响应。
  • 响应带状态码;「成功但载荷异常」比「明确失败」更常见。
  • 上报是异步的,ROSpec 跑起来之后就会出现,它不响应任何东西。
  • 读写器事件与错误通知也是异步到达的,所以客户端必须一直在读。
  • 只在发完请求之后才去读的客户端,最终会把套接字缓冲塞满然后卡死。

读写器配置:你总会发的五条消息

配置是一个状态机,顺序比单个字段更重要。

  • 先读能力:它会告诉你这台读写器支持哪些选项,避免发出不支持的设置。
  • 再设置读写器配置:保活、上报缓冲,以及默认天线属性。
  • 然后添加 ROSpec、启用它、再启动它;「已启用但未启动」的 ROSpec 什么都不做,看起来却像失败。
  • AccessSpec 单独添加,且只在确实需要写入或加锁时才加。
  • 要改 ROSpec 就删掉重建,而不是就地编辑;就地编辑正是厂商差异暴露的地方。

ROSpec:描述一次盘点作业

ROSpec 是一个容器,装着上报规格与一个或多个盘点参数规格。

  • 上报规格决定回传哪些标签字段、以及多久发一次上报。
  • 盘点参数规格把天线列表与空口协议行为放在同一个单元里。
  • 每个执行中的 ROSpec 都在争抢同一部无线电,所以一台读写器上跑两个 ROSpec,通常意味着有一个是错的。
  • 标签观测触发器决定何时上报一枚标签:立即、读满 N 次后,或不再被看见时。
  • 每种业务行为保持一个 ROSpec,在描述字段里给它起名字,并把这个名字当作配置契约的一部分。

空口设置:真正改变行为的字段

读写器的行为其实是在 C1G2 盘点命令里被决定的。

  • 发射功率与信道(或跳频表)排在最前;功率受法规约束,不是调参旋钮。
  • 接收灵敏度设置在更宽的监听窗口与噪音之间交换,而默认值在密集货道里很少最优。
  • 单化会话的选择决定标签是被快速重复上报还是被按住不动;会话二适合移动的货物。
  • 标签数量估计帮读写器选择 Q 值;估错只是浪费时间,不影响正确性。
  • 标签过滤器在单化之前缩小标签集合,是性价比最高的一项性能优化。

AccessSpec:读取与写入标签存储

访问操作要少用,而且每种用法都有特定的失效画像。

  • AccessSpec 必须带过滤器;除非你真的想写范围内每一枚标签,否则绝不能不带。
  • 读存储区是安全的诊断手段;写 EPC 或用户区才是会损坏数据的操作。
  • 写操作必须在同一会话里用一次读回来验证,而不能凭一个成功状态就假定。
  • 访问密码必须当作机密管理;加锁却没有记下密码,是不可逆的错误。
  • 失败的访问操作会返回状态码,而那个码通常比一次重试更有信息量。

错误处理:值得分支处理的状态码

大多数 LLRP 客户端把所有非成功都当成同一种失败,这让现场诊断变得不可能。

  • 区分参数错误与状态错误:前者说明消息写错了,后者说明读写器处在错误的状态。
  • 能力不匹配应当退回到受支持的选项,而不是中止部署。
  • 反复超时通常意味着 TCP 会话已断,而不是读写器很慢,所以重试前先看套接字。
  • 把消息标识和状态码一起记录;缺了它,一段多消息序列就无法调试。
  • 也要把「意外的成功」当成 bug——一个成功响应却带着空载荷,往往意味着读写器忽略了请求。

让 LLRP 代码跨厂商可移植

可移植性是开局时做的设计选择,事后补做代价极高。

  • 只要标准覆盖了你的需求,就只用标准消息与标准参数。
  • 通过能力消息做特性探测,而不是假定某厂商支持某选项。
  • 把厂商扩展隔离在一个薄适配层后面,让网关其余部分永远不 import 它们。
  • 在定稿设计之前,把同一套配置在第二个品牌上测一遍;差异会早早且便宜地暴露。
  • 给配置文件做版本,因为一份能跑的 ROSpec 是资产,应当能扛过一次读写器更换。
Odoo RFID 集成一站式方案

我们使用 Cookie 来提升您的浏览体验、分析网站流量并个性化内容。点击“接受全部”即表示您同意我们使用所有 Cookie,您也可以选择“仅必要 Cookie”。详情请参阅我们的 隐私政策 以了解更多详情。