第一章:安防协议栈概述

什么是嵌入式安防协议栈

先说说我自己的理解吧。嵌入式安防协议栈,说白了就是一套让摄像头、NVR、门禁这些设备能互相说话的规则集合。你想想看,一个海康的摄像头要跟大华的录像机通信,没有统一协议怎么行?

我习惯把协议栈分成三层来看:

  • 底层传输层:负责把数据包发出去,TCP/UDP这些是基础
  • 中间控制层:处理设备发现、能力协商、会话管理
  • 上层应用层:视频流传输、报警事件、云台控制这些具体功能

嗯,这里要注意,嵌入式环境跟PC不一样。资源有限,内存可能就几十兆,CPU主频也不高。所以协议栈不能照搬PC上的实现,得做裁剪和优化。我在一个海思3516的项目上就吃过这个亏,直接移植了开源的gSOAP库,结果内存爆了……后来自己重写了精简版才搞定。

核心要点:嵌入式安防协议栈 = 标准协议 + 嵌入式适配 + 安防业务逻辑

主流协议栈对比

目前市面上主流的安防协议栈有三个:ONVIF、RTSP、GB28181。我一个个说。

ONVIF

ONVIF是国际标准,由安讯士、博世、索尼这些厂商推起来的。它基于Web Services,用SOAP做控制信令,RTP/RTSP做媒体传输。

优点

  • 跨厂商兼容性好,我试过用ONVIF客户端同时控制海康、大华、宇视的摄像头
  • 功能全面,设备发现、视频配置、PTZ控制、事件处理都有
  • 文档规范,社区活跃

缺点

  • SOAP协议太重了,XML解析在嵌入式上很吃资源
  • 启动慢,设备发现过程要好几秒
  • 有些厂商的实现有私有扩展,不完全兼容

我的经验:如果你做的是国际市场的产品,ONVIF是必须支持的。但建议只实现Profile S(视频流)和Profile G(录像)这两个核心子集,别贪多。

RTSP

RTSP是IETF标准,专门用来控制流媒体服务器。它本身不传输视频数据,而是负责建立和控制媒体会话。

优点

  • 协议简单,就几个方法:DESCRIBE、SETUP、PLAY、PAUSE、TEARDOWN
  • 传输效率高,配合RTP/RTCP延迟低
  • 嵌入式实现容易,代码量小

缺点

  • 只解决媒体传输问题,设备发现、配置管理这些都没有
  • 安全性弱,基本靠底层加密
  • 不同厂商的RTSP实现细节有差异,比如SDP描述格式

为什么会这样?因为RTSP最初是为IP摄像头设计的,后来才被安防行业广泛采用。我记得有一次调试一个RTSP的PLAY请求,客户端一直返回454 Session Not Found,查了半天发现是CSeq序号没同步……这种坑踩多了就记住了。

GB28181

GB28181是中国国家标准,主要用于公安、交通这些政府项目。它基于SIP协议做信令控制,媒体传输用RTP。

优点

  • 国内安防项目必备,尤其是政府招标
  • SIP协议成熟,扩展性好
  • 支持级联,适合大规模组网

缺点

  • 协议复杂,SIP消息格式要求严格
  • 国标版本多(2011、2016、2022),兼容性是个大问题
  • 有些地方标准跟国标有差异,比如广东的DB44

避坑指南:我曾经在一个平安城市项目里,因为GB28181的SIP注册超时时间设置不对,导致设备上线成功率只有60%。后来把超时从30秒改到60秒,再配合心跳保活,才稳定下来。这个参数在嵌入式上特别容易忽略。

协议栈对比表格

特性 ONVIF RTSP GB28181
标准组织 ONVIF联盟 IETF 中国国标委
信令协议 SOAP/HTTP RTSP SIP
媒体传输 RTP/RTSP RTP/RTCP RTP
设备发现 WS-Discovery SIP注册
嵌入式开销
国内适用性 一般 一般
国际适用性

协议栈在安防系统中的位置

我画个简单的分层图你就明白了:

+----------------------------+
|       安防应用层           |
| (视频预览、录像回放、报警) |
+----------------------------+
|       协议栈层             |
| (ONVIF/RTSP/GB28181)      |
+----------------------------+
|       网络传输层           |
| (TCP/UDP/IP)              |
+----------------------------+
|       硬件驱动层           |
| (网卡、编码芯片、传感器)   |
+----------------------------+

协议栈在中间,承上启下。对上,它把安防业务逻辑抽象成标准接口;对下,它屏蔽了不同硬件平台的差异。

举个例子,你写一个云台控制功能:

  • 应用层调用 ptz_move(left, speed)
  • 协议栈层把这个调用转成ONVIF的 ContinuousMove 请求,或者GB28181的SIP消息
  • 网络层把数据包发出去
  • 硬件驱动层控制电机转动

这样设计的好处是,换协议栈只需要改中间层,应用层代码基本不用动。我在一个项目里就做过ONVIF转GB28181的协议适配器,应用层完全无感知。

总结一下:协议栈选型要看产品定位。做海外市场优先ONVIF,做国内政府项目必须GB28181,做纯视频流传输RTSP就够了。但实际项目中,往往是多协议共存——ONVIF做设备发现,RTSP做视频流,GB28181做平台对接。嗯,这就是现实。

下一章我会详细讲ONVIF协议栈的移植过程,包括怎么裁剪SOAP库、怎么处理WS-Discovery的广播风暴。到时候拿一个海思平台的实战案例来说,你会有更直观的感受。