webrtc入门:6.搭建apprtc服务器建立webrtc远程通讯

通过前面几章关于webrtc的了解,我们建立了在局域网下互相通讯的webrtc示例。我们知道,如果需要在远程中进行webrtc的通讯的话,我们需要一个转发的服务器。

这个转发的服务器,负责把我们的webrtc的流,转发到对应的地址上,现在这种转发的服务器也比较多,这里介绍的是AppRTC 他是一整套的开源代码,这里看看如何使用AppRTC 建立远程的视频通讯。

安装AppRTC必须的软件

安装JDK
# 先安装add-apt-repository命令支持
sudo apt-get install python-software-properties
sudo apt-get install software-properties-common
# 第一步:打开终端,添加ppa源
sudo add-apt-repository ppa:openjdk-r/ppa
# 第二步:更新源
sudo apt-get update
# 第三步:安装openjdk 8
sudo apt-get install openjdk-8-jdk# 第四步:配置openjdk 8为默认java环境
sudo update-alternatives --config java
sudo update-alternatives --config javac
# 最后,验证一下是否成功
java -version
# 返回
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
安装node.js
cd ~/webrtc
wget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz
# 解压
tar -xvf node-v10.16.0-linux-x64.tar.xz
# 进入目录
cd node-v10.16.0-linux-x64/
# 查看当前的目录
pwd

# 确认一下nodejs下bin目录是否有node 和npm文件,如果有就可以执行软连接,比如
sudo ln -s /home/xxx/webrtc/node-v10.16.0-linux-x64/bin/npm /usr/local/bin/
sudo ln -s /home/xxx/webrtc/node-v10.16.0-linux-x64/bin/node /usr/local/bin/


# 看清楚,这个路径是你自己创建的路径,我的路径是/home/xxx/webrtc/node-v10.16.0-linux-x64


# 查看是否安装,安装正常则打印版本号
node -v 
npm -v 


# 有版本信息后安装 grunt-cli,先进到nodejs的bin目录, 要和自己的目录匹配
cd /home/xxx/webrtc/node-v10.16.0-linux-x64/bin
sudo npm -g install grunt-cli
sudo ln -s /home/xxx/webrtc/node-v10.16.0-linux-x64/bin/grunt /usr/local/bin/

grunt --version
# 显示grunt-cli v1.3.2

#使用淘宝源替换npm,后续要执行npm时执行cnpm
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org
sudo ln -s /home/xxx/webrtc/node-v10.16.0-linux-x64/lib/node_modules/cnpm/bin/cnpm /usr/local/bin/
安装Python和Python-webtest (python2.7)
# 没有则输入下命令
sudo apt-get install python
# python 安装之后安装 Python-webtest
sudo apt-get install python-webtest


python -V
#Python 2.x

#安装pip
apt install python-pip
sudo pip install requests
安装google_appengine
# 回到webrtc目录
cd ~/webrtc/
# 下载google_appengine
wget https://storage.googleapis.com/appengine-sdks/featured/google_appengine_1.9.40.zip
unzip google_appengine_1.9.40.zip

#配置环境变量:在/etc/profile文件最后增加一行,和自己路径保持一致
export PATH=$PATH:/home/xxx/webrtc/google_appengine
# 生效
source /etc/profile
安装go
#安装go
sudo apt-get install golang-go
#检测go 版本 
go version
#go version go1.6.2 linux/amd64


#创建go工作目录
mkdir -p ~/webrtc/goworkspace/src
#配置环境变量:在/etc/profile文件最后增加一行:
sudo vim /etc/profile


export GOPATH=/home/xxx/apprtc/goworkspace
# 然后执行
source /etc/profile
安装AppRTC
安装coturn
sudo apt-get install libssl-dev
sudo apt-get install libevent-dev

# 返回webrtc目录
cd ~/webrtc
#git clone https://github.com/coturn/coturn 
#cd coturn
#提供另一种安装方式turnserver是coturn的升级版本
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7
 
./configure 
make 
sudo make install


