freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。

本文主要记录freeswitch学习过程。

一 安装freeswitch

NOTE

以下两种安装方式,再安装的过程中遇到了不少问题,印象比较深刻的就是lua库找到不到这个问题。这个问题发生在make && make install 阶段,如果你的机器上遇到lua.sh文件找不到可以参考下面的解决方式:

1,下载lua的tar.gz包并手动解压copy到对应的模块目录下。

      curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz; tar zxvf lua-5.3.0.tar.gz; cp lua-5.3.0/src/* src/mod/languages/mod_lua/

      copy完成后,你必须重新执行

      ./configure -C; make && make install;

 

On MacOS:

1:install homebrew

      ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)

2: install git

     [sudo] brew install git

3: clone freeswitch master branch

    git clone https://stash.freeswitch.org/scm/fs/freeswitch.git freeswitch.git

4: checkout the tag what you want to build

    git checkout -b v1.x.x

5: build

    ./bootstrap.sh # 如果提示你有一些库没有安装,请直接使用[sudo] brew install xxx。例如 brew install autoconf automack libtool。

    ./configure #如果提示你某个package没有找到,请直接下载brew install xxx。好吧,我承认这个过程中你可能会遇到很多package没有安装,你可以尝试安装,也可以根据提示将其disable,这些应该都是freeswitch的外围模块需要的依赖,如果你不需要用到,可以不安装。

    make && make install #这个过程依然可能提示安装失败,原因和上面一样缺少依赖,请直接brew install xxx。

    make sounds-install;make moh-install #安装声音文件

    make cd-sounds-install; make cd-moh-install #安装高清声音文件

On Ubuntu:

1:更新源

    sudo apt-get update 

2: 安装依赖

    sudo apt-get install libedit-dev libldns-dev libpcre3-dev libspeexdsp-dev libspeex-dev libcurl4-openssl-dev libopus-dev libncurses5-dev libtiff-dev libjpeg-dev zlib1g-dev libssl-dev libsqlite3-dev build-essential automake autoconf git-core wget libtool liblua50-dev libsndfile1-dev yasm

3: 下载freeswitch源码

   git clone https://stash.freeswitch.org/scm/fs/freeswitch.git freeswitch.git

4: 编译

   git tag #查看历史版本

   git checkout -b 1.x.x #选择要编译的版本

   ./bootstrap.sh; ./configure;sudo make && sudo make install

    make sounds-install;make moh-install #安装声音文件

    make cd-sounds-install; make cd-moh-install #安装高清声音文件

二:freeswitch初探

   1,架构

    总的来说freeswitch是有一个稳定的核心,和大量的外围模块组成。其中核心提供底层的统一的API接口,外围模块可以根据需要实现相应的API调用。这样有2个好处:

    1)松耦合,核心的存在不依赖与外围模块,换句话说我可以只加载我需要的模块。

    2)高扩展,核心层暴露出来统一的API,外围模块可以根据需求来调用不同的API。这样围绕核心层就能产生出很多很多的模块,它们就像插件极大的方便了用户的使用。

    根据模块的功能和用途可分为Endpoint(如作为sip终端), Codec(如h264,vp8,vp9常用的video编码,pcmu,opus,g722等常用的audio编码), Dialplan, Applicaltion, DB,

   TTS(test to speeck)/ASR(autometic speeck recognition), Chatplan等等模块。

   贴上我画的美图:

   2:freeswitch常用命令

      现在我们安装好了freeswitch,那就练习下常用命令吧。

      哦,再练习之前我们需要把freeswitch的可执行文件加入到PATH中去,这样我们就能像执行shell命令一样来使用freeswitch相关命令了。

      freeswitch默认的安装路径是: /usr/local/freeswitch/, 它的可执行文件在bin/目录下,所以你只需要执行: 

      export PATH=/user/local/freeswitch/bin:$PATH.

      Ok, 万事具备,开始练习吧:

      freeswitch -help #帮助命令,注意哦,一个"-"中划线。这里列出的命令主要是控制freeswitch启动模式的命令,如:

     -waste 允许浪费内存; -core 出错时进行内核转储(这个对测试开发很有用,在出现bug是能记录当时的错误信息);-nc 启动后台模式(也是我目前学习阶段唯一用到的)等等。

      note freeswitch需要使用UDP 5060端口,这个和很多的SIP Client相冲突(如linphone)。

      现在通过 “”freeswitch -nc” 你的freeswitch已经启动了,如何确定你的freeswitch确实在运行呢?

      sudo ps -aux | grep freeswitch 或者 sudo netstat -pan | grep :5060可以检查到的freeswitch是否在正常运行。

       像很多的服务一样,freeswitch安装的时候默认就帮我们安装好了freeswitch的客户端fs_cli,从cli就能看出它是基于命令行的。。好了,来看下fs_cli的常用命令

        执行 “fs_cli“可以直接进入命令行交互页面在交互页面输入:

        version   #当前版本,status  #当前状态, sofia status 显示sofia, help 帮助信息。

        执行 "fs_cli -x 'commond' " 可以在命令执行结束后退出交互页面。

  3 API命令与APP

     API命令是freeswitch内部的命令, APP是一个应用程序,好吧其实大多情况下分不清它们谁是谁。下面通过一个小的呼叫案例来感受下它们(fs_cli交互页面):

     1, 发起呼叫 freeswitch> originate user/1000 &echo #词语句在通过originate user/1000呼叫了一个用户后,执行了echo这个程序。echo是一个回音程序,它把任何它听到的声音反播给对方。originate是一个内部命令。

   4 freeswitch目录结构

    bin:   可执行文件freeswitch, fs_cli都在这里。

    db: 

     htdocs: HTTP server 根目录

     mod: 可加载模块

     run: 存放freeswitch运行时的pid

     sounds: 声音文件

      grammar: 语法, 用于ASR

      includ: 头文件

       log:  日志

       recordings: 录音存放目录

       scripts:  嵌入式语言写的脚本lua, luarun jsrun.

        stoerage: 语音留言

       conf: 配置文件目录。

三 SIP协议基础

      在真正使用freeswitch之前,我们是需要了解sip协议基础的。下面我以http和sip的对比来介绍下sip协议:

 我们来比较下http和sip的请求行,请求头

请求行:

http协议请求行中第一个字段是http协议的方法(get, post, put, patch, delete等)

sip协议的请求行中第一个字段是sip协议支持的方法(invite,register,ack,cancel,bye,options)

http协议的请求行中第二个字段代表的是server端的某一资源

sip协议的请求行第二个字段代表的是server端的某一个人

二者请求行中第三个字段都代表协议的版本号。

请求头:

请求头主要是想表达client端一些信息

http协议中有client可以接受什么样的数据,支持的压缩方法,与服务器连接的状态等等

sip协议中有呼叫端的标识,被叫者的标识,会话的标识等等信息。

       http协议 sip 协议

请求行:  GET /aggsite/AggStats HTTP/1.1

请求行: INVITE sip:username@sip_server_ip SIP/2.0

请求头 Host: www.cnblogs.com;Connection: keep-alive Accept: text/plain, */*;

