第一章:安防协议栈概述
什么是嵌入式安防协议栈
先说说我自己的理解吧。嵌入式安防协议栈,说白了就是一套让摄像头、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的广播风暴。到时候拿一个海思平台的实战案例来说,你会有更直观的感受。