不会说 SIP 的设备靠「网关」接进国标域,网关只做三件事。 它给每台非国标设备发一个 20 位编号,于是上级看不出区别。
上一节讲的是「两个国标平台怎么连」。 这一节讲「一台不会说国标的设备怎么接进来」——现实里这种设备占多数。 Demo 把转换的三件事摆开,再算一算报文大小的差。
一、网关做的三件事
第一件:信令转换。 ONVIF 那边是 SOAP over HTTP,国标这边是 SIP 加 MANSCDP XML, 网关把「取设备信息」翻译成「Catalog 查询」。 第二件:媒体转换。 ONVIF 走 RTSP 协商、裸流输运,国标要求 RTP 加 PS 封装, 所以网关至少要把裸流重新封成 PS——这一步是纯搬运,不重新编码,所以便宜。 第三件:身份转换,也是最重要的一件。 网关给每一台非国标设备「发一个 20 位编号」,这些编号由网关自己维护一张表。 于是上级平台看它,和看一台真的国标摄像机没有区别。 这就是「非 SIP 监控域互联」的全部秘密:不是让设备学会 SIP,而是让网关替它说。
二、网关是单点,而且状态要维持两份
网关的代价很直接:它成了唯一的翻译点,所以它是单点故障; 它还要同时维持两套会话状态——ONVIF 那边的 RTSP 会话、国标这边的 SIP 对话。 任何一边断了,用户看到的现象都一样:点开黑屏。 但原因完全不同:RTSP 那边断了是「取不到流」,SIP 那边断了是「点播请求没通」。 所以排查的顺序应该是「先看信令、再看媒体」:抓包看 INVITE 有没有 200 OK, 有 200 再看 RTP 有没有到。这一步顺序反了,会白查很久。 还有一个容量问题:网关做 PS 封装是纯 CPU 搬运,一路 4 Mbps 大概占单核的百分之几, 但一千路乘上去就是几核。 所以网关的规格书里,「支持多少路」这个数字比「支持什么协议」更值得看。
三、动手 Demo:非 SIP 域怎么接进来——网关做的三件事
先摆出三张转换表,再算四个典型动作在两套协议下的报文大小。
acts = [
("ONVIF 取设备信息", "HTTP 请求+响应", 1180),
("国标 Catalog 响应", "SIP 200+XML", 620),
("ONVIF 取流地址", "SOAP 往返", 940),
("国标 INVITE", "SIP+SDP", 780),
]
for name, form, size in acts:
print(name, form, size)
实跑输出:
--------------------------------------------------------------------
非 SIP 域怎么接进来——网关做的三件事
--------------------------------------------------------------------
**现实里总有一批设备不会说 SIP**(老 ONVIF 枪机、模拟加编码器)。
**它们靠「网关」接进国标域,而网关只做三件事。**
转换 从 到
-----------------------------------------------------------
**信令** **ONVIF SOAP** **SIP + MANSCDP XML**
**媒体** **RTSP/RTP 裸流** **RTP/PS**
**身份** **UsernameToken** **一个虚拟的国标编号**
**第三行是网关最核心的魔法**:**它给每一台非国标设备「发一个 20 位编号」**,
**于是上级平台看它,和看一台真国标摄像机没有区别。**
**下面算一笔转换的账**:
动作 报文形态 典型大小
------------------------------------------------------------
**ONVIF 取设备信息** HTTP 请求+响应 **1180 字节**
**国标 Catalog 响应** SIP 200+XML **620 字节**
**ONVIF 取流地址** SOAP 往返 **940 字节**
**国标 INVITE** SIP+SDP **780 字节**
**同一件事,ONVIF 那边普遍更大**,**因为 SOAP 每个元素都要带命名空间前缀。**
**而国标那边靠「短标签名」省字节**——**`<CmdType>` 这种命名,就是为省字节设计的。**
**网关的代价也要说清**:
**它成了唯一的翻译点,所以它是单点故障**;
**而且它要同时维持两套会话状态**——**ONVIF 那边的 RTSP 会话、国标这边的 SIP 对话**,
**任何一边断了,用户看到的就是「点开黑屏」。**
同一件事,ONVIF 那边普遍更大,因为 SOAP 每个元素都要带命名空间前缀。
而国标靠「短标签名」省字节——<CmdType> 这种命名,就是为省字节设计的。
但别把「报文小」理解成「性能好」:国标一次目录查询要把所有通道都列出来,
五百个通道的 XML 有几十 KB;而 ONVIF 是「按需一条一条问」,单次更小但次数更多。
一个是批量、一个是单条,这是两种完全不同的设计取向。
网关的价值也在这张表里:它要把左右两列的语义对齐,
而「对齐」这件事没有标准答案——ONVIF 的某个字段在国标里可能根本没有对应项。
所以同一个网关厂商,换个上级平台就可能要调映射表。
30 秒实验
- 算一下:500 个通道的目录 XML,每条 120 字节,一共多少 KB?(约 59 KB)
- 想一下:网关为什么要给设备「发编号」而不是「转发原地址」?
- 想一下:点开黑屏时,先查信令还是先查媒体?
常见误区
- 以为「网关会转码」。 它只重新封装,不重新编码,所以便宜得多。
- 以为「非国标设备接进来就变成国标了」。 是网关替它说,设备本身还是原来的协议。
- 以为「报文小就快」。 国标一次列全部通道,总量可能比 ONVIF 更大。
自测三问(点开对答案)
1. 网关做的三件事? —— **信令转换、媒体封装、身份(编号)转换**。 2. 为什么说网关是单点? —— **它是唯一的翻译点**,而且同时维持 RTSP 与 SIP 两套会话。 3. 点开黑屏,排查顺序是什么? —— **先看信令有没有 200 OK,再看 RTP 有没有到**。下一节把整个联网系统的协议栈摆出来,看四种协议各占多少字节。
- ☐ (本节完,下一节 10.03.03 联网系统通信协议结构)