请求头:Call-ID: xxx, CSeq:xx, From:xxx, To:xxx, Max-Forwards:, Via:xxx

四:freeswitch通话模型初探

     了解sip协议后,我们就可以试着了解freeeswitch的核心技术了。

      sip协议是一个点对点的协议(Peer to Peer),理论上只要两个sip端就可以直接通话了。但是实际情况是不容易实现的。想象一下,sipA,sipB是两个互不相识的sip客户端,A和B要想通话,则必须让A和B先认识,如何让A和B认识呢,一个比较简单的办法就是找一个A,B都认识的人S,让S 为A,B牵桥搭线。这里A,B是client的角色,S就是一个服务器的角色,不过这个角色比较特殊,它只负责牵线的工作,剩下的完全交给A,B,因此S这个服务器又称之为Signaling Server.

用个图表达下

上面介绍了P2P的简单流程,然而freeswitch采用的不是这种通信建立的模式。也当然,freeswitch不会采用这用架构,因为这种模式server只起到牵线的作用,完成牵线的作用后就没事情做了,无法对通话进行监控和管理。

那如果我们想要实现对通话的管理呢?比如,录音,状态查看等。答案是 Back-to-Back UA.那么如何理解这个家伙呢?

我们把上面的案例做一点点改变:角色变化如下

