吴伟贤のBlog

Feed Rss

FreeSWITCH的SDP读取与设置

07.21.2013, FreeSWITCH的SDP读取与设置已关闭评论, freeswitch, by .

转自:http://www.cnblogs.com/jizha/archive/2013/06/07/freeswitch_sdp.html

 

在对接第三方SIP客户端和网关时,常常需要修改手工修改SDP信息。 下面给出设置修改SDP信息的两种方法,如下:
– 通过拨号方案修改SDP信息
– 通过API命令修改SDP信息

通过拨号方案修改SDP信息

Edit sdp channel variables by dialplan.

拨号方案重写SDP信息

在拨号方案里面通过set方法设置switch_r_sdp的值,该方法会直接覆盖掉原有的sdp值。
具体拨号方案如下所示:

<extension name="show_info">
  <condition field="destination_number" expression="^9192$">
  <action application="answer"/>
  <action application="info"/>
  <action application="log" data="INFO  ===switch_r_sdp Before:========${switch_r_sdp}"/>
  <action application="set"><![CDATA[switch_r_sdp=v=0
o=- 123456 123 IN IP4 192.168.1.112
s=etmedia
c=IN IP4 192.168.1.113
t=0 0
a=X-nat:0 Unknown
m=audio 4002 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000
]]>
  </action>
  <action application="log" data="INFO  ===switch_r_sdp After:============${switch_r_sdp}"/>
  <action application="sleep" data="250"/>
  <action application="hangup"/>
  </condition>
</extension>  

控制台输出如下所示:

2013-06-07 22:04:44.210888 [INFO] mod_dptools.c:1458  ===switch_r_sdp Before:========v=0
o=- 3579631484 3579631484 IN IP4 192.168.1.101
s=etmedia
c=IN IP4 192.168.1.101
t=0 0
a=X-nat:0 Unknown
m=audio 4018 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000
a=rtpmap:103 speex/16000
a=rtpmap:102 speex/8000
a=rtpmap:117 iLBC/8000
a=fmtp:117 mode=30
a=rtpmap:3 GSM/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:9 G722/8000
a=rtpmap:118 AMR/8000
a=rtpmap:119 AMR-WB/16000
a=rtpmap:104 speex/32000
a=rtpmap:4 G723/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=rtcp:4019 IN IP4 192.168.1.101

2013-06-07 22:04:44.210888 [INFO] mod_dptools.c:1458  ===switch_r_sdp After:============v=0
o=- 123456 123 IN IP4 192.168.1.112
s=etmedia
c=IN IP4 192.168.1.113
t=0 0
a=X-nat:0 Unknown
m=audio 4002 RTP/AVP 18 103 102 117 3 0 8 9 118 119 104 4 101
a=rtpmap:18 G729/8000

从上面的输出结果可以看到,在设置完switch_r_sdp后,原有的SDP变量的值都被替换为新值。

拨号方案向A-Leg附加SDP新值

apend new value to A-Leg sdp
上面的方法会直接覆盖掉所有的SDP值,那如果只是要附加一部分值的话,可以采用下面的方式:
如下方拨号方案所示:

<extension name="show_info">
  <condition field="destination_number" expression="^9192$">
  <action application="answer"/>
  <action application="info"/
  <action application="set" data="switch_r_sdp=${switch_r_sdp}AS:384"/>
  <action application="sleep" data="250"/>
  <action application="hangup"/>
  </condition>
</extension>  

在原有变量的后面附加上自己需要的值即可。

拨号方案向B-Leg附加SDP新值

append new value to B-Leg SDP
如果需要在桥接B-Leg之前,修改B-Leg的SDP值的话,需要用到一个通道变量sip_append_audio_sdp
可采用下面的方式来解决:

<extension name="show_info">
  <condition field="destination_number" expression="^9192$">
  <action application="answer"/>
  <action application="info"/>
  <action application="export" data="sip_append_audio_sdp=b=AS:384"/>
  <action application="sleep" data="250"/>
  <action application="hangup"/>
  </condition>
</extension> 

应用场景

在桥接第三方SIP客户端时,需要在SDP在里面增加对方自定义的值才能协商语音成功,在这种场景里面需要用到该变量。(此处是个人理解,如果有更好的应用,欢迎指点)

变量说明

sip_append_audio_sdp在官网的Wiki文档说明如下:
This may be used to append audio parameters to the SDP sent to B-leg.
It should/must be set before bridging.
Usage:

<action application="export" data="sip_append_audio_sdp=a=fmtp:18 annexb=no"/>   

