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已经能正常通信。
网络电话时代图