使用最新版的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
posted @ 2024-11-04 10:06  秋将暮  阅读(37)  评论(0编辑  收藏  举报