简单翻译下是该变量可以用来设置发送给B-Leg的语音变量,不过,需要在Bridge之前进行设置。

通过API命令修改SDP信息

API命令读取SDP

前提假设

假设现在有两个短号互打,1000为Easytalk,1001为x-lite,1001拨打1000,通话正常建立。

1000对应的通道UUID为:31c0ea2e-53b6-4457-8790-70b1b1c36d10
1001对应的通道UUID为:6fec25de-34e9-4a4a-9d1c-5284bf023e43

查询A-Leg的SDP信息

使用下面的命令查询使用的SDP:
FreeSWITCH@wchi-PC> uuid_getvar 6fec25de-34e9-4a4a-9d1c-5284bf023e43 switch_r_sdp
返回结果:

v=0
o=- 2 2 IN IP4 192.168.1.101
s=CounterPath X-Lite 3.0
c=IN IP4 192.168.1.101
t=0 0
m=audio 55190 RTP/AVP 107 119 100 106 0 105 98 8 101
a=rtpmap:107 BV32/16000
a=rtpmap:119 BV32-FEC/16000
a=rtpmap:100 SPEEX/16000
a=rtpmap:106 SPEEX-FEC/16000
a=rtpmap:105 SPEEX-FEC/8000
a=rtpmap:98 iLBC/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=alt:1 1 : +pnfung+ CxnLWcRO 192.168.1.101 55190

查询B-Leg的SDP信息

FreeSWITCH@wchi-PC> uuid_getvar 31c0ea2e-53b6-4457-8790-70b1b1c36d10 switch_r_sdp
返回结果:

v=0
o=- 3579629755 3579629756 IN IP4 192.168.1.101
s=etmedia
c=IN IP4 192.168.1.101
t=0 0
a=X-nat:0 Unknown
m=audio 4016 RTP/AVP 0 101
a=rtpmap:0 PCMU/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=rtcp:4017 IN IP4 192.168.1.101

API命令设置SDP

设置方法同上面拨号方案类似,都是通过修改通道变量来达到目的。只是修改的方式不同而已。

freeswitch在呼叫中心高效使用 IVR 的 5 个最佳技巧

07.21.2013, freeswitch在呼叫中心高效使用 IVR 的 5 个最佳技巧已关闭评论, freeswitch, by .

转自:http://www.freeswitch.org.cn/2010/08/14/-zai-hu-jiao-zhong-xin-gao-xiao-shi-yong-ivr-de-5-de-zui-jia-ji-qiao.html

 

原文来自:http://www.voiptoday.org/index.php?option=com_content&view=article&id=496:top-5-tips-for-effective-use-of-ivrs-in-call-center&catid=903:call-center&Itemid=171

IVR 本来是用于在呼叫中心里通过使用计算机技术来增加客户服务能力的. 但是, 你是否注意到, 你的 IVR 确实增加了你的客户满意度了呢还是激怒了你的用户? 读读下面这 5 个最佳技巧, 可以确保你确实增加了你的客户服务能力.

CRM 集成

你必须将你的 IVR 与 CRM 系统集成! 如果不集成的话, 根本谈不上提高了客服水平. 通过将 IVR 与 CRM 系统集成, 可以增加很多有用的特性, 比方说对于用户身份验证来讲, 用户就不需要输入所有相关的信息. 这将有助于缩短服务时间, 并且客户与乐于使用 IVR.

允许客户转接到人工坐席

任何时候, 都必须让客户能够选择转接到客户关怀的人工坐席上. 在很多情况下, 客户知道他们必须跟真人解释他们的需求或问题, 如果他们无法找到一个选项能转接到人工坐席, 那么他们很可能就转到其它的竞争对手那里去了. 对于通用型的呼叫中心或客户关怀服务来讲, 这尤其重要. 你必须在电脑服务和人工坐席方面做一个良好的平衡.

不要对客户的具体情况问两次

在很多 IVR 中, 我们发现客户必须先输入自己的某些身份验证信息后方可进行获得下一步的服务, 然而, 当他最终最转接到人工坐席时, 他还要重复他所输入的信息. 永远不要这样做. 这样会激怒客户, 你的客户关怀中心也可能会立即变成客户愤怒中心. 还有一种情况是客户回到主菜单时,要求重新输入验证信息,千万不要那么做.

如实准确

如实准确地提供任何信息. 另外,也要注意尽量让导航菜单简短.你应该在每一级菜单都提供一个转接至人工坐席的选项及回主菜单的选项. 长菜单会吓跑客户,并且太长的菜单也不容易记住所有的选项.

IVR 信息

