GB/T28181 开源日记[8]:国标开发速知速会

news2025/2/8 7:39:31
  • 服务端源代码 github.com/gowvp/gb28181

  • 前端源代码 github.com/gowvp/gb28181_web

介绍

go wvp 是 Go 语言实现的开源 GB28181 解决方案,基于GB28181-2022标准实现的网络视频平台,支持 rtmp/rtsp,客户端支持网页版本和安卓 App。支持rtsp/rtmp等视频流转发到国标平台,支持rtsp/rtmp等推流转发到国标平台。

技术栈

Golang v1.23, Goweb v1.x, Gin v1.10, Gorm v1.25 …

React 19, Vite 6.x, Typescript, React-Router v7, React-Query v5, shadcn/ui …

国标开发速知速会

GB/T 28181 是我国在安防视频监控领域的一项重要国家标准。

标准定义

GB/T 28181 全称为《安全防范视频监控联网系统信息传输、交换、控制技术要求》。它规定了安全防范视频监控联网系统中信息传输、交换、控制的互联结构、通信协议结构,以及传输、交换、控制的基本要求和安全性要求,明确了控制、传输流程和协议接口等技术要求,目的是规范视频监控联网系统,实现不同厂商设备和系统的互联互通与互操作。

发展历程

  • 2011 年:推出 GB/T 28181-2011 版本,为安防行业的前端设备、平台服务器、平台客户端等安防产品的建设部署提供了基础标准。
  • 2016 年:第一次修订,推出 GB/T 28181-2016 版本,进一步细化和完善了视频监控设备之间的通信协议规范。
  • 2022 年:第二次修订,推出 GB/T 28181-2022 版本,于2023年7月1日实施,用于替代 GB/T 28181 - 2016 版本。此版本最新,相关实现的摄像机/NVR 等也较少。

Go WVP 基于最新标准 GB/T 28181 - 2022 开发,以为简称 GB28181。

一个最简单的监控域长这样,采集设备通过 SIP 信令注册到 GB28181 平台,

image-20250207223516313

SIP 全称是 Session Initiation Protocol (会话初始协议),是一种应用层的信令控制协议。

SIP 协议由 IETF(互联网工程任务组)制定,用于创建、修改和终止多媒体会话,如语音通话、视频会议、即时消息等。它借鉴了 HTTP 和 SMTP 等协议的设计理念,具有文本格式、简单灵活等特点。

在 IP 电话、视频会议系统、即时通讯软件、在线游戏等多种实时通信应用中广泛应用。

在 GB/T 28181 标准中,SIP 协议被用作信令控制的基础协议,用于实现视频监控联网系统中设备之间的注册、会话建立、控制命令传输等功能。通过对 SIP 协议进行定制和扩展,GB/T 28181 规定了符合安防视频监控领域需求的信令流程和消息格式,使得不同厂商的视频监控设备能够基于 SIP 协议进行标准化的通信和互操作。

SIP 协议中的请求消息由请求行、消息头字段、消息体(可选)三部分组成,每部分都有特定的格式和功能。

SIP 报文

以为是 GB28181 注册的报文。

REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Message Header
    Via: SIP/2.0/TCP 192.168.10.9:41607;rport;branch=z9hG4bK67a61cd2
    From: <sip:34020000001110000005@3402000000>;tag=7bebef2f
    To: <sip:34020000001110000005@3402000000>
    Contact: <sip:34020000001110000005@192.168.10.9:41607>
    Call-ID: 41F04E9D7137EFA1@192.168.10.9
    CSeq: 1 REGISTER
    Max-Forwards: 70
    Expires: 360
    X-GB-Ver: 3.0
    Content-Length: 0

请求行

REGISTER sip:34020000002000000001@3402000000 SIP/2.0

用于标识请求的类型,格式为 <请求方法> <请求 URI> <SIP 版本>。

  • 请求方法:在 HTTP 协议中 Request Method 有 POST, GETDELETE , PUT 等等,而 GB28181 中常用的是 REGISTERINVITEACKMESSAGEINFONOTIFY 等等。
  • 请求 URI:指定请求的目标地址。
  • SIP 版本:一般为SIP/2.0,表示使用的 SIP 协议版本。
消息头

通用头字段

  • Via: 用于记录请求消息经过的路径,包含发送方的地址和端口等信息,例如 Via: SIP/2.0/TCP 192.168.10.9:41607;rport;branch=z9hG4bK67a61cd2
  • Max-Forwards:指定请求消息在被丢弃之前可以经过的最大跳数,每经过一个服务器,该值减 1。如:Max-Forwards: 70

