为什么要抓包? GB28181的问题,90%可以通过抓包解决。
设备注册不上?抓包看REGISTER发了没,平台回了401没。点播黑屏?抓包看INVITE的SDP协商对不对。云台不响应?抓包看MESSAGE发出去没,设备回了什么。
Wireshark是国标调试的必备工具。今天手把手教你看懂GB28181的注册流程。
环境准备 安装Wireshark
在平台服务器上抓包,或者用镜像端口抓设备侧的包
过滤器设置:sip || rtp || rtcp
注册流程逐帧分析 GB28181的标准注册流程是“挑战-应答”模式,分四步:-34
第一步:设备发REGISTER(无认证信息) REGISTER sip:34020000002000000001@3402000000 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK123456 From: sip:34020000001320000001@3402000000;tag=abc123 To: sip:34020000001320000001@3402000000 Call-ID: 1234567890@192.168.1.64 CSeq: 1 REGISTER Contact: sip:34020000001320000001@192.168.1.64:5060 Max-Forwards: 70 User-Agent: Hikvision Expires: 3600 Content-Length: 0 关键字段解读:
Via:设备地址和端口,branch参数用于事务匹配
From和To:设备ID,格式是设备编码@域
Contact:设备的联系地址,平台回响应时用这个
Expires:注册有效期,3600秒
User-Agent:设备厂商信息,海康显示Hikvision
第二步:平台回401 Unauthorized SIP/2.0 401 Unauthorized Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK123456 From: sip:34020000001320000001@3402000000;tag=abc123 To: sip:34020000001320000001@3402000000;tag=server456 Call-ID: 1234567890@192.168.1.64 CSeq: 1 REGISTER WWW-Authenticate: Digest realm="3402000000", nonce="abc123def456" Content-Length: 0 关键字段解读:
WWW-Authenticate:认证挑战,包含realm(域)和nonce(随机数)
To头域新增了tag参数,表示这是平台生成的响应
第三步:设备携带认证信息再次REGISTER REGISTER sip:34020000002000000001@3402000000 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK789012 From: sip:34020000001320000001@3402000000;tag=abc123 To: sip:34020000001320000001@3402000000 Call-ID: 1234567890@192.168.1.64 CSeq: 2 REGISTER Contact: sip:34020000001320000001@192.168.1.64:5060 Authorization: Digest username="34020000001320000001", realm="3402000000", nonce="abc123def456", uri="sip:34020000002000000001@3402000000", response="计算出的摘要" Expires: 3600 Content-Length: 0 关键字段解读:
CSeq变成了2,表示这是同一个Call-ID下的第二个请求
Authorization:包含用户名、realm、nonce、URI和response(摘要计算结果)
第四步:平台验证通过,回200 OK SIP/2.0 200 OK Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK789012 From: sip:34020000001320000001@3402000000;tag=abc123 To: sip:34020000001320000001@3402000000;tag=server456 Call-ID: 1234567890@192.168.1.64 CSeq: 2 REGISTER Contact: sip:34020000001320000001@192.168.1.64:5060;expires=3600 Content-Length: 0 关键字段解读:
Contact头域带上了expires=3600,确认注册有效期
注册完成,设备上线
常见注册失败原因排查 原因1:平台没收到REGISTER
Wireshark只看到设备发REGISTER,没有平台的401响应。检查:
设备网关配置是否正确-1
防火墙是否放行了UDP 5060端口-34
设备是否使用了定向流量卡,运营商可能屏蔽了平台IP-2
原因2:收到了REGISTER但平台没回401
可能是平台代码问题。用纯Python方案的话,把日志级别调到DEBUG,看REGISTER消息进来后,解析到哪一步停住了。
原因3:设备发了带认证的REGISTER,但平台回了403
认证失败。检查:
设备ID和平台配置的设备ID是否一致
密码是否正确
SIP域是否填写正确(应为SIP服务器ID的前10位)-34
原因4:注册成功但设备频繁掉线
平台判定设备离线的依据是心跳超时。海康设备默认心跳周期60秒,最大超时次数3次,即180秒没收到心跳就判离线。-2
检查:
设备心跳是否正常发送
网络是否有丢包
设备本地时间偏差是否超过30秒(时间偏差大会导致心跳被丢弃)-26
点播流程抓包 注册成功后,点播流程是:平台发INVITE → 设备回200 OK(带SDP)→ 平台发ACK → 设备发RTP流。
INVITE关键字段: INVITE sip:34020000001320000001@3402000000 SIP/2.0 ... Content-Type: application/sdp
v=0 o=34020000002000000001 0 0 IN IP4 192.168.1.100 s=Play c=IN IP4 192.168.1.100 t=0 0 m=video 6000 RTP/AVP 96 a=rtpmap:96 PS/90000 a=recvonly y=0000000001 关键字段解读:
c=:媒体地址,平台告诉设备往这个IP发RTP
m=video 6000:视频媒体,端口6000
a=recvonly:平台只接收,不发送
y=:SSRC,用于标识RTP流
调试技巧总结 抓包永远是最快的排查方式。 信令问题,先抓包,看消息发了没、回了没。
设备CLI命令可以快速确认状态。 海康设备Telnet进去,get gb28181 status看注册状态。-26
纯Python方案的优势在调试。 日志级别调到DEBUG,看消息解析到哪一步。断点打上去,变量值一目了然。
对照协议文档。 2022版和2016版的SDP差异、信令字符集差异,都要注意。
项目现状 PyGBSentry已经开源,AGPL v3.0协议,GitHub和Gitee同步维护。支持GB/T 28181-2022,向下兼容2016版。设备注册、实时预览、录像回放、云台PTZ、语音对讲、平台级联,功能完整。
部署三条命令: 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-3183938/ ,如需转载,请注明出处,否则将追究法律责任。