wvp-GB28181-pro 开发参与指南:环境搭建、代码结构与提交规范详解
2026/9/16 18:11:07 网站建设 项目流程

wvp-GB28181-pro 开发参与指南:环境搭建、代码结构与提交规范详解

【免费下载链接】wvp-GB28181-pro基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将普通摄像机/直播流/直播推流转国标共享到国标平台。项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro

本文基于 wvp-GB28181-pro 官方文档《参与到开发中来》(doc/_content/qa/development.md)展开,系统梳理参与该国标视频平台开发所需的完整技术栈信息(Java 后端 + Vue 前端)、代码结构理解方法、异步处理机制以及抓包调试技能,并说明 Fork + PR 的提交规范。读完本文后,你可以搭建出可编译、可调试的开发环境,并具备定位 SIP 信令问题、按项目规范提交代码的实战能力。

一、开发语言与技术栈总览

官方文档给出的开发信息如下,这是理解整个项目的起点:

  • 开发语言:后端 Java + 前端 Vue;
  • 作者自用开发 IDE:JetBrains IntelliJ IDEA;
  • 后端使用 Spring Boot 框架开发;
  • 项目大量使用了异步操作;
  • 跟代码学流程需要参考 GB/T 28181 标准文档,只看代码会很难理解信令交互的来龙去脉;
  • 必须学会抓包,这是调试 GB/T 28181 协议问题的必备技能。

需要注意的是,文档中记录的 JDK 1.8、Node.js v10.19.0 / npm 6.14.4 属于早期版本的记录。以当前仓库的实际构建配置为准:

项目版本依据
JDK21(java.version=21,compiler source/target 均为 21)pom.xml
Spring Boot3.4.4(parent 版本),spring-boot-maven-plugin 3.4.10pom.xml
打包方式默认 jar 包,profilewar可切换为 war 部署pom.xml
前端框架Vue 2.6.10 + Element UI 2.15 + @vue/cli 4.4.4web/package.json
Node.jsengines 要求 node >= 8.9、npm >= 3.0.0web/package.json

其中 Node.js 的取值有一个隐性约束:前端使用 @vue/cli 4.4.4(webpack 4 体系),文档推荐的 v10.19.0 是该工具链下最稳妥的组合,Node 版本过高可能触发 OpenSSL 等兼容问题,因此按文档版本准备 Node 环境是合理的选择。

Docker 构建流程同样印证了 JDK 21 的要求:docker/wvp/Dockerfile 以ringcentral/jdk:21.0.9作为构建与运行镜像,通过mvn clean package -Dmaven.test.skip=true生成wvp-pro-*.jar后直接java -jar启动,并支持--spring.config.location指定外部配置文件。

后端关键依赖速览

pom.xml 中的依赖清单本身就是项目能力版图:

  • SIP 协议栈jain-sip-ri1.3.0-91,即 GB/T 28181 信令(注册、目录查询、INVITE 点播等)的底层实现。仓库中还有定制类 CustomNioTcpMessageProcessor.java 对 jain-sip 的 NIO TCP 处理器做了扩展;
  • 数据库:H2 / MySQL 8.2 / PostgreSQL / 人大金仓 KingBase8 四种数据源驱动,配合 MyBatis + PageHelper 分页插件,对应仓库数据库/目录下各版本的初始化与升级 SQL;
  • 缓存与会话:spring-data-redis、spring-session-core、Caffeine;
  • Web 与安全:spring-boot-starter-websocket、spring-security、JJWT(jose4j)、SpringDoc + Knife4j(OpenAPI 在线文档);
  • 工具库:fastjson2、okhttp(含 digest 认证扩展,用于对接 ZLMediaKit/AB 流媒体接口)、dom4j(解析 SIP 信令中的 XML 目录)、easyexcel、hutool、lombok、oshi-core(系统监控信息);
  • 内嵌 FTP 服务:Apache FtpServer(conf/ftpServer包下有完整实现),用于设备抓图等场景。

前端结构速览

前端位于 web 目录,是一个标准的 vue-admin-template 工程:

  • web/src/api:按业务域拆分的接口层(device.js、group.js、platform.js、playback.js、streamProxy.js、streamPush.js、jtDevice.js 等 20 个模块);
  • web/src/views:页面层,包含 channel(通道/云台)、device(设备管理)、jtDevice(部标 1078 车载设备)、live(实时播放)、map(GIS 地图)、platform(级联平台)、streamProxy/streamPush(流代理/推流)、operations(运维日志与系统信息)等;
  • web/src/store/modules:Vuex 状态管理,与 api 目录一一对应;
  • web/public/static/js:播放内核相关资源,包含 jessibuca、h265web、ZLMRTCClient 等 Web 播放 SDK;
  • 单元测试:npm run test:unit(jest),示例见 web/tests/unit。

