什么是GB28181
GB28181(國標(biāo)28181),全稱為《中華人民共和國公共安全視頻監(jiān)控聯(lián)網(wǎng)系統(tǒng)技術(shù)要求》,是中國國家標(biāo)準(zhǔn)委員會(huì)發(fā)布的一個(gè)針對(duì)公共安全視頻監(jiān)控領(lǐng)域的標(biāo)準(zhǔn)框架。該標(biāo)準(zhǔn)指導(dǎo)了視頻監(jiān)控設(shè)備之間的聯(lián)網(wǎng)互通,統(tǒng)一管理和控制,并提供了一套包括設(shè)備接入、設(shè)備管理、視頻傳輸、事件告警等功能要求。
GB28181標(biāo)準(zhǔn)采用了基于IP網(wǎng)絡(luò)的架構(gòu),通過使用 SIP(Session Initiation Protocol,會(huì)話初始協(xié)議) 實(shí)現(xiàn)設(shè)備的接入通信和管理,通過使用RTSP(Real-Time Streaming Protocol 實(shí)時(shí)流傳輸協(xié)議) 標(biāo)準(zhǔn)協(xié)議實(shí)現(xiàn)設(shè)備之間的視頻流傳輸,包括實(shí)時(shí)預(yù)覽、錄像回放等操作。
總體而言,GB28181 標(biāo)準(zhǔn)的出臺(tái)旨在提高公共安全視頻監(jiān)控系統(tǒng)的互聯(lián)互通能力,促進(jìn)不同廠家設(shè)備的兼容性和互操作性,確保系統(tǒng)的可靠性、穩(wěn)定性和安全性。它對(duì)于中國的公共安全行業(yè)具有重要意義,并在國內(nèi)得到廣泛的推廣和應(yīng)用。
平臺(tái)依賴項(xiàng)
在Linux平臺(tái)下搭建GB28181服務(wù)器,主要使用的庫包括WVP和ZLMediakit,兩個(gè)項(xiàng)目的開源地址分別如下所示:
WVP
https://github.com/648540858/wvp-GB28181-pro
ZLMediakit
https://github.com/ZLMediaKit/ZLMediaKit
WVP是基于GB/T 28181-2016標(biāo)準(zhǔn)實(shí)現(xiàn)的流媒體平臺(tái),負(fù)責(zé)處理SIP信令,實(shí)現(xiàn)國產(chǎn)化設(shè)備的接入和管理。 而ZLMediakit作為流媒體服務(wù)器負(fù)責(zé)視頻流的處理和轉(zhuǎn)換。
搭建步驟
首先編譯WVP和ZLMediakit,編譯過程可以參考官方的教程,寫的十分詳細(xì),這里就不多做介紹了。
WVP和ZLMediakit之間的關(guān)系圖如下圖所示:
配置Redis和MySQL
由于WVP依賴于Redis和MySQL這里先安裝MySQL和Redis,安裝流程如下所示:
安裝MySQL
# Ubuntu 安裝 MySQL
sudo apt install mysql-server
# 檢查MySQL是否在運(yùn)行
sudo systemctl status mysql
安裝Redis
# 安裝Redis
sudo apt update
sudo apt install redis-server redis-cli
# 查看Redis的運(yùn)行狀態(tài)
sudo systemctl status redis-server
為了保障數(shù)據(jù)的安全性這里我們修改一下MySQL和Redis的缺省密碼
修改MySQL的root密碼
# 默認(rèn)沒密碼 不用輸入 直接按回車就可以了
mysql -u root -p
# 在MySQL終端下 更新root密碼
mysql> use mysql;
mysql> UPDATE uer SET authentication_string = PASSWORD('password') WHERE User = 'root';
# 刷新權(quán)限表
mysql> flush privileges;
# 退出
mysql> quit
修改Redis的密碼
# 打開Redis的配置文件,通常位于/etc/redis/redis.conf
# 在配置文件中,找到并修改以下行(如果沒有,則添加)
requirepass your_password
# 重啟Redis
sudo systemctl restart redis
# 如果Redis沒有被設(shè)置成服務(wù)也可以通過下面的命令啟動(dòng)服務(wù)端
nohup redis-server /etc/redis/redis.conf &
MySQL的默認(rèn)編碼是latin1,在執(zhí)行WVP的Init.SQL腳本的時(shí)候,會(huì)報(bào)亂碼錯(cuò)誤,導(dǎo)致服務(wù)不可用,我們需要將MySQL的默認(rèn)編碼修改成UTF-8。 修改方式如下:
找到 my.cnf 配置文件, 該文件一般在/etc/mysql目錄下, 在文件中添加如下配置:
[mysqld]
character_set_server = utf8
collation_server = utf8_general_ci
也可以在SQL命令中指定字符編碼方式:
reate table wvp_log (
id serial primary key ,
name character varying(50) CHARACTER SET utf8 COLLATE utf8_general_ci,
type character varying(50)
)CHARACTER SET utf8 COLLATE utf8_general_ci;
當(dāng)然修改編碼的方式還有很多,這里只介紹這兩種。修改完配置之后,重啟mysql服務(wù),重啟方式如下:
service mysql restart
配置ZLMediakit
配置完成Redis和MySQL之后, 我們先啟動(dòng)ZLMediakit, 啟動(dòng)命令如下:
# 后臺(tái)運(yùn)行輸出
nohup MediaServer -c ./config.ini > /dev/null 2>&1 &
ZLMediakit的配置文件config.ini 如下所示(省略不重要的配置):
[api]
# secret 值用來鑒權(quán)處理
...
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
...
[general]
...
# ZLMediakit的ID
mediaServerId=my_zlmediakit_id
...
[hook]
# 用作鑒權(quán)處理
admin_params=secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
[http]
# http的端口號(hào),通過這個(gè)端口進(jìn)行配置處理
port=18800
[protocol]
# 是否開啟hls
enable_hls=0
# 是否開啟rtmp
enable_rtmp=1
# 是否開啟rtsp
enable_rtsp=1
# 是否開啟ts
enable_ts=0
[rtmp]
# rtmp的端口號(hào)
port=1935
[rtsp]
# rtsp的端口號(hào)
port=554
配置WVP
ZLMediakit 配置完成之后,我們就可以啟動(dòng)WVP了.
WVP的配置文件application.yml如下所示(省略了不重要的配置)
spring:
# REDIS數(shù)據(jù)庫配置
redis:
# [必須修改] Redis服務(wù)器IP, REDIS安裝在本機(jī)使用127.0.0.1
host: 127.0.0.1
# [必須修改] Redis端口號(hào)
port: 6379
# [可選] 數(shù)據(jù)庫 DB
database: 7
# [可選] Redis訪問密碼,若你的redis服務(wù)器沒有設(shè)置密碼,就不需要用密碼去連接
password: redis_passwd
# mysql數(shù)據(jù)源
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
# MySQL的賬號(hào)密碼
username: root
password: root_passwd
#[可選] WVP監(jiān)聽的HTTP端口, 網(wǎng)頁和接口調(diào)用都是這個(gè)端口
server:
port: 8050
# 作為28181服務(wù)器的配置
sip:
# [必須修改] 本機(jī)的IP,對(duì)應(yīng)你的網(wǎng)卡,監(jiān)聽什么ip就是使用什么網(wǎng)卡,
# 如果要監(jiān)聽多張網(wǎng)卡,可以使用逗號(hào)分隔多個(gè)IP, 例如: 192.168.1.4,10.0.0.4
# 如果不明白,就使用0.0.0.0,大部分情況都是可以的
# 請(qǐng)不要使用127.0.0.1,任何包括localhost在內(nèi)的域名都是不可以的。
ip: 0.0.0.0
# 28181服務(wù)監(jiān)聽的端口
port: 18116
# 根據(jù)國標(biāo)6.1.2中規(guī)定,domain宜采用ID統(tǒng)一編碼的前十位編碼。國標(biāo)附錄D中定義前8位為中心編碼(由省級(jí)、市級(jí)、區(qū)級(jí)、基層編號(hào)組成,參照GB/T 2260-2007)
# 后兩位為行業(yè)編碼,定義參照附錄D.3
domain: 4101050000
id: 41010500002000000001
# SIP驗(yàn)證密碼
password: sip_passwd
#zlm 默認(rèn)服務(wù)器配置
media:
# 和zlm config.ini中的mediaServerId 保持一致
id: my_zlmediakit_id
# [必須修改] zlm服務(wù)器的內(nèi)網(wǎng)IP
ip: 127.0.0.1
# 和zlm config.ini中的http.port保持一致
http-port: 80
# 返回流地址時(shí)的ip,這里需要設(shè)置為本機(jī)的實(shí)際IP地址, 置空使用 media.ip
stream-ip: 192.168.0.0
# wvp在國標(biāo)信令中使用的ip,這里需要設(shè)置為本機(jī)的實(shí)際IP地址, 置空使用 media.ip
sdp-ip: 192.168.0.0
# 和zlm config.ini中的rtmp.port/rtsp.port保持一致
rtmp-port: 1935
rtsp-port: 5545
# 和zlm服務(wù)器的hook.admin_params=secret保持一致
secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
rtp:
# [可選] 是否啟用多端口模式, 開啟后會(huì)在portRange范圍內(nèi)選擇端口用于媒體流傳輸
enable: true
# [可選] 在此范圍內(nèi)選擇端口用于媒體流傳輸, 必須提前在zlm上配置該屬性,不然自動(dòng)配置此屬性可能不成功
port-range: 30000,30500 # 端口范圍
# [可選] 國標(biāo)級(jí)聯(lián)在此范圍內(nèi)選擇端口發(fā)送媒體流,
send-port-range: 30000,30500 # 端口范圍
# 輔助錄像服務(wù)這里0為關(guān)閉
record-assist-port: 0
user-settings:
#關(guān)閉推流鑒權(quán)
push-authority: false
record-push-live: false
auto-apply-play: false
由于WVP啟動(dòng)的時(shí)候需要用到一些數(shù)據(jù)庫表,包括設(shè)備表、用戶名表等, 以這里先調(diào)用WVP提供的SQL腳本初始化對(duì)應(yīng)的數(shù)據(jù)庫信息。
WVP提供的初始化SQL腳本的地址為wvp/sql/init.sql。
# 創(chuàng)建數(shù)據(jù)庫wvp
mysql -u root -proot_passwd -e "CREATE DATABASE wvp"
# 在wvp中執(zhí)行init.sql腳本 初始化對(duì)應(yīng)的數(shù)據(jù)庫表
mysql -u root -proot_passwd wvp < ./sql/init.sql
初始化完成之后,我們就可以啟動(dòng)wvp的服務(wù)了啟動(dòng)命令如下所示:
java -jar ./wvp/wvp-pro.jar --spring.config.location=./conf/application.yml
使用效果
WVP+ZLM啟動(dòng)成功之后,在瀏覽器中輸入IP:server.port/#/login就可以進(jìn)入WVP的登錄界面了登錄界面如下所示:
WVP默認(rèn)的賬戶和密碼都是admin
登錄之后的界面如下所示:
在攝像頭中配置WVP-GB28181平臺(tái)的信息,注冊對(duì)應(yīng)的設(shè)備信息,這里以官方提供的海康攝像頭為例進(jìn)行說明:
攝像頭中的配置和application.yml中的配置項(xiàng)的對(duì)應(yīng)關(guān)系如下所示:
配置項(xiàng)1 對(duì)應(yīng)著sip.password
配置項(xiàng)2 對(duì)應(yīng)著sip.port
配置項(xiàng)3 對(duì)應(yīng)著sip.domain
配置項(xiàng)4 對(duì)應(yīng)著sip.ip
配置項(xiàng)5 對(duì)應(yīng)著sip.id
配置完成之后,過一段時(shí)間我們就可以在WVP的國標(biāo)設(shè)備中查看到對(duì)應(yīng)的設(shè)備信息了。
封裝成Docker鏡像
把GB28181服務(wù)器封裝成docker鏡像,主要工作就是把WVP+ZLM以及其依賴的環(huán)境封放到Docker鏡像中,這里一些流程化的細(xì)節(jié)不做展開討論。著重說明一下端口開放問題,官方提供的端口開放列表如下:文章來源:http://www.zghlxwxcb.cn/news/detail-739810.html
服務(wù) | 端口 | 類型 | 必選 |
---|---|---|---|
wvp | server.port | tcp | 是 |
wvp | sip.port | tcp/udp | 是 |
zlm | http.port | tcp | 是 |
zlm | http.sslport | tcp | 否 |
zlm | rtmp.port | tcp | 否 |
zlm | rtmp.sslport | tcp | 否 |
zlm | rtsp.port | udp/tcp | 否 |
zlm | rtsp.sslport | udp/tcp | 否 |
zlm | rtp_proxy.port | udp/tcp | 單端口開放 |
zlm | rtp.port-range | udp/tcp | 多端口開放 |
GB28281服務(wù)器很多端口是既要開放UDP也要開發(fā)TCP的,所以docker鏡像如果只映射TCP端口的話, 會(huì)出現(xiàn)服務(wù)訪問失敗的問題。
下面以創(chuàng)建GB28181鏡像的命令為例說明一下docker鏡像如何做端口映射:文章來源地址http://www.zghlxwxcb.cn/news/detail-739810.html
docker create -it --privileged=true --restart=always \
-p zlm.rtmp.port:zlm.rtmp.port -p zlm.rtsp.port:zlm.rtsp.port -p wvp.web.port:wvp.web.port -p wvp.sip.port:wvp.sip.port/tcp -p wvp.sip.port:wvp.sip.port/udp \
-p 30000-30500:30000-30500/tcp -p 30000-30500:30000-30500/udp \
-p zlm.rtp.port:zlm.rtp.port/tcp -p zlm.rtp.port:zlm.rtp.port/udp \
--name=wvp_zlm my_gb28181_image
到了這里,關(guān)于Linux平臺(tái)下搭建GB28181服務(wù)器(WVP+ZLMediakit)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!