永远在主菜单提供一下”帮助”选项. 它应该有关于IVR本身的帮助, 如, 该 IVR 能为用户提供什么功能以及不提供什么功能. 另外, 告诉客户他能连接到客户代表的大致等待时间. 建议你不要使用类似”您的电话对我们很重要,我们正在转 接客户服务专员, 请耐心等待…”之类的信息,如果这样的信息重复很多次, 没准就会发怒了, 尤其是客户本来就是打进电话来抱怨的时候.

上述的 5 个技巧并不能涵盖 IVR 的所有方面.无论如何, 高效使用 IVR 的底线是: 针对你的每一项业务进行优化!

使用SIPP对FreeSWITCH进行稳定性及压力测试

07.21.2013, 使用SIPP对FreeSWITCH进行稳定性及压力测试已关闭评论, freeswitch, by .

转自:http://www.freeswitch.org.cn/2013/01/14/shi-yong-sipp-dui-freeswitch-jin-xin-wen-ding-xing-ji-ya-li-ce-shi.html

SIPP 是一个很好的SIP测试工具,不过其缺省的配置文件好像有点问题,因此FreeSWITCH推荐使用以下配置文件进行测试:

http://www.freeswitch.org/eg/load_test/dft_cap.xml

使用方法很简单,只需要运行以下命令就可以了,我进行了个简单测试,每秒发一个请求,每个请示持续10秒(10000ms)。发到FreeSWITCH的5080端口:

sipp -sf dft_cap.xml -r 1 -d 10000 192.168.1.21:5080

最初会收到好多404,那是因为还没有路由。看一下 FreeSWITCH 的 LOG,在FreeSWITCH public那个 context 里加个到 service的路由就好了:

<extension name="200">
  <condition field="destination_number" expression="^service$">
    <action application="answer"/>
    <action application="playback" data ="local_stream://moh"/>
  </condition>
</extension>

当然 SIPP 还有好多选项,用起来也很灵活,抛砖引玉,剩下的就靠你慢慢琢磨了。祝玩得开心!

freeswitch 优化db

07.21.2013, freeswitch 优化db已关闭评论, freeswitch, by .

来自群 freeswitch-cn

昆山+戴晓亮(272966) 14:13:51
今天没事做给大家讲一下fs的优化
fs运行的时候会生成一些db文件,是sqlite的,因为sqlite在高并发的状态下不行
我以前是直接把这些文件放在ramdisk下面的,这样的确能够提高稳定性的,
但是在超过200以上的并发,系统有时会出问题的
所以我就把这些文件放在mysql里面跑 毕竟mysql不会出现锁的状态的
http://wiki.freeswitch.org/wiki/Using_ODBC_in_the_core
按照上面做就可以了 ubuntu安装unixODBC的路径和说明里面的不一样的,自己修改一下
然后我就把core fifo internal 这些都跑在了mysql (我的fs自己优化了一下 所以就这3个需要数据库,默认会有很多需要的)
最后给大家一个提示,这些数据库是用来跑临时数据的,所以只要速度快不需要保存的
所以我就把本来是Innodb的表都改成mysql的内存表了,
结果就是速度奇快,超级稳定
一点小经验大家分享一下

——————————————————————————————————————————————————-

西安-大熊(816078) 14:46:11
其实sql并不是瓶颈,XML dialplan更加需要优化
——————————————————————————————————————————————————-
昆山+戴晓亮(272966) 14:48:55
这个没涉及到dialplan呢
fs在运行的时候会有大量的后台数据,就像session一样的东西,用于记录用户的通道等等信息
这些个数据需要优化的 官方的wiki都说这个要优化
——————————————————————————————————————————————————-
昆山+戴晓亮(272966) 14:50:04
然后才是dialplan的流程优化
——————————————————————————————————————————————————-
西安-大熊(816078) 14:51:26
放在内存盘上就可以了,我觉得用odbc其实也不好
——————————————————————————————————————————————————-
昆山+戴晓亮(272966) 14:55:52
sqlite有死锁的问题 你怎么解决
mysql如果不通了 那么其他业务也做不了了
所以mysql一定通着的
通着就要利用一下啊 mysql的内存表速度比memcache的速度还快
而且不会死锁 这个是最稳定的方法了
我已经实在想不出有更好的办法了
有好方法赐教
如果不用mysql当然是最好了

freeswitch cookbook 第1章: Routing Calls

07.21.2013, freeswitch cookbook 第1章: Routing Calls已关闭评论, freeswitch, by .

转自:http://www.voip123.cn/?p=242

本章我们将从多个方面讨论呼叫路由相关的知识,主要包括:

* 内部呼叫

* DID内呼

