EslMessage elme = client.sendSyncApiCommand("originate", " sofia/gateway/huawei/015011275853 &bridge(user/1011)");
EslMessage elme = client.sendSyncApiCommand("originate", " sofia/gateway/huawei/015011275853 &transfer(01011 XML default);
EslMessage elme = client.sendSyncApiCommand("originate", " user/1011 &transfer(015011275853 XML default);
EslMessage elme = client.sendSyncApiCommand("originate", " user/1011 &bridge(sofia/gateway/huawei/015011275853);
originate {origination_caller_id_number=95522,origination_caller_id_name=fanpc}user/1000 {origination_caller_id_number=95522,origination_caller_id_name=wangyong}&bridge(user/1002)
EslMessage response = client.sendApiCommand("fsctl hupall normal_clearing dialed_ext "+callNo, "");
client.sendApiCommand("originate", " sofia/gateway/huawei/"+calleeno+" &bridge"
+ "(user/"+callno+")"); //api命令
client.sendBackgroundApiCommand("originate", " sofia/gateway/huawei/"+calleeno+" &bridge"
+ "(user/"+callno+")"); //bgapi命令
freeswitch> originate sofia/gateway/gw1/Bob &echo
其中,gw1为呼叫Bob使用的网关的名字。上述命令是阻塞的,因而在Bob对应的网关没有任何反应的时候(不
回任何SIP消息),可能会阻塞较长时间。当FreeSWITCH控制台被阻塞时,将不能输入任何命令。如果要解决这个问题,可以打开另一个终端,用fs_cli连接FreeSWITCH,然后使用show channels找到对应的Channel,并且用
uuid_kill将该Channel释放。当然,为了避免产生这种阻塞的情况,可以提前使用bgapi,如:
freeswitch> bgapi originate sofia/gateway/gw1/Bob &echo
bgapi可以使originate在后台(新的线程中)执行,因而不会阻塞控制台。
sofia profile internal siptrace on
sofia profile internal siptrace off
originate {instant_ringback=true}{transfer_ringback=local_stream://moh}user/1000 &bridge(user/1001)
originate {transfer_ringback=local_stream://moh}user/1000 &bridge(user/1001)
freeswitch> show channels
freeswitch> uuid_debug_media b4fae306-3f78-4d91-bcde-a2e95b0f9c1d both on
uuid_debug_media命令查看调试输出。其中,该命令的第一个参数是Channel的UUID,接下来是欲
调试的方向。方向有read和write两种(即读和写,也即收和发,都是相对于FreeSWITCH而言的,下同),也可以使用both参数表示双向都调试。最后一个参数是on或off,分别表示打开或关闭调试
freeswitch> originate user/1002 &record(/tmp/test.wav)
originate user/1000 &playback(/usr/local/freeswitch/sounds/test.wav)
freeswitch> uuid_record start /tmp/record.wav
freeswitch> uuid_record stop /tmp/record.wav
$ play /tmp/record.wav
freeswitch> uuid_record stop all
sofia status profile internal reg
ps aux | grep freeswitch
netstat -an | grep 5060
“警告”(WARNING)和“错误”(ERROR)是级别比较高的日志,“调试”(DEBUG)是级别比较低的日志,但其能显示更多的细节
freeswitch> sofia profile internal siptrace on
freeswitch> sofia profile external siptrace on
freeswitch> sofia global siptrace on //打开
freeswitch> sofia global siptrace off //关闭
freeswitch> sofia loglevel all 9 //打开
freeswitch> sofia loglevel all 0 //关闭
sofia loglevel [0-9] //sofia日志级别格式
freeswitch> sofia loglevel nua 9 //打开nua日志抓包
freeswitch> originate
-USAGE: |&()
[] [] [] [] []
call url 外呼呼叫字符串
freeswitch> originate user/1000 &echo
freeswitch> originate user/1000,user/1001 &echo
通过逗号(,)或竖线符号(|)将多个呼叫字符串隔开,以达到同振或顺振的目的。如下面命令可同时呼叫1000和1001,两个话机都会振铃,哪个先接听则接通哪个,另一路会自动挂断
freeswitch> originate user/1000 &bridge(user/1001)
freeswitch> originate user/1000|user/1001 &echo
freeswitch> originate {var1=1}[leg_timeout=10]user/1000|
[leg_timeout=20]sofia/gateway/gw1/1380000000|
[leg_timeout=20]sofia/gateway/gw2/1380000000
leg_timeout只应用于靠近它的那一条腿上,它用于定义呼叫超时,即等待对方返回媒体(如183或200)的超时时间。而var1=1是全局的,每条腿都会有这个变量
freeswitch> originate {absolute_codec_string=G729\,PCMU}user/1000 &echo
freeswitch> originate {origination_caller_id_number=7777}user/1000 &echo
freeswitch> originate {originattion_caller_id_number=7777}user/1000 &bridge(user/1001)
freeswitch> originate {originatioin_caller_id_number=7777}user/1000
&bridge({origination_caller_id_number=8888}user/1001)
或者
freeswitch> originate {originatioin_caller_id_number=7777}
{effective_caller_id_number=8888}user/1000
&bridge(user/1001)
freeswitch> originate {ignore_early_media=true}sofia/gateway/gw/13800000000
&playback(/tmp/test.wav)
freeswitch> originate {instant_ringback=true}transfer_ringback=local_stream://moh}user/1000
&bridge(user/1001)
**注意:**以下命令都在linux的shell命令行中执行
在UNIX系统上的Shell中使用下列命令完成
sed -e "s/1000/1020/" 1000.xml > 1020.xml
sed是UNIX系统上经典的流文件编辑器,上面我们使用sed的“s”命令将1000.xml文件中所有出现1000的
地方都替换成1020,然后将命令的输出重定向(大于号是Shell中的重定向操作符)到1020.xml文件中
for i in `seq 1020 1039`; do sed -e "s/1000/$i/" 1000.xml > $i.xml ; done
源代码目录中的scripts/perl目录下也有一个add_user脚本
./add_user 1020
指定生成配置文件路径
./add_user 1020 --domain=my_domain --confpath=/opt/freeswitch/conf
指定批量创建用户范围
./add_user --users=1020-1039
在指定文件夹中生成配置文件
# mkdir -p /tmp/directory/my_domain
# ./add_user 1111 --users=1020-1039 --domain=my_domain --confpath=/tmp
注意: 修改拨号计划配置文件之后别忘记修改拨号计划正则匹配规则
重新加载配置文件
freeswitch>reloadxml
IVR系统默认的配置文件为
conf/autoload_configs/ivr.conf.xml
ivr按钮配置目录
conf/ivr_menus/
conf/ivr_menus/welcome.xml
·greet-long 该语音文件默认的位置应该是在/usr/local/freeswitch/sounds目录下 开始欢迎音乐
·greet-short //按键提示音 如果长时间没有输入 提示
·invalid-sound //按错键 提示音
·exit-sound //退出菜单提示音
·timeout //按键输入超时提示音
.max-failures //容许用户最大输入错误次数
.max-timeouts //最大超时次数
·inter-digit-timeout //按键时间间隔
·digit-len //输入号最大长度
freeswitch> originate user/1001 &ivr(welcome)
Outbound模式相较于嵌入式语言相比更强大,适合控制单腿的呼叫,实现复杂的IVR应用;而Inbound更适合接收所有的事件,与多条腿进行交互,进行更复杂的呼叫控制。其中,在Outbound模式中,又分为同步模式和异步模式,同步模式控制比较简单,但自由度较小;异步模式需要更多的编程技巧,但会更强大。
Outbound模式的Socket是由FreeSWITCH建立的,它是建立在Channel的基础上的,每一个Channel均会为外部的TCP Server建立一个连接,在Channel挂机时释放,因此,Outbound的连接要考虑Channel的生命周期(即Socket的生命周期)。而Inbound的连接由客户端主动向FreeSWITCH发起连接,极需要考虑断线重连等问题。