wvp-pro-talk развертывание внутренней связи национального стандарта

развертывание wvp-pro-talk

предисловие

wvp-pro-talk добавляет в проект wvp-pro функцию внутренней связи национального стандарта 28181. Развертывание wvp-pro-talk , за исключением того, что необходимо включить функцию https, по сути такое же, как и развертывание wvp-pro .

Мое первоначальное намерение состояло в том, чтобы позволить всем обращаться к документам по развертыванию wvp и zlmediakit для развертывания wvp-pro-talk . Однако у большинства людей все еще возникают различные проблемы в процессе развертывания, поэтому этот документ опубликован.

В процессе общения со всеми я обнаружил, что среда развертывания и идеи развертывания в каждой компании различны. Здесь я перечислю два часто используемых решения по развертыванию, и решения, которые я лично проверил, следующие:

  • wvp + nginx (разделение передней и задней частей) + развертывание докера zlmediakit
  • wvp (фронтенд и бэкенд не разделены) + вручную скомпилировать zlmediakit

1. Авторская серверная среда

Сервер: Tencent Cloud centos 7.6_1810

операционная среда wvp-pro-talk (версии следующего программного обеспечения вы можете определить самостоятельно, вам не обязательно быть таким же, как я)

  • редис 6.2.6
  • MySQL 5.7
  • jdk (автор использует jdk 1.8_212. Рекомендуется использовать последнюю версию 1.8, поскольку старая версия 1.8 имеет проблемы совместимости с tomcat после включения https. Я столкнулся с этим и решил это после обновления jdk)
  • maven 3.6 ( необязательно. Обычно среда разработки упакована в jar-пакеты, а затем загружается в среду развертывания, поэтому нет необходимости устанавливать maven в среду развертывания)
  • nodejs v10.24.1 ( необязательно по той же причине, что и выше)

zlmediakit, зависимая от ручной компиляции среда (версия, используемая автором)

  • gcc 4.8.5
  • cmake 3.21.0-rc3
  • опенссл 1.1.1к
  • libsrtp >= 2.3.0
  • ffmpeg 4.2.3 (необязательно)

2. Два необходимых условия

2.1 https

Механизм безопасности браузера, для вызова микрофона устройства веб-сайт должен быть https, без https невозможно вызвать микрофон, два варианта:

  • самоподписанный сертификат

При первом доступе к самозаверяющему сертификату браузер отобразит предупреждение, и вам нужно будет нажать вручную, чтобы продолжить.

В каталоге zlmediakit есть default.pem.Если мы не укажем сертификат, то этот сертификат будет загружен по умолчанию.

Если используется самозаверяющий сертификат, браузеру также необходимо получить доступ к SSL-порту zlmediakit, иначе видео не будет воспроизводиться, поскольку интерфейс WVP определит, что если сайт https, то адрес воспроизведения видео «Взято» также является безопасным адресом воспроизведения, но сертификат zlmediakit также является самоподписанным и будет перехвачен браузером, поэтому нам необходимо получить доступ к порту SSL zlmediakit в адресной строке браузера.После доступа появится экран тревоги. Нажмите, чтобы продолжить, а затем воспроизведите видео. Экран видео появится в обычном режиме, как показано ниже. Демонстрация ошибки (видео невозможно воспроизвести, поскольку сертификат zlmediakit не является доверенным):

  • Сертификат общедоступной сети

    Я использую сертификат Alibaba Cloud:

2.2 zlmediakit webrtc

