本文主要记录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. 一、HTML基础学习

    1.基本格式<html> <head><title></title></head> <body></body>< ...

  2. HTML、CSS知识点,面试开发都会需要--No.5 文章段落

    No.5 文章段落 1.文字属性 文字属性包含font-*和text-*两类. 2.基于font的属性 (1)font-family:字体属性,多个字体之前用逗号隔开.如果第一个字体没找到,则依次找后 ...

  3. adjacent_diffenerce

    版本1: template <class InputIterator,class OutputIterator> OutputIterator adjacent_diffenerce(In ...

  4. Changing Ethernet Media Speed for AIX

    ITS UNIX Systems Changing Ethernet Media Speed for AIX First you need to find out the device name of ...

  5. Linux 安装mysql mariadb配置

    CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server ...

  6. 实体框架—Entity Framework

    简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...

  7. PE就是市盈率的缩写 PB是平均市净率的缩写

    PE就是市盈率的缩写 PB是平均市净率的缩写 以下为百科知识 PE Price/Earnings 市盈率 也有叫做PER的,Price/Earnings Ratio 本益比,价格收益比,市盈率 市盈率 ...

  8. Python脚本之安装linux源码包-Jenkins

    最近开始学Python,按照网上的教程,写了一个Python脚本下载Jenkins并运行的脚本,很简单. 首先使用vi命令编辑一个新文件auto_built_jenkins.py(关于vi的使用可以见 ...

  9. ng2-tree

    [转]https://github.com/valor-software/ng2-tree#eyes-demo  demo:http://valor-software.com/ng2-tree/

  10. py三个面试小问题

    1.是否遇到过Python的模块间循环引用的问题,如何避免它? 这是代码结构设计的问题,模块依赖和类依赖,如果老是觉得碰到循环引用可能的原因有几点: a.可能是模块的分界线划错地方了 b.可能是把应该 ...