webrtc

这两天测试了下webrtc的效果,不知道是不是手机比较渣,画面并不是很清晰,先来说说服务器的部署。部署环境ubuntu14.04 32位。

一、服务器组成

      1、AppRTC 房间服务器  https://github.com/webrtc/apprtc

      2、Collider  信令服务器  上边源码里自带

      3、coTurn   穿透服务器   https://github.com/coturn/coturn

      4、需要自己实现coTurn连接信息接口,主要返回用户名、密码和turn配置信息,通常叫做TURN REST API,不实现这个接口的话AppRTCDemo连不上服务器,浏览器访问的话可以正常访问。

二、AppRTC房间服务器

      1、下载代码

      2、安装依赖

            sudo apt-get install nodejs

            sudo npm install -g npm

            sudo apt-get install nodejs-legacy

            sudo npm -g install grunt-cli

            切换到源码目录

            cd apprtc-master

            npm install

            sudo apt-get install python-webtest

            grunt build

            编译之后会多出out目录

            运行还依赖 Google App Engine SDK for  Python 需FQ

            下载完后设置环境变量 

            sudo gedit /etc/profile

            export PATH=$PATH:/home/google_appengine

            source /etc/profile

        3、修改配置文件

             主要是src/app_engine目录下的apprtc.py和constants.py

             首先是constants.py

             修改TURN_BASE_URL = 'http://192.168.214.129:80'  这个是上边提到的连接信息接口的地址

             TURN_URL_TEMPLATE = '%s/turn.php?username=%s&key=%s'

             CEOD_KEY = 和coturn turnserver.conf static-auth-secret一致

             WSS_INSTANCES = [{
                   WSS_INSTANCE_HOST_KEY: '192.168.214.129:8089',
                   WSS_INSTANCE_NAME_KEY: 'wsserver-std',
                   WSS_INSTANCE_ZONE_KEY: 'us-central1-a'
                  }, {
                   WSS_INSTANCE_HOST_KEY: '192.168.214.129:8089',
                   WSS_INSTANCE_NAME_KEY: 'wsserver-std-2',
                   WSS_INSTANCE_ZONE_KEY: 'us-central1-f'
            }]

             apprtc.py:

             修改get_wss_parameters(request) 下的

              if wss_tls and wss_tls == 'false':
                   wss_url = 'ws://' + wss_host_port_pair + '/ws'
                   wss_post_url = 'http://' + wss_host_port_pair
              else:
                   wss_url = 'ws://' + wss_host_port_pair + '/ws'
                   wss_post_url = 'http://' + wss_host_port_pair

              主要是把原来的wss和https的scheme都改为ws和http,不要让客户端和浏览器去使用ssl连接,如果有第三   方根证书的签名机构颁发的证书就不需要这样了。

               修改完后重新grunt build下。

           4、启动

                dev_appserver.py --host=0.0.0.0 ./out/app_engine

三、Collider信令服务器

        1、安装依赖

         sudo apt-get install golang-go

         2、在home目下创建文件夹

         mkdir -p ~/collider_root        并在collider_root目录下创建src目录

         设置GOPATH环境变量    export GOPATH=~/collider_root

         将apprtc/src/collider目录下的三个文件夹都拷贝到collider_root/src下

         进入到collider_root/src,开始编译安装collider,准备好FQ

         go get collidermain

         go install collidermain

         成功编译后会在collider_root目录下生成bin和pkg目录,执行文件在bin下。

        3、运行

          修改collider_root/src/collidermain/main.go填上自己ip地址

          var roomSrv = flag.String("room-server", "http://192.168.214.129:8080/", "The origin of the room server")

          启动

          ~/collider_root/bin/collidermain -port=8089 -tls=false

四、coTurn 打洞服务器

        1、下载http://turnserver.open-sys.org/downloads/

         找个适合自己linux系统的,我这里是ubuntu32位所以选了turnserver-4.2.1.2-debian-wheezy-ubuntu-mint-x86-32bits.tar.gz

         下载完后解压进入解压目录

          cat INSTALL     查看安装须知

          sudo apt-get install gdebi-core

          sudo gdebi coturn_4.2.2.2-1_i386.deb

         2、编辑配置文件

           sudo gedit /etc/turnserver.conf

           listening-device=eth0

           listening-port=3478

           relay-device=eth1

           min-port=49152
           max-port=65535

           Verbose

           fingerprint

           lt-cred-mech

           use-auth-secret

           static-auth-secret=填写自己的密钥可不修改

           stale-nonce

           cert=/usr/local/etc/turn_server_cert.pem

           pkey=/usr/local/etc/turn_server_pkey.pem

           no-loopback-peers

           no-multicast-peers

           mobility

           no-cli

         3、生成签名证书

           sudo openssl req -x509 -newkey  rsa:2048 -keyout/usr/local/etc/turn_server_pkey.pem -out /usr/local/etc/turn_server_cert.pem -days 99999 -nodes       

               4、启动

          service coturn start

