1.WebRTC后台服务:
STUN(Simple Traversal of UDP over NATs,NAT 的UDP简单穿越); STUN协议服务器就是用来解决这些问题:
STUN协议可以很好的解决一般家用(NAT)路由器环境的打洞问题,但是对于大部分的企业的网络环境就不是很好了. 这时需要一个新的解决方案:TURN(Traversal Using Relay NAT,允许在TCP或UDP的连线上跨越 NAT 或防火墙. TURN是一个Client-Server协议。TURN的NAT穿透方法与STUN类似,都是通过取得应用层中的公有地址达到NAT穿透,但实现TURN client的终端必须在通讯开始前与TURN server进行交互,并要求TURN server产生"relay port",也就是relayed-transport-address.这时 TURN server会建立peer,即远端端点(remote endpoints),开始进行中继(relay)的动作,TURN client利用relay port将资料传送至peer,再由peer转传到另一方的TURN client.通过服务器新产生的peer来进行数据的中转. ICE协议就是综合前面2种协议的综合性NAT穿越解决方案. 通过offer/answer模型建立基于UDP的通讯。ICE是offer/answer模型的扩展,通过在offer和answer的SDP(Session Description Protocol)里面包含多种IP地址和端口,然后对本地SDP和远程SDP里面的IP地址进行配对,然后通过P2P连通性检查进行连通性测试工作,如果测试通过即表明该传输地址对可以建立连接。其中IP地址和端口(也就是地址)有以下几种:本机地址、通过STUN服务器反射后获取的server-reflexive地址(内网地址被NAT映射后的地址)、relayed地址(和TURN转发服务器相对应的地址)及Peer reflexive地址等。 2.房间服务器与信令服务器搭建:我们把这一系列后台服务器搭建在公网的一个UbuntuLinux服务器中. 服务器的代码我们选用GoogleChrome的开源项目,该项目可以在Github找到: https://github.com/GoogleChrome/webrtc 该项目的一些示例可以在下面网址得到: http://googlechrome.github.io/webrtc/ 在我们自己的服务器中运行Google的房间服务器AppRTC需要依赖 Google App Engine SDK forPython和 Grunt. 先搭建房间服务器AppRTC
上面的编译过程会自动下载安装Google App Engine SDK至当前目录. cheetah@localhost:~/webrtc$lsbower.json google_appengine Gruntfile.jsLICENSE.md README.md samplesbuild google_appengine_1.9.17.zipimages node_modulesrun_python_tests.pywebtest-masterCONTRIBUTING.mdgrunt-chrome-build index.html package.jsonrun_python_tests.shwebtest-master.tar.gz下一步,我们需要把Google App Engine SDK的目录加入系统环境变量$PATH,并使之生效. cheetah@localhost:~/webrtc$echo"export PATH=$PATH:$PWD/google_appengine"> ~/.bash_profilecheetah@localhost:~/webrtc$source~/.bash_profile这个时候我们就可以直接运行我们的房间服务器AppRTC了.用下面的命令来开启(主机名:vpn.wuqiong.tk可以用自己的给我钱IP地址代替): cheetah@localhost:~/webrtc$dev_appserver.py --host vpn.wuqiong.tksamples/web/content/apprtc/再搭建信令服务器 信令服务器我们依然采用Google Chrome WebRTC项目里提供的用Go语言编写的基于websocket的信令服务器:Collider. cheetah@localhost:~/webrtc$sudo apt-get install golang-go然后在我们的用户目录新建一个目录(collider_root)来存放这个Collider的go代码程序. cheetah@localhost:~/webrtc$mkdir -p ~/collider_root;cheetah@localhost:~/webrtc$exportCOLLIDER_ROOT=$HOME/collider_root; //也可以加入~/.bash_profile下一步就是链接wenrtc项目目录下面的collider代码目录到$COLLIDER_ROOT/src下去,准备后续的编译工作; cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collider$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collidermain$COLLIDER_ROOT/src/cheetah@localhost:~/webrtc$ln -sf$PWD/samples/web/content/apprtc/collider/collidertest$COLLIDER_ROOT/src/一切准备之后,我们就主要编译安装Collider了: cheetah@localhost:~/webrtc$go get collidermaincheetah@localhost:~/webrtc$go install collidermain这个时候,信令服务器的二进制程序就安装到了$COLLIDER_ROOT/bin下去了. 如下命令就可以开启运行信令服务器: cheetah@localhost:~/webrtc$ $COLLIDER_ROOT/bin/collidermain -port=8089-tls=false信令服务器暂时用非tls方式运行.因为我们自签名的证书Websocket通讯不了. 3.STUN/TURN/ICE服务器的搭建我们选择有更丰富功能的coTurn作为我们的NAT穿越打洞服务器,该项目是一个C/C++语言的开源项目,项目地址:https://code.google.com/p/coturn/或者我们直接下载已经编译好的软件包,在下面站点可以下载我们对应平台的软件包:http://turnserver.open-sys.org/downloads/v4.4.1.2/打开这个网址,根据我们的服务器类型选择下载,我现在选择Debian和Ubuntu系统的包: cd~;wgethttp://turnserver.open-sys.org/d ... t-x86-64bits.tar.gz接着解压软件包: tar xvfz turnserver-4.4.1.2-debian-wheezy-ubuntu-mint-x86-64bits.tar.gz详细阅读安装手册 INSTALL 文件,根据指导进行安装: $sudo apt-get update$sudo apt-get install gdebi-core$sudo gdebi coturn*.deb然后编辑配置文件,打开系统默认启动配置: $vim /etc/default/coturn把上面打开编辑的文件中的这一行TURNSERVER_ENABLED=1去掉注释,保存退出. 再根据实际情况编辑coturn的配置文件 /etc/turnserver.conf,比如我打开的配置项如下: listening-device=eth0listening-ip=~~106.186.127.xxx~~relay-device=eth0relay-ip=~~106.186.127.xxx~~Verbosefingerprintlt-cred-mechuse-auth-secretstatic-auth-secret=diveineduuser=diveinedu:0x06b2afcf07ba085b7777b481b1020391user=diveinedu:diveinedustale-noncecert=/etc/turn_server_cert.pempkey=/etc/turn_server_pkey.pemno-loopback-peersno-multicast-peeRSSha256mobilityno-cli上面cert和pkey配置的自签名证书用Openssl命令生成: sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days99999-nodes穿墙服务器的一切配置完成之后,万事俱备,之前启动命令了: service coturn start;房间服务器和信令服务器的设置 三个服务器都搭建完成之后,我们需要多一定的整合配置,使他们能一起工作: apprtc目录下的constants.py是一些常量配置信息的配置文件,比如我的做了如下设置: #TURN_BASE_URL = 'https://computeengineondemand.appspot.com'TURN_BASE_URL='http://apprtc.diveinedu.com'#TURN_URL_TEMPLATE = '%s/turn?username=%s&key=%s'TURN_URL_TEMPLATE='%s/turn.PHP?username=&key='#CEOD_KEY = '4080218913'CEOD_KEY='diveinedu'#WSS_HOST_PORT_PAIR = 'apprtc-ws.webrtc.org:443'WSS_HOST_PORT_PAIR='apprtc.diveinedu.com:8089'由于我们的信令服务器没有开启安全Socket模式,所以我们要对应的改一下apprtc的代码,做apprtc.py中如下修改: defget_wss_parameters(request):ws_host_port_pair=request.get('wshpp')ws_tls=request.get('wstls')ifnotws_host_port_pair: ws_host_port_pair=constants.WSS_HOST_PORT_PAIRifws_tlsandws_tls=='false': wss_url='ws://'+ws_host_port_pair+'/ws' wss_post_url='http://'+ws_host_port_pairelse: wss_url='http://'+ws_host_port_pairreturn(wss_url,wss_post_url)把原来的wss和https的scheme都改为ws和http,不要让客户端或者浏览器去使用SSL链接.当然,如果有第三方根证书的签名机构颁发的证书,那就不需要这样了 而对应的信令服务器也需要稍微做设置: 编辑collider/collidermain/main.go,修改设置自己的房间服务器URL: //var roomSrv = flag.String("room-server","https://apprtc.appspot.com","The origin of the room server")varroomSrv = flag.String("room-server","http://apprtc.diveinedu.com:8080/",68); word-wrap:break-word">"The origin of the room server")经过这一些简单的房间服务器和信令服务器的定制设置之后,我们就搭建了一套基于Google项目的属于自己的WebRTC的简单服务了. 用谷歌浏览器打开http://apprtc.diveinedu.com:8080/,注册房间之后就可以视频通话了.当然结合之前的WebRTC foriOS框架就可以浏览器和ios的原生应用直接视频通话了. |