怎么实现freeswitch opensips一个技能组同时振铃

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
基于FreeSwitch和DSP的多媒体会议系统的设计与实现.pdf4页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:11 &&
你可能关注的文档:
··········
··········
V01.30 No.8
第30卷第8期
计算机应用与软件
ComputerApplicationsandSoftware
2013年 8月
基于 FreeSwitch和 DSP的多媒体会议系统的设计与实现
胡建洲 田裕鹏
南京航空航天大学自动化学院 江苏南京 210016
多媒体会议系统的出现有效地提高了人们的沟通效率。传统采用纯硬件的多媒体会议系统,由于价格昂贵,维护困难,
让很多企业都望而却步;而单纯以软件构建的多媒体会议系统又由于对通用处理器能力要求过高、音视频效果不佳等原因,无法满
足企业对高质量多媒体会议的需求。针对这一现实需求,设计一种以FreeSwitch为软交换平台,以SIP协议为信令协议,并外扩DSP
来分离处理媒体,软硬件相结合的多媒体会议系统。实践表明该系统能够满足当前对多媒体会议系统的需求
VoIP FreeSwitch SIP协议 DSP
多媒体会议系统
中图分类号 TP311
文献标识码 A
DOI:10.3969/j.issn.x.1
DESIGN AND IM PLEMENTATIoN oFMULTIMEDIA CoNFERENCE SYSTEM
BASED oN FREESW ITCH AND DSP
HuJianzhou TianYupeng
SchoolofAutomationEngineering,Nanjing UniversityofAeronauticsandAstronautics,Nanjing210016,flangsu,China
Abstract Theemergenceofmultimediaconferencesystem effectivelyimprovedthecommunicationefficiencybetweenpeople.Duetohigh
costanddifficultinmaintenance,quiteafew companiesflinchfrom traditionalmultimediaconfer
正在加载中,请稍后...FreeSWITCH 架构
我的图书馆
FreeSWITCH 架构
总体结构 FreeSWITCH 由一个稳定的核心及外围模块组成,下图来自 FreeSWITCH Wiki: && FreeSWITCH 使用线程模型来处理并发请求,每个连接都在单独的线程中进行处理。这不仅能提供最大强度的并发,更重要的是,即使某路电话发生问题,也只影响到它所在的线程,而不会影响到其它电话。FreeSWITCH 的核心非常短小精悍,这也是保持稳定的关键。所有其它功能都在外围的模块中。模块是可以动态加载(以及卸载)的,在实际应用中可以只加载用到的模块。外围模块通过核心提供的 Public API 与核心进行通信,而核心则通过回调机制执行外围模块中的代码。核心FS Core 是 FreeSWITCH 的核心,它包含了关键的数据结构和复杂的代码,但这些代码只出现在核心中,并保持了最大限度的重用。外围模块只能通过 API 调用核心的功能,因而核心运行在一个受保护的环境中,核心代码都经过精心的编码和严格的测试,最大限度地保持了系统整体的稳定。核心代码保持了最高度的抽象,因而它可以调用不同功能,不同协议的模块。同时,良好的 API 也使得编写不同的外围模块非常容易。数据库FreeSWITCH 的核心除了使用内部的队列、哈希表存储数据外,也使用外部的 SQL 数据库存储数据。当前,系统的核心数据库使用 SQLite,默认的存储位置是 db/core.db 。 使用外部数据库的好处是--查询数据不用锁定内存数据结构,这不仅能提供性能,而且降低了死锁的风险,保证了系统稳定。命令 show calls、show channels 等都是直接从数据库中读取内容并显示的。由于 SQLite 会进行读锁定,因此不建议直接读取核心数据库。系统对数据库操作做了优化,在高并发状态时,核心会尽量将几百条 SQL 一齐执行,这大大提高了性能。但在低并发的状态下执行显得稍微有点慢,如一个 channel 已经建立了,但还不能在 show channels 中显示;或者,一个 channel 已经 destroy 了,还显示在 show channels 中。但由于这些数据只用于查询,而不用于决策,所以一般没什么问题。除核心数据库外,系统也支持使用 ODBC 方式连接其它数据库,如 PostgreSQL、MySQL等。某些模块,如 mod_sofia、mod_fifo等都有自己的数据库(表)。如果在 *nix 类系统上使用 ODBC,需要安装 UnixODBC,并进行正确的配置,如果编译安装的话还需要开发包 unixodbc-devel(CentOS) 或 unixodbc-dev(Debian/Ubuntu)。由于 PostgreSQL、MySQL 等都是 Client-Server 的结构,因此,外部程序可以直接查询数据(但需要清楚数据的准确性,可能会比 FreeSWITCH 核心中的数据有所滞后)。模块FreeSWITCH 主要分为以下几个部分:终点End Points 是终结 FreeSWITCH 的地方,也就是说再往外走就超出 FreeSWITCH 的控制了。它主要包含了不同呼叫控制协议的接口,如 SIP, TDM 硬件,H323 以及 Google Talk 等。这使得 FreeSWITCH 可以与众多不同的电话系统进行通信。如,可以使用 mod_skypopen 与 Skype 网络进行通信。另外,前面也讲过,它还可以通过 portaudio 驱动本地声卡,用作一个软电话。拨号计划Dialplan 主要是为了查找电话路由,主要的是 XML 描述的,但它也支持 Asterisk 格式的配置文件。另外它也持 ENUM 查询。XML 接口XML Interface 支持多种获取 XML 配置的方式,它可以是本地的配置文件,或从数据库中读取,甚至是一个能动态返回 XML 的远程 HTTP 服务器。编解码器FreeSWITCH 支持最广泛的 Codec,除了大多数 VoIP 系统支持的 G711、G722、G729、GSM 外,它还支持 iLBC,BV16/32、SILK、CELT等。它可以同时桥接不同采样频率的电话,以及电话会议等。语音识别支持语音自动识别(ASR)及文本-语音转换(TTS)。文件格式支持不同的声音文件格式,如 wav,mp3等。日志日志可以写到控制台、日志文件、系统日志(syslog)以及远程的日志服务器。嵌入式语言通过 swig 包装支持多种脚本语本语言控制呼叫流程,如 Lua、Javascript、Perl等。事件套接字使用 Event Socket 可以使用任何其它语言通过 Socket 方式控制呼叫流程、扩展 FreeSWITCH 功能。目录结构在 *nix 类系统上,FreeSWITCH 默认的安装位置是 /usr/local/freeswitch,在 Windows 上可能是 C:\freeswitch,目录结构大致相同。bin
可执行程序
系统数据库(sqlite),FreeSWITCH 把呼叫信息存放到数据库里以便在查询时无需对核心数据结构加锁
HTTP Web srver 根目录
可加载模块
运行目录,存放 PID
声音文件,使用 playback() 时默认的寻找路径
日志,CDR 等
recordings
录音,使用 record() 时默认的存放路径
嵌入式语言写的脚本,如使用 lua()、luarun()、jsrun 等默认寻找的路径
语言留言(Voicemail)的录音
配置文件,详见下节
配置文件配置文件由许多 XML 文件组成。在系统装载时,XML解析器会将所有XML文件组织在一起,并读入内存,称为XML注册表。这种设计的好处在于其非常高的可扩展性。由于XML文档本身非常适合描述复杂的数据结构,在 FreeSWITCH 中 就可以非常灵活的使用这些数据。并且,外部应用程序也可以很简单地生成XML,FreeSWITCH 在需要时可以动态的装载这些 XML。另外,系统还允许在某些 XML 节点上安装回调程序(函数),当这些节点的数据变化时,系统便自动调用这些回调程序。使用 XML 唯一的不足就是手工编辑这些 XML 比较困难,但正如,他绝对不是 XML 的粉丝,但这一缺点与它所带来的好处相比是微不足道的。而且,将来也许会有图形化的配置工具,到时候只所高级用户会去看这些XML了。目录结构配置文件的的目录结构如下(其中结尾有 “/” 的为目录):autoload_configs/
directory/
extensions.conf
freeswitch.xml
fur_elise.ttml
jingle_profiles/
mime.types
notify-voicemail.tpl
sip_profiles/
tetris.ttml
voicemail.tpl
web-vm.tpl
其中最重要的是 freeswitch.xml,就是它将所有配置文件“粘”到一起。只要有一点 XML 知识,这些配置是很容易看懂的。其中,X-PRE-PROCESS标签称为预处理命令,它用来设置一些变量和装入其它配置文件。在 XML 加载阶段,FreeSWITCH 的 XML 解析器会先将预处理命令进行展开,生成一个大的 XML 文件 log/freeswitch.xml.fsxml。该文件是一个内存镜像,用户不应该手工编辑它。但它对调试非常有用,假设你不慎弄错了某个标签,又不知道它在哪个地方,FreeSWITCH 在加载时就报 XML 的某一行出错,在该文件中就行容易找到。整个XML文件分为几个重要的部分:configuration (配置)、dialplan (拨号计划)、directory(用户目录)及phrase(分词)。每一部分又分别装入不同的 XML。小知识:XML
XML由标签(Tag)和属性构成。&tag& 和 &/tag&组成一对标签,如果该标签有相关属性,刚以
&tag attr="value"&&/tag& 形式指定。有些标签无须配对,则必须以 “/&”关闭该标签定义,
如&other\_tag attr="value"/&。
freeswitch.xml&?xml version="1.0"?&
&document type="freeswitch/xml"&
&!-- #comment 这是一个配置文件,本行是注释 --&
&X-PRE-PROCESS cmd="include" data="vars.xml"/&
&section name="configuration" description="Various Configuration"&
&X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/&
&/section&
&/document&
上面是一个精减了的 freeswitch.xml。它的根是 document,在 document 中,有许多 section,每个 section 都对应一部分功能。其中有两个 X-PRE-PROCESS 预处理指令,它们的作用是将 data 参数指定的文件包含(include)到本文件中来。由于它是一个预处理指令,FreeSWITCH 在加载阶段只对其进行简单替换,并不进行语法分析,因此,对它进行注释是没有效果的,这是一个新手常犯的错误。假设 vars.xml 的内容如下,它是一个合法的 XML:&!-- this is vars.xml --&
&var&xxxxx&/var&
若你在调试阶段想把一条 X-PRE-PROCESS 指令注释掉:&!-- &X-PRE-PROCESS cmd="include" data="vars.xml"/& --&
当 FreeSWITCH 预处理时,还没有到达 XML 解析阶段,也就是说它还不认识 XML 注释语法,而仅会机械地将预处理指令替换为 vars.xml 里的内容:&!-- &!-- this is vars.xml --&
&var&xxxxx&/var& --&
由于 XML 的注释不能嵌套,因此便产生错误的XML。解决办法是破坏掉 X-PRE-PROCESS 的定义,如我常用下面两种方法:&xX-PRE-PROCESS cmd="include" data="vars.xml"/&
&XPRE-PROCESS cmd="include" data="vars.xml"/&
由于 FreeSWITCH 不认识 xX-PRE-PROCESS 及 XPRE-PROCESS,因此它会忽略掉该行,相当于注释掉了。vars.xmlvars.xml 主要通过 X-PRE-PROCESS 指令定义了一些全局变量。全局变量以 $${var} 表示,临时变量以 ${var} 表示。有些变量是系统在运行时自动获取的,如默认情况下 $${base_dir}=/usr/local/freeswitch, $${local_ip_v4}=你机器的IP地址等。autoload_configs 目录autoload_configs目录下面的各种配置文件会在系统启动时装入。一般来说都是模块级的配置文件,每个模块对应一个。文件名一般以 模块名.conf.xxml 方式命名。其中 modules.conf.xml 决定了 FreeSWITCH 启动时自动加载哪些模块。dialplan 目录定义 XML 拨号计划,我们会有专门的章节讲解拨号计划。directory 目录它里面的配置文本决定了 FreeSWITCH 作为注册服务器时哪些用户可以注册上来。FreeSWITCH 支持多个域(Domain),每个域可以写到一个 XML 文件里。默认的配置包括一个 default.xml,里面定义了 1000 ~ 1019 一共 20 个用户。sip_profiles它定义了 SIP 配置文件,实际上它是由 mod_sofia 模块在 autoload_configs/sofia.conf.xml 中加载的。但由于它本身比较复杂又是核心的功能,因此单列了一个目录。我们将会在后面加以详细解释。XML 用户目录XML 用户目录决定了哪些用户可以注册到 FreeSWITCH 上。当然,SIP 并不要求一定要注册才可以打电话,但是用户认证仍需要在用户目录中配置。用户目录的默认配置文件在 conf/directory/,系统自带的配置文件为 default.xml(其中 dial-string 一行由于排版要求人工换行,实际上不应该有换行):&domain name="$${domain}"&
&param name="dial-string" value="{presence_id=${dialed_user}@${dialed_domain}}
${sofia_contact(${dialed_user}@${dialed_domain})}"/&
&variables&
&variable name="record_stereo" value="true"/&
&variable name="default_gateway" value="$${default_provider}"/&
&variable name="default_areacode" value="$${default_areacode}"/&
&variable name="transfer_fallback_extension" value="operator"/&
&/variables&
该配置文件决定了哪些用户能注册到 FreeSWITCH 中。一般来说,所有用户都应该属于同一个 domain(除非你想使用多 domain,后面我们会有例子)。这里的 $${domain} 全局变量是在 vars.xml 中设置的,它默认是主机的 IP 地址,但也可以修改,使用一个域名。params 中定义了该 domain 中所有用户的公共参数。在这里只定义了一个 dial-string,这是一个至关重要的参数。当你在使用 user/user_name 或 sofia/internal/user_name 这样的呼叫字符串时,它会扩展成实际的 SIP 地址。其中 sofia_contact 是一个 API,它会根据用户的注册地址扩展成相应的呼叫字符串。variables 则定义了一些公共变量,在用户做主叫或被叫时,这些变量会绑定到相应的 Channel 上形成 Channel Variable。在 domain 中还定义了许多组(group),组里面包含很多用户(user)。&groups&
&group name="default"&
&X-PRE-PROCESS cmd="include" data="default/*.xml"/&
在这里,组名 default 并没有什么特殊的意义,它只是随便起的,你可以修改成任何值。在用户标签里,又使用预处理指令装入了 default/ 目录中的所有 XML 文件。你可以看到,在 default/ 目录中,每个用户都对应一个文件。你也可以定义其它的用户组,组中的用户并不需要是完整的 XML 节点,也可以是一个指向一个已存在用户的“指针”,如下图,使用 type="pointer" 可以定义指针。
&group name="sales"&
&user id="1000" type="pointer"/&
&user id="1001" type="pointer"/&
&user id="1002" type="pointer"/&
虽然我们这里设置了组,但使用组并不是必需的。如果你不打算使用组,可以将用户节点(users)直接放到 domain 的下一级。但使用组可以支持像群呼、代接等业务。使用 group_call 可以同时或顺序的呼叫某个组的用户。实际用户相关的设置也很直观,下面显示了 alice 这个用户的设置:&user id="alice"&
&param name="password" value="$${default_password}"/&
&param name="vm-password" value="alice"/&
&variables&
&variable name="toll_allow" value="domestic,international,local"/&
&variable name="accountcode" value="alice"/&
&variable name="user_context" value="default"/&
&variable name="effective_caller_id_name" value="Extension 1000"/&
&variable name="effective_caller_id_number" value="1000"/&
&variable name="outbound_caller_id_name" value="$${outbound_caller_name}"/&
&variable name="outbound_caller_id_number" value="$${outbound_caller_id}"/&
&variable name="callgroup" value="techsupport"/&
&/variables&
由上面可以看到,实际上 params 和 variables 可以出现在 user 节点中,也可以出现在 group 或 domain 中。 当它们有重复时,优先级顺序为 user,group,domain。当然,用户目录还有一些更复杂的设置,我们留待以后再做研究。呼叫流程及相关概念再复习一下,FreeSWITCH是一个B2BUA,我们还是以第四章中的图为例:主要呼叫流程有以下两种:bob 向 FreeSWITCH 发起呼叫,FreeSWTICH 接着启动另一个 UA 呼叫 alice,两者通话;FreeSWITCH 同时呼叫 bob 和 alice,两者接电话后 FreeSWITCH 将 a-leg 和 b-leg 桥接(bridge)到一起,两者通话。其中第二种又有一种变种。如市场上有人利用上、下行通话的不对称性卖电话回拨卡获取不正当利润:bob 呼叫 FreeSWITCH,FreeSWITCH 不应答,而是在获取 bob 的主叫号码后直接挂机;然后 FreeSWITCH 回拨 bob;bob 接听后 FreeSWITCH 启动一个 IVR 程序指示 bob 输入 alice 的号码;然后 FreeSWITCH 呼叫 Alice……在实际应用中,由于涉及回铃音、呼叫失败等,实际情况要复杂的多。Session 与 Channel对每一次呼叫,FreeSWITCH 都会启动一个 Session(会话,它包含SIP会话,SIP会在每对UAC-UAS之间生成一个 SIP Session),用于控制整个呼叫,它会一直持续到通话结束。其中,每个 Session 都控制着一个 Channel(信道),Channel 是一对 UA 间通信的实体,相当于 FreeSWITCH 的一条腿(leg),每个 Channel 都有一个唯一的 UUID。另外,Channel 上可以绑定一些呼叫参数,称为 Channel Variable(信道变量)。Channel 中可能包含媒体(音频或视频流),也可能不包含。通话时,FreeSWITCH 的作用是将两个 Channel(a-leg 和 b-leg,通常先创建的或占主动的叫 a-leg)桥接(bridge)到一起,使双方可以通话。通话中,媒体(音频或视频)数据流在 RTP 包中传送(不同于 SIP, RTP是另外的协议)。一般来说,Channel是双向的,因此,媒体流会有发送(Send/Write)和接收(Receive/Read)两个方向。回铃音与 Early MediaA
------ |a 交换机 | ---X--- | 交换机 b| -------- B
为了便于说明,我们假定A与B不在同一台服务器上(如在PSTN通话中可能不在同一座城市),中间需要经过多级服务器的中转。假设上图是在 PSTN 网络中,A 呼叫 B,B 话机开始振铃,A 端听回铃音(Ring Back Tone)。在早期,B 端所在的交换机只给 A 端交换机送地址全(ACM)信号,证明呼叫是可以到达 B 的,A 端听到的回铃音铃流是由 A 端所在的交换机生成并发送的。但后来,为了在 A 端能听到 B 端特殊的回铃音(如“您拨打的电话正在通话中…” 或 “对方暂时不方便接听您的电话” 尤其是现代交换机支持各种个性化的彩铃 - Ring Back Color Tone 等),回铃音就只能由 B 端交换机发送。在 B 接听电话前,回铃音和彩铃是不收费的(不收取本次通话费。彩铃费用一般是在 B 端以月租或套餐形式收取的)。这些回铃音就称为 Early Media(早期媒体)。它是由 SIP 的183(带有SDP)消息描述的。理论上讲,B 接听电话后交换机 b 可以一直不向 a 交换机发送应答消息,而将真正的话音数据伪装成 Early Media,以实现“免费通话”。Channel Variable在每一个 Channel 上都可以设置好多 Variable,称为信道变量。FreeSWITCH 呼叫过程中,会根据这些变量控制 Channel 的行为。$${var} 与 ${var}${var} 是在 dialplan、application 或 directory 中设置的变量,它会影响呼叫流程并且可以动态的改变。而 $${var} 则是全局的变量,它仅在预处理阶段(系统启动时,或重新装载 - reloadxml时)被求值。后者一般用于设置一些系统一旦启动就不会轻易改变的量,如 $${domain} 或 $${local_ip_v4}等。所以,两者最大的区别是,$${var} 只求值一次,而 ${var} 则在每次执行时求值(如一个新电话进来时)。$variable_xxxx你会发现,有些变量在显示时(可以使用dp_tools 中的 info() 显示,后面会讲到)是以“variable_”开头的,但在实际引用时要去掉这开头的“variable_”。如“variable_user_name”,引用时要使用“${user_name}”。&列举了一些常见的变量显示与引用时的对应关系。给 Variable 赋值在 dialplan 中,有两个程序可以给 Variable 赋值:&action application="set" data="my_var=my_value"/&
&action application="export" data="my_var=my_value"/&
以上两条命令都可以设置 my_var 变量的值为 my_value。不同的是 -- set 程序仅会作用于“当前”的 Channel (a-leg),而 export 程序则会将变量设置到两个 Channel (a-leg 和 b-leg)上,如果当时 b-leg 还没有创建,则会在创建时设置。另外,export 还可以只将变量设置到 b-leg 上:&action appliction="export" data="nolocal:my_var=my_value"/&
在实际应用中,如果 a-leg 上已经有一些变量的值(如 var1、var2、var3),而想同时把这些变量都复制到 b-leg 上,可以使用以下几种办法:&action application="export" data="var1=$var1"/&
&action application="export" data="var2=$var2"/&
&action application="export" data="var3=$var3"/&
或者使用如下等价的方式:&action application="set" data="export_vars=var1,var2,var3"&
所以,其实 set 也具有能往 b-leg 上赋值的能力,其实,它和 export 一样,都是操作 export_vars 这个特殊的变量。取消 Variable 定义取消 Variable 定义只需对它赋一个特殊的值_undef_”:&action application="set" data="var1=_undef_"&
截取 Variable 的一部分可以使用特殊的语法取一个 Variable 的子串,格式是“${var:位置:长度}”。其中 “位置” 从 0 开始计烽,若为负数则从字符串尾部开始计数;如果“长度”为 0 或小于 0,则会从当前“位置”一直取到字符串结尾(或开头,若“位置”为负的话)。例如 var 的值为 ,那么:${var}
${var:0:1}
${var:-4:2} = 78
${var:4:2}
小结本章描述了 FreeSWITCH 的架构。到这里,读者应该对 FreeSWITCH 有了一个总体的了解。我们也提到了一些基本元素和概念,简单介绍了配置文件的基本结构,由于脱离了实际单讲配置会比较抽象,因此,我们把具体的配置也写到后面的章节里,即,用到时再说。
TA的最新馆藏[转]&freeswitch(3)
第二章 FreeSWITCH 初步
什么是 FreeSWITCH ?
FreeSWITCH 是一个开源的电话交换平台,它具有很强的可伸缩性--从一个简单的软电话客户端到运营商级的软交换设备几乎无所不能。能原生地运行于Windows、 Max OS X、Linux、BSD 及 solaris 等诸多32/64位平台。可以用作一个简单的交换引擎、一个PBX,一个媒体网关或媒体支持IVR的服务器等。它支持SIP、H323、Skype、Google
Talk等协议,并能很容易地与各种开源的PBX系统如sipXecs、Call Weaver、Bayonne、YATE及Asterisk等通信。 FreeSWITCH 遵循RFC并支持很多高级的SIP特性,如 presence、BLF、SLA以及TCP、TLS和sRTP等。它也可以用作一个SBC进行透明的SIP代理(proxy)以支持其它媒体如T.38 等。FreeSWITCH 支持宽带及窄带语音编码,电话会议桥可同时支持8、12、16、24、32及48kHZ的语音. 而在传统的电话网络中,要做到三方通话或多方通话需要通过专门的芯片来处理,其它像预付费,彩铃等业务在PSTN网络中都需要依靠智能网(IN)才能实现,而且配置起来相当不灵活。
FreeSWITCH 的功能确实非常丰富和强大,在进一步学习之前我们先来做一个完整的体验。FreeSWITCH 默认的配置是一个SOHO PBX(家用电话小交换机),那么我们本章的目标就是从0安装,实现分机互拨电话,测试各种功能,并通过添加一个SIP-PSTN网关拨打PSTN电话。这样,即使你没有任何使用经验,你也应该能顺利走完本章,从而建立一个直接的认识。在体验过程中,你会遇到一点稍微复杂的配置,如果不能完全理解,也不用担心,我们在后面会详细的介绍。当然,如果你是一个很有经验的
FreeSWITCH 用户,那么大可跳过本章。
安装FreeSWITCH基本系统
在本文写作时,最新的版本1.0.5pre10,但说不定当你读到时1.0.5正式版已经发布了。FreeSWITCH支持32位及64位的 Linux、 MacOSX、BSD、Solaris、Windows等众多平台。某些平台上有编译好的安装包,但本人强烈建议从源代码进行安装,因为 FreeSWITCH
更新非常快,而已编译好的版本通常都比较旧。你可以下载源码包,也可以直接从SVN仓库中取得最新的代码。与其它项目不同的是,其SVN主干 (trunk)代码通常比稳定的发布版更稳定。而且,当你需要技术支持时,开发人员也通常建议你先升级到SVN中最新的代码,再看是不是仍有问题。
Windows用户可以直接下载安装文件&(再提醒一下,版本比较旧代,如果从源代码安装的话,需要Visual
Studio 2008)。安装完成执行 c:\freeswitch\freeswitch.exe 便可启动,其配置文件都在c:\freeswitch\conf\。
以下假定你使用 Linux 平台,并假定你有 Linux 的基本知识。如何从头安装 Linux 超出了本书的范围,而且,你也可以很容易的从网上找到这些资料。一般来说,任何发行套件都是可以的,但是,有些发行套件的内核、文件系统、编译环境,LibC 版本会有一些问题。所以,如果你在遇到问题后想获得社区支持,最好选择一种大家都熟悉的发行套件。FreeSWITCH
开发者使用的平台是 CentOS 5.2/5.3(CentOS 5.4 上会有一些问题,并不总是版本越高越好),社区中也有许多人在使用 Ubuntu 和 Debian,如果你想用于生产环境,建议使用 LTS(Long Term Support) 的版本,即 Ubuntu8.04/10.04 或 Debian Stable。在安装之前,我们需要先准备一些环境(FreeSWITCH 可以以普通用户权限运行,但为了简单起见,以下所有操作均用 root 执行):
yum install -y subversion autoconf automake libtool gcc-c++ ncurses-devel make
apt-get -y install build-essential subversion automake autoconf wget libtool libncurses5-dev
以下三种安装方式任选其一,默认安装位置在/usr/local/freeswitch。安装过程中会下载源代码目录,请保留,以便以后升级及安装配置其它组件。
解压缩源码包安装:
tar xvzf freeswitch-1.0.5-latest.tar.gz
cd freeswitch-1.0.5
./configure
make install
这是在在 Linux 上从源代码安装软件的标准过程。首先第 1 行下载最新的源代码,第 2 行解压缩,第 4 行配置编译环境,第 5 行编译安装。
从 SVN 仓库安装:
FreeSWITCH 使用 Subversion 管理源代码,从代码库安装能让你永远使用最新的版本。
svn co&&freeswitch
cd freeswitch
./bootstrap.sh
./configure
make install
与上一种方法不同的是,直接从代码库安装需要执行一个 bootstrap.sh 以初始化一些环境。
最快安装(推荐)
make install
以上命令会下载一个 Makefile,然后使用 make 执行安装过程。安装过程中它会从 SVN 仓库中获取代码,实际上执行的操作跟上一种安装方式相同。
安装声音文件
在以下例子中我们需要一些声音文件,而安装这些声音文件也异常简单。你只需在源代码目录中执行:
make sounds-install
make moh-install
以下高质量的声音文件可选择安装。FreeSWITCH支持8、16、32及48kHz的语音,很少有其它电话系统支持如此多的抽样频率(普通电话是8K,更高频率意味着更好的通话质量)。
make cd-sounds-install
make cd-moh-install
安装完成后,会显示一个有用的帮助,
+---------- FreeSWITCH install Complete ----------+
+ FreeSWITCH has been successfully installed. +
+ +
+ Install sounds: +
+ (uhd-sounds includes hd-sounds, sounds) +
+ (hd-sounds includes sounds) +
+ ------------------------------------ +
+ make cd-sounds-install +
+ make cd-moh-install +
+ +
+ make uhd-sounds-install +
+ make uhd-moh-install +
+ +
+ make hd-sounds-install +
+ make hd-moh-install +
+ +
+ make sounds-install +
+ make moh-install +
+ +
+ Install non english sounds: +
+ replace XX with language +
+ (ru : Russian) +
+ ------------------------------------ +
+ make cd-sounds-XX-install +
+ make uhd-sounds-XX-install +
+ make hd-sounds-XX-install +
+ make sounds-XX-install +
+ +
+ Upgrade to latest: +
+ ---------------------------------- +
+ make current +
+ +
+ Rebuild all: +
+ ---------------------------------- +
+ make sure +
+ +
+ Install/Re-install default config: +
+ ---------------------------------- +
+ make samples +
+ +
+ Additional resources: +
+ ---------------------------------- +
+&&+
+&&+
+&&+
+&&+
+ +
+ irc.freenode.net / #freeswitch +
+-------------------------------------------------+
至此,已经安装完了。在Unix类操作系统上,其默认的安装位置是/usr/local/freeswtich,下文所述的路径全部相对于该路径。两个常用的命令是 bin/freeswitch 和 bin/fs_cli,为了便于使用,建议将这两个命令做符号链接放到你的搜索路径中,如:
ln -sf /usr/local/freeswitch/bin/freeswitch /usr/local/bin/
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/local/bin/
当然,如果 /usr/local/bin 不在你的搜索路径中,可以把上面 /usr/local/bin 换成 /usr/bin/。 另外你也可以修改你的PATH环境变量以包含该路径。
接下来就应该可以启动了,通过在终端中执行freeswitch命令(如果你已做符号链接的话,否则要执行/usr/local /freeswitch/bin/freeswitch)可以将其启动到前台,启动过程中会有许多log输出,第一次启动时会有一些错误和警告,可以不用理会。启动完成后会进入到系统控制台(以下称称FS-Con)。并显示类似的提示符“freeswitch@internal&”(以下简作
“FS& ”)。通过在FS-Con中输入shutdown命令可以关闭FreeSWITCH。
如果您想将FreeSWITCH启动到后台(daemon,服务模式),可以使用freeswitch -nc (No console)。后台模式没有控制台,如果这时想控制FreeSWITCH,可以使用客户端软件fs_cli连接。注意,在fs_cli中需要使用 fsctl shutdown 命令关闭
FreeSWITCH。当然,也可以直接在 Linux 提示符下通过 freeswitch -stop 命令关闭。如果不想退出 FreeSWITCH 服务,只退出fs_cli客户端,则需要输入 /exit,或Ctrl + D,或者,直接关掉终端窗口。
连接SIP软电话
FreeSWITCH最典型的应用是作为一个服务器(它实际上是一个背靠背的用户代理,B2BUA),并用电话客户端软件(一般叫软电话)连接到它。虽然 FreeSWITCH 支持 IAX、H323、Skype、Gtalk 等众多通信协议,但其最主要的协议还是 SIP。支持SIP的软电话有很多,最常用的是
X-Lite 和 Zoiper。这两款软电话都支持 Linux、MacOSX 和 Windows平台,免费使用但是不开源。在 Linux 上你还可以使用 ekiga 软电话。
强烈建议在同一局域网上的其它机器上安装软电话,并确保麦克风和耳机可以正常工作 。当然,如果你没有多余的机器做这个实验,那么你也可以在同一台机器上安装。只是需要注意,软电话不要占用 UDP 5060 端口,因为 FreeSWITCH 默认要使用该端口,这是新手常会遇到的一个问题。你可以通过先启动
FreeSWITCH 再启动软电话来避免该问题,另外有些软电话允许你修改本地监听端口。
通过输入以下命令可以知道 FreeSWITCH 监听在哪个IP地址上,记住这个 IP 地址(:5060以前的部分),下面要用到:
netstat -an | grep 5060
FreeSWITCH 默认配置了 1000 ~ 1019 共 20 个用户,你可以随便选择一个用户进行配置:
在 X-Lite 上点右键,选 Sip Account Settings...,点Add添加一个账号,填入以下参数(Zoiper 可参照配置):
Display Name: 1000
User name: 1000
Password: 1234
Authorization user name: 1000
Domain: 你的IP地址,就是刚才你记住的那个
其它都使用默认设置,点 OK 就可以了。然后点 Close 关闭 Sip Account 设置窗口。这时 X-Lite 将自动向 FreeSWITCH 注册。注册成功后会显示&Ready. Your username is 1000&,另外,左侧的“拨打电话”(Dial)按钮会变成绿色的。如下图。
激动人心的时刻就要来了。输入“9999”按回车(或按绿色拨打电话按钮),就应该能听到保持音乐(MOH, Music on Hold)。如果听不到也不要气馁,看一下 FS-Con 中有没有提示什么错误。如果有“File Not Found”之类的提示,多半是声音文件没有安装,重新查看 make
moh-install 是否有错误。接下来,可以依次试试拨打以下号码:
------------------
号码 | 说明
----------------------
9999 | 保持音乐
9996 | echo,回音测试&
9992 | info,在控制台上显示呼叫参数
9888 | FreeSWITCH电话会议,每周召开
5900 | 呼叫挂起
5901 | 接听挂起的呼叫
5000 | 示例IVR
4000 | 听取语音信箱
33xx | 电话会议,48K(其中xx可为00-99,下同)
32xx | 电话会议,32K
31xx | 电话会议,16K
30xx | 电话会议,8K
| 默认分机号
表一: 默认号码及说明
另外,也许你想尝试注册另外一个SIP用户并在两者间通话。最好是在同一个局域网中的另外一台机器上启动另一个 X-Lite ,并使用 1001 注册,注册完毕后就可以在 1000 上呼叫 1001,或在 1001 上呼叫 1000 。当然,你仍然可以在同一台机器上做这件事(比方说用Zoiper注册为1001),需要注意的是,由于你机器上只有一个声卡,两者可能会争用声音设备。特别是在Linux上,有些软件会独占声音设备。如果同时也有一个USB接口的耳机,那就可以设置不同的软件使用不同的声音设备。
FreeSWITCH配置文件默认放在 conf/, 它由一系列XML配置文件组成。最顶层的文件是freeswitch.xml,系统启动时它依次装入其它一些XML文件并最终组成一个大的XML文件。
文件 | 说明
---------------------------------------------------
vars.xml | 一些常用变量
dialplan/default.xml | 缺省的拨号计划
directory/default/*.xml | SIP用户,每用户一个文件
sip_profiles/internal.xml | 一个SIP profile,或称作一个SIP-UA,监听在本地IP及端口5060,一般供内网用户使用
sip_profiles/externa.xml | 另一个SIP-UA,用作外部连接,端口5080
autoload_configs/modules.conf.xml | 配置当FreeSWITCH启动时自动装载哪些模块
添加一个新的SIP用户
FreeSWITCH默认设置了20个用户(),如果你需要更多的用户,或者想通过添加一个用户来学习FreeSWITCH配置,只需要简单执行以下三步:
* 在 conf/directory/default/ 增加一个用户配置文件
* 修改拨号计划(Dialplan)使其它用户可以呼叫到它
* 重新加载配置使其生效
如果想添加用户Jack,分机号是1234。只需要到 conf/directory/default 目录下,将 1000.xml 拷贝到 1234.xml。打开1234.xml,将所有1000都改为1234。并把 effective_caller_id_name 的值改为 Jack,然后存盘退出。如:
&variable name=&effective_caller_id_name& value=&Jack&/&
接下来,打开 conf/dialplan/default.xml,找到 &condition field=&destionation_number&
expression=&^(10[01][0-9])$&& 一行,改为 &condition field=&destionation_number& expression=&^(10[01][0-9]|1234)$&&。熟悉正则表达式的人应该知道,“^(10[01][0-9])$”匹配被叫号码。因此我们修改之后的表达式就多匹配了一个1234。FreeSWITCH使用Perl兼容的正则表达式(PCRE)。
现在,回到FS-Con,或启动fs_cli,执行 reloadxml 命令或按快捷键F6,使新的配置生效。
找到刚才注册为1001的那个软电话(或启动一个新的,如果你有足够的机器的话),把1001都改为1234然后重新注册,则可以与1000相互进行拨打测试了。如果没有多台机器,在同一台机器上运行多个软电话可能有冲突,这时,也可以直接进在FreeSWITCH控制台上使用命令进行测试:
FS& sofia status profile internal (显示多少用户已注册)
FS& originate sofia/profile/internal/1000 &echo (拨打1000并执行echo程序)
FS& originate user/1000 &echo (同上)
FS& originate sofia/profile/internal/ (相当于在软电话1000上拨打9999)
FS& originate sofia/profile/internal/ XML default (同上)
其中,echo() 程序一个很简单的程序,它只是将你说话的内容原样再放给你听,在测试时很有用,在本书中,我们会经常用它来测试。
FreeSWITCH用作软电话
FreeSWITCH也可以简单的用作一个软电话,如X-Lite. 虽然相比而言比配置X-Lite略微麻烦一些,但你会从中得到更多好处:FreeSWITCH是开源的,更强大、灵活。关键是它是目前我所知道的唯一支持CELT高清通话的软电话。
FreeSWITCH使用mod_portaudio支持你本地的声音设备。该模块默认是不编译的。到你的源代码树下,执行:
make mod_portaudio
make mod_portaudio-install
其它的模块也可以依照上面的方式进行重新编译和安装。然后到FS-Con中,执行:
FS& load mod_portaudio
如果得到“Cannot find an input device”之类的错误可能是你的声卡驱动有问题。如果是提示“+OK”就是成功了,接着执行:
FS& pa devlist
API CALL [pa(devlist)] output:
0;Built-in M2;0;
1;Built-in S0;2;r
2;Built-in H0;2;
3;Logitech USB H0;2;o
4;Logitech USB H1;0;i
以上是在我笔记本上的输出,它列出了所有的声音设备。其中,3和4最后的“o”和“i”分别代表声音输出(out)和输入(in)设备。在你的电脑上可能不一样,如果你想选择其它设备,可以使用命令:
FS& pa indev #0
FS& pa outdev #2
以上命令会选择我电脑上内置的麦克风和耳机。
接下来你就可以有一个可以用命令行控制的软电话了,酷吧?
FS& pa looptest (回路测试,echo)
FS& pa call 9999
FS& pa call 1000
FS& pa hangup
如上所示,你可以呼叫刚才试过的所有号码。现在假设想从SIP分机1000呼叫到你,那需要修改拨号计划(Dialplan)。用你喜欢的编辑器编辑以下文件放到conf/dialplan/default/portaudio.xml
&extension name=&call me&&
&condition field=&destination_number& expression=&^(me|)$&&
&action application=&bridge& data=&portaudio&/&
&/condition&
&/extension&
&/include&
然后,在FS-Con中按“F6”或输入以下命令使之生效:
FS& reloadxml
在分机1000上呼叫“me”或“”(你肯定想为自己选择一个更酷的号码),然后在FS-Con上应该能看到类似“[DEBUG] mod_portaudio.c:268 BRRRRING! BRRRRING! call 1”的输出(如果看不到的话按“F8”能得到详细的Log),这说明你的软电话在振铃。多打几个回车,然后输入“pa
answer”就可以接听电话了。“pa hangup”可以挂断电话。
当然,你肯定希望在振铃时能听到真正的振铃音而不是看什么BRRRRRING。好办,选择一个好听一声音文件(.wav格式),编辑conf/autoload_configs/portaudio.conf.xml,修改下面一行:
&param name=&ring-file& value=&/home/your_name/your_ring_file.wav&/&
然后重新加载模块:
FS& reloadxml
FS& reload mod_portaudio
再打打试试,看是否能听到振铃音了?
如果你用不惯字符界面,可以看一下FreeSWITCH-Air(&/download),它为
FreeSWITCH 提供一个简洁的软电话的图形界面。另外,如果你需要高清通话,除需要设置相关的语音编解码器(codec)外,你还需要有一幅好的耳机才能达到最好的效果。本人使用的是一款USB耳机。
配置SIP网关拨打外部电话
如果你在某个运营商拥有SIP账号,你就可以配置上拨打外部电话了。该SIP账号(或提供该账号的设备)在 FreeSWITCH 中称为SIP网关(Gateway)。添加一个网关只需要在 conf/sip_profiles/external/ 创建一个XML文件,名字可以随便起,如gw1.xml。
&gateway name=&gw1&&&
&param name=&realm& value=&SIP服务器地址,可以是IP或IP:端口号&/&
&param name=&username& value=&SIP用户名&/&
&param name=&password& value=&密码&/&
&param name=&register& value=&true& /&
&/gateway&
如果你的SIP网关还需要其它参数,可以参阅同目录下的 example.xml,但一般来说上述参数就够了。你可以重启 FreeSWITCH,或者执行以下命令使用之生效。
FS& sofia profile external rescan reloadxml
然后显示一下状态:
FS& sofia status
如果显示 gateway gw1 的状态是 REGED ,则表明正确的注册到了网关上。你可以先用命令试一下网关是否工作正常:
FS& originate sofia/gateway/gw1/xxxxxx &echo()
以上命令会通过网关 gw1 呼叫号码 xxxxxx(可能是你的手机号),被叫号码接听电话后,FreeSWITCH 会执行 echo() 程序,你应该能听到自己的回音。
从某一分机上呼出
如果网关测试正常,你就可以配置从你的SIP软电话或portaudio呼出了。由于我们是把 FreeSWITCH 当作 PBX 用,我们需要选一个出局字冠。常见的 PBX 一般是内部拨小号,打外部电话就需要加拨 0 或先拨 9 。当然,这是你自己的交换机,你可以用任何你喜欢的数字(甚至是字母)。
继续修改拨号计划,创建新XML文件: conf/dialplan/default/call_out.xml :
&extension name=&call out&&
&condition field=&destination_number& expression=&^0(\d+)$&&
&action application=&bridge& data=&sofia/gateway/gw1/$1&/&
&/condition&
&/extension&
&/include&
其中,(\d+)为正则表达式,匹配 0 后面的所有数字并存到变量 $1 中。然后通过 bridge 程序通过网关 gw1 打出该号码。当然,建立该XML后需要在Fs-Con中执行 reloadxml 使用之生效。
呼入电话处理。
如果你的 SIP 网关支持呼入,那么你需要知道呼入的 DID 。 DID的全称是 Direct Inbound Dial,即直接呼入。一般来说,呼入的 DID 就是你的 SIP 号码,如果你不知道,也没关系,后面你会学会如何得到。 编辑以下XML文件放到 conf/dialplan/public/my_did.xml
&extension name=&public_did&&
&condition field=&destination_number& expression=&^(你的DID)$&&
&action application=&transfer& data=&1000 XML default&/&
&/condition&
&/extension&
&/include&
reloadxml 使之生效。上述配置会将来话直接转接到分机 1000 上。在后面的章节你会学到如何更灵活的处理呼入电话,如转接到语音菜单或语音信箱等。
其实本章涵盖了从安装、配置到调试、使用的相当多的内容,如果你能顺利走到这儿,你肯定对 FreeSWITCH 已经受不释手了。如果你卡在了某处,或某些功能未能实现,也不是你的错,主要是因为 FreeSWITCH 博大精深,我不能在短短的一章内把所有的方面解释清楚。在后面的章节中,你会学到更多的基本概念、更加深入地了解
FreeSWITCH 的哲学,学到更多的调试技术和技巧,解决任何问题都会是小菜一碟了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:142548次
积分:3156
积分:3156
排名:第8941名
原创:95篇
转载:508篇
评论:22条
文章:30篇
阅读:20670
(10)(6)(18)(50)(15)(31)(93)(54)(28)(40)(8)(9)(29)(34)(30)(40)(39)(25)(12)(14)(7)(5)(8)(9)(1)}

我要回帖

更多关于 freeswitch opensips 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信