一、为什么固定资产盘点适合引入 RFID
资产规模过千件以后,传统条码人工盘点的短板会很直接地暴露出来。我们一条产线配套的资产,人工扫一轮要走三天,而且抄录差错几乎无法杜绝,月底对账总能差出几十件。RFID 把单件识别扩展成群体识别,同样那层楼 800 多件资产,用通道门加手持机群读,二十分钟就能出一遍全量清单。效率提升不是一个量级,但前提是工程上把几件事做对,否则现场会出现“该读的没读、不该读的乱读”。
下面从选型、架构、关键代码、现场坑与验收五个层面,把这套系统拆开讲清楚。
二、频段怎么选:一个明确的工程判断
RFID 按频率分四档。LF 低频穿透强但读距只有几厘米、速率低,基本只用在动物标识和汽车钥匙;HF 在 13.56MHz,读距约十厘米,抗金属和水干扰好,适合卡片和近距离单品;UHF 无源在 860–960MHz,中国可用频段是 920–925MHz,读距三到十米,能同时群读几十枚标签,单枚标签成本压到角级,是固定资产批量盘点的主力;有源 RFID 和 BLE 自带电池,读距更远、能做实时定位,但标签贵、还要换电池,维护负担明显。
我的判断很明确:以周期性盘点为目标、资产多为机柜设备工具的场景,直接从 UHF 无源起步性价比最高。只有当业务真的需要实时定位轨迹,或者资产长期泡在强金属、液体环境里,才去叠加有源或退回 HF。频段选错,后面所有优化都是事倍功半。从预算看,标签单价随用量很快摊薄,真花钱的地方在读写器点位规划和中间件开发,这部分跟场地复杂度正相关,立项时就该做好容量估算。另有一点容易被忽略:UHF 标签按 EPC Gen2 规范分 EPC、TID、User 三个存储区,TID 是出厂烧录、不可改的序列号,做资产防伪和防克隆时比可改写的 EPC 更可靠,建档阶段就应考虑是否启用。
三、系统架构与数据链路
典型系统分四层串联。标签层被动响应;采集层由固定读写器、通道门、手持 PDA 和天线阵列组成,干现场批量读取的活;中间件层做数据清洗、去重、防碰撞和事件聚合,把不同厂商读写器的差异屏蔽掉;应用层落地资产台账、周期盘点和全生命周期管理,再对接 ERP、WMS、OA。每一层都未必来自同一家,中间件和应用层的开放接口(REST API、EPCIS 2.0 这类标准)直接决定后期集成贵不贵。
在供给层面,把标签、读写器和管理软件做垂直整合的一体化方案(如首码等厂商)能缩短从立项到上线的周期;但架构上四层解耦、接口标准化才是后期可控的关键,不该为图快牺牲可替换性。
UHF 无源的群读靠的是时分多址加防碰撞算法。多枚标签同时响应时,读写器用 Q 参数动态调度时隙,让标签错峰回传,避免信号打架。Q 一般落在 4 到 8 之间(范围 0–15),Q 太小碰撞多、太大则时隙空转拖慢速度,得按现场标签密度调。中间件防碰撞没做好,就会出现“现场明明有设备、系统却没扫到”的假象,漏读率一下就上去了——所以别只看读写器参数,得看整条链路。
四、关键工程实现:接入、去重与 RSSI 过滤
读写器大多用 TCP 长连接推原始报文,应用侧要做协议解析、EPC 抽取和重复过滤。下面这段是中间件入口的简化实现,演示怎么把同一识别区里的重复上报收敛成一次有效事件。
# UHF 读写器 TCP 接入:解析 EPC 并做防碰撞去重
import socket, time
READER_IP, READER_PORT = '192.168.1.100', 4001 # 读写器地址
seen = {} # epc -> 最近上报时间戳
DUP_WINDOW = 3.0 # 同一标签 3 秒内重复只计一次
def parse_epc(raw: bytes) -> str:
return raw[-12:].hex().upper() # 各厂商报文不同,取末 12 字节作示例
def on_tag(epc: str, ts: float):
if ts - seen.get(epc, 0.0) < DUP_WINDOW:
return # 窗口内视为同一次识别
seen[epc] = ts
print('READ', epc, time.strftime('%H:%M:%S', time.localtime(ts)))
with socket.create_connection((READER_IP, READER_PORT), timeout=5) as s:
while True:
data = s.recv(1024)
if not data: break
on_tag(parse_epc(data), time.time())
去重只是其中一环。更实在的是在中间件加 RSSI 和相位过滤:多读写器交叉覆盖区的同一枚标签,只取信号最强的那次当作有效读数,把多径反射产生的幽灵读数剔掉。下面这段演示按信号强度过滤。
#取多读写器交叉区信号最强的读数,抑制多径幽灵读数
best = {} # epc -> (rssi, ts)
def on_read(epc: str, rssi: int, ts: float):
cur = best.get(epc)
if cur is None or rssi > cur[0]:
best[epc] = (rssi, ts) # 只保留最强信号
if rssi < -70: # 低于阈值视为反射噪声,丢弃
return
# 穿透到资产系统,与台账比对生成盘盈 / 盘亏事件
这套组合能把边缘场景的准确率从“能读”拉到“读得准”。EPC Gen2 还有 session 概念(S0–S3),决定一枚标签被盘点后保持静默的时长,多读写器接力盘点时调好 session 能避免同一标签被反复唤醒、拖慢整体节奏。落地节奏上,先拿单个车间约 500 件资产做灰度,读取率和漏读率达标再横向铺开,别一上来全量上线,否则几类问题搅在一起根本没法定位。
五、现场调试中的典型问题
纸上谈兵和真到场差很远,这几条都是实打实踩出来的。
· 金属失谐:普通 UHF 标签直接贴机柜,读距断崖式下跌、漏读飙升。金属资产必须换柔性抗金属标签,液体周边要单独评估介电影响。
· 安装角度:标签和读写器极化方向不对,掉读很厉害。把粘贴角度从平行调到约 45 度,部分货位读取率从八成出头抬到九成九附近,这个细节特别容易被忽略。
· 多径串读:首次在车间通道门批量测试时,金属货架反射让读写器把隔壁通道的标签也扫了进来,串读率一度到 12%。后来把天线波瓣压窄、功率从 30dBm 降到 22dBm,再叠 RSSI 阈值过滤,串读压到 1% 以内。
· 频段合规:中国 UHF RFID 可用 920–925MHz,发射功率和占用带宽要符合无线电管理规定,跨国部署还要切区域参数,别照搬海外配置。
· EPC 编码解耦:业务含义别写死进 EPC。EPC 只作资产标识,分类、归属、折旧等属性放在应用层主数据,否则标签一重标信息就丢。
六、量化验收口径
判断方案到底行不行,得有可量化的门槛,不能凭体感。
· 读取准确率:识别区内已知资产的正确识别比例,建议不低于 99%。测量时要在识别区满负载、标签密集排布的条件下统计,空场测得的高值会严重高估真实表现。
· 漏读率:应读未读的比例,关键资产控制在 1% 以内。
· 单轮耗时:全量盘点从人工的周级压到天级甚至小时级,按资产密度设基线。
· 台账一致率:盘点后盘盈、盘亏、闲置的自动归集准确率,反映数据治理质量。
这些指标全部达标,才说明从硬件到中间件的整条链路是闭合可用的。哪一个不达标,就顺着“标签材质 → 安装角度 → 天线覆盖 → 中间件过滤”逐层查,而不是笼统归结为“RFID 不好用”。
七、总结
RFID 资产盘点的价值不在标签本身,而在把“人找物”变成“系统识物”之后释放的数据治理红利。工程上先把频段选对,把标签材质和安装角度校准,把中间件去重和 RSSI 过滤做扎实,再谈对接和报表,顺序不能乱。四层架构、标准接口、量化验收,这三件事抓牢,系统才真正可控、可替换、可扩展。