
简介一份面向安防与视频监控领域的28181平台对接接口说明文档聚焦下级平台与上级平台之间的SIP通信流程。文档详细拆解了平台注册与心跳保活两大核心环节包括REGISTER信令的完整交换过程、401鉴权挑战与应答、基于MD5的摘要认证以及Keepalive心跳消息的交互机制可直接作为开发者和维护者进行二次开发或联调时的接口参考。资源为单个doc文档共85KB内容精炼适合需要快速掌握GB/T 28181平台对接接口的技术人员。目前已有291人学习下载。通过文中给出的真实信令示例读者可以直观理解从REGISTER请求到200 OK的完整鉴权流程并能对照排查实际对接过程中常见的鉴权失败、心跳超时等问题。整体结构清晰便于按需查阅信令格式与字段含义。1. 28181平台对接接口不是一份死文档是你跑通视频对接的“信令地图”《28181平台对接接口详解.doc》这类文档我拿到手一般先不急着照配置而是先把它当成一张信令地图。因为大部分对接失败不是IP填错而是不知道接口背后跑的是SIP注册、目录订阅和媒体协商三段流程。28181指GB/T 28181是视频监控领域里设备与平台、平台与平台互联的国家标准它把SIP当作会话控制通道再用RTP/RTCP传视频码流。平台对接接口要解决的核心问题就三个设备注册、目录下发、实时点播。这篇笔记会从接口骨架、参数配置、抓包验证、现场排错一直讲到平台级联适合刚接手国标对接的运维、集成商和平台开发。2. 接口骨架先分清会话控制和媒体流再谈调通281812.1 接口从哪来GB/T 28181在SIP上扩展了什么很多搞了多年网络的人第一次看28181会蒙因为它的注册流程像SIP但目录查询、云台控制、报警上报又全是自定义的XML消息。其实GB/T 28181选用了SIP作为基础协议语音和视频的呼叫控制都沿用SIP方法但为了让监控域里的设备能互相发现和管理又定义了一套消息体固定使用Content-Type: Application/MANSCDPxml。MANSCDP可以理解成“面向监控设备的会话描述与控制协议”所有目录查询、设备状态、云台控制、报警通知的请求和响应都打包在这类XML里。而媒体流走的是另外一条通道用RTP承载PS封装后的视频码流。所以对接接口要了解的第一件事就是信令面一旦通了只能说明注册和消息能到对方媒体面要另测RTP两者不能混在一起调试。因此在看任何一份28181接口文档时我习惯了先把章节分为信令和媒体两大类。信令类主要看SIP方法、消息体、鉴权方式媒体类主要看SDP协商、RTP端口、封装格式。后面的抓包和排错也都是顺着这个分法进行的。2.2 一个最小注册流程REGISTER、401质询与200 OK设备要接入28181平台第一步就是SIP注册。完整的交互不是设备发一次REGISTER就完而是一个标准的Digest鉴权过程抓包你会看到四帧。方向SIP方法关键头字段含义设备 → 平台REGISTERTo/From: 设备SIP IDContact: 设备IP和端口发起注册请求平台 → 设备401WWW-Authenticate: Digest realm..., nonce...要求做摘要鉴权设备 → 平台REGISTERAuthorization: Digest uri..., response...携带密码计算的摘要平台 → 设备200Expires: 3600注册成功有效期1小时这四帧看懂了以后排查注册问题会很快。第1帧里的To和From都是设备的20位SIP ID比如34020000001320000001Contact记录设备的实际IP和端口平台会把这个地址当成后续信令的发送目标。第3帧的response是用用户名、密码、nonce等算出来的MD5摘要。如果两者密码不同平台会回403或直接忽略。注册成功后的Expires字段很关键代表注册有效期。多数设备默认3600秒平台在到期前会收到设备的刷新REGISTER如果设备离线或网络中断平台会在超时后把它标记为离线。对接调试时我喜欢把这个值临时改小到60秒这样快速测心跳是否正常。2.3 目录查询与订阅MESSAGE和SUBSCRIBE各管哪一段设备注册上线后平台要知道这台设备下有哪些摄像机通道这就有两个办法一次性查询和持续订阅。这两个接口经常被混为一谈但实际走的是不同的SIP方法。一次性目录查询用MESSAGE平台主动发一条XML到设备设备先回一个200 OK表示收到随后再发一条MESSAGE带查询结果给平台。典型查询消息体是这样Query CmdTypeCatalog/CmdType SN100/SN DeviceID34020000001320000001/DeviceID /QueryCmdType是操作类型查询目录固定填CatalogSN是消息序号每次请求增加即可用于把响应和请求对应起来DeviceID是被查询的设备ID可以填设备本身也可以填某个通道ID。设备返回的XML里CmdType是CatalogResponse下面挂Item列表每个Item代表一个通道里面有DeviceID、名称、状态、经纬度等。持续订阅用的是SUBSCRIBE。平台向设备发SUBSCRIBE头域Event: Catalog设备收到后先回200等目录变化时再主动给平台发NOTIFY。这个接口适合上级平台需要实时感知通道增减的场景但很多低端NVR只实现了MESSAGE查询对SUBSCRIBE是回200不动作。所以遇到“订阅已成功目录却一直不更新”的问题先抓包看平台是不是真的发了NOTIFY如果没有基本上就是设备没实现订阅通知老老实实改成轮询查询。2.4 实时点播INVITESDP里媒体参数怎么填才能拉到流设备注册和目录都通了接下来就是拉流。平台向设备发INVITE设备回200 OK媒体流就通过RTP到达平台。INVITE的SDP是媒体协商的核心我常看到接口文档写得很简单实际平台上却因为SDP方向填错导致黑屏。一份标准且兼容性最好的SDP长这样v0 o34020000001320000001 0 0 IN IP4 192.168.1.100 sPlay cIN IP4 192.168.1.100 t0 0 mvideo 5000 RTP/AVP 96 artpmap:96 PS/90000 arecvonlyo里的IP是媒体接收地址c也一样平台会把后续RTP流发到这个IP上的m端口。sPlay表示实时点播回放时常见是Playback。artpmap:96 PS/90000说明用RTP承载PS封装时间戳频率90000。arecvonly表示平台只收流方向一定要写对。设备回200 OK后平台要再发一个ACK完成三次握手然后设备才开始推流。如果漏了ACK设备会不断重发200但RTP就是不来。调试时看到这个现象先检查平台代码或日志里ACK是否发出去。3. 平台对接接口落地必填参数、抓包验证与一条龙调试3.1 对接前必填的六个核心参数IP、端口、SIP ID、域、密码与通道数在线下给客户做对接时我最先做的一件事就是整理一张参数表让两端工程师按着表填比翻文档效率高一倍。六项里最容易被忽略的是SIP域和通道ID的编码规则。参数示例值说明SIP服务器IP192.168.1.10平台的SIP监听地址SIP服务器端口5060默认UDP端口有些平台用TCP 5060要先确认设备SIP ID3402000000132000000120位编码前8位是中心编码设备密码12345678参与REGISTER摘要鉴权SIP域34020000通常取SIP ID前8位通道数/通道ID34020000001320000002 等每个摄像机一个编号最后一个通道号不同SIP ID的20位编码看上去玄学实际有规律前8位中心编码代表区域中间4位是类型和行业编码后7位是序号和校验位。对接时如果平台要求通道ID的前8位和SIP域一致那就确认平台是按中心编码限制接入的。密码基本都是8位数字但有的国标平台支持字母和符号建议先沿用设备出厂密码通了再改。端口方面SIP信令默认走UDP 5060。如果设备端用的是TCP 5060平台也要开启TCP监听两边不匹配时设备报文发出去平台根本没收到。很多设备会把信令和媒体分成两个线程信令注册成功但媒体端口没监听这会在点播时报对端不可达。3.2 用sngrep和Wireshark看信令三个关键过滤表达式排查28181对接问题不能只靠平台日志。平台日志经常只说“设备离线”不告诉你为什么。我的习惯是在设备侧或者平台侧镜像口抓包用sngrep看信令交互用Wireshark做深挖。sngrep是字符界面工具一条命令就能把SIP对话按会话列出来非常直观。sudo sngrep -d eth0 -p 5060-d指定抓包网卡-p指定SIP端口。运行后能看到所有SIP消息按tab键展开某一通会话能直接看到REGISTER、401、200 OK的完整报文。如果现场没有sngrep用tshark也一样sudo tshark -i eth0 -Y sip || rtsp -w 28181_debug.pcap保存的pcap可以带回办公室在Wireshark里看。在Wireshark里我常用的过滤器有三个sip.MethodREGISTER只看注册方法sip.Status-Code只看所有响应码配合时间排序可以很快找到哪一步卡住rtp只看媒体包用来判断RTP到底有没有来。这三个过滤表达式中sip.Status-Code是最能说明问题的看到401说明鉴权流程正常看到403说明密码错看到480说明设备暂时不可用看到488则通常是不接受SDP。现场不方便装工具的时候也可以配合udp抓包。很多嵌入式设备不带sngrep但能ping通平台IP这时用nc -u -zv 192.168.1.10 5060只能测UDP通不通测不出SIP语义所以最可靠的办法还是镜像抓包。3.3 从发起注册到平台显示在线七步操作清单把上面的参数整理好接下来的调试顺序要固定避免东一榔头西一棒子。我一般按七步走在设备或接入网关里填入SIP服务器IP、端口、SIP ID、域和密码。在平台上添加设备填入同样的SIP ID和密码有些平台还需要勾选“主动注册”或“被动注册”。设备端启动注册观察平台在线状态。如果离线抓包看有没有REGISTER发出、平台有没有回401。若401之后没有第二个REGISTER检查密码或摘要算法不一致。若注册成功发一次目录查询确认设备把所有通道上报。选一个通道发起实时点播用sngrep确认INVITE、200、ACK完整再用VLC拉流验证。第七步最容易踩坑。很多平台显示“点播中”但VLC里黑屏问题往往不是信令而是RTP端口不通。建议在平台侧先确认媒体端口范围然后在设备侧放通对应UDP端口。如果现场是跨网段的还要检查路由器和防火墙有没有放行RTP端口不要只开5060。4. 对接中最容易翻车的五个坑从离线到黑屏的现场排错4.1 设备注册不上平台日志报401却不再回应现象设备配置无误平台在线列表却一直离线。抓包看到设备发REGISTER平台回了401但设备没有发第二个REGISTER。原因两个最常见。一是密码不一致设备用A密码计算摘要平台用B密码验算必然对不上二是部分设备在收到401后默认走RFC2617的MD5算法而平台要求的是MD5-sess或带uri校验的算法如果设备没有可选项就会一直停在401状态。解决先把两端密码都改成出厂默认值比如12345678。再看抓包里Authorization头的algorithm字段如果平台要求MD5-sess而设备发的是MD5就需要在设备配置里找“摘要算法”选项。有些NVR厂家将选项藏在“SIP高级配置”里不仔细看根本发现不了。最后检查设备系统时间如果设备时钟差了几分钟也会导致摘要中的nonce也算不对平台宁可沉默也不回错。4.2 注册成功目录不出只查到一条根节点现象设备已在线平台上点击刷新目录转几圈后只显示一个设备根节点没有摄像机通道。原因这类问题经常不是信令没通而是通道ID规划不一致。平台发送的目录查询DeviceID是设备ID设备返回的Item里每一个通道ID都有独立的20位编码。如果通道ID的前8位中心编码和平台规划的域编码不一致平台会直接丢弃这些通道只留下根节点。另一种可能是平台对通道类型做了过滤比如只接受编码类型为“摄像机”的通道而设备上报的是“视频服务器”。解决打开抓包里的目录查询响应XML复制一个Item里的DeviceID和平台要求的域编码对比。如果前8位不同需要在设备端重新配置通道编码。还要看Status字段是ON还是OFF有些平台不显示离线通道。这里提醒一句很多设备默认通道ID不是规范的20位数字需要人工补齐别指望设备自己改。4.3 实时点播黑屏信令正常却收不到RTP包现象INVITE、200 OK、ACK三帧都正常平台显示正在播放但画面黑屏抓包里一封RTP都没有。原因SDP里媒体接收地址和端口写错了。平台作为收流方会在mvideo后面写上自己的一个UDP端口设备会向这个端口发RTP。如果平台的实际媒体监听地址和c里的IP不一致比如平台有两个网卡SDP里写的是内网地址而设备从另一个路由过来数据包就被丢了。解决抓包时除了看SIP还要看平台有没有向设备发送过RTP。如果没有说明设备压根没收到ACK或者SDP方向是sendonly。如果设备发过RTP但平台没收到就用tcpdump -i eth0 udp port 5000在平台侧看到底有没有包到达。还有一个常见做法是让设备改用TCP传输在SDP里加上atransport:TCP这样能避开UDP端口不通的玄学问题代价是延迟略高。4.4 云台控制指令发了没反应现象平台上点“右转”设备在抓包里明明收到了MESSAGE也回了200但云台不动。原因MESSAGE只是把XML发给设备设备回200只代表“接收成功”不代表“执行成功”。PTZ命令的CmdType虽然是Control但真正的方向指令在PTZCmd字段里是一串十六进制比如右转是A0 00 02 20 00 00之类不同厂商会有扩展码。如果设备的解码驱动只认私有扩展命令而平台发的是通用协议设备自然不执行。解决先用设备自带的SDK或IE页面测试云台是否工作确认硬件没问题。然后抓包看设备实际收到的PTZCmd和厂家协议手册里的命令码是否一致。不一致时需要让平台在接口配置里选对应厂家或者把云台控制从“标准28181”切换成“私有扩展”。另外很多设备在执行连续移动时要先收到一个PanRight启动命令再在松开按钮时收到一个Stop命令如果平台只发一次启动命令设备只会动一下停一下或者完全不动。4.5 设备在分平台能看大平台就卡现象同一台NVR接到地市的分平台码流正常再级联到省平台播放就卡顿甚至花屏。原因典型的是码流封装和传输模式问题。28181规定RTP里通常是PS封装有些厂家在分平台用的私有协议到省平台才走28181就会出现PS流的解析兼容问题。还有H.265码流在部分老平台和播放器里没有正确识别画面上绿屏或黑屏。码率过高时UDP传输发生分片丢失也是大平台卡顿的主要因素。解决先把设备主码流降低到2Mbps以内关闭动态GOP强制用PS封装看是否好转。再用ffmpeg直接拉流测试ffmpeg -i rtp://192.168.1.10:5000 -t 10 -f null /dev/null如果能跑满10秒不报错说明流本身没大问题。如果报Protocol not supported或者Invalid data基本是封装不兼容。遇到H.265不要直接在VLC里试先用ffprobe看编码格式ffprobe -v error -select_streams v:0 -show_streams rtp://192.168.1.10:5000这样能确认到底是H.264还是H.265。省平台要兼容H.265一般要求平台版本在2016标准之后。另一个后备方案就是把设备编码改成H.264最省事。5. 从单设备接入到平台级联接口文档之外要补的参数5.1 平台与平台级联时的上下级域与目录ID规划单设备接入调试通过后更多人会碰到平台与平台级联。这不再是设备找SIP服务器而是整个平台作为下级平台向上级平台注册。这时接口文档常常不够用因为还要规划上下级域的编码规则否则目录一推上去上级看不懂。上级平台通常会给一个“SIP域编码”和“上级SIP服务器地址”下级平台在配置级联时要填自己的“平台SIP ID”和密码并且保证本级所有通道ID的前8位域编码与上级分配一致。我之前遇到一个项目下级平台用34020000作为域编码上级平台内部却用34020100做区域划分导致通道虽然上报了但在上级地图上无法定位。这种问题不靠抓包而是靠事先拿到《行政区划编码表》逐一对齐。级联的目录上报也有两种方式手工导出导入和实时订阅。多数平台支持把下级目录用EXCEL导出来改但生产环境我更推荐订阅方式就是让上级平台向下级平台发SUBSCRIBE下级平台把目录变化通过NOTIFY推上去。注意这里的Event头是Catalog但消息体里CmdType要写CatalogResponse。很多平台把这块写死在内部对不齐时就容易出现“上级能收到目录但状态全是离线”的怪现象解决的方法最常见是让两边平台工程师各出一份对接参数表逐项比对。5.2 跨网段NAT场景SIP会话穿透怎么配如果设备或下级平台部署在一个私网里和公网平台对接就要处理NAT。28181的SIP里面IP地址至少出现在三个地方Via、Contact、SDP。私网设备发出的REGISTER里Via和Contact都是内网IP平台如果直接按这个地址回信令包就到不了。所以很多设备在配置页里有一个“NAT”开关开启后会把Via和Contact替换成映射后的公网IP。配置项私网直连NAT场景SIP服务器IP填平台内网IP填平台公网IP本机IP设备内网IP设备外网映射IPNAT开关关闭开启媒体端口随机或固定必须映射到外网对应端口RTP传输模式自动/UDP建议TCP除了信令替换媒体端口也要映射。很多平台支持“媒体端口范围”比如设备端从10000到20000。NAT场景下这段UDP端口要全部映射到外网。只映射5060是很多初学者的血泪教训信令通了、INVITE也通了但RTP因为回程找不到内网端口就断了。如果公司网络不允许开太多端口换成TCP传输模式只需要映射一个TCP端口虽然比UDP费一点性能但打洞逻辑简单得多。在平台侧也有对应的配置通常是“允许NAT穿透”或“支持UDP keepalive”。设备开启NAT后会周期性给平台发Keepalive消息平台才能动态刷新设备的外网IP和端口。如果平台没有这个功能设备注册后地址一变化平台就再也联系不上了。5.3 录像回放与报警推送接口调用顺序和鉴权实时点播跑通之后录像回放是第二个大头。回放的接口改动不大INVITE的Subject头和SDP里会带上时间范围。多数字段和实时点播一样区别在于sPlayback并且SDP的o行里会附带起始和停止时间有些平台用自定义XML头传时段。回放流程上有一个必须注意的顺序INVITE → 200 OK → ACK → 媒体流。如果有倒放或变速播放平台会再发一个INVITE更新会话或者使用RTSP的PLAY方法做变相控制但大多数纯28181平台只用INVITE和BYE。若要兼容第三方播放器也可以在平台侧转成RTSP再输出这样播放器不用解析PS流代价是多一次转码延迟。报警推送在设备端实现得比平台端更简单。设备检测到移动侦测后向平台发一条MESSAGECmdType为Alert里面带报警时间和报警类型编码。平台收到后回一个200如果平台配置了录像联动则会在内部把报警和录像文件关联。要注意的是报警信息里的DeviceID必须是报警通道的ID而不是设备根ID。如果用根ID发平台虽然能收到报警但不知道是哪个通道界面上会显示“未知通道”。所以对接报警时先确认通道ID在目录上报里存在再触发一次移动侦测最后在平台侧看能不能匹配。6. 一个验证技巧用抓包的响应码判断对接是否真通对接28181接口调到最后我不看平台面板只看三个响应码。第一个是REGISTER收到的200 OK第二个是目录查询MESSAGE后设备回的第一个200 OK第三个是INVITE返回的200 OK。这三个200都出现对接就基本完成了。过程里如果出现401那是正常的鉴权挑战但REGISTER流程里第二个REGISTER必须带回新的Authorization否则不算通。实际操作上我会写一个简单的shell别名让现场同事一抓就能过滤出SIP响应码alias siptracesudo tshark -i eth0 -Y sip.Status-Code || sip.MethodREGISTER -T fields -e frame.time -e ip.src -e sip.Method -e sip.Status-Code跑起来后屏幕上会按时间列出所有SIP方法和响应码。你会很直观地看到REGISTER、401、REGISTER、200这就是设备上线SUBSCRIBE、200这是订阅成功INVITE、200、ACK这才具备拉流条件。如果列表里一直只有REGISTER和401没有第二个REGISTER那问题就在密码或鉴权算法不用去翻平台日志瞎猜。我的习惯是把这条命令和sngrep都留在现场笔记本里sngrep看对话tshark看响应码。遇到黑屏这类媒体问题再加一条rtp过滤看RTP包的源IP是不是设备IP、目的端口是不是平台SDP里那个端口。这比任何一台设备的调试界面都真实。单位里新来的同事总问我28181接口细节这么多怎么快速上手。我一般让他先把每个接口的响应码画成一条竖线从REGISTER到INVITE线上标出关键的200、401、ACK后面再遇到问题就顺着这条线找。这个习惯帮我在好几个项目里避开黑匣子一样的平台日志少通宵几次。对接28181没有玄学抓包看到的每一帧都是证据。希望这些经验和踩坑记录能帮到你在下次对接时少走一段弯路。本文还有配套的精品资源点击获取