* 外呼

* 同振

* 顺振

*

* 定时路由呼叫

*

介绍

呼叫路由是每一个FREESWITCH服务器的核心。虽然有若干处理复杂呼叫建立的方法,但它可以提供基本的工具,确保解决这些问题。

呼叫路由的最基本内容是拨码计划(dialplan)。拨码计划由一系列动作组成,以完成各种拨码(就像书中诸多章节提到的,拨码计划还有许多特性能影响呼叫路由)。拨码计划包含若干个contexts,每个contexts包含若干个extensions,每个extensions由若干个actions组成,每个actions完成特定的呼叫路由。呼叫路由的解析通过regular expressions完成。regular expressions是正则表达式匹配模式,以完成各个extensionsactions的执行。

为了确保能正确理解本章的内容,了解默认配置中的正则表达式匹配和三个contexts非常必要。

Regular expressions

FreeSWITCH 使用Perl-compatible regular expressions(PCRE)进行正则表达式匹配。请看如下拨码计划的片段,

<extension name=”example”>

<condition field=”destination_number” expression=”^(10\d\d)$”>

<action application=”log” data=”INFO dialed number is [$1]“/>

该例子是包含了拨码计划的大部分内容。匹配destination_number(是指用户要进行呼叫的号码)字段并把该值保存在一个名为$1的变量里。假如一个用户拨打1025,该号码正好和我们例子中的^(10\d\d)$相符合。所有在action中的动作将执行。在我们的例子中将执行log输出。将在终端上显示一条绿色信息,并将变量$1的值用1025代替。打印出的内容如下:

2011-01-09 13:38:31.864281 [INFO] mod_dptools.c:1152 dialed number is [1025]

理解了这个基础的例子,你可以写出更为出色的拨码计划。更多关于正则表达式匹配相关的内容,可以参考如下链接:http://wiki.freeswitch. org/wiki/Regex.

[wiki部分翻译开始]

介绍

在FreeSWITCH中大量使用了正则表达式匹配。具体可以参见http://wiki.freeswitch.org/wiki/Dialplan_XML中的具体应用。本WIKI(http://wiki.freeswitch.org/wiki/Regular_Expression)中分享了许多有用的正则表达式匹配。

 

可以通过在CLI中运行regex命令测试所写正则表达式是否符合您的想法。

regex

Evaluate a regex (regular expression). This command behaves differently depending upon whether or not a substitution string is supplied:

  • If a subst is not supplied, regex returns either true or false
  • If a subst is supplied, regex returns the subst value on a true condition, or the source string on a false condition (this is an update as of revision 14727, previously the regex would return “false” on a failed match.)

The regex delimiter defaults to the | (pipe) character. The delimiter may be changed to ~ (tilde) or / (forward slash) by prefixing the regex with m: (new behavior as of 14727).

Usage: regex <data>|<pattern>[|<subst string>]

       regex m:/<data>/<pattern>[/<subst string>]

       regex m:~<data>~<pattern>[~<subst string>]

Examples:

regex test1234|\d                  <== Returns “true”

regex m:/test1234/\d               <== Returns “true”

regex m:~test1234~\d               <== Returns “true”

regex test|\d                      <== Returns “false”

regex test1234|(\d+)|$1            <== Returns “1234″

regex sip:foo@bar.baz|^sip:(.*)|$1 <== Returns “foo@bar.baz”

regex testingonetwo|(\d+)|$1       <== Returns “testingonetwo” (no match)

[wiki部分翻译结束]

默认配置中的重要拨码计划

如前所述,contexts是由若干个extensions组成。FreeSWITCH默认的配置包括三类contexts。

*  default

*  public

*  features

 

每一类都有其特定的作用,了解他们,有助于您更好地实现您想要实现的功能。具体可参见http://wiki.freeswitch.org/wiki/Dialplan_XML

 

在默认配置中使用最多的context是 default context。默认不修改的情况下,所有在FREESWITCH上认证的用户之间的通话都将使用该context。一般的修改包括使用ACLs以及禁用认证。Default context可以看作是一种“内部的”context,即它管理所有在FreeSWITCH注册的用户之间的路由,与之相对应的是“外部的”呼叫。

 

许多传统PBX所拥有的特性在default context中都有所体现。在 conf/dialplan/default. Xml 中有许多值得学习的实例。可以通过简单的实例开始学习,例如 show_info,可以在终端打印一些提示信息; vmain, which allows a user to log into his/her voicemail box.

 

Local_Extension非常有用,它包含如下内容:

* 内部用户之间的呼叫路由

* 语音留言功能

* 使用 bind_meta_app实现in-call特性

