国标gb28181 SIP协商详细分析
前置知识
国标GB/T 28181协议_gb28181-CSDN博客
sip交互流程图
注册信令需注意是插上电源线的时候触发,而不是视频入会。
字段详解
开始注册请求
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0 // 请求行:向 192.168.6.14 平台(ID=34020000002000000002)注册 Via: SIP/2.0/UDP 192.168.9.200:5060; // 首个 Via:指出本端(设备)IP:端口与所用传输层rport; // rport 参数让服务器把响应发回同一源口,解决 NAT 穿透branch=z9hG4bK1945009904 // branch 是事务唯一标识,以 “z9hG4bK” 开头 Route: <sip:34020000001110000011@192.168.6.14:5060;lr> // GB/T 28181 推荐携带上级平台路由;lr=Loose Route,允许中继逐跳转发 From: <sip:34020000001110000011@192.168.9.200:5060>;tag=321443940 // 主叫方身份;user part=设备国标 ID;tag 区分同一 URI 的多个注册实例 To: <sip:34020000001110000011@192.168.9.200:5060> // 被叫方(对 REGISTER 来说等同 From,但无 tag) Call-ID: 214776626@192.168.9.200 // 全局会话标识;所有往返消息保持一致,否则平台会报 “call/transaction does not exist” CSeq: 1 REGISTER // 序列号;每发一次 REGISTER +1。首次注册为 1,平台通常先回 401 质询 Contact: <sip:34020000001110000011@192.168.9.200:5060> // 告诉平台之后如何直连设备;同一 UA 多地址时可出现多个 Contact Max-Forwards: 70 // 每经过一跳减 1;0 时丢弃,防环路 User-Agent: Dahua SIP UAS V1.0 // 设备/厂商软硬件版本信息(便于平台兼容性判断) Expires: 3600 // 注册有效期 3600 s;为 0 表示注销 Content-Length: 0 // 无消息体
服务器回复401校验
//服务器回复401校验 SIP/2.0 401 Unauthorized // 状态行:401表示需要身份验证才能继续注册 C REGISTER // 序列号必须与请求保持一致,表明这是对第一次注册请求的回复 Call-ID: 214776626@192.168.9.200 From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880 // From字段必须与请求中的完全一致;注意:tag值可能与请求中不同,这里是由平台回复时自动生成 To: <sip:34020000001110000011@192.168.9.200:5060> // To字段从请求中拷贝,但在401回复中可能会添加tag参数(这里未添加) Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK45766126 // Via字段必须完全拷贝自原始请求,包括所有参数,用于路由回复到正确位置 WWW-Authenticate: Digest realm="3402000000", // 最关键的认证质询头,包含客户端计算摘要所需的所有参数nonce="962535b552b6e29883ff988c0065ddc2" // nonce是服务器生成的随机数,用于防止重放攻击;常见做法是用时间戳+设备ID等计算MD5 Content-Length: 0 // 401响应通常无消息体
摄像头第二次注册
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0 //留意该文本,按照空格切割,uri为第二个字符串,第一个是方法,第三个是请求版本号,类似HTTP/1.1 Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK1647127273 Route: <sip:34020000001110000011@192.168.6.14:5060;lr> From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880 To: <sip:34020000001110000011@192.168.9.200:5060> Call-ID: 214776626@192.168.9.200 CSeq: 2 REGISTER //第二次注册 Contact: <sip:34020000001110000011@192.168.9.200:5060> Authorization: Digest username="34020000001110000011", // 认证头开始realm="3402000000", // 与质询中 realm 保持一致nonce="962535b552b6e29883ff988c0065ddc2", // 使用 401 提供的 nonceuri="sip:34020000002000000002@192.168.6.14:5060", // 必须与请求行 URI 精确匹配response="77ed0f6d00ab1e0c1a871dd5e03edb65", // MD5(MD5(username:realm:password):nonce:MD5(method:uri))algorithm=MD5 // 指定摘要算法 Max-Forwards: 70 User-Agent: Dahua SIP UAS V1.0 Expires: 3600 Content-Length: 0
第二次校验成功的话直接响应200 之后摄像头会发起心跳保活
SIP/2.0 200 OK CSeq: 2 REGISTER //回复第二次注册 Call-ID: 214776626@192.168.9.200 //唯一会话id From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880 To: <sip:34020000001110000011@192.168.9.200:5060> Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK1647127273 Expires: 3600 Date: Fri, 10 Apr 2021 08:24:49 // 响应时间,可用于日志和时序分析 Content-Length: 0
摄像头回复注销信息
这里注意Expires字段,为0代表注销 服务器收到后直接做业务操作回复200
REGISTER sip:34020000002000000002@192.168.6.14:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.9.200:5060;rport;branch=z9hG4bK399301364
Route: <sip:34020000001110000011@192.168.6.14:5060;lr>
From: <sip:34020000001110000011@192.168.9.200:5060>;tag=793568880
To: <sip:34020000001110000011@192.168.9.200:5060>
Call-ID: 214776626@192.168.9.200
CSeq: 3 REGISTER // 序列号递增到 3,标识同一会话中的第三次请求
Contact: <sip:34020000001110000011@192.168.9.200:5060>
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0
Expires: 0 // 注销标志:0 表示注销设备注册
Content-Length: 0
Keepalive保活信息
摄像头发送过来的Keepalive保活信息
MESSAGE sip:34020000002000000002@192.168.6.14:5060 SIP/2.0 //MESSAGE 方法名,类似http的get/post方法
Via: SIP/2.0/UDP 192.168.1.8:5060;rport;branch=z9hG4bK700933079 //这个不用理会,但需要拷贝该字段,回复200要用
From: <sip:34020000001110000011@192.168.1.8:5060>;tag=1896094222 //同上
To: <sip:34020000002000000002@192.168.6.14:5060> //同上
Call-ID: 78119256@192.168.1.8 //同上
CSeq: 20 MESSAGE //唯一标识
Max-Forwards: 70
User-Agent: Dahua SIP UAS V1.0
Content-Type: Application/MANSCDP+xml //消息体格式
Content-Length: 178 //消息体长度,不带消息头,下面会空一行才会读到消息体,解析时注意下读到空行<?xml version="1.0" encoding="GB2312" ?> //编码
<Notify><CmdType>Keepalive</CmdType> //注意这里的消息体,大华发送的消息体有空格的,海康的消息体不带空格,需要做下处理,或者使用xml工具类,这里为了方便直接解析字符串<SN>0</SN><DeviceID>34020000001110000011</DeviceID> //设备编号<Status>OK</Status>
</Notify>
服务器需要对其进行200回复,超过不回复次数就会断流
SIP/2.0 200 OK //回复200
CSeq: 20 MESSAGE //拷贝上面心跳信息
Call-ID: 78119256@192.168.1.8 //同上
From: <sip:34020000001110000011@192.168.1.8:5060>;tag=1896094222 //同上
To: <sip:34020000002000000002@192.168.6.14:5060> //同上
Via: SIP/2.0/UDP 192.168.1.8:5060;rport;branch=z9hG4bK700933079 //同上
Content-Length: 0 //没有消息体,直接写0
sip协议
一个标准的 SIP MESSAGE 请求报文 (包含MANSCDP+xml格式的设备目录响应)
Via: SIP/2.0/UDP 27.10.24.1:5061;branch=z9hG4bK8210143023101430fa101430b Call-ID: 9ae8ca0e3be8ca0ee2e8ca0ea0e8ca0e16e8c@27.10.24.1 From: <sip:42010000012005000001@27.10.24.1:5061;transport=udp>;tag=63a161ccc2a161cc1ba161cc59a161cc To: <sip:45510000012005000001@27.10.30.98;transport=udp> CSeq: 134349445 MESSAGE Max-Forwards: 70 Expires: 90 User-Agent: IMOS/V3 // 标识用户代理软件/设备名称及版本,此处为IMOS系统V3版本。 Contact: <sip:42010000012005000001@27.10.24.1:5061> Content-Type: application/MANSCDP+xml Content-Length: 1288 <?xml version="1.0" encoding="GB2312"?> <Response> <CmdType>Catalog</CmdType> // 命令类型:Catalog表示设备目录查询响应。 <SN>859327</SN> <DeviceID>4201010303</DeviceID> //设备编号,实际是上级组织编号 <SumNum>72</SumNum> // 设备总数:表示该组织下共有72个设备。 <DeviceList Num="1"> // 设备列表:Num="1"表示当前返回1个设备信息(分页返回)。<Item> //核心数据 <DeviceID>42010000011315000808</DeviceID> //真正的设备编号 <Name>A xxxxxx-C79</Name> //名称 <Manufacturer>uniview</Manufacturer> // 制造商:设备制造厂商为uniview(宇视科技)。 <Model>h3c</Model> //型号 <Owner>h3c</Owner> //所属厂商 <CivilCode>4201010303</CivilCode> // 民政区划代码:设备所在的行政区划代码。 <Block></Block> // 警务区划代码:警务管辖区划,此处为空。 <Address>27.10.24.1</Address> // 设备安装地址:此处记录的是信令源地址。 <Parental>0</Parental> // 父设备标识:0表示不是父设备,1表示是父设备(如编码器)。 <ParentID>4201010303</ParentID> //上级编号 <SafetyWay>0</SafetyWay> // 安全方式:0-不加密,2-TLS,3-国密算法等。 <RegisterWay>1</RegisterWay> // 注册方式:1-符合IETF RFC 3261标准的认证注册模式。 <CertNum>1</CertNum> // 证书序列号:设备证书编号。 <Certifiable>0</Certifiable> // 证书有效标识:0-无效,1-有效。 <ErrCode>400</ErrCode> // 错误码:设备状态错误码,400可能表示请求错误。 <EndTime>2011-11-11T19:46:17</EndTime> // 结束时间:设备离线或服务结束时间。 <Secrecy>0</Secrecy> // 保密属性:0-普通,1-秘密,2-机密,3-绝密。 <IPAddress>27.14.33.75</IPAddress> // 设备实际IP地址:设备的真实网络地址。 <Port>8800</Port> // 设备端口号:设备提供服务的端口号。 <Password>admin</Password> // 设备密码:设备访问密码(生产环境不应明文传输)。 <Status>ON</Status> // 设备状态:ON-在线,OFF-离线。 <Longitude>114.306191347343</Longitude> // 经度:设备安装位置的地理经度坐标。 <Latitude>30.6136439824189</Latitude> // 纬度:设备安装位置的地理纬度坐标。 <Info> // 设备详细信息:包含设备的技术参数和能力信息。<CameraType>1</CameraType> // 摄像机类型:1-球机,2-半球,3-固定枪机,4-遥控枪机等。 <PTZType>1</PTZType> // 云台类型:0-无云台,1-有云台。 <PositionType>2</PositionType> // 位置类型:1-省际检查站,2-党政机关,3-车站码头,4-中心广场等。 <RoomType>1</RoomType> // 机房类型:1-室外,2-室内。 <UseType>1</UseType> // 用途类型:1-治安,2-交通,3-重点,9-其他。 <SupplyLightType>1</SupplyLightType> // 补光类型:1-无补光,2-红外补光,3-白光补光。 <DirectionType>1</DirectionType> // 监视方位:1-东,2-西,3-南,4-北,5-东南,6-西南,7-东北,8-西北。 <Resolution></Resolution> // 分辨率:设备支持的分辨率,此处为空。 <DownloadSpeed></DownloadSpeed> // 下载倍速:设备支持的下载倍速,此处为空。 <SVCSpaceSupportMode>0</SVCSpaceSupportMode> // SVC空域支持模式:0-不支持,1-支持。 <SVCTimeSupportMode>0</SVCTimeSupportMode> // SVC时域支持模式:0-不支持,1-支持。 <StreamNum>1</StreamNum></Info> // 码流数量:设备支持的码流数量。 </Item> </DeviceList> </Response>
订阅通知协议
注: 订阅通知相比catalog,主要是在head头里面多了一个event和expires
上级平台向下级平台发送流程:
一个简单的gb28181直播预览流程:
1接收下级域的注册请求
2发送catalog请求,查看设备信息
3选择设备进行预览
4catalog流程:
5向下级域发送catalog请求
6下级域回复200
7下级域发送设备信息,可能一次只发送两个设备的信息
8上级域回复200
9循环步骤3和4
实战
当下级设备在收到200 OK
后、发送ACK
再紧接着发出BYE
,通常是设备端对上级返回的 SDP 或消息头不满足自身解析/会话匹配规则而主动终止会话。排查要点包括抓包分析、SDP格式校验、SIP会话标识一致性和设备日志。
在客户端(平台)与设备之间双向抓取完整SIP对话(INVITE、200 OK、ACK、BYE)
会话匹配一致性检查,按以下时序核对关键字段:
Call-ID、From-Tag、To-Tag、CSeq(三者必须一致)
Via 分支(
branch
)与rport
Content-Length
与消息体长度确认设备发出
BYE
时,的确是同一次会话的ID和Tag,否则设备会因“找不到匹配事务”而发 BYESDP 格式与私有扩展排查
部分设备在解析SDP时,若遇到额外字段或非标准行会判定为“协议不兼容”,主动结束会话并发 BYE 。
确认 m=audio/video 行及各
rtpmap
/fmtp
映射在设备支持列表中,避免设备因不支持编码格式而退出。
BYE sip:33010600002000000009@172.25.24.21:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:11060;rport;branch=z9hG4bKPjb805348c-f9ff-4d86-8112-ff29fefdfc85
Max-Forwards: 70
From: <sip:34020000002000000001@192.168.1.110>;tag=e0a561ea-2087-44f2-8e93-d01ea517868d
To: <sip:33010600002000000009@172.25.24.21>;tag=b.IC9izlIQyYsPq-ZS4P0puD.LewSb9t
Call-ID: t4MmTL-bEylwjmGIeWc-TiyDEWzgfppb
CSeq: 16350 BYE
Content-Length: 0SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.110:11060;rport=11060;received=192.168.1.110;branch=z9hG4bKPjb805348c-f9ff-4d86-8112-ff29fefdfc85
From: <sip:34020000002000000001@192.168.1.110>;tag=e0a561ea-2087-44f2-8e93-d01ea517868d
To: <sip:33010600002000000009@172.25.24.21>;tag=b.IC9izlIQyYsPq-ZS4P0puD.LewSb9t
Call-ID: t4MmTL-bEylwjmGIeWc-TiyDEWzgfppb
CSeq: 16350 BYE
User-Agent: TP-Link IP-Camera
Content-Length: 0MESSAGE sip:33010600002000000009@172.25.24.21:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.110:11060;rport;branch=z9hG4bKPj15607e05-0895-47e7-b272-6ede72e7c480
Max-Forwards: 70
From: <sip:34020000002000000001@192.168.1.110>;tag=631b3544-8805-424b-b638-a611a184ae23
To: <sip:33010600002000000009@172.25.24.21>
Call-ID: d8eb0c5c-6e98-478f-a023-ea3e8717e88c
CSeq: 45366 MESSAGE
Content-Type: Application/MANSCDP+xml
Content-Length: 199<?xml version="1.0" encoding="UTF-8"?>
<Notify>
<CmdType>Broadcast</CmdType>
<SN>15</SN>
<SourceID>34020000002000000001</SourceID>
<TargetID>33010600001320000001</TargetID>
</Notify>SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.110:11060;rport=11060;received=192.168.1.110;branch=z9hG4bKPj15607e05-0895-47e7-b272-6ede72e7c480
From: <sip:34020000002000000001@192.168.1.110>;tag=631b3544-8805-424b-b638-a611a184ae23
To: <sip:33010600002000000009@172.25.24.21>;tag=OeKkJL6xwH98J4k0yWiN7e1x2N-CHXLs
Call-ID: d8eb0c5c-6e98-478f-a023-ea3e8717e88c
CSeq: 45366 MESSAGE
User-Agent: TP-Link IP-Camera
Content-Length: 0MESSAGE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 172.25.24.21:5060;rport;branch=z9hG4bKYGgiR.DjAltJURhrja56yuKRCmWLoyvR
From: <sip:33010600002000000009@3402000000>;tag=Xf21stdQZlOzBpdTlaFEthJe24VF.LfL
To: <sip:34020000002000000001@3402000000>
Call-ID: po5Ry1sLB57CHHe-h5XvM-JRZQXNun14
CSeq: 4221 MESSAGE
Contact: <sip:33010600002000000009@172.25.24.21:5060>
Max-Forwards: 70
User-Agent: TP-Link IP-Camera
Content-Type: Application/MANSCDP+xml
Content-Length: 166<?xml version="1.0" encoding="GB2312"?>
<Response>
<CmdType>Broadcast</CmdType>
<SN>15</SN>
<DeviceID>33010600001320000001</DeviceID>
<Result>OK</Result>
</Response>SIP/2.0 200 OK
Via: SIP/2.0/UDP 172.25.24.21:5060;rport=5060;received=172.25.24.21;branch=z9hG4bKYGgiR.DjAltJURhrja56yuKRCmWLoyvR
Call-ID: po5Ry1sLB57CHHe-h5XvM-JRZQXNun14
From: <sip:33010600002000000009@3402000000>;tag=Xf21stdQZlOzBpdTlaFEthJe24VF.LfL
To: <sip:34020000002000000001@3402000000>;tag=z9hG4bKYGgiR.DjAltJURhrja56yuKRCmWLoyvR
CSeq: 4221 MESSAGE
Content-Length: 0INVITE sip:34020000002000000001@192.168.1.110:11060 SIP/2.0
Via: SIP/2.0/UDP 172.25.24.21:5060;rport;branch=z9hG4bKrTO5F2rdGSzyhHJqcL77xeIMPIW24jCr
From: <sip:33010600002000000009@172.25.24.21:5060>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@192.168.1.110:11060>
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
CSeq: 4222 INVITE
Contact: <sip:33010600002000000009@172.25.24.21:5060>
Max-Forwards: 70
User-Agent: TP-Link IP-Camera
Content-Type: Application/SDP
Content-Length: 219
Subject: 34020000002000000001:1,33010600002000000009:2v=0
o=33010600002000000009 0 0 IN IP4 172.25.24.21
s=Play
c=IN IP4 172.25.24.21
t=0 0
m=audio 58361 TCP/RTP/AVP 8
a=recvonly
a=rtpmap:8 PCMA/8000
a=setup:active
a=connection:new
y=0200004125
f=v/////a/1/8/1SIP/2.0 100 Trying
Via: SIP/2.0/UDP 172.25.24.21:5060;rport=5060;received=172.25.24.21;branch=z9hG4bKrTO5F2rdGSzyhHJqcL77xeIMPIW24jCr
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
From: <sip:33010600002000000009@172.25.24.21>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@192.168.1.110>
CSeq: 4222 INVITE
Content-Length: 0SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 172.25.24.21:5060;rport=5060;received=172.25.24.21;branch=z9hG4bKrTO5F2rdGSzyhHJqcL77xeIMPIW24jCr
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
From: <sip:33010600002000000009@172.25.24.21>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@192.168.1.110>;tag=7399164a-29d2-4aed-bb1d-bf9295f5567b
CSeq: 4222 INVITE
Contact: <sip:34020000002000000001@192.168.1.110:11060>
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE, NOTIFY
Content-Length: 0SIP/2.0 200 OK
Via: SIP/2.0/UDP 172.25.24.21:5060;rport=5060;received=172.25.24.21;branch=z9hG4bKrTO5F2rdGSzyhHJqcL77xeIMPIW24jCr
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
From: <sip:33010600002000000009@172.25.24.21>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@192.168.1.110>;tag=7399164a-29d2-4aed-bb1d-bf9295f5567b
CSeq: 4222 INVITE
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE, NOTIFY
Contact: <sip:34020000002000000001@192.168.1.110:11060>
Supported:
Content-Type: application/sdp
Content-Length: 222v=0
o=33010600001320000001 0 1 IN IP4 192.168.1.110
s=Play
c=IN IP4 192.168.1.110
t=0 0
m=audio 13203 TCP/RTP/AVP 8
a=sendonly
a=rtpmap:8 PCMA/8000
a=setup:passive
a=connection:new
y=1200007790
f=v/////a/1/8/1ACK sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 172.25.24.21:5060;rport;branch=z9hG4bKimDzHO8ppo5CkSi0dxVoOLSBaTgFQCdF
From: <sip:33010600002000000009@3402000000>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@3402000000>;tag=7399164a-29d2-4aed-bb1d-bf9295f5567b
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
CSeq: 4222 ACK
Contact: <sip:33010600002000000009@172.25.24.21:5060>
Max-Forwards: 70
User-Agent: TP-Link IP-Camera
Content-Length: 0BYE sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 172.25.24.21:5060;rport;branch=z9hG4bK-IGMcuevqosp4WecoS-CDOFaKJRHtK5S
From: <sip:33010600002000000009@3402000000>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@3402000000>;tag=7399164a-29d2-4aed-bb1d-bf9295f5567b
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
CSeq: 4222 BYE
Contact: <sip:33010600002000000009@172.25.24.21:5060>
Max-Forwards: 70
User-Agent: TP-Link IP-Camera
Content-Length: 0SIP/2.0 500 Invalid CSeq
Via: SIP/2.0/UDP 172.25.24.21:5060;rport=5060;received=172.25.24.21;branch=z9hG4bK-IGMcuevqosp4WecoS-CDOFaKJRHtK5S
Call-ID: ELmBAPp1gYlSI3hD.Co4J3.BxoLpi9g1
From: <sip:33010600002000000009@3402000000>;tag=Vg0DcjMxXEZ7MZXJUEooNl.4OAGJHJvd
To: <sip:34020000002000000001@3402000000>;tag=7399164a-29d2-4aed-bb1d-bf9295f5567b
CSeq: 4222 BYE
Content-Length: 0分析问题,为什么会500
案例原因:
- ACK后BYE的信息,branch已经改变说明是新的请求,但是CSeq并没有增加,没有按照sip规范处理,因此出现500 sip协议错误。
- sdp协商成功,ack确认。但是接到了bye,需要询问厂商售后。正常情况是协商结束,开始媒体传输阶段。