sudo nohup turnserver -L 0.0.0.0 -a -u lqf:123456 -v -f -r nort.gov &
#账号 lqf 密码:123456 这一步随便给,但是后面配置apprtc时需要用到
#命令后加 & ,执行起来后按 ctr+c,不会停止



#开启新窗口 执行
lsof -i:3478`
#输出大致这样的成功
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
turnserve 30299 root   16u  IPv4  61868      0t0  UDP *:3478 
turnserve 30299 root   17u  IPv4  61869      0t0  UDP *:3478 
turnserve 30299 root   32u  IPv4  61879      0t0  TCP *:3478 (LISTEN)
turnserve 30299 root   33u  IPv4  61880      0t0  TCP *:3478 (LISTEN)
安装apprtc collider 信令服务器
cd ~/webrtc/
# 先尝试使用github的下载连接
git clone https://github.com/webrtc/apprtc.git
# 如果github的连接下不了就用码云的链接
git clone https://gitee.com/sabergithub/apprtc.git
#将collider的源码软连接到go的工作目录下
ln -s /home/xxx/webrtc/apprtc/src/collider/collider $GOPATH/src
ln -s /home/xxx/webrtc/apprtc/src/collider/collidermain $GOPATH/src
ln -s /home/xxx/webrtc/apprtc/src/collider/collidertest $GOPATH/src

#下一步在编译 go get collidermain: 被墙
#报错: package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket"
#所以先执行:
mkdir -p $GOPATH/src/golang.org/x/
cd $GOPATH/src/golang.org/x/
git clone https://github.com/golang/net.git net
go install net

#编译collidermain
cd ~/webrtc/goworkspace/src
go get collidermain
go install collidermain

配置防火墙,允许访问8089端口(tcp,用于客户端和collider建立websocket信令通信)

# 执行collider 信令服务器
sudo nohup $GOPATH/bin/collidermain -port=8089 -tls=false -room-server="http://192.168.100.164:8090" &

-room-server=“http://192.168.100.164:8090” 实际是连接房间服务器的地址

#同样检查是否成功
sudo lsof -i:8089
#显示
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
colliderm 30354 root    3u  IPv6  62696      0t0  TCP *:8089 (LISTEN)
apprtc 房间服务器

配置防火墙,允许访问8090端口(tcp,此端口用于web访问)
配置文件修改(主要是配置apprtc对应的conturn和collider相关参数)

vim /home/xxx/webrtc/apprtc/src/app_engine/constants.py

# ICE_SERVER_OVERRIDE = None 注释掉



# Turn/Stun server override. This allows AppRTC to connect to turn servers
# directly rather than retrieving them from an ICE server provider.
# ICE_SERVER_OVERRIDE = None
# Enable by uncomment below and comment out above, then specify turn and stun
ICE_SERVER_OVERRIDE = [
  {
 "urls": [
 "turn:192.168.100.164:3478?transport=udp",
 "turn:192.168.100.164:3478?transport=tcp"
     ],
 "username": "lqf",
 "credential": "123456"
   },
   {
 "urls": [
 "stun:192.168.100.164:3478"
     ]
   }
 ]

ICE_SERVER_BASE_URL = 'https:192.168.100.164'
ICE_SERVER_URL_TEMPLATE = '%s/v1alpha/iceconfig?key=%s'
ICE_SERVER_API_KEY = os.environ.get('ICE_SERVER_API_KEY')

# Dictionary keys in the collider instance info constant.
WSS_INSTANCE_HOST_KEY = '192.168.100.164:8088'
WSS_INSTANCE_NAME_KEY = 'vm_name'
WSS_INSTANCE_ZONE_KEY = 'zone'
WSS_INSTANCES = [{
 WSS_INSTANCE_HOST_KEY: '192.168.100.164:8088',
 WSS_INSTANCE_NAME_KEY: 'wsserver-std',
 WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
}]

进到apprtc目录

#编译
cd /home/xxx/webrtc/apprtc
sudo cnpm install
sudo grunt build

启动

# 默认端口是8080, 可以自己指定端口,我们这里指定为8090
sudo nohup  /home/xxx/webrtc/google_appengine/dev_appserver.py --host=0.0.0.0 --port=8090 /home/xxx/webrtc/apprtc/out/app_engine --skip_sdk_update_check &
#如果提示更新选择: n

出现错误:

ImportError: cannot import name RAND_egd

解决办法:

修改:

google-cloud-sdk\platform\google_appengine\google\appengine\dist27\socket.py

去掉RAND_egd

RAND_egd is not available on some platforms (Windows, etc.)

https配置

因为webrtc需要用到https,因此配置https。

生成证书
mkdir -p ~/cert
cd ~/cert
# CA私钥
openssl genrsa -out key.pem 2048
# 自签名证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
Web代理

反向代理apprtc,使之支持https访问,如果http直接访问apprtc,则客户端无法启动视频音频采集(必须得用https访问)

完整配置文件:/usr/local/nginx/conf/conf.d/apprtc-https-proxy.conf

upstream roomserver {
   server 192.168.100.164:8090;
}
server {
    listen 443 ssl;
    ssl_certificate /home/lqf/cert/cert.pem;
    ssl_certificate_key /home/lqf/cert/key.pem; 
    charset utf-8;
    # ip地址或者域名
    server_name 192.168.100.164;
    location / {
        # 转向代理的地址
        proxy_pass http://roomserver$request_uri;
        proxy_set_header Host $host;
    }
}
配置websocket代理

ws 不安全的连接 类似http
wss是安全的连接,类似https
完整配置文件:/usr/local/nginx/conf/conf.d/apprtc-websocket-proxy.conf

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
upstream websocket {
    server 192.168.100.164:8089;
}

server {
    listen 8088 ssl;
    ssl_certificate /home/lqf/cert/cert.pem;
    ssl_certificate_key /home/lqf/cert/key.pem;

    server_name 192.168.100.164;
    location /ws {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_connect_timeout 4s; #配置点1
        proxy_read_timeout 6000s; #配置点2,如果没效,可以考虑这个时间配置长一点
        proxy_send_timeout 6000s; #配置点3
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

重启 nginx

/etc/init.d/nginx restart

访问:https://192.168.100.164

出现浏览器通话跨域问题 :pushState

Messages:Failed to start signaling: Failed to execute ‘pushState’ on ‘History’

修改文件apprtc/src/web_app/js/appcontroller.js

vim /home/lqf/webrtc/apprtc/src/web_app/js/appcontroller.js
#搜索  displaySharingInfo_ 大概是445行displaySharingInfo_函数第一行添加

roomLink=roomLink.replace("http","https");

最终结果(大概446行的修改)

AppController.prototype.displaySharingInfo_ = function(roomId, roomLink) {
 roomLink=roomLink.replace("http","https");
 this.roomLinkHref_.href = roomLink;
 this.roomLinkHref_.text = roomLink;
 this.roomLink_ = roomLink;
 this.pushCallNavigation_(roomId, roomLink);
 this.activate_(this.sharingDiv_);
};

然后重新build

cd ~/webrtc/apprtc
sudo grunt build 

重启:

sudo nohup  /home/xxx/webrtc/google_appengine/dev_appserver.py --host=0.0.0.0 --port=8090 /home/xxx/webrtc/apprtc/out/app_engine --skip_sdk_update_check &

打开https://192.168.100.164/ ,进入 一个房间中,
image

后开启了一个房间,再开启一个浏览器,进入这个房间中。

在这里插入图片描述

点击 join 记录视频聊天。

在这里插入图片描述

两端已经连接上了,后面我们会对apprtc进行研究说明。

以后启动的时候,需要开启这些服务:

sudo nohup turnserver -L 0.0.0.0 -a -u lqf:123456 -v -f -r nort.gov &


sudo nohup /home/xxx/apprtc/goworkspace/bin/collidermain -port=8089 -tls=false -room-server="http://192.168.100.164:8090" &




sudo nohup  /home/xxx/apprtc/google_appengine/dev_appserver.py --host=0.0.0.0 --port=8090 /home/xxx/apprtc/apprtc/out/app_engine --skip_sdk_update_check &
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值