请求头字段

  • From:标识请求的发起者,包含发起方的 SIP 地址和显示名称等信息。例如:<sip:34020000001110000005@3402000000>;tag=7bebef2f,其中tag用于标识本次请求的唯一性。
  • To:指定请求的接收者,包含接收方的 SIP 地址和显示名称等。如:To: <sip:34020000001110000005@3402000000>
  • Contact:用于告知接收方,期望接收响应的地址和端口等信息。例如:Contact: <sip:34020000001110000005@192.168.10.9:41607>
  • Call-ID:用于标识一个呼叫会话,在整个会话过程中,所有与该会话相关的请求和响应消息都具有相同的Call-ID。例如:Call-ID: 41F04E9D7137EFA1@192.168.10.9
  • CSeq:用于标识请求的顺序和类型,由一个序列号和请求方法组成。如:CSeq: 1 REGISTER,表示这是一个 REGISTER 请求,序列号为 1。
  • User-Agent: 用于标识身份,例如 GoWVP v0.0.1 标识这个开源项目的 v0.0.1 版本。

消息体头字段

  • Content-Type:指示消息体的媒体类型,如Content-Type: application/sdp表示消息体包含 SDP(会话描述协议)信息。
  • Content-Length:表示消息体的长度,以字节为单位。例如:Content-Length: 0 表示没有消息体。

GB28181 头字段

  • Expires: 用于表示注册的过期时间,0 表示注销,>0 表示多少秒以内有效,例如 Expires: 360 表示从注册时间开始 360 秒以内有效。
  • X-GB-Ver: 用于标识 GB28181 实现的协议版本,是 2022 版本中新增的参数,X-GB-Ver: 3.0 表示 GB/T 28181-2022,在 GoWVP 开发中,我们需要借助此标识,支持 2022 的设备更多功能,如果是旧版本不支持 2022 的特性给出对应错误提示。
消息体

根据 Content-Type 的定义,可能是 xmlsdpmanscdp 等等,根据实际报文解析出内容即可。

国标注册

  1. 注册和注销应进行认证,认证方式应支持 Digest (数字摘要认证),高安全级别的宜支持数字证书的认证方式。
  2. 注册成功后,在注册过期时间到来之前,应刷新注册,刷新注册流程与首次注册流程一致。
  3. 注册失败后,应间隔一定时间后继续发起注册,gowvp 的国标级联设计是间隔 10s。
  4. 注册与上一次注册时间间隔应可调,一般情况不应短于 60s,知名摄像头的设计都是间隔默认 1 小时,即 3600s,可提前 10 秒发出消息,避免对端超时过期。
  5. 注册成功则认为在线状态,注册失败或注册时间过期则认为离线状态。
  6. 对于开启网络地址转换 (NAT) 功能的路由器内测的 SIP 代理,宜支持 TCP 发送 sip 注册,注册成功后,保持长连接,信令部分依然按照上面的要求,多一条 tcp 通道断开则认为离线。

image-20250207231437334

注册的源代码都在这里,没有太多好说的,姊妹篇是 [GB28181 七种注册姿势]。

有兴趣的话可以打开 github 看看源代码,再顺手点个 star ?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6 maven工具的使用、maven项目中使用日志

文章目录 前言一、maven&#xff1a;一款管理和构建java项目的工具1 基本概念2 maven的安装与配置&#xff08;1&#xff09;maven的安装&#xff08;2&#xff09;IDEA集成Maven配置当前项目工程设置 maven全局设置 &#xff08;3&#xff09;创建一个maven项目 3 pom.xml文件…

GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读

一、43698-2024标准图解 https://mmbiz.qpic.cn/sz_mmbiz_png/rwcfRwCticvgeBPR8TWIPywUP8nGp4IMFwwrxAHMZ9Enfp3wibNxnfichT5zs7rh2FxTZWMxz0je9TZSqQ0lNZ7lQ/640?wx_fmtpng&fromappmsg 标准在线预览&#xff1a; 国家标准|GB/T 43698-2024 相关标准&#xff1a; &a…

CF 278A.Circle Line

题目分析 输入n个数据作为路径&#xff0c;求从a到b的最短距离&#xff0c;需要将其相成一个圆圈&#xff0c;既可以从小往大走又可以从大往小走 思路分析 依然将数据存为数组&#xff0c;通过下标进行操作&#xff0c;既然说了有两种方式那就计算两种方式哪个更快就输出谁 代…

本地部署deepseek简单教程

部署deepseek&#xff0c;首先需要知道deepseek官网地址&#xff1a;DeepSeek 第一步&#xff1a;Ollama 去ollama下载对应的版本&#xff0c;我的电脑是window 在这里可以看到关于deepseek相关 第二步&#xff0c;下载完ollama无脑下一步就可以 这样属于安装成功 第三步&…

UnityShader学习笔记——多种光源

——内容源自唐老狮的shader课程 目录 1.光源类型 2.判断光源类型 2.1.在哪判断 2.2.如何判断 3.光照衰减 3.1.基本概念 3.2.unity中的光照衰减 3.3.光源空间变换矩阵 4.点光源衰减计算 5.聚光灯衰减计算 5.1.聚光灯的cookie&#xff08;灯光遮罩&#xff09; 5.2.聚…

电脑右下角小喇叭没反应怎么回事,快速解决方案

当电脑右下角的小喇叭&#xff08;音量图标&#xff09;没有反应时&#xff0c;可以尝试以下快速解决方案&#xff1a; 一、基础检查与操作 检查键盘音量键&#xff1a; 按下键盘上的音量增加或减少键&#xff0c;或尝试Fn音量键&#xff08;部分笔记本需组合键&#xff09;&a…