* 更新本地数据库,实现回呼、监听等功能

本章讨论的许多内容都可以在Local_Extension中找到。

freeswitch cookbook 第2章: 呼叫中的电话和服务供应商

07.21.2013, freeswitch cookbook 第2章: 呼叫中的电话和服务供应商已关闭评论, freeswitch, by .

转自:http://www.voip123.cn/?p=249

 

在本章我们将说明下列内容:

配置一个SIP电话向FreeSWITCH注册

使用PortAudio来连接音频设备

把FreeSWITCH当作软电话使用

配置一个SIP网关

配置Google Voice

配置编码

 

介绍

从字面理解FreeSWITCH就是将各种终端连接在一起.(未完)

 

配置一个SIP电话向FreeSWITCH注册

大部分使用中的FreeSWICH要允许用户之间进行通信,SIP电话或其他SIP设备要能向其发起注册.当一个电话或其他设备向FreeSWITCH服务器注册,意味着它将提供一些信息(比如说IP地址和端口)来说明如何通过局域网或互联网来访问自己.FreeSWITCH将保存这些信息为将来如果有人想联络这个电话的时候使用.

在这个例子中,你将注册一个电话到FreeSWITCH.你需要将认证信息分别写入你的电话和FreeSWITCH(两边要匹配).在本书中我们将只说明在FreeSWITCH服务器端的配置.

开始

确保mod_sofia模块已经编译并加载(Sofia是SIP协议栈).

你还需要确定你注册用的IP地址已经允许作为一个特殊的域名.

确认的步骤:

1:运行FreeSWITCH的命令行界面(CLI)

2:执行命令sofia status来确认现在服务器正在监听的IP和端口

3:查看输出结果,特别留意标记ALIASED那行

freeswitch@internal> sofia status

Name           Type   Data                                 State

======================================================================

external          profile  sip:mod_sofia@192.168.0.100:5080       RUNNING (0)

my.company.com  alias    internal                              ALIASED

internal          profile  sip:mod_sofia@127.0.0.1:5060          RUNNING (0)

======================================================================

2 profiles 1 aliases

标记为ALIASED的那行意味着在系统中已经识别域名并用来注册.重命名的域名将关联到一个特别的端口和IP地址.在这个例子中,my.company.com被关联到一个叫做internal的接口.该接口是监听在127.0.0.1的IP和5060的端口上.也就是说,如果要向FreeSWITCH上的my.company.com注册,就必须发生在服务器的127.0.0.1和5060端口.

如何做

下面的步骤将说明如何配置一个SIP电话:

1:选择你想要的注册时用到的用户名和密码

2:打开FreeSWITCH配置目录下的directory/default/USERNAME.xml文件. USERNAME需要使用用户名或分机号码来替换(比如说2000)

3:添加以下内容到文件中并保存

<include>

<user id=”USERNAME”>

<params>

<param name=”password” value=”PASSWORD”/>

</params>

</user>

</include>

代码中的USERNAME和PASSWORD使用你选择的用户名和密码来替换.

4:重新进入FreeSWITCH的命令行界面(CLI)

5:在FreeSWITCH的CLI上执行命令reloadxml 来重新加载当前的配置.

开源VOIP项目的组合应用

07.21.2013, 开源VOIP项目的组合应用已关闭评论, voip, by .

转自: http://blog.csdn.net/bearjb2006/article/details/5817391

 