五、coTurn连接信息接口

       TURN REST API 标准参考文档

       返回json结果示例:

       {"username":"1456904882:1231244","password":"jAph7EHMLuPJuxLLC1uRiI3kvq4=","ttl":86400,"uris":["turn:192.168.214.129:3478?transport=udp","turn:192.168.214.129:3478?transport=tcp","turn:192.168.214.129:3479?transport=udp","turn:192.168.214.129:3479?transport=tcp"]}

       1、username字段需要以timestamp + ":"  + username的形式输出

       2、响应的 password 字段,需要以 HMAC-SHA1 算法计算得出,公式为:【base64_encode( hmac( key,

            username ) )】此处的 key,为 coTurn 服务器配置中的 “static-auth-secret”值。以 key 作为      hmac 算法的密钥,turn-username 为被计算的内容,得出的 hmac 摘要后,经 base64 编码得到最终密码。

       3、uris为后台配置好的,我这里写死

       4、很简单的接口,用惯了java,这里我准备用php,写起来比java快

       

  1. <?php
  2. $request_username = $_GET["username"];
  3. if(empty($request_username)) {
  4. echo "username == null";
  5. exit;
  6. }
  7. $request_key = $_GET["key"];
  8. $time_to_live = 600;
  9. $timestamp = time() + $time_to_live;//失效时间
  10. $response_username = $timestamp.":".$_GET["username"];
  11. $response_key = $request_key;
  12. if(empty($response_key))
  13. $response_key = "密钥";//constants.py中CEOD_KEY
  14. $response_password = getSignature($response_username, $response_key);
  15. $jsonObj = new Response();
  16. $jsonObj->username = $response_username;
  17. $jsonObj->password = $response_password;
  18. $jsonObj->ttl = 86400;
  19. $jsonObj->uris = array("turn:192.168.214.129:3478?transport=udp","turn:192.168.214.129:3478?transport=tcp","turn:192.168.214.129:3479?transport=udp","turn:192.168.214.129:3479?transport=tcp");
  20. echo json_encode($jsonObj);
  21. /**
  22. * 使用HMAC-SHA1算法生成签名值
  23. *
  24. * @param $str 源串
  25. * @param $key 密钥
  26. *
  27. * @return 签名值
  28. */
  29. function getSignature($str, $key) {
  30. $signature = "";
  31. if (function_exists('hash_hmac')) {
  32. $signature = base64_encode(hash_hmac("sha1", $str, $key, true));
  33. } else {
  34. $blocksize = 64;
  35. $hashfunc = 'sha1';
  36. if (strlen($key) > $blocksize) {
  37. $key = pack('H*', $hashfunc($key));
  38. }
  39. $key = str_pad($key, $blocksize, chr(0x00));
  40. $ipad = str_repeat(chr(0x36), $blocksize);
  41. $opad = str_repeat(chr(0x5c), $blocksize);
  42. $hmac = pack(
  43. 'H*', $hashfunc(
  44. ($key ^ $opad) . pack(
  45. 'H*', $hashfunc(
  46. ($key ^ $ipad) . $str
  47. )
  48. )
  49. )
  50. );
  51. $signature = base64_encode($hmac);
  52. }
  53. return $signature;
  54. }
  55. class Response {
  56. public $username = "";
  57. public $password = "";
  58. public $ttl = "";
  59. public $uris = array("");
  60. }
  61. ?>

      5、拿nginx部署下,怎么部署自行百度

六、测试

       部署成功后可在浏览器输入http://192.168.214.129:8080创建房间

       appRTCDemo连接也改成http://192.168.214.129:8080即可

七、参考连接

       http://www.mamicode.com/info-detail-513556.html

       http://www.jianshu.com/p/c55ecf5a3fcf

       http://www.bubuko.com/infodetail-938737.htmll

八、关于webrtc编译

       我只编译了android的版本,公司网速慢死,找了个国内下好的代码,分享到网盘了http://pan.baidu.com/s/1kUyNE55

       AppRTCDemo的工程源码连接:AppRTCDemo工程源码

posted @ 2018-06-28 18:14  清澈见底  阅读(1330)  评论(0编辑  收藏  举报