Mysql基于binlog主从同步配置

主配置&#xff1a; 修改配置文件&#xff1a;/etc/my.cnf 添加server-id1 重启MySQL服务&#xff1a;systemctl restart mysqld 创建用户并授权&#xff1a; mysql> create user rep192.168.79.% identified with mysql_native_password by 123456; Query OK, 0 rows aff…

Docker Desktop安装到其他盘

Docker Desktop 默认安装到c盘&#xff0c;占用空间太大了&#xff0c;想给安装到其他盘&#xff0c;网上找了半天的都不对 正确安装命令&#xff1a; start /w "" "Docker Desktop Installer.exe" install --installation-dirF:\docker命令执行成功&am…

NetCore Consul动态伸缩+Ocelot 网关 缓存 自定义缓存 + 限流、熔断、超时 等服务治理

网关 OcelotGeteway 网关 Ocelot配置文件 {//单地址多实例负载均衡Consul 实现动态伸缩"Routes": [{// 上游 》》 接受的请求//上游请求方法,可以设置特定的 HTTP 方法列表或设置空列表以允许其中任何方法"UpstreamHttpMethod": [ "Get", &quo…

ubuntu 本地部署deepseek r1 蒸馏模型

本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署&#xff1a;基于docker安装&#xff0c;且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线操作。它支持各种 LLM…

go语言中的反射

为什么会引入反射 有时我们需要写一个函数&#xff0c;这个函数有能力统一处理各种值类型&#xff0c;而这些类型可能无法共享同一个接口&#xff0c;也可能布局未知&#xff0c;也有可能这个类型在我们设计函数时还不存在&#xff0c;这个时候我们就可以用到反射。 空接口可…

JUC学习笔记02

文章目录 JUC笔记2练习题&#xff1a;手写线程池代码解释&#xff1a;AdvancedThreadPool 类&#xff1a;WorkerThread 内部类&#xff1a;AdvancedThreadPoolExample 类&#xff1a; 线程池的思考CPU密集型IO密集型 练习题&#xff1a;手写自动重试机练习题&#xff1a;手写定…

【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…

C++(进阶五)--STL--用一颗红黑树封装map和set

目录 1.红黑树源码&#xff08;简略版&#xff09; 2.模板参数的控制 3.红黑树的结点 4.迭代器的实现 正向迭代器 反向迭代器 5.set的模拟实现 6.map的模拟实现 7.封装完成后的代码 RBTree.h mymap.h myset.h 1.红黑树源码&#xff08;简略版&#xff09; 下面我们…

飞算JavaAI :AI + 时代下的行业趋势引领者与推动者

在科技飞速发展的当下&#xff0c;AI 时代正以前所未有的速度重塑着各个行业的格局&#xff0c;而软件开发领域更是这场变革的前沿阵地。在众多创新力量之中&#xff0c;飞算JavaAI 脱颖而出&#xff0c;宛如一颗璀璨的新星&#xff0c;凭借其独树一帜的特性与强大功能&#x…

【重新认识C语言----结构体篇】

目录 -----------------------------------------begin------------------------------------- 引言 1. 结构体的基本概念 1.1 为什么需要结构体&#xff1f; 1.2 结构体的定义 2. 结构体变量的声明与初始化 2.1 声明结构体变量 2.2 初始化结构体变量 3. 结构体成员的访…

一种解决SoC总线功能验证完备性的技术

1. 前言 通过总线将各个IP通过总线连接起来的SoC芯片是未来的大趋势&#xff0c;也是缩短芯片开发周期&#xff0c;抢先进入市场的常用方法。如何确保各个IP是否正确连接到总线上&#xff0c;而且各IP的地址空间分配是否正确&#xff0c;是一件很棘手的事情。本文提出了一种新…

【Linux系统】线程:线程库 / 线程栈 / 线程库源码阅读学习

一、线程库 1、线程库介绍&#xff1a;命名与设计 命名&#xff1a;线程库通常根据其实现目的和平台特性进行命名。例如&#xff0c;POSIX标准定义了Pthreads&#xff08;POSIX Threads&#xff09;&#xff0c;这是一个广泛使用的线程库规范&#xff0c;适用于多种操作系统。此…

深度剖析 Redis:缓存穿透、击穿与雪崩问题及实战解决方案

一、缓存基本使用逻辑 在应用程序中&#xff0c;为了提高数据访问效率&#xff0c;常常会使用缓存。一般的缓存使用逻辑是&#xff1a;根据 key 去 Redis 查询是否有数据&#xff0c;如果命中就直接返回缓存中的数据&#xff1b;如果缓存不存在&#xff0c;则查询数据库&#…

如何使用el-table的多选框

对el-table再次封装&#xff0c;使得功能更加强大&#xff01; 本人在使用el-table时&#xff0c;因为用到分页&#xff0c;导致上一页勾选的数据在再次返回时&#xff0c;没有选中&#xff0c;故在原有el-table组件的基础之上再次进行了封装。 1.首先让某些不需要勾选的列表进…