Поток голосовых данных записывается через webrtc zlmediakit, поэтому функция webrtc zlmediakit должна быть включена, чтобы обеспечить доступность функции внутренней связи национального стандарта. Подробную информацию о том, как включить webrtc в zlmediakit, см. в разделе [ZlmediaKit Deployment] (#3. ZlmediaKit). Развертывание), zlmediakit включает webrtc. Папка webrtc будет создана следующим образом:

3. Развертывание ZlmediaKit

**Примечание.** Чтобы вручную скомпилировать zlmeidakit, необходимо включить функцию webrtc. Чтобы включить функцию webrtc, необходимо установить openssl и libsrtp. При развертывании zlmediakit с помощью Docker функция webrtc включается по умолчанию без какой-либо специальной настройки. .

3.1 Компиляция zlmediakit вручную

  • Установить gcc
# 首先查看是否已经安装gcc,如果安装且版本>=4.8跳过此步骤
$ gcc -version
# 安装gcc 
$ yum isntall gcc
$ yum -y install gcc-c++
  • Установить cmake
$ yum -y install cmake
# 查看cmake 版本
$ cmake -version
  • Установить OpenSSL
# 服务器安装好后一版自带openssl,但是自带的openssl可能版本和zlmediakit所需的版本不匹配,此处推荐安装openssl 1.1.1K
#查看openssl版本
$ openssl version -a
# 安装openssl
$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
$ tar -xvzf openssl-1.1.1k.tar.gz
$ yum install -y zlib zlib-devel perl-CPAN
$ ./config shared --openssldir=/usr/local/openssl --prefix=/usr/local/openssl
$ make && make install
$ echo "/usr/local/lib64/" >> /etc/ld.so.conf
$ echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
$ ldconfig
$ ln -s /usr/local/openssl/bin/openssl  /usr/local/bin/openssl # 替换系统openssl,非必须
$ openssl version -a
  • Установить библиотеку libsrtp
$ wget https://codeload.github.com/cisco/libsrtp/tar.gz/refs/tags/v2.3.0
$ tar -xvzf libsrtp-2.3.0.tar.gz
$ cd libsrtp-2.3.0
$ ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl
$ make -j8 && make install
#对于一些比较新的编译环境(如GCC 10+),编译 libsrtp-2.3.0 可能会存在问题,可以考虑切换到 2.5.0 版本,即
$ wget https://github.com/cisco/libsrtp/archive/refs/tags/v2.5.0.tar.gz
$ tar -xvzf libsrtp-2.5.0.tar.gz
$ cd libsrtp-2.5.0
$ ./configure --enable-openssl --with-openssl-dir=/usr/local/openssl
$ make -j8 && make install
  • Скачать исходный код zlm

git клон --глубина 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
Не забудьте выполнить эту команду
git submodule update --init

  • Скомпилировать zlmediakit
$ mkdir build

$ cd build

# -DENABLE_WEBRTC=true 开启webrtc,必须开启
$ cmake .. -DENABLE_WEBRTC=true  -DOPENSSL_ROOT_DIR=/usr/local/openssl                   -DOPENSSL_LIBRARIES=/usr/local/openssl/lib

$ cmake --build . --target MediaServer

# 最终输出
[ 96%] Built target test_rtcp_fci
[ 96%] Building CXX object tests/CMakeFiles/test_rtp.dir/test_rtp.cpp.o
[ 97%] Linking CXX executable ../../release/linux/Debug/test_rtp
[ 97%] Built target test_rtp
[ 97%] Building CXX object tests/CMakeFiles/test_wsServer.dir/test_wsServer.cpp.o
[ 97%] Linking CXX executable ../../release/linux/Debug/test_wsServer
[ 97%] Built target test_wsServer
[ 97%] Building CXX object tests/CMakeFiles/test_server.dir/test_server.cpp.o
[ 97%] Linking CXX executable ../../release/linux/Debug/test_server
[ 97%] Built target test_server
[ 98%] Built target jsoncpp
[ 98%] Linking CXX executable ../../release/linux/Debug/MediaServer
[100%] Built target MediaServer
  • Запустить zlmediakit
# -s 参数指定加载的ssl证书
./MediaServer -s xx.pem

3.2 Docker развертывает zlmediakit

  • Загрузите образ докера zlmediakit
$ docker pull zlmediakit/zlmediakit:master
  • Посмотреть изображение
$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
zlmediakit/zlmediakit   master    e461953e6ef1   3 days ago     597MB
nginx                   latest    eb4a57159180   2 weeks ago    187MB
  • Запустите образ ( сопоставление портов и монтирование каталога зависят от вашей ситуации )
docker run -d -p 1935:1935 -p 80:80 -p 554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 446:446 -p 30000-30050:30000-30050 -p 30000-30050:30000-30050/udp --name zlmediakit --restart=always --env MODE=standalone -e TZ="Asia/Shanghai" -v /usr/local/docker/zlmediakit/media/bin:/opt/media/bin -v /usr/local/docker/zlmediakit/media/conf:/opt/media/conf zlmediakit/zlmediakit:master
  • Возможные проблемы с развертыванием докера

    Docker выполняет сопоставление портов диапазона. Если диапазон портов слишком велик, он может потреблять память. Первоначально я сопоставил диапазон портов от 30000 до 30500 и обнаружил, что память сервера не поддерживает его. Затем я изменил его на 30000–30050, в зависимости от Однако если включен сбор многопортового трафика, необходимо включить как минимум 26 портов.

    Docker развертывает zlmediakit для загрузки сертификата общедоступной сети, поскольку я не нашел места для установки параметров команды запуска контейнера. Я изменил имя своего сертификата на default.pem и позволил zlmediakit загрузить его автоматически, поскольку zlmediakit загружает по умолчанию. .pem по умолчанию.

3.3 Две необходимые конфигурации для zlmediakit config.ini после завершения развертывания

  • Изменить формат первой отправки голосовых данных

    Голосовой формат, принимаемый большинством устройств, – g711a. Этот шаг зависит от формата, поддерживаемого устройством. В zlmediakit по умолчанию в качестве первого формата используется PCMU. Если сторона устройства поддерживает формат G711A, в первую очередь необходимо настроить PCMA. Если формат не соответствует стороне устройства, возникнут проблемы с шумом.

  • Для развертывания общедоступной сети вам необходимо изменить внешний IP-адрес rtc на IP-адрес общедоступной сети, который по умолчанию остается пустым.

3. развертывание wvp-pro-talk

3.1 Нераздельное развертывание фронтенда и бэкенда

Я не буду вдаваться в подробности об операционной среде wvp, которая использует redis mysql и инициализацию базы данных. Пожалуйста, установите ее самостоятельно.

  • Получить код
git clone https://github.com/MengFanLu1/wvp-gb28181-talk-demo.git
  • Фронтальная упаковка
# 1.进入web_src文件夹
npm install

npm run build

#打包后生成的文件会自动放到后端的resource/static目录下

  • Конфигурация серверной части (разделение не-интерфейсной и серверной части требует включения https в файле конфигурации. Это моя конфигурация общедоступной сети, обратитесь к ней)
spring:
    # [可选]上传文件大小限制
    servlet:
        multipart:
            max-file-size: 10MB
            max-request-size: 100MB
    # REDIS数据库配置
    redis:
        # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1
        host: 127.0.0.1
        # [必须修改] 端口号
        port: 60001
        # [可选] 数据库 DB
        database: 0
        # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接
        password:
        # [可选] 超时时间
        timeout: 10000
        # mysql数据源
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:60002/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
        username: root
        password:
        druid:
            initialSize: 10                       # 连接池初始化连接数
            maxActive: 200                        # 连接池最大连接数
            minIdle: 5                            # 连接池最小空闲连接数
            maxWait: 60000                        # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
            keepAlive: true                       # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。
            validationQuery: select 1             # 检测连接是否有效sql,要求是查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。
            testWhileIdle: true                   # 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
            testOnBorrow: false                   # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
            testOnReturn: false                   # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
            poolPreparedStatements: false         # 是否開啟PSCache,並且指定每個連線上PSCache的大小
            timeBetweenEvictionRunsMillis: 60000  # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
            minEvictableIdleTimeMillis: 300000    # 配置一個連線在池中最小生存的時間,單位是毫秒
            filters: stat,slf4j             # 配置监控统计拦截的filters,监控统计用的filter:sta, 日志用的filter:log4j
            useGlobalDataSourceStat: true         # 合并多个DruidDataSource的监控数据
            # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
            connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=1000
            #stat-view-servlet.url-pattern: /admin/druid/*

#[可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
    port: 18080
    ssl:
        # [可选] 是否开启HTTPS访问
        enabled: true
        # [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名
        key-store: classpath:gbslink.top.pfx
        # [可选] 证书密码
        key-store-password: g0jr52ef
        # [可选] 证书类型, 默认为jks,根据实际修改
        key-store-type: PKCS12
# 作为28181服务器的配置
sip:
    # [必须修改] 本机的IP
    ip: 10.0.4.4
    # [可选] 没有任何业务需求,仅仅是在前端展示的时候用
    show-ip: 124.220.191.166
    # [可选] 28181服务监听的端口
    port: 15060
    # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
    # 后两位为行业编码,定义参照附录D.3
    # 3701020049标识山东济南历下区 信息行业接入
    # [可选]
    domain: 3402000000
    # [可选]
    id: 34020000002000000001
    # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
    password: 12345678

#zlm 默认服务器配置
media:
    id: your_server_id
    # [必须修改] zlm服务器的内网IP
    ip: 10.0.4.4
    # 视频播放地址,如果有域名可以使用域名,没有域名使用ip
    stream-ip: gbslink.top
    # [可选] wvp在国标信令中使用的ip,此ip为摄像机可以访问到的ip, 置空使用 media.ip
    sdp-ip: 124.220.191.166
    # [可选] zlm服务器的hook所使用的IP, 默认使用sip.ip
    hook-ip: 124.220.191.166
    # [必须修改] zlm服务器的http.port
    http-port: 80
    # [可选] zlm服务器的hook.admin_params=secret
    secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
    # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
    rtp:
        # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
        enable: true
        # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
        port-range: 30000,30500 # 端口范围
        # [可选] 国标级联在此范围内选择端口发送媒体流,
        send-port-range: 30000,30500 # 端口范围
    # 录像辅助服务, 部署此服务可以实现zlm录像的管理与下载, 0 表示不使用
    record-assist-port: 0
# [可选] 日志配置, 一般不需要改
logging:
    config: classpath:logback-spring-local.xml

  • Бэкэнд-упаковка

пакет mvn

  • запускать

Загрузить на сервер

java -jar wvp-pro-talk.jar

3.2 Раздельное развертывание фронтенда и бэкенда с использованием nginx в качестве прокси

  • Фронтальная упаковка загружает сгенерированные файлы в каталог html nginx.

  • конфигурация nginx

    server {
          
          
        # 服务器端口使用443,开启ssl, 这里ssl就是上面安装的ssl模块
        listen       443 ssl;
        # 域名,多个以空格分开
        server_name  gbslink.top www.gbslink.top;
        
        # ssl证书地址
        ssl_certificate     /etc/nginx/ssl/gbslink.top.pem;  # pem文件的路径
        ssl_certificate_key  /etc/nginx/ssl/gbslink.top.key; # key文件的路径
        
        # ssl验证相关配置
        ssl_session_timeout  5m;    #缓存有效期
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;    #加密算法
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;    #安全链接可选的加密协议
        ssl_prefer_server_ciphers on;   #使用服务器端的首选算法
    
        location / {
          
          
            root /usr/share/nginx/html;
            index index.html index.htm;
        }
    	
    	location  /api/ {
          
          
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header REMOTE-HOST $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                add_header Access-Control-Allow-Methods *;
    			add_header Access-Control-Allow-Origin $http_origin;
                proxy_pass http://124.220.191.166:18080; #公网地址,需要防火墙打开端口
            }
    }
    # http请求重定向到https
    server {
          
          
        listen 80;
        
        #填写绑定证书的域名
        server_name gbslink.top www.gbslink.top;
        
        #强制将http的URL重写成https
        rewrite ^(.*) https://$server_name$1 permanent; 
    }
    
    

    Если в nginx настроен https, нет необходимости включать https в серверной части wvp: вы можете просто использовать прокси-сервер nginx напрямую.

  • перезапуск nginx

    ./nginx -s reload
    
  • Бэкэнд-упаковка

    пакет mvn

  • запускать

    Загрузить на сервер

    Java -jar xxx.jar

4. Порты, которые необходимо открыть брандмауэру

wvp (следующие порты зависят от развернутых служб)

Фронтенд nginx 443 80

Бэкенд 18080

zlmediakit (следующий порт является портом по умолчанию для zl, если вы измените его, используйте свой собственный)

rtmp 1935/udp

rtsp 554 нет

Порт трафика по умолчанию: 30000-30500/udp 30000-30500/tcp

вебртк 8000/udp 8000/tcp

http 80/tcp (конфликт с nginx)

https 443/tcp (конфликт с nginx)

5. Домофонный вход

6. Свяжитесь с автором

шх: 17686791164

qq: 252657030

Демонстрационный адрес проекта: https://www.gbslink.top

Supongo que te gusta

Origin blog.csdn.net/weixin_43162884/article/details/131562470
Recomendado
Clasificación