基础篇
1. freeswitch -nc是将FREESWITCH启动到后台
2. 在windows上,可以将freeswitch注册为windows服务(使用“FreeswitchConsole -install”)
3. log/freeswitch.log是freeswitch的运行日志
4. conf/autoload_configs/switch.conf.xml定义了控制台的快捷键F1~F12
5. fs_cli.exe类似一个telnet的客户端,可以连接freeswitch;不仅可以连接本地的也可以连接其他的freeswitch,在主目录中编辑配置.fs_cli_conf文件
[server1]
host => 192.168.1.10
port => 8021
password => secret_password
debug => 7
[server2]
host => 192.168.1.11
port => 8021
password => someother_password
debug => 0
确保目标机器的event socket监听的是真实网卡的ip,而不是127.0.0.1,如果是改为服务器IP或“0.0.0.0”
配置完成,在fs_cli中可以使用命令server1或者server2切换地址
6. conf/autoload_configs/event_socket.conf.xml是监听真是网卡地址的配置文件
SDP(会话描述协议)
主要是描述媒体数据
与sip配合使用
SOA(媒体流得协商过程,提议/应答)
3PCC(第三方呼叫控制)
一种灵活的会话控制方式
媒体
编码
1. PCM编码
2. FS支撑得其他语音编码
3. fs中编码名称得格式“名称@xxh@yyi”,h代表Hz频率,i代表ptime,打包间隔,xx和yy代表实际得数值
重新加载编码模块查看编码参数
如:查看SILK编码
reload mod_silk
4. 在FS中有些编码不是默认安装得,可以执行以下命令安装,例如安装silk编码,在fs中执行一下命令
make mode_silk-install
5. 查看当前与profile相关得配置
sofia status profile internal
RTP(实时传输协议)
RTP协议详细说明了在互联网上传递音频和视频得标准数据包格式,RTP协议是建立在UDP协议之上的
RTCP(实时传输控制协议)
是RTP的一个姊妹协议,RTP使用一个偶数UDP端口,而RTCP使用RTP的下一个相邻的奇数端口
RTCP为RTP提供信道外的控制,本身不传输数据,和RTP协作打包发送媒体数据。
主要功能:为RTP提供的服务的质量提供反馈信息,例如传输的字节数、传输分组数等
转码
“8 9 0 3”分别代表PCMA,G722,PCMU,GSM
透传:指不经过转码的情况下,将从一方收到的媒体流原样的转给另一方。
媒体绕过:将媒体流点对点传输,不经过FS
媒体代理:不管FS是否支持此类转码,都对RTP数据不进行任何处理发给另一方,它改变的是SDP中的“c=”部分。
视频,所有编码的视频流都是透传的,FS还不支持视频编码的转码
Media Bug 检测监听媒体流
SIP模块
Sofia-SIP:是由诺基亚公司开发的SIP协议栈
Endpoint:实现一些互联网协议接口的模块称为Endpoint,Endpoint一般是跟通话相关的
NAT(网络地址转换)
当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法
装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
基本功能及实现
批量创建用户
1. 默认20个用户,需要手动添加,例如添加1020用户,首先创建1020.xml,复制1000.xml的模版,然后把出现1000的地方替换为1020即可
2. windows上批量创建1020-1039.xml文件需要安装UnxUtils,
1. 下载地址https://sourceforge.n et/projects/unxutils/,
2. 解压到自己的文件夹,把/usr/local/wbin文件夹的绝对地址加到我的电脑(右键)->属性->高级->环境变量->系统变量->path值
3. 在1000.xml相同的目录下创建“.bat”的文件,文件内容如下:
for /L %%i in (1020,1 1039) do sed -e "s/1000/%%i" 1000.xml > %%i.xml
4. 编辑更改生成的文件的,修改内容
3. 修改默认的Dialplan的正则表达式
<extension name="Local_Extension">
<condition field="destination_number" expression="^(10[0-3][0-9])$"
实现ivr
1. IVR的默认配置文件为:conf\autoload_configs\ivr.conf.xml,内部装入conf\ivr_menu\目录下的所有的xml文件,系统给的实例是demo_ivr.xml
2. 在conf\ivr_menus、目录下创建自己的welcome.xml的ivr文件,内容如下
<!-- 测试ivr语音 -->
<menu name="welcome"
greet-long="ivr/8000/welcome.wav"
greet-short="ivr/8000/welcome_short.wav"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
confirm-macro=""
confirm-key=""
tts-engine="flite"
tts-voice="rms"
confirm-attempts="3"
timeout="15000"
inter-digit-timeout="2000"
max-failures="3"
max-timeouts="3"
digit-len="4">
<entry action="menu-exec-app" digits="0" param="transfer 1003 XML default"/>
<entry action="menu-exec-app" digits="/^(10[01][0-9])$/" param="transfer $1 XML features"/>
</menu>
以上各项的含义:
1. greet-long表示播放的语音文件,默认位置FreeSWITCH\sounds\目录下,此处是将录音文件放入FreeSWITCH\sounds\zh\cn\link\ivr\8000目录下
2. greet-short表示用户长时间没有按键提示的语音文件
3. invalid-sound表示用户按错键的提示音
4. exit-sound表示菜单退出时的“再见”的提示音
5. timeout表示超时时间
6. max-timeouts表示最大超时次数
7. max-failures:允许用户输错的次数
8. inter-digit-timeout:两次按键按下的最大间隔时间
9. digit-len:可以输入的号码的长度,此处输入“1234”,定为4位
10. 第一个action表示按“0”,转接到1003话务机
11. 第二个action表示直接转接到播的分机号
3. 配置dialplan,在dialplan的context(defualt/public)加入extension
<!-- 测试自定义ivr -->
<extension name="incoming_ivr">
<condition field="destination_number" expression="^1234$">
<action application="answer" data=""/>
<action application="sleep" data="1000"/>
<action application="ivr" data="welcome"/>
</condition>
</extension>
拨打1234,接入应答“answer”(必须应答才能向对方播放声音);然后暂停1秒,等待建立声音通路;最后执行ivr,指定到刚建立的菜单项的名字welcome
一下action的值代表的意思:
1. menu-exec-app执行app的param
2. menu-sub进入下级菜单
3. menu-top返回上级菜单
按时间进行路由
这里时匹配拨打DID的用户转入ivr
第一步创建以下extension
<!-- 设置时间使用不同的ivr -->
<extension name="time_based_ivr" continue=true>
<condition wday="2-6" hour="8:30-17:30">
<action application="set" data="ivr=ivr_day" inline="true"/>
<anti-action application="set" data="ivr=ivr_night" inline="true"/>
</condition>
</extension>
1. wday表示星期(0表示周日)周一至周五表示为“2-6”
2. hour表示小时,工作时间8:30-17:30
3. 如果在条件范围内执行第一个ivr_day,如果不在执行ivr_night
4. extension中使用”continue=true“,保证在dialplan解析的时候解析完此处继续往下执行
5. inline属性设置为true表示该动作立即生效
<!-- 第二步匹配DID执行应答,转入ivr -->
<extension name="ivr" >
<condition wday="destination_number" expression="^DID$">
<action application="answer" data=""/>
<anti-action application="ivr" data="${ivr}"/>
</condition>
</extension>
1. 呼入号码匹配DID
2. 接听回应匹配ivr
配置中文语音包
1. 语音包地址:http://wiki.freeswitch.org/wiki/Language_File#Chinese
2. 下载语音包,zh表示中文语音包,拷贝到sounds目录下
3. 修改var.xml文件的sound_prefix变量,修改声音文件的具体路径
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/>
4. 使用Phrase(框架)
1. 作用:屏蔽各种不同语言提示的差异性
2. Phrase是在conf/lang/en/demo/demo_ivr.xml中定义的宏
<macro name="demo_ivr_main_menu" pause="100"> <!-- See conf/autoload_config/ivr.conf.xml for an example on how to use this macro in an IVR -->
<input pattern="(.*)">
<match>
<action function="play-file" data="ivr/ivr-welcome_to_freeswitch.wav"/>
<action function="play-file" data="ivr/ivr-this_ivr_will_let_you_test_features.wav"/>
<action function="play-file" data="ivr/ivr-you_may_exit_by_hanging_up.wav"/>
其中name定义宏的名称;pause表示在每个action之间暂停多长时间(毫秒),匹配(match)指定的模式(pattern)后,执行下面的动作,paly-file表示播放后面的data指定的声音文件。
3. 声音文件的具体路径实在conf/lang/en/en.xml中定义的,同时include装入了demo_ivr.xml,en.xml的内容如下
<include>
<language name="en" say-module="en" sound-prefix="$${sounds_dir}/en/us/callie" tts-engine="cepstral" tts-voice="callie">
<phrases>
<macros>
<X-PRE-PROCESS cmd="include" data="demo/*.xml"/>
<X-PRE-PROCESS cmd="include" data="vm/sounds.xml"/>
<X-PRE-PROCESS cmd="include" data="dir/sounds.xml"/>
<X-PRE-PROCESS cmd="include" data="ivr/*.xml"/>
</macros>
<X-PRE-PROCESS cmd="include" data="vm/voicemail_ivr.xml"/>
en.xml定义了语言,名称(name)为en;该语言是由say-module指定的en模块(在mod_say_en模块中实现)支持的;所有支持它的声音文件都是由sound-prefix指定。
4. 配置中文Phrase
在conf/freeswitch.xml中添加
<X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
5. say接口支持中文语言,需要mod_say_zh模块
1. 在源代码目录中执行一下命令
make mod_say_zh-install
2. 在freeswitch管理台加载该模块
load mod_say_zh
3. 为了FS启动时自动加载该模块,需要在conf/autoload_configs/modules中去掉下列的注释
<load module="mod_say_zh"/>
5. 中文语音包的使用
1. 可以在dialplan中加入以下配置
<action application="set" data="language=zh"/>
完整的dialplan
<extension name="ivr_demo">
<condition field="destination_number" expression="^5000$">
<action application="set" data="language=zh"/>
<action application="answer"/>
<action application="sleep" data="2000"/>
<action application="ivr" data="demo_ivr"/>
</condition>
</extension>
2. 也可对单个用户配置,配置1002.xml的variables标签中添加如下配置,让语言仅对1002用户生效
<variable name="language" value="zh"/>
<variable name="default_language" value="zh"/>
录音
单腿录音
1. 录音命令
originate user/1002 &record(/1.wav)
2. dialplan中设置
<!--录音测试-->
<extension name="record" >
<condition field="destination_number" expression="^12(.*)$">
<action application="answer" />
<action application="playback" data="tone_stream://%(100,1000,800)"/>
<action application="record" data="/$1.wav"/>
</condition>
</extension>
3. 播发录音
originate user/1000 &playback(/1.wav)
两条腿的通话录音
1. 使用以下api命令进行通话录音
开始录音 uuid_record <channel_uuid> start /record.wav
结束录音 uuid_record <channel_uuid> stop /record.wav
2. 使用sox命令混音处理:
$sox record.wav -c 1 record1.wav
3. media bug录音
uuid_record <channel_uuid> start /1.wav
uuid_record <channel_uuid> start /2.wav
uuid_record <channel_uuid> start /3.wav
可以在不同的时间点分别执行以上命令,录制多个声音文件
可以使用stop停止某个录音,也可以使用“all”停止所有录音
uuid_record <channel_uuid> stop all
4. 在dialpan中可以通过record_session达到类似的效果
<extension name="record_session" >
<condition field="destination_number" expression="^(100[0-9])$">
<action application="record_session" data="/record-$1.wav"/>
<action application="bridge" data="user/$1"/>
</condition>
</extension>
与record相比,record_session是非阻塞的,它可以作用于单腿的呼叫也可以用于桥接(bridge)的呼叫;而record是阻塞知道录音完才,只能录单腿的呼叫
立体声
设置RECORD_STEREO同到变量设置为true可以在录音时直接录成立体声,在dialplan中record_ession时的设置如下
<action application="set" data="RECORD_STETEO=true"/>
<action application="record_session" data="/record-$1.wav"/>
放音
playback的参数
1. 声音文件
大部分声音文件的支持都是在mod_sndfile模块中实现的,该模块直接调用了libsndfile库,典型的如WAV、AU、AIFF、VOX等
mod_shout模块实现了对MP3文件的支持
2. local_stream
3. silence_stream
4. tone_stream
5. file_string
6. 其他接口与参数