ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

监控摄像机协议全解析:从ONVIF到GB28181的分层与实战

监控摄像机协议全解析:从ONVIF到GB28181的分层与实战 1. 先建立一个坐标系摄像机协议到底分成哪几层1.1 协议不是“一个东西”而是一套链路约定监控摄像机这块很多人一提“协议”就默认是某一个具体玩意比如ONVIF或者RTSP。实际上摄像机里的协议是一整条链路约定从网线接口到应用平台每一层都有自己负责的规则。没建立这个坐标系之前我们排查问题会非常痛苦比如用户跟我说“设备不在线”可他说的“在线”到底是网络ping通了还是平台注册上了还是视频流能拉出来完全不是一回事。我习惯把协议理解成一套“对暗号”流程。摄像机要给平台出画面至少得过三关第一关物理链路和网络层能通IP能ping通、端口能访问第二关应用层能握手大家用同一种“行业黑话”交换能力信息比如“我支持H.264我有一路1080P主码流我支持云台上下左右”第三关媒体流能协商成功两边对好了码率、分辨率、传输端口然后才开始真正推流。每一关都对应不同类型的协议所以“监控摄像机协议”从来不是一个点而是一张网。1.2 分层记忆法物理链路层、传输层、应用协议层、行业标准层我常用的分层方法是把摄像机的协议体系拆成四层跟网络七层模型有点关系但做工程没必要背那么细重点是知道每一层管什么。第一层是物理链路层。对老一点的红外一体机来说最典型的是RS-485串行总线专门用来传云台控制命令对现在的网络摄像机IPC来说最常见的是以太网RJ45口底层是TCP/IP协议族传输介质可以是双绞线也可以是光纤还要区分PoE供电还是一根网线只传数据。别小看这层很多“拉流拉不到”的怪问题最后都出在链路层的握手协商上比如自适应网卡的两端速率不匹配。第二层是传输层。主要就是TCP、UDP两大天王。TCP面向连接、可靠但延迟稍高适合传命令状态、配置数据UDP无连接、效率高但可能丢包尤其适合音视频实时流。监控领域还经常碰见TCP和UDP混合用的情况比如用RTSP over TCP还是RTSP over UDP直接影响画面延迟和花屏概率。第三层是应用协议层HTTP/HTTPS、RTSP、RTMP、MQTT、Modbus这些都在这一层。它们是给具体业务用的比如HTTP用来拉取设备网页和调用APIRTSP用来协商视频流通道MQTT用来上报事件和接收指令。第四层是行业标准协议层也就是不同厂家、不同平台为了互通而共同遵守的约定。比如ONVIF、GB28181、GAT1400、Pelco-D这些。这一层最上面也最容易在项目验收阶段卡壳因为功能都一样但各家实现细节差别很大。1.3 一个摄像机从上电到出图最少要跑通哪几条协议链路把分层搞清楚之后我用一个完整的最小链路来说大家会更有画面感。假设一台新IPC接入NVR或者中心平台从插上网线到屏幕出映像背后至少会发生这么几条协议交互。首先是DHCP协议摄像机开机后向局域网广播请求IP地址路由器的DHCP服务给它分配一个可用地址如果配了静态IP这一步就跳过。接着是NTP协议设备向NTP服务器同步时间这事看起来不起眼但极其关键后面GB28181注册、录像检索、报警联动全依赖准确时间。然后是平台主动探测设备这里就会用到ONVIF的WS-Discovery基于组播或厂商私有的搜索协议。发现之后平台拉取设备的能力描述拿到媒体服务地址再进行RTSP信令交互最后通过RTP协议传输音视频流。也就是说一个最小系统里DHCP、NTP、ONVIF或私有发现、RTSP、RTP就已经串成了一条链。任何一个环节协议没走通都能让用户看到“设备在线但不出图”“搜不到设备”这样的现象。接下来每一层详细拆开讲配合实操里踩过的坑一起说大家会更有体感。2. 平台接入的三大主角ONVIF、RTSP/RTMP、GB281812.1 ONVIF设备发现、能力协商、媒体配置、云台控制一揽子方案ONVIF是监控厂商做得比较成功的标准化尝试算是安防行业的“通用接口”。它不是我理解的一个单一协议而是一套基于Web Services的接口规范。设备上通常跑着一个ONVIF服务默认端口是80或者8899等客户端通过SOAP/XML格式给设备发命令设备返回能力描述。做平台对接时第一步永远是“设备发现”ONVIF标准里叫WS-Discovery。它用组播方式向局域网发探测消息支持ONVIF的设备收到后就会回应自己的设备服务地址。这个机制有个非常典型的坑组播包默认不过三层跨网段的时候经常“搜不到”。我见过不少同事一上来就说“设备不支持ONVIF”其实是PC和摄像机不在同一网段组播发现被路由器拦掉了。真正要跨网段接入要么改设备IP到同网段要么手动指定ONVIF服务地址不能光靠自动发现。发现之后就是“能力协商”。设备会返回一份能力列表告诉你它支持哪些Profile。ONVIF的Profile系列里Profile S是流媒体配置的基础套餐Profile T是高性能流媒体套餐Profile G是录像存储相关Profile C是门禁控制。接平台时如果要求支持H.265摄像机固件又只实现了Profile S的基本配置那平台侧就算拿到码流也可能编解码不兼容问题特别隐蔽。还有一点容易踩坑ONVIF的云台控制服务PTZ控制命令走的是同一套SOAP接口但在“绝对移动”和“相对移动”两种模式下各厂商实现很不一样。有的设备只支持ContinuousMove按住动松手停有的支持AbsoluteMove直接给坐标。平台按下发按钮快速切换预置位时如果只实现了相对移动坐标会漂移因为设备端当前位置和平台侧缓存的位置经常对不上。2.2 RTSP下的视频流交互逻辑与字段细节RTSP是实时流传输协议它不是用来传视频数据的而是用来“建立会话、控制播放、协商参数”的。视频数据本身走RTP协议RTSP相当于“导演”RTP相当于“摄影机”。一次标准交互大概是这样的客户端VLC、NVR或平台先发一个OPTIONS请求问设备支持哪些方法比如DESCRIBE、SETUP、PLAY、TEARDOWN接着发DESCRIBE带上完整的RTSP URL设备返回SDPSession Description Protocol里面描述了媒体类型、编码格式、分辨率和端口信息客户端拿到SDP后再发SETUP建立起RTP传输通道最后发PLAY设备开始推流。这里的URL非常关键。常见的RTSP URL长这样rtsp://192.168.1.64:554/ch1/main/av_stream rtsp://admin:password192.168.1.64:554/Streaming/Channels/101不同厂家的URL路径差异很大海康、大华、宇视各有各的规则而且往往不是从ONVIF能力描述里直接拿到的。有的平台支持“ONVIF自动接入”但只做了一部分拉流时还是需要你手动在配置框里填RTSP地址。我建议在接第三方平台前先用VLC本地测试一下URL能出图再往平台上填这能隔离掉很多“平台不支持”的假象。SETUP阶段还有一个容易被忽略的参数就是传输模式。RTSP可以走TCP也可以走UDP。TCP模式下RTP数据包在TCP连接里传输穿越NAT更稳定但延迟稍微高一点UDP模式延迟低、效率高但遇到丢包就会花屏。很多NVR默认走UDP如果你在公网上拉流防火墙或NAT没做好端口映射画面会卡到怀疑人生。2.3 GB28181/GAT1400题外话国标对接不是“插上就能用”GB28181是国内公共安全视频监控联网系统的信息传输、交换、控制技术要求GAT1400则是面向图像信息采集、检索等场景的另一套标准。做公安平台、综合治理、学校一键报警这类项目时GB28181几乎绕不开。和ONVIF完全不同GB28181用的是SIP信令视频流是RTP/PS封装需要在平台侧配置SIP服务器ID、SIP服务器域、设备ID、密码等参数。GB28181对接有个特点信令走SIP的TCP或UDP通道媒体流走RTP但媒体传输地址是由SIP信令协商出来的。很多项目失败在“注册成功但拉流黑屏”上问题大多不出在注册环节而是媒体协商。比如设备上报给SIP服务器一个媒体IP但这个IP是内网地址平台在公网侧拿不到流。这时候就需要在设备侧配置NAT模式或者由SIP服务器指定媒体接收地址。我个人的建议是做国标接入之前先确认三个信息SIP服务器ID和域是否一致设备编码是否符合规范的20位规则平台侧是否开放了UDP媒体端口。这三个对不上后面全是白忙。2.4 私有SDK与标准协议之间的取舍最后说一句私有SDK。标准协议的优点是通用但缺点是各家的“标准实现”总是有细微差异。私有SDK是厂商自己定义的接口通常功能最全但高度绑定厂商生态不具备通用性。我的做法是能走标准协议就尽量走标准。ONVIF满足不了时再看RTSP裸流够不够用实在需要拍照上传、OSD叠加、语音对讲、智能分析事件等私有能力时才上厂商SDK。工程项目里有一条很现实的经验SDK接口的兼容性问题不比标准协议少而且换了固件版本就可能变调试成本高得多。3. 主板内部与周边设备的通信协议RS-485、Modbus、CAN、UART、SPI、IIC3.1 云台控制的RS-485总线与Pelco-D协议不少人对RS-485有误解以为它是一个“协议”其实RS-485是电气标准它定义了电平、接线方式、传输距离但不规定数据内容。数据内容由上一层协议决定监控里最经典的是Pelco-D和Pelco-P。Pelco-D是很多云台摄像机的内置控制协议波特率常见为2400或9600数据格式是8位数据位、1位停止位、无校验。一条Pelco-D命令一般是7个字节第1字节是同步字节0xFF第2、3字节是云台地址第4字节是命令字第5、6字节是水平垂直速度第7字节是校验和。举个例子地址为1的云台执行“水平向左转”的命令大概长这样FF 01 00 04 00 20 25这里04是左转命令字配合水平速度0x20最后25是校验和。很多二次开发的朋友喜欢跳过协议文档直接拿现成指令发但一旦云台地址不是1、波特率不是默认值就完全失控。遇到这种问题第一件事就是用串口助手抓一下实际通讯内容看地址字节到底是多少。RS-485是半双工的意思是收发共用一对线同一时刻只能一个方向传数据。当我们用485延长线接了多个云台时还要注意总线两端加120Ω终端电阻否则信号反射会造成指令时而有效时而无效。这属于纯硬件细节但项目里十有八九栽在没接电阻上。3.2 Modbus监控联动传感器时绕不过去的老将Modbus是我做了大量传感器联动项目之后才真正重视起来的协议。它的核心价值是“寄存器读写”。Modbus协议里有一套寄存器地址空间比如保持寄存器Holding Register和输入寄存器Input Register上位机通过读寄存器获取传感器数值通过写寄存器控制设备输出。在监控场景里Modbus最常见的用法是把温湿度传感器、烟感、水浸、门磁等设备接入综合管理平台。一个温湿度变送器会暴露出一组寄存器地址比如30001是温度30002是湿度。平台定期用Modbus RTU的03功能码去读这两个寄存器转成实际物理值后显示在大屏上。也有一部分联动控制用05功能码写单线圈比如触发声光报警器。这里提醒一句Modbus的寄存器地址在不同厂家设备上有偏移有的用0基地址有的用1基地址如果解析结果总是差一位不需要怀疑协议理解错了大概率是地址偏移没对齐。解决方式很简单用Modbus Poll这类工具直接读看哪个地址能返回合理数值再用那个地址配置平台。3.3 主板内部的“隐形协议”UART、SPI、IIC、CAN到底在干嘛上面说的协议是设备和外部系统之间的但摄像机主板内部也有大量芯片间通信这些协议用户看不见可一旦失效主板上的外设就工作不起来。IPC主板上常见的芯片间协议有UART、SPI、IIC和CAN。这层知识在做二次开发、维修主板时非常有用。UART是串口异步通信PC和开发板调试时用的几乎都是它。嵌入式工程师常说的“串口打印”就是通过UART输出日志。它在摄像机里承担跑系统日志、进入bootloader、升级固件等任务相当于人的“备胎通道”图形界面挂了还能靠它对暗号。SPI是高速同步串行总线典型用途是连接Flash闪存和部分传感器速率高时序逻辑写在寄存器里普通用户几乎感觉不到它的存在。IIC则是两根线的低速总线用来读取Sensor参数、EEPROM存储、RTC时钟芯片等。CAN总线在摄像机里相对少见更多出现在车辆监控的云台、传感器组网中。刚开始看这些协议会一头雾水但我想给一个很实用的角度如果你做的项目只是“用现成设备、写业务系统”那么重点掌握RS-485、Modbus、TCP/IP这层外部协议就够了一旦要改硬件、移植固件、做嵌入式开发UART、SPI、IIC、CAN这些内部总线的知识和排查能力就是硬门槛。两种角色用的知识体系不一样但都不超出“协议”这个框架。4. IoT化之后IPC上的网络协议全家桶4.1 HTTP/HTTPS承载的API与配置下发现在的IPC早就不只是“出画面”的机器它还是一个小型Web服务器。设备内置一个Web管理页面你用浏览器登录IP地址就能改参数这就是HTTP协议的功劳。我们在对接平台时也经常利用HTTP接口做批量配置比如利用设备的CGI接口设置IP地址、码流参数、OSD叠加文字等。HTTP接口有个特点无状态每个请求都是独立的但实际应用中我们需要保持登录态。设备一般用一个session机制或token机制来管理需要先调用登录接口获取凭证后续请求带上凭证才能执行操作。如果二次开发中一直报“未认证”或者401最可能的原因就是没有正确携带token或者会话过期没有重连。HTTPS就是在HTTP外面套了一层TLS/SSL加密。新出厂的摄像机默认开启HTTPS的越来越多但它会带来一个痛点平台用自签名证书调用设备HTTPS接口时证书校验不过。做系统集成时要么把设备的自签名证书导入平台的信任库要么在平台里关闭证书校验不推荐。更麻烦的是有些设备HTTP与HTTPS两者互相抢端口导致你在浏览器里明明看到页面开着但平台接口死活调不通。这时候直接在设备网络配置里强制指定HTTP端口省心得多。4.2 MQTT报警推送与状态上报的新宠监控行业这几年IoT化趋势很明显尤其是物联网云平台、可视化大屏、智能家居联动等场景MQTT出现频率越来越高。MQTT是一种基于发布/订阅模型的轻量级消息协议它并不传输视频流而是传“事件”。典型用法是摄像机或边缘盒子检测到移动侦测、越界、区域入侵等事件后将结构化信息发布到某个Topic比如cam/device/001/alarm。业务平台订阅这个Topic收到消息后做弹窗推送、联动开门、开启录像等操作。消息体格式通常是JSON里面携带事件类型、通道号、抓图URL、置信度等信息。我特别提醒一下MQTT服务器的QoS选择。很多项目图省事把所有消息都用QoS2确保可达结果消息多了之后Broker吞吐量掉下来反而丢消息。实际上对于监控报警场景QoS1基本够用QoS0在局域网内也可以。真正要确保不丢消息的更应该把重点放在持久化会话和遗嘱消息上比如设备断电后能通过遗嘱消息及时通知平台“设备离线”这比丢一两条报警更贴近真实需求。4.3 DHCP、NTP、FTP、SMTP、WebSocket容易被忽略但非常关键的配角这些协议都不是主角但缺了它们系统会出各种让人摸不着头脑的“怪病”。DHCP就不用多说了IP地址分配全靠它。很多项目实施时图省事不做IP规划让设备自动获取结果设备一重启IP变了平台侧找不到设备。正规做法是在路由器上做DHCP静态绑定或者直接改成手动静态IP并写进设备台账。NTP是时间同步协议很多人忽略它。监控系统的时间不同步会导致什么后果录像时间轴对不上、检索回放拖不到正确时间点、报警联动触发时间错误。尤其是GB28181项目平台校验设备注册时有可能看时间戳时间差太大会认为信令非法。FTP是很多摄像头自带的文件上传协议比如把抓拍图片定时上传到FTP服务器。这类需求在工地扬尘监测、渣土车管理、卡口等场景里很常见。部署FTP上传功能时要注意被动模式问题摄像机偶发传不上去多半是FTP服务器被动模式端口限制没配好。SMTP是摄像机发邮件报警用的配置方式相对简单但部分老设备不支持TLS加密而大部分邮箱服务器现在强制开启TLS所以经常出现“明明配置了邮件服务器却收不到报警邮件”的现象。WebSocket在监控大屏里用得越来越多特别是实时状态刷新和点位列表。它跟HTTP不同是一个长连接全双工通道服务器可以主动往客户端推数据。做可视化平台时如果选择轮询HTTP接口来刷新设备状态延迟和服务器压力都很大换成WebSocket后服务端有状态变化就主动推送体验会好很多。5. 排查排错与协议选型的真实案例复盘5.1 场景一设备能被搜索到但预览一直转圈有一次项目现场反馈一台新装IPC用海康的官方搜索工具能搜到NVR也显示在线但点预览就一直转圈过几十秒报“网络不可达”。很多人的第一反应是带宽不够可我测了一下码流也就4Mbps局域网百兆环境绰绰有余。后来我逐层排查。先ping摄像机IP延迟在2ms以内链路层没问题。再用VLC直接拉RTSP流发现能出图就是延迟高达5秒。这就很有信息量了说明设备媒体服务没死问题大概率出现在NVR与设备的协商上。我用Wireshark抓包看NVR和摄像机之间的RTSP交互发现NVR发SETUP时用的是transport: RTP/AVP/TCP但摄像机回包协议里却要求UDP。来回重试几次后NVR放弃了这个通道于是表现为“预览一直转圈”。原因出在设备RTP传输模式的配置上厂家固件在开启“NAT穿透”后会强制把传输模式改为UDP但NVR那边在自动协商时没适配过来。最后的解决办法是在摄像机的网络高级设置里把“RTP传输模式”改成TCP优先或者在NVR的通道配置里直接手动指定传输协议。这事的经验是预览出图失败不要想当然认为一定是设备或平台问题先抓RTSP协商报文看传输模式是否两边一致。5.2 场景二GB28181注册成功却没有视频流国标项目里平台显示设备“在线”点实时视频却说无可用流。SIP注册明明成功了为什么没流有次我去现场排查先在设备GB28181配置页面上确认注册状态显示已注册。接着抓SIP服务器上的信令发现Invite请求已发出设备也返回了200 OK但平台侧迟迟没收到RTP包。往设备侧一看设备上报媒体IP是192.168.50.10而平台SIP服务器在公网数据包根本路由不回来。这就是典型的内网设备做SIP注册但媒体流穿越失败的场景。设备配置里的相关参数变成了“仅信令模式”媒体端口没有映射到公网。后来我们在平台侧关闭了“媒体地址使用SIP信令地址”的强制要求改成允许设备上报公网地址另外把设备NAT穿透模式打开并确保UDP 10000端口段在路由器上转发了视频流马上出来了。这个案例说明GB28181注册成功是信令层面的成功媒体流能不能回来是另一个层次的事。方案上遇到“注册在线、拉流失败”时优先检查媒体协商地址是可路由的IP而不是一个内网保留地址。5.3 场景三局域网拉流正常公网延迟高且频繁断开另一个很常见的问题是摄像机在局域网内怎么看都正常一旦通过公网域名或端口映射访问画面就一卡一卡还经常断开重连。一开始我也怀疑是上行带宽不够但用户说宽带有200M上行测速也没问题。后来我用测速工具模拟UDP传输发现该宽带的上行UDP流量在某些时段被严重丢包。这时候就浮出一个关键点NVR或平台在公网拉流时默认使用UDP的RTSP而UDP在穿越公网时特定IPS/防火墙设备会做流量整形丢包率非常高。相比之下TCP虽然有TCP重传开销但在链路不稳定的场景下表现可比UDP稳得多。于是我把拉流协议改成TCP画面卡顿立刻好转。另一个更深层的问题是视频编码参数。公网传输场景中如果摄像机编码设了大I帧间隔、高码率峰值遇到瞬时拥塞TCP重传会累积导致延迟飞涨。我现在做公网传输项目时都会建议把CBR码率设置打开I帧间隔适当缩短分辨率根据上行带宽保守设置。协议和编码参数一起调比单独换协议有效得多。5.4 选型层面的四张自检清单视频监控项目做多了我总结了一套协议选型的自检问题每次做技术方案之前先过一遍能省掉后期很多对接成本。第一张清单是“设备接入方式”。确认是ONVIF标准接入还是RTSP裸流接入还是厂商SDK接入还是GB28181接入。每个项目的接入场景不一样要提前问清楚平台支持哪些标准如果已经定了平台就先去确认平台侧的接入协议列表别等设备买了才发现不兼容。第二张清单是“网络环境是否跨网段、跨公网”。局域网内部对接组播发现和大码流UDP传输都相对好解决跨三层、跨公网接入就要重点评估RTSP over TCP、GB28181的NAT穿越、MQTT的服务器地址可达性以及防火墙端口放行策略。第三张清单是“业务到底需要哪些‘非视频’能力”。如果只是看监控画面RTSPONVIF就够了如果要做移动侦测报警推送给微信那MQTT或HTTP回调就得上如果要做图片抓拍上传FTP就需要确认FTP上传协议是否支持被动模式和TLS如果要做云台联动和语音对讲ONVIF的PTZ与Audio接口能不能满足各厂商的私有实现是否兼容都要提前验证。第四张清单是“固件版本与协议版本是否匹配”。ONVIF存在Profile版本差异GB28181也有不同年份发布的技术要求Modbus寄存器地址表更是随固件更新变化的。同一个项目如果设备批次不同、固件版本不同很可能出现“一台能接入另一台就是不行”的情况。我每次做项目验收时都会先做一台样机的全流程测试确认协议、版本、参数都匹配之后再批量部署。这四张清单不是万能的但按它走一遍至少能在动工前把八成的“协议坑”提前排掉。监控摄像机这东西协议学起来不难真正的门槛全在项目里那些细节组合里。
返回列表