使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器
说明
前段时间发布了一系列GB28181测试环境的搭建,最近整理一下服务器和模拟设备一个完整的博客,不需要设备就可以熟悉GB28181协议.
安装
主机建议使用Ubuntu 22.04.5 LTS x86_64
及以上版本.
1.安装nodejs
简介
到nodejs官网下载最新LTS版本. 因为nodejs依赖glic库,所以ubuntu使用最新的LTS版本.
当前nodejs依赖glibc2.28版本,为了确保nodejs能正常运行,需要先查询系统的glibc版本.
strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_
#输出如下信息
......
GLIBC_2.27
GLIBC_2.28
GLIBC_2.29
GLIBC_2.30
GLIBC_2.31
GLIBC_2.32
GLIBC_2.33
GLIBC_2.34
GLIBC_2.35
安装步骤
#解压缩
tar -Jxf node-v20.9.0-linux-x64.tar.xz
#移动位置
sudo mv node-v20.9.0-linux-x64/ /opt
#编辑/etc/profile内容
export PATH="/opt/node-v20.9.0-linux-x64/bin:$PATH"
#使环境变量使能
source /etc/profile
#查看nodejs是否正常安装
node -v
v20.9.0
npm -v
10.1.0
2.安装java环境
sudo apt install -y openjdk-11-jre maven
#确认java安装成功
java -version
#输出版本信息
openjdk 11.0.21 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
#maven
mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.24, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.5.0-18-generic", arch: "amd64", family: "unix"
3.安装mysql
安装
#移除以前的mysql相关
sudo apt remove --purge mysql-\*
#安装mysql
sudo apt install mysql-server mysql-client
#查看是否启动
systemctl status mysql
#手动启动
systemctl start mysql
#查看mysql版本
mysql --version
修改密码
#免密进入mysql
sudo mysql -uroot
#your_new _password 修改成用户密码
alter user 'root'@'localhost' identified with mysql_native_password by 'your_new _password';
#然后就可以使用密码登录了
mysql -u root -p
use mysql;
#root账号可以访问所有主机
update user set host='%' where user= 'root';
#ERROR 1046 (3D000): No database selected
flush privileges;
#授权
grant all on *.* to 'root'@'%';
flush privileges;
quit;
4.安装redis
sudo apt update
sudo apt install redis-server
#启动
redis-server
#查看Redis是否正常
systemctl status redis
redis-cli
#输入ping返回PONG表示正常
5.安装编译器
sudo apt install build-essential
g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
6.安装cmake
官网https://cmake.org/下载最新稳定版本 cmake-3.27.8-linux-x86_64.tar.gz, 这样的好处可以方便查找帮助文档,方便查看cmake内部的资料.
tar -zxvf cmake-3.27.8-linux-x86_64.tar.gz
sudo mv cmake-3.27.8-linux-x86_64 /opt/
sudo vim /etc/profile
#增加
export PATH="/opt/cmake-3.27.8-linux-x86_64/bin:$PATH"
source /etc/profile
cmake --version
#显示安装成功
cmake version 3.27.8
CMake suite maintained and supported by Kitware (kitware.com/cmake).
/opt/cmake-3.27.8-linux-x86_64/doc/cmake/html
为网页帮助文档.
7.安装依赖库
sudo apt install -y libssl-dev
sudo apt install -y libsdl1.2-dev
sudo apt install -y libavcodec-dev
sudo apt install -y libavutil-dev
sudo apt install -y ffmpeg
8.编译ZLMediaKit
git clone https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
git submodule update --init
git submodule status
08c094ea14f259ecf0c356e6243cb47ee96ce292 3rdpart/ZLToolKit (heads/master)
69098a18b9af0c47549d9a271c054d13ca92b006 3rdpart/jsoncpp (1.9.0-178-g69098a18)
cf83ebc62e65ae6f3b73bc5ebd06cb0b2da49fa5 3rdpart/media-server (v1.0.0-173-gcf83ebc6)
b02d2a4c1abf95db45e50bb77d789defa0fcc4b7 www/webassist (heads/main)
#编译
mkdir build
cd build
cmake ..
make -j4
编译结果在release目录下,主要有三部分组成:
-
MediaServer 进程
cd ZLMediaKit/release/linux/Debug #通过-h可以了解启动参数 ./MediaServer -h
-
c api 的 SDK
头文件在ZLMediaKit/api/include
库文件为:ZLMediaKit/release/linux/Debug/libmk_api.so
- 以
test_
开头的测试程序
相关代码在ZLMediaKit/tests
目录下,你可以对照代码启动测试进程。
9.编译wvp-GB28181-pro
git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
#1.编译前端页面
cd wvp-GB28181-pro/web_src/
npm --registry=https://registry.npmmirror.com install
npm run build
#编译完成后会生成目录: wvp-GB28181-pro/src/main/resources/static
#2.生成可执行jar
cd wvp-GB28181-pro
mvn package
#编译后生成文件: wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.jar
#3.生成war
cd wvp-GB28181-pro
mvn package -P war
#编译后生成文件: wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.war
配置
目录结构如下
.
├── config #配置文件
├── record #录像保存
├── wvp-GB28181-pro
└── ZLMediaKit
把所有的配置文件放到config目录中
cp wvp-GB28181-pro/target/classes/配置详情.yml config
cp ZLMediaKit/release/linux/Debug/config.ini config
最终config目录内容如下:
config
├── wvp_gb28181.sh #wvp-GB28181-pro运行脚本
├── wvp_gb28181.yml #wvp-GB28181-pro配置文件
├── ZLMediaKit.ini #ZLMediaKit配置文件
└── ZLMediaKit.sh #ZLMediaKit运行脚本
1.ZLMediaKit配置
[api]
#和 wvp_gb28181.yml 中 media:secret: 一致
secret=BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x
[general]
#和 wvp_gb28181.yml 中 media:id: 一致
mediaServerId=FQ3TF8yT83wh5Wvz
[http]
#和 wvp_gb28181.yml 中 media:http-port: 一致
port=80
[rtp_proxy]
#和 wvp_gb28181.yml 中 media:rtp:port-range: 一致
port_range=30000-35000
2.wvp-GB28181-pro配置
2.1.配置ZLMediaKit连接信息
media:
#和ZLMediaKit设置一致
secret: BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x
id: FQ3TF8yT83wh5Wvz
http-port: 80
rtp:
port-range: 30000,30500
# [必须修改] zlm服务器的内网IP
ip: 192.168.137.2
hook-ip: 192.168.137.2
2.2.28181服务器的配置
sip:
ip: 192.168.137.2
# [可选] 没有任何业务需求,仅仅是在前端展示的时候用
show-ip: 192.168.137.2
# [可选] 28181服务监听的端口
port: 5061
# [可选]
domain: Local1
# [可选]
id: 32050950002000005001
# [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
password: eLTE@com123
2.3.配置web服务器
#web访问
server:
port: 18080
2.4.数据库配置
2.4.1.修改root用户的密码
#查看数据库状态
systemctl status mysql
#进入mysql
mysql -u root -p
#更改root用户密码为root123,并修改为root用户可以使用任何电脑访问所有数据库
use mysql;
update user set host='%' where user= 'root';
flush privileges;
select host,user,plugin from user where user='root';
alter user 'root'@'%' identified with mysql_native_password by 'root123';
flush privileges;
grant all on *.* to 'root'@'%';
flush privileges;
2.4.2.删除以前wvp相关数据库
#显示所有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wvp |
| wvp2 |
+--------------------+
6 rows in set (0.00 sec)
#显示当前数据库
select database();
+------------+
| database() |
+------------+
| mysql |
+------------+
1 row in set (0.00 sec)
#删除wvp相关数据库
mysql> drop database wvp;
Query OK, 17 rows affected (0.32 sec)
mysql> drop database wvp2;
Query OK, 0 rows affected (0.01 sec)
2.4.3.删除mysql数据库中wvp相关表格
#显示mysql数据库中所有表格
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| replication_asynchronous_connection_failover |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version |
| replication_group_member_actions |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
| wvp_cloud_record |
| wvp_device |
| wvp_device_alarm |
| wvp_device_channel |
| wvp_device_mobile_position |
| wvp_gb_stream |
| wvp_log |
| wvp_media_server |
| wvp_platform |
| wvp_platform_catalog |
| wvp_platform_gb_channel |
| wvp_platform_gb_stream |
| wvp_resources_tree |
| wvp_stream_proxy |
| wvp_stream_push |
| wvp_user |
| wvp_user_role |
+------------------------------------------------------+
54 rows in set (0.00 sec)
#删除wvp相关表格
drop table wvp_cloud_record;
drop table wvp_device;
drop table wvp_device_alarm;;
drop table wvp_device_channel;
drop table wvp_device_mobile_position;
drop table wvp_gb_stream;
drop table wvp_log;
drop table wvp_media_server;
drop table wvp_platform;
drop table wvp_platform_catalog;
drop table wvp_platform_gb_channel;
drop table wvp_platform_gb_stream;
drop table wvp_resources_tree;
drop table wvp_stream_proxy;
drop table wvp_stream_push;
drop table wvp_user;
drop table wvp_user_role;
2.4.4.数据库连接配置修改
原来的
dynamic:
primary: master
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
username: root
password: root123
hikari:
connection-timeout: 20000 # 是客户端等待连接池连接的最大毫秒数
initialSize: 50 # 连接池初始化连接数
maximum-pool-size: 200 # 连接池最大连接数
minimum-idle: 10 # 连接池最小空闲连接数
idle-timeout: 300000 # 允许连接在连接池中空闲的最长时间(以毫秒为单位)
max-lifetime: 1200000 # 是池中连接关闭后的最长生命周期(以毫秒为单位)
share:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wvp269_1?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: root
修改为
dynamic:
primary: master
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
username: root
password: root123
hikari:
connection-timeout: 20000 # 是客户端等待连接池连接的最大毫秒数
initialSize: 50 # 连接池初始化连接数
maximum-pool-size: 200 # 连接池最大连接数
minimum-idle: 10 # 连接池最小空闲连接数
idle-timeout: 300000 # 允许连接在连接池中空闲的最长时间(以毫秒为单位)
max-lifetime: 1200000 # 是池中连接关闭后的最长生命周期(以毫秒为单位)
2.4.5.建立并导入数据库
#复制数据库
cp wvp-GB28181-pro/数据库/2.7.3/初始化-mysql-2.7.3.sql config/mysql.sql
create DATABASE wvp2;
use wvp2;
source /home/multimedia/gb28181/wvp_zlm_platform/config/mysql.sql;
flush privileges;
exit
2.5.跨域配置
# [根据业务需求配置]
user-settings:
# 跨域配置,不配置此项则允许所有跨域请求,配置后则只允许配置的页面的地址请求, 可以配置多个
allowed-origins:
- http://localhost:8008
- http://192.168.137.2:8008
运行
准备运行脚本
ZLMediaKit.sh
WVP_ZLM_PLATFORM_PATH=/home/multimedia/gb28181/wvp_zlm_platform
ZLMEDIAKIT_MEDIASERVER=${WVP_ZLM_PLATFORM_PATH}/ZLMediaKit/release/linux/Debug/MediaServer
ZLMEDIAKIT_CONFIG_FILE=${WVP_ZLM_PLATFORM_PATH}/config/ZLMediaKit.ini
sudo ${ZLMEDIAKIT_MEDIASERVER} -c ${ZLMEDIAKIT_CONFIG_FILE}
wvp_gb28181.sh
WVP_ZLM_PLATFORM_PATH=/home/multimedia/gb28181/wvp_zlm_platform
WVP_GB28181_JAR=${WVP_ZLM_PLATFORM_PATH}/wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.jar
WVP_GB28181_CONFIG_FILE=${WVP_ZLM_PLATFORM_PATH}/config/wvp_gb28181.yml
sudo java -jar ${WVP_GB28181_JAR} --spring.config.location=${WVP_GB28181_CONFIG_FILE}
运行服务
每个脚本需要一个终端窗口
#需要先运行ZLMediaKit
ZLMediaKit.sh
#测试
http://192.168.137.2/
https://192.168.137.2/webassist/?secret=BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x
https://192.168.137.2/webrtc
#然后运行wvp_gb28181
./wvp_gb28181.sh
#测试
http://192.168.137.2:18080/#/login
#用户名: admin
#密码: admin
使用国标设备对接国标服务器
可能手头没有国标设备,为了方便验证国标服务器是否搭建成功,这里使用国标模拟设备进行对接测试.国标模拟设备选择 http://happytimesoft.com/的国标模拟设备,下载地址为 http://happytimesoft.com/products/gb28181-device/index.html,支持windows x86,windows x64, linux,andorid等,这里使用windows x64版本.
下载后解压修改配置文件gb28181device.cfg
,其他保持不变.
<?xml version="1.0" encoding="utf-8"?>
<config>
<server_ip>192.168.137.2</server_ip>
<server_port>5061</server_port>
<server_id>32050950002000005001</server_id>
<server_domain>Local1</server_domain>
<device_id>32050950002000005067</device_id>
<device_name>myTestDevice</device_name>
<password>eLTE@com123</password>
<channel>
<cid>32050950001320418045</cid>
<cname>myTestCh1</cname>
</channel>
</config>
双击GB28181Device.exe
运行国标模拟设备,在国标设备
页面显示出设备
虚拟设备控制台显示如下信息说明注册成功
Happytime GB28181 Device V7.0
Registering to the platform 192.168.137.2
sip_ntf_cb, evt : PUEVT_REGING
sip server date : 2024-10-28T14:58:32.148
sip_ntf_cb, evt : PUEVT_REG_PASS
在http://192.168.137.2:18080
中打开'国标设备->通道->播放',即可正常播放,效果如下图
云端录像
参考官网文档: https://doc.wvp-pro.cn/#/
由于需要验证音频是否正常,录像后发送到手机端播放.
摘录官方文档说明
云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下。
- 国标设备是否录像: 可以再WVP的配置中user-settings.record-sip设置为true那么每次点播以及录像回放都会录像;
- 推流设备是否录像: 可以再WVP的配置中user-settings.record-push-live设置为true;
- 拉流代理的是否录像: 在添加和编辑拉流代理时可以指定, 每次点播都会进行录像
- 录像文件存储路径配置: 可以修改media.record-path来修改录像路径,但是如果有旧的录像文件,请不要迁移,因为数据库记录了每一个录像的绝对路径,一旦修改会造成找到文件,无法定时移除以及播放
- 录像保存时间: 可以修改media.record-day来修改录像保存时间,单位是天;
保证如下设置即可:
# [根据业务需求配置]
user-settings:
# 国标是否录制
record-sip: true
在国标设备页面设置开启音频
,然后播放,此时会在ZLMediaKit相应目录下录制文件.
例如:
/home/multimedia/gb28181/wvp_zlm_platform/ZLMediaKit/release/linux/Debug/www/record/rtp
tree
.
├── 32050950002000005065_32050950002000005061
│ └── 2024-10-28
│ ├── 15-42-12-0.mp4
│ └── 15-44-26-0.mp4
├── 32050950002000005065_32050950002000005062
│ └── 2024-10-28
│ └── 15-44-00-0.mp4
├── 32050950002000005065_32050950002000005063
│ └── 2024-10-28
│ └── 15-44-40-0.mp4
└── 32050950002000005067_32050950001320418045
└── 2024-10-28
└── 15-36-13-0.mp4