常用脚本(web/package.json):npm run dev本地开发(监听 0.0.0.0)、npm run build:prod生产构建、npm run lint代码检查。

二、理解代码结构:从入口类开始

后端入口是 VManageBootstrap.java,从注解就能读出三个关键特性:

@ServletComponentScan("com.genersoft.iot.vmp.conf") @SpringBootApplication @EnableScheduling @EnableCaching public class VManageBootstrap extends SpringBootServletInitializer {
  1. 继承SpringBootServletInitializer:同一份代码既能打成可执行 jar 本地运行,也能通过-P warprofile 打成 war 部署到外部 Tomcat,对应 pom 中 war profile 引入的javax.servlet-api
  2. @EnableScheduling:印证了文档所说项目存在大量定时/异步任务,仓库根目录下 WVPTimerTask.java、DynamicTask.java、MediaStatusTimerTask.java、SchedulingConfig.java 等即为其具体实现,承担心跳超时检测、媒体服务状态轮询等周期性工作;
  3. 启动时还会打印 Git 构建版本(分支、commitId、构建时间),该信息来自 pom 中 git-commit-id-maven-plugin 在 initialize 阶段生成的git.properties,排查线上版本问题时非常有用。

后端包结构与业务模块对应关系

职责
gb28181/GB/T 28181 核心:transmit/下是 SIP 请求/应答处理器(注册、Keepalive、Catalog、INVITE、BYE 等),bean/是 85 个协议消息 Bean,service/impl/是设备、通道、平台级联等业务实现
jt1078/部标 JT/T 808 + JT/T 1078 车载视频协议栈,codec/是报文编解码,proc/下有 76 个指令处理器
media/流媒体服务对接层,zlm/(ZLMediaKit)与abl/(AB 流媒体)双实现,event/hook处理媒体服务回调
streamProxy/streamPush/将非 GB 流(RTSP/RTMP 等)代理为国标共享、普通流推送到国标平台
service/+storager/跨模块服务接口(录像、告警、云台、角色权限等)与 Redis/数据库混合存储
conf/全局配置、安全、WebSocket、内嵌 FTP 服务器、Redis 配置

前端开发时建议按“页面 (views) → 状态 (store) → 接口 (api) → 后端 Controller (gb28181/controller)”这条链路逐层追踪,Controller 层有 27 个 REST 接口类,可直接与 web/src/api 中的请求路径一一对应;若需要调试 REST 接口,可借助 knife4j 提供的在线文档。

三、为什么“跟代码学流程必须参考 28181 文档”

文档特别强调:“跟代码学流程需要参考 28181 文档,只看代码你会很懵的”。这句话针对的是 SIP 信令状态机式交互的特性。以注册流程为例,仓库中的理论文档 注册流程 描述的就是代码要实现的完整交互:

设备 -> WVP-PRO: 1. Register WVP-PRO -> 设备: 2. 401 Unauthorized 设备 -> WVP-PRO: 3. Register(携带 Authorization 信任书) WVP-PRO -> 设备: 4. 200 OK(验证通过)

这是 RFC 3261 规定的“挑战-应答式”数字摘要认证。如果不先知道“第二次 Register 必须携带第一次 401 应答中 WWW-Authenticate 给出的挑战参数”,直接读 transmit 包下 Register 请求处理器的分支代码(首次注册返回 401、二次注册校验摘要并建立会话)就会迷失方向。

仓库文档目录提供了配套的理论素材,学习顺序建议:

  1. 注册流程:设备接入的基础信令;
  2. 统一编码规则:GB/T 28181 附录 D 的 20 位/16 位编码规则(中心编码 + 行业编码 + 类型编码 + 序号),这是设备/通道 ID 校验与生成逻辑的标准依据;
  3. 点播流程、级联点播:INVITE 交互与 SDP 协商,理解后 PlayServiceImpl.java 这类核心类才不再晦涩。

四、“项目大量使用了异步操作”的源码印证

文档明确提示项目大量使用异步操作,阅读代码时必须带着“这段逻辑可能不在当前调用栈里”的意识。从源码结构看,异步主要体现在两条主线:

  1. CompletableFuture 链式编排CompletableFuture/@Async在 26 个 Java 类中出现,覆盖设备服务(DeviceServiceImpl.java)、点播服务(PlayServiceImpl.java)、流媒体对接(MediaServerServiceImpl.java)、流代理/推流等模块。典型场景是:一次点播需要先后完成“向 ZLM 申请 RTP 接收端口 → 发送 INVITE 携带 SDP → 等待媒体上行事件”,这些跨模块的等待-回调关系正是用 Future 串联的;
  2. SIP 信令的观察者 + 事件发布:SIPProcessorObserver.java 将 SIP 协议栈事件分发给各类 Request/Response 处理器,各处理器内部再触发 Spring 事件(gb28181/event/下 15 个事件类)解耦业务逻辑;
  3. 定时任务兜底WVPTimerTask等定时类周期性清理超时会话、刷新设备/媒体服务在线状态,保证异步链路即使某一步丢失也能被恢复。

五、抓包:GB/T 28181 调试的第一技能

文档强调“必须学会抓包”,配套的 抓包 一文给出了完整方法论。GB/T 28181 是 SIP 信令 + RTP 媒体分离的协议,调试的核心手段就是同时观察两路流量:

工具选择

