一个真实的电话 晚上十点,一个做集成的朋友打电话过来,语气很急。
“设备配置全对,平台就是收不到上线。SIP服务器地址、端口、域、用户名密码,每一项都核对过了,没问题。”
我让他把设备和平台的国标编码发过来对比。
一看,设备编码和平台上另一台老设备的编码完全一样。
改了编码,设备秒上线。
他说了句话让我印象很深:“我一直以为是海康设备有问题,差点打电话骂客服。”
编码冲突:到底是设备的问题还是平台的问题? 这是国标圈子里经常争论的一个话题。设备厂商和平台厂商互相甩锅,集成商夹在中间两头受气。
设备厂商说:“我按标准填的编码,你平台自己不去重,怪我?”
平台厂商说:“编码是设备的唯一标识,你自己不检查重复,怪我?”
我的看法:双方都有责任。
平台应该在注册时做编码冲突检测,设备应该在配置时做唯一性校验。但现实是,大部分设备的管理界面根本没有编码查重功能,平台也默认“设备编码一定不会重复”。
根据技术支持统计,超过30%的国标设备上线失败问题,都和设备编码有关-39。
排查过程:从怀疑设备到发现问题 回到那个案例。
设备是海康的IPC,GB28181-2022版本。配置界面上,SIP服务器ID、服务器IP、端口、域,每一项都对着平台文档填的。
我让他先抓包。
Wireshark里能看到设备发了REGISTER,平台也回了401挑战。设备带着Authorization再次REGISTER,然后……平台没有回200 OK。
平台收到了,但不认。
这就是编码冲突的典型症状。 设备向平台发起注册请求时,平台首先会校验设备编码。如果编码已经存在,平台会认为这是同一个设备的重复注册请求,直接拒绝-39。
为什么平台不报错?
大部分平台的日志只会记录“注册失败”,不会告诉你“失败原因是编码重复”。你得自己去看设备列表,找到已经存在的那个同编码设备。
更坑的是: 有些平台的设备编码字段是大小写敏感的,而有些设备导出的编码带空格。肉眼对比看不出来,得用工具逐字符比对。
怎么避免编码冲突? 设备端:
在配置国标编码前,先在平台上查一下这个编码是否已存在
如果批量配置设备,用一个Excel表管理编码分配,避免手工输入重复
注意不要把通道编码当成设备编码填入
平台端:
注册时做编码唯一性校验,冲突时返回明确的错误码
提供编码批量导入和查重功能
日志中记录冲突详情,而不是只写“注册失败”
集成商的习惯:
每台设备上线前,先记录编码,避免后期排查时遗忘
编码分配后留一份文档,后期扩容时参考
一个让人无奈的事实 国标GB28181的设备编码是20位,理论上空间足够大,不会重复。但实际情况是:
很多集成商直接用设备出厂默认编码,不同批次的设备可能撞号
有些项目是多个集成商协作,各自分配的编码没有统一管理
设备更换时,新设备的编码没有及时更新到平台
编码冲突不是技术难题,是管理问题。 但它造成的排查成本,比技术难题高得多。
项目现状 PyGBSentry已经开源,AGPL v3.0协议,支持GB/T 28181-2022,向下兼容2016版。注册流程中做了编码冲突检测,冲突时日志会明确提示“设备编码重复”。
部署三条命令:
git clone https://gitee.com/suoten/PyGBSentry.git
cd PyGBSentry/editions/open-source
python tools/generate_env.py --docker && docker compose up -d
Gitee: suoten/PyGBSentry GitHub: suoten/PyGBSentry
你遇到过设备编码冲突吗?是海康的问题还是平台的?评论区说说。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050062/viewspace-3184169/ ,如需转载,请注明出处,否则将追究法律责任。