在VOIP的开源社区有无数的开源项目,多的让你很容易迷失方向(http://www.voip-info.org/wiki/view/Open+Source+VOIP+Software?navmenu),从不用的应用场景我们试图来挖掘这个宝库。

一、SOHO或作坊式企业

多为All-in-one的部署方式,合适的开源项目有Asterisk、Freeswitch

二、中型或大型企业

集中式、HA模式的sip proxy,结合分布式部署的的Media Server,合适的开源项目组合有Kamailio+Freeswitch(fusionpbx、asterisk)+sip communicator,如:Kamailio 3.0.x and FreeSWITCH 1.0.6 for Media Services

三、运营商

分布式的sip proxy、分布式的media server、集中式的用户信息数据库,如IMS架构,合适的开源项目还在摸索尝试寻找中

目前国外已经有企业在尝试进行Hosting VOIP Server的业务,与云计算(虚拟化)的结合将是一个不错的业务模式,参考:

http://www.synapseglobal.com/voip_vps.html

http://www.net-vantage.com/voip-telephone-systems.html

编写一个SIP软电话所需要的组件

07.21.2013, 编写一个SIP软电话所需要的组件已关闭评论, voip, by .

若要编制一个支持语音视频的SIP软电话,至少需要以下组件及相关技术:

1.  SIP协议栈:主要用于会话的建立,修改以及终止。

开源SIP协议栈:

[1]The GNU oSIP library – http://www.gnu.org/software/osip/

[2] reSIProcate – http://www.resiprocate.org/Main_Page

[3] libmsip – http://www.minisip.org/download.html

[4] Sofia – SIP – http://sofia-sip.sourceforge.net/

[5] pjsip – http://www.pjsip.org/

更多的内容可参考网站:http://www.pernau.at/kd/voip/index.html

 

2.  SDP协议栈:主要用于会话的媒体协商。

3.  RTP协议栈:为数据提供了具有实时特征的端对端传送服务。

[1] jrtplib – http://lumumba.luc.ac.be/jori/jrtplib/jrtplib.html

[2] ortp – http://www.linphone.org/ortp

[3] GNU ccRTP – http://www.gnu.org/software/ccrtp

更多的内容可参考网站:http://www.pernau.at/kd/voip/index.html

 

4.  音频编解码库:主要用于对音频数据编解码,以适应网络传输。

G.711 A-law

G.711 Mu-law

GSM

G729

Speex – http://www.speex.org/

还有好多,不一一列举。

 

5.  视频编解码库:主要用于对视频数据编解码,以适应网络传输。

Xvid – http://www.xvid.org/

X264 – http://www.videolan.org/developers/x264.html

Ffmpeg – http://ffmpeg.org/

 

6.  界面皮肤及操作库:主要用于软电话界面的显示以及逻辑的控制。

7.  音频数据处理库:对音频数据的基本处理,例如通过声卡获取,然后播放等。

8.  视频数据处理库:对视频数据的基本处理,例如通过显卡获取,然后播放等。

9.  NAT以及防火墙穿越技术:穿越私网和防火墙。

10. 防窃听防封杀加密技术:防黑客窃听,防有关部门封杀

centos 安装git

07.20.2013, centos 安装git已关闭评论, linux, by .

由于软件源中没有,就不能使用yum来安装,不过通过源码安装也很简单。
git下载地址:http://code.google.com/p/git-core/downloads/list,我下载的是git-1.8.3.3.tar.gz ,下载命令:

wget http://git-core.googlecode.com/files/git-1.8.3.3.tar.gz

tar -xvf git-1.8.3.3.tar.gz
cd git-1.8.3.3/
./configure
make && make install

就可以了,git依赖zlib-devel,openssl-devel,perl,cpio,expat-devel,gettext-devel这些包,如果configure报错,通过yum安装缺失的依赖包即可。

 

git –version 看下是否安装成功

FreeSWITCH 1.0.6 第一章-谈FreeSWITCH架构(二)

07.20.2013, FreeSWITCH 1.0.6 第一章-谈FreeSWITCH架构(二)已关闭评论, freeswitch, by .

转自:http://www.8000hz.com/archives/8.html

 

The FreeSWITCH API (FSAPI) 

FreeSWITCH中另一个非常强大的模块接口是FSAPI模块。 这一类的的接口的设计原则很简单—它接收一个字符串作为参数,可能也可能不被解析,主要由下面的代码决定。返回的值也是一个字符串,任意大小,从一个字符大小到几页纸,这由被调用的函数决定。

FSAPI的功能的主要好处就是一个模块可以使用它调用其它的模块,而不需要直接连接实际的代码。FreeSWITCH的命令行接口或CLI 使用FSAPI函数根据你的输入传入命令。这里是一个小的示例关于如何从FreeSWITCH的CLI中执行status 这个FSAPI命令。

freeswitch> status API CALL [status()] output: UP 0 years, 3 days, 23 hours, 31 minutes, 31 seconds, 524 milliseconds, 576 microseconds 438 session(s) since startup 6 session(s) 0/30 1000 session(s) max

当我们敲下status然后按下回车键的时候真实发生了什么呢, 关键字’status’被用来寻找status FSAPI函数从它被实现的模块中. 下面的函数然后被调用,core 正在查询它的状态信息。一旦状态数据被获取,输出会通过流传送回来同时作为命令行的结果显示出来。

我们已经知道一个模块可以创建和导出FSAPI函数,这些可以从任何地方调用像CLI中。但是不止如此,还有更多!模块也可以向FSAPI的接口执行命令然后通过一个特定的协议返回结果。在FreeSWITCH中有两个模块就是有这个功能的—mod_event_socket 和 mod_xml_rpc(mod_event_socket 将会详细的讨论在第9章节,从外部控制FreeSWITCH).

来一看mod_xml_rpc的例子。这个模块把标准的XML-RPC协议实现作为一个FreeSWITCH的模块。 客户端可以使用XML-RPC接口连接到FreeSWITCH和执行任何FSAPI命令。所以一个远端的客户端可以执行一个RPC 调用到 status,也可以得到一个就像我们在前一个例子中看到的相同的状态信息 这个模块也将FreeSWITCH作为一个通用的WEB服务器,这样就可以允许用过直接的URL访问来执行FSAPI命令。例子,某要可以在浏览器中输入http://example.freeswitch.box:8080/api/status通过万维网来使用命令status.通过这种技术,创建一个工作像CGI那样,提供一个可以直接接入到FreeSWITCH内部的动态的WEB应用是可行的。

如我们所看到的那样,FSAPI接口几乎是万能的。现在我们知道它可以用来提供一个命令行接口,一个可以让模块互相调用的方式和导出WWW或XML-RPC函数。还有一个FSAPI的功能我们还没有讲到。我们在之前已经轻微的接触过channel 变量的概念,仅仅是使用表达式${myvariable}去获得一个指定变量的值。FSAPI函数也可通过${myfunction()}这样的格式去调用。 这个标记表示名叫”myfuntion”的FSAPI的命令会被调用,并且这个表达式会被它调用的函数的输出替换。   因此,我们可以在任何地方使用${status()},变量被展开去获取status命令,例如:

<action application=”set” data=”my_status=${status}”/>

My_status变量中的值是status命令行的输出。

单一模块提供多种功能的弊端是,为了达成这样的目的,我们不得不让函数变得弱类型(”loosely type”)。这表示有好几种情况,一个FSAPI会被很容易的调用,使用我们已经讨论过的方式。另外,也有一个特殊的函数被设计成使用一个特殊的方式调用。例如,如果我们我们开发一个FSAPI的命令,提供输出HTML则有意使用一个浏览器来调用,我们不想使用命令行调用或作为一个变量来引用它. 同样地,如果我们写了一个FSAPI函数用来计算通话中的某些值,它的设计就是从diaplan中调用,如果从命令行或WEB来调用的话就显得没有多大的意义了。所以,拥有非凡的能力也就意味着要承担重大的责任,我们需要使用通常的理解去决定何时在哪里使用合适的FSAPI函数来对它们最大的利用。

The XML registry XML
注册表

我们已经讨论了FreeSWITCH核心中大部分重要的组件和他们是如何互相作用的。我们已经了解event system 如何携带信息穿过核心,XML Dialplan如何从XML 的注册表中的查询数据。现在是个好的时间去解释XML注册表更多一些了。XML注册表是一个主要的管理XML文档,它拥有所有的可以保证FreeSWITCH运行正常地重要的数据。初始的文档是由你的硬盘中被加载,然后传入到一个特定的预处理器。这个预处理器可以包含其它的XML文档和其它特殊的操作,如设置全局变量,这些操作会被预处理器解析然后另入到文档中。 一旦整个文件和所有它包含的都会解析,替换和生成为一个静态的XML文档,这个文件就会被加载到内存中。

XML的注册表被分成了好几个部分—配置,拨号方案,目录和片(宏).核心和模块从configuration部分中来获取他们的配置文件。XML diaplan 模块从diaplan部分中来获取它的拨号方案数据。SIP的验证,用户查询,以及voicemail模块读取他们的账户信息从directory 部分。Phrase Macros获取它的配置信息从phrases 部分。如果我们把在硬盘上的文档修改了,我们可以通过重新加载更新到内部中通过从CLI中执行命令reloadxml.(CLI是一个使用FSAPI接口与freeSWITCH核心进行通信的示例).   

Language modules

一种独特的模块类型,它们没有像文件模块和终端模块那样有直接的接口到FreeSWITCH,但是依然提供一个极大的丰富的连接到已经存在的技术,它们就是语言模块(language module).语言模块呢嵌入一个编程语言像Lua,javascript或perl到FreeSWITCH中,同时在核心和语言运行环境中间来转换功能。这可以允许IVR 应用使用嵌入式应用来编写,可以简化很多使用。Language模块通常以应用接口的方式注册到核心中,FSAPI接口是通过Diaplan来调用地。Language 模块提供很多的可能性和非常的强大。通过language模块,你可以使用标准的编程语言来编写一个强大的语音应用。在某些方面,你可以通过一种编程语言来真实的控制一个电话.

The default configuration
 默认配置

理解所有的这些概念远非易事,同时作为一个软件的维护者,我们不希望大部分的人做的只是”点击”. 这就是为什么,我们在核心中设置了这么多的层,把事情变得简单化和易学。默认的配置文件就是 新手和令人疯狂的,复杂的,有时候彻头彻尾邪恶的被称为电话的东西之间的最后的防线。 我们非常的努力去拯救用户从这些令人抓狂的东西里。

默认配置文件的主要目的是列出你在使用中会遇到的数百个参数.我们提供一个可用的配置文件,在你冒险进入未知的电话世界和动手修改一些选项前,事实上不需要更改就可以使用一些功能。把FreeSWITCH想作是一个乐高积木(lego set)。FreeSWITCH和所有的组件就像一个品牌积木一样,使用这些部分去创建我们想像的任何东西。默认的配置呢就像你在积木介绍册子里看到的示例飞船一样。它包含准确的,手把手的配置介绍教你怎么去配置一个可工作的环境。

当你学到了一些经验,你可能就想去修改你的乐高飞船添加一些额外的功能,或者可能重建他们为一个汽车或者其它新的创造。对于FreeSWITCH来说的好消息是它已经被组装好了。因此,不像一桶乐高积木那样,如果你把它弄碎了或你对你的配置文件灰心了,你可以重新安装默认的配置文件而你不需要从头开始重建。默认的配置文件会在第三章进行讨论-尝试驾驭默认的配置.

一旦FreeSWITCH已经在你的系统上编译成功,你只需要执行程序,不需要更改配置文件。你可以注册一个SIP电话或软件SIP电话到你电脑的IP地址上和打一通测试电话。如果你有勇气和希望连接到传统的电话,你需要对SIP相关的知识牢牢的掌握。这是因为这需要一些工作(包括为你的电脑购买一个硬件板卡或一个神奇的设备叫ATA-模拟电话适配器)。

如果你不止有一部电话,你可以把它们配置的拥有一个独立的分机号在1000—1019之间,这是在默认的配置文件中已经定义好的。一旦你有两个电话注册成功,你可以使用它们去互相通话或让他们去参加在号码3000-3399之间的会议室。如果你呼叫了一个没有注册的电话或一个电话长时间没有接听,语音邮件应用将会使用phrase系统去提示你所呼叫的用户暂时无法接通,以及让你留一下一个留言。如果你拨打5000,你可以听到一个默认的IVR菜单,提供一些菜单中的选择示例,展示在条条框框之外其他各种巧妙的事情。有很多小的变化,可以向默认的配置,同时仍保持它的完整补充.

例如,使用我们之前看过的预处理器,默认的配置文件加载从某些地方的文件到XML注册表,意味着在特殊文件夹的文件将会组合到最终的XML配置文档中。 最重要的两点是,在哪里保存用户账号和拨号方案中的extension。那默认预先配置20个分机都保存在它们个自的文件中。我们可以很容易的添加带有独立账号定义的新文件,把它放置到directory目录去添加另一个账号,然后从FreeSWITCH的CLI中执行命令 reloadxml。同样的方法也适用于示例拨号方案,我们可以添加到单个的extension到单独的文件,然后把它放置到我们想放置的地方。 

Summary 总结

FreeSWITCH是由可拆解的组件组成的复杂的系统,这样耦合在一起是为了提供一个,可靠的,稳定的核心,灵活,易扩展和附加组件。核心扩展它的接口到模块。这些模块进一步的简化应用,然后提供这些功能给用户。模块也可以通过转换不同的协议到一个通用的,众所周知的模式把外部的功能加入到FreeSWITCH. 我们已经看了很多种模块类型,以及它们如何围绕在核心周围如何互相作用实现转换简单抽象的概念到高层次的功能。我们接触了一些在FreeSWITCH中比较受欢迎的应用-会议和语音邮件模块,以及它们如何使用系统中的模块,甚至它们都不知道对方。这种不可认知是由事件系统实现的。我们也了解了默认配置文件是如何提供一些可用的示例的, 去帮助实现一个全功能的软件交换系统来取代另一种商业的系统。

现在,我们拥有了一些普通的观念关于怎么让FreeSWITCH运作,我们将会通过尝试一些真实世界中的例子来更进一步的了解这些概念。首先,我们会从互联网上下载一份源代码,我们可以编译Freeswitch和安装Freeswitch。从那里,我们将会彻底的检验配置文件,所以请保证你有一个SIP电话或至少一个软终端。一旦我们尝试了几个例子,我们会更深入的了解事情是如何工作的和创造一些我们自己的东西像一个extension或两个和一个IVR菜单。所以呼吸一下,准备去深入FreeSWITCH的电话通讯世界吧!