A是个男孩,青春期;B是个女孩,也是青春期;S的角色变化比较大是一个成年人微信群,现在里面有 A的父亲,B的父亲。

故事在一个春天里开始了:A 不知道在哪里听说B是一个漂亮的女孩,于是他想和B见面,见不了面通个电话也行啊。A知道他的父亲在一个成年人的微信群里,心想说不定这个群里有认识B的人。于是乎A拿起了电话和父亲建立了连接,说道: 爸爸,你在群里帮我问下有认识B的人吗? A的父亲就开始寻找,他发现一个男人脸上写着B的信息,于是就对这个男人(B的父亲)发起呼叫,嘿兄弟,帮忙联系下B,我儿子想给她通电话。B的父亲正想为女儿相亲呢,这下正好,赶快拿起手机与B建立起来了连接。现在我们来看看连接有多少个了; 1,A---A的父亲; 2,A的父亲---B的父亲;3, B的父亲---B。因为A的父亲和B的父亲都想对A,B之间的通话进行了解,因此连接就这样保持着。

 来个图表示下:

 

好了,到此freeswitch初探就写到这里,下面学习下它的应用场景。

五:freeswitch应用场景

    在介绍freeswitch应用场景之前,不得不提一下IP-PBX和PBX,以及一些呼叫中心业务相关的概念。

    以下内容大多提取自<freeswitch权威指南>一书:敬上链接地址  https://wenku.baidu.com/view/f0deb939e518964bcf847cb4.html,虽然只有前面几章免费(我也只是看了前面免费的几章),但是作者由浅入深,从古至今的讲述了呼叫业务的发展历史,并且详细的介绍了freeswitch如何安装,使用。下面记录下本人读后所得,便于以后复习:

   记得作者在书中有一句话,大意是“我们对一直存在于身边的事物一知半解”。再次感谢作者的写作思路,能让我从历史的角度,迅速渐进地,由简入繁地,去了解电话业务的发展过程。

   PSTN(Public Switch Telephone Network)公共电话网络。

  我们对internet很了,在internet上我们可以通过路由器,交换机连接到世界上任何一个可访问的公有IP。但是我们对时时刻刻在用的电话网络却不明所以,其实PSTN也像internet一样,通过运营商提供给我的号码(就像internet上的公网IP),我们就可以在PSTN上与其他终端用户交流(就像internet上不同IP间的访问一样)。

   贴上我画的PSTN的发展简图。

   

      PBX(Private Branch eXchange)私有或专有交换机。PBX的使用场景就像internet上的路由器一样,它的一端通PSTN相连,一端和公司内部的话机终端相连,我们可以通过PBX设置接听方式。

     贴上我画的PBX在公司电话系统中的位置:

      

 

   上面的案例只试用与小规模的部署,当有大规模的部署需求时,呼叫中心(Call center)就孕育而生了。呼叫中心提供了更多的服务,如排队,IVR,录音系统等等,下面以一张图来表达:图片引用自《FreeSwitch权威指南》:

   

随着互联网的发展交换机由硬件交换机到软件交换机转换,而freeswitch正被作为软交换,网关服务器来使用。结合目前很火的webrtc,webrtc sipgateway等服务可以搭建起来网页版的sip client,也可以很方便的搭建起电话会议,视频会议。

我使用Intel提供的webrtc开发套件(在服务器端集成sip client), sipgateway(一个sip网关,通过这个服务,可以实现网页版的sip client)以下红色方框内的是本人经过测试实际可行的。由于对电话业务不熟,只是走通了不同sip端,通过freeswitch镜像交互这一步。

不同的sip client如 jitsi,xlite,linphone, web sip client, webrtc-mcu-server(集成的有sip client)通过freeswitch已经能正常通信。

 

网络电话时代图

 

posted @ 2018-02-01 01:36  chenzhenqi  阅读(4384)  评论(0编辑  收藏  举报