  • 图形界面环境(Windows、Ubuntu 等):Wireshark,直观查看 SIP 消息头/SDP 内容;
  • 命令行服务器:tcpdump(Linux 一般自带,tcpdump --version可验证),抓出的.pcap文件可拷到图形界面用 Wireshark 打开。

过滤器(GB/T 28181 场景通常只关注 SIP 和 RTP):

# 只过滤 SIP sip # 只获取 RTP 数据 rtp # 默认组合 sip or rtp # 叠加设备 IP sip and ip.addr==192.168.1.3 # 叠加 SIP 端口 sip and udp.port==5060

服务器端抓包操作:先用ip addr确认网卡名,然后抓取网卡全量数据(不过滤,保证数据完整):

sudo tcpdump -i wlp3s0 -w demo.pcap

抓包保持运行期间在 WVP-PRO 页面上执行目标操作(注册、点播、录像回放等),完成后Ctrl+C结束,将demo.pcap下载到本地用 Wireshark 分析。这套流程是排查设备注册失败(401 挑战参数不匹配)、点播无流(SDP 中 IP/端口错误)、级联异常(对端平台未正确应答 INVITE)等问题的标准动作,与文档中 注册失败、播放错误 等排障文档可以配合使用。

六、构建与运行

完整的编译部署文档见 编译,参与开发时的标准构建流程为:

# 1. 编译前端(完成后会在 src/main/resources 下生成 static 目录) cd wvp-GB28181-pro/web/ npm --registry=https://registry.npmmirror.com install npm run build:prod # 2. 生成可执行 jar(默认 jar profile) cd wvp-GB28181-pro mvn package # 3.(可选)生成 war 部署包 mvn package -P war

产物为target/wvp-pro-VERSION.jar(或 .war)。若编译报错,官方文档提示通常是国内网络导致的依赖下载失败,pom 中已配置阿里云镜像仓库(pom.xml)。后端依赖 MySQL/Redis(或 H2 内嵌库)与 ZLMediaKit 媒体服务,完整服务说明与 docker 编排见 docker/docker-compose.yml。

七、提交代码:Fork + PR 与编码规约

官方文档规定的贡献路径是:

  1. Fork 项目,在自己的分支上开发并提交;
  2. 提交 Pull Request,由项目维护者审核后合并到主线;
  3. 提交过程遵循**《阿里巴巴 Java 开发手册(编码规约)》**;维护者坦言“现有代码也有很多代码没有做到,但是我们在朝这个方向努力”——即规约是新代码的底线要求,而非对存量代码的追溯性约束。

结合仓库现状,贡献者在开发时还应注意:

  • 新增 REST 接口时保持gb28181/controller/与前端 web/src/api 的同步,前端请求层有统一的 request.js 拦截器;
  • 涉及协议字段变更时,先对照 统一编码规则 与信令理论文档确认标准语义,再修改 bean 包下的消息模型,避免破坏与现有设备的兼容性;
  • 涉及信令交互的修改,提交 PR 前按第五节流程抓包自测,把关键 SIP 报文序列作为 PR 说明的佐证;
  • 数据库结构变更需同步更新 数据库 目录下对应版本的 SQL(仓库按 2.6.9~2.7.4 维护了 MySQL 与 PostgreSQL/金仓两套初始化及升级脚本)。

八、小结

参与 wvp-GB28181-pro 开发的核心准备可以浓缩为四件事:对齐环境(JDK 21 + Spring Boot 3 后端、Vue 2 + Element UI 前端,以 pom.xml 与 web/package.json 为准)、带着标准文档读代码(注册/编码/点播理论文档对应gb28181/transmitgb28181/bean的实现)、认清异步主线(CompletableFuture + 事件发布 + 定时任务兜底)、抓包验证一切信令行为(Wireshark/tcpdump 双工具,sip/rtp 过滤器)。遵循 Fork + PR 与阿里编码规约提交,即可按项目约定安全地向主线贡献代码。

【免费下载链接】wvp-GB28181-pro基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将普通摄像机/直播流/直播推流转国标共享到国标平台。项目地址: https://gitcode.com/GitHub_Trending/wv/wvp-GB28181-pro

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询