本文主要记录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已经能正常通信。

网络电话时代图

freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。的更多相关文章

  1. 64位FreeSWITCH编译安装(版本1.4.20)

    1.安装64位的CentOS6.5操作系统(勾选的服务器版本安装). 2.下载FreeSWITCH安装包以及关联的lib库.下载地址http://files.freeswitch.org/downlo ...

  2. freeswitch 编译安装后的配置

    --------------------FreeSWITCH configuration------------Locations: prefix: /usr/local/freeswitchexec ...

  3. freeswitch编译安装依赖

    ncurses:提供字符界面 zlib:数据压缩 libjpeg:JPEG图片格式数据的解码/编码/其他. lua:lua解释器 libedit:一种编辑操作的库,对一些可以交互操作的场景,或转为了自 ...

  4. LNAMP服务器环境搭建(手动编译安装)

    LNAMP服务器环境搭建(手动编译安装) 一.准备材料 阿里云主机一台,操作系统CentOS 6.5 64位 lnamp.zip包(包含搭建环境所需要的所有软件) http://123.56.144. ...

  5. 6、httpd2.4 编译安装LAMP

    www.itjc8.com 新特性: MPM支持运营DSO机制(动态共享对象),以模块形式按需加载 支持event MPM 支持异步读写 支持每模块及每个目录分别使用各自的日志级别 每请求配置 增强版 ...

  6. Freeswitch 各版本一键安装脚本 Freeswitch 快速安装 G729编解码库

    最近有时间整理,写了freeswitch的一键安装包分享一下,里面带有 mysql=0 是否选择安装mysql. 其他提示:脚本里面集成了安装g729脚本,支持录音.转码的bcg729脚本. 1.下载 ...

  7. freeswitch编译java esl

    一.背景假设源代码路径为/home/freeswitch 二.编译安装libesl.a1. cd /home/freeswitch(源代码的根目录) 执行./configure,以便生成必要的Make ...

  8. 编译安装Heartbeat常见错误

    -----------那些需要升级包还有少包的错误就不写了---------- <b>1</b>. Reusable-Cluster-Components-glue-glue- ...

  9. mysql5.5编译安装

    MySQL是一个关系型数据库管理系统 ,由瑞典MySQL AB公司开发,目前属于Oracle 公司.MySQL分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤其是开放源码 这一特点,一般中 ...

随机推荐

  1. 写jquery插件(转载)

    如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jquery 及ui 内置web项目里了.至于使用jquery好处这里就不再赘述了,用过的都知道.今天我们来讨论下jq ...

  2. GetAsyncKeyState()& 0x8000

    0x8000 & GetKeyState(VK_SHIFT); 这句是判断是否有按下shift键. 关于GetAsyncKeyState与GetKeyState区别:关于GetAsyncKey ...

  3. PHP(一般标签介绍,标签特性,实体名称,绝对路径与相对路径)

    h1:为标题  h1~h6 标题会逐渐变小 需更换标签里面的数字 如: <h1>这是标题123</h1>---标题 <h2>这是标题123</h2>-- ...

  4. 关于0x3f3f3f3f

    发现有人把无穷大设成0x3f3f3f3f,好像还真不是随便设的. 0x3f3f3f3f比10^9大一点,比一般数据范围大: 乘2之后比2147483467小,满足正无穷加正无穷还是正无穷: 每个字节都 ...

  5. 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园

    题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...

  6. 简单理解php深复制浅复制问题

    其实接触深复制浅复制是通过学习c++了解到的,比如c++很好用的模板,php是不允许方法模板和类模板 一个简单的例子,如果不是很了解php 的取地址符&,可以去看下官方文档,php的& ...

  7. 洛谷试炼场 - 关卡1-5 - 简单字符串 - (Done)

    P1055 ISBN号码 #include<bits/stdc++.h> using namespace std; string s; ]={','X'}; int main() { ci ...

  8. (四)juc线程高级特性——线程池 / 线程调度 / ForkJoinPool

    13. 线程池 第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置. 线程池可以解决两个不同问 ...

  9. DBMS_METADATA.set_transform_param格式化输出

    DBMS_METADATA.set_transform_param格式化输出获得DDL --输出信息采用缩排或换行格式化 EXEC DBMS_METADATA.set_transform_param( ...

  10. navicat for mysql 数据库备份与还原

    一, 首先设置, 备份保存路径 工具 -> 选项 点开 其他 -> 日志文件保存路径 二. 开始备份 备份分两种, 一种是以sql保存, 一种是保存为备份 SQL保存 右键点击你要备份的数 ...