ITPub博客

首页 > 应用开发 > Python > 用Wireshark逐帧分析GB28181注册流程

用Wireshark逐帧分析GB28181注册流程

原创 Python 作者:suoten 时间:2026-09-26 08:24:46 0 删除 编辑

为什么要抓包? 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-05-07

  • 博文量
    69
  • 访问量
    55379