本文主要是介绍FreeSwitch(十):基本技能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、通话设置
1、安装freeswitch,启动控制台,用sofia status命令查看freeswitch监听的IP和本电脑ip。
2、软电话设置freeswitch的ip.口令1234.
3、 FreeSwitch配置文件设置电脑IP。
<param name="rtp-ip" value="192.168.67.149"/>
<param name="sip-ip" value="192.168.67.149"/>
<param name="ext-rtp-ip" value="192.168.67.149"/>
<param name="ext-sip-ip" value="192.168.67.149"/>
4、拨号计划:
<extension name="public_extensions">
<condition field="destination_number" expression="^(02062161257)$">
<action application="bridge" data="{absolute_codec_string=PCMA,ignore_early_media=false}user/1198"/>
</condition>
</extension>
二、调试
1、show channels命令来找到当前通话的 Channel的UUD。
show channels
2、使用 uuid debug media命令查看调试输出。其中,该命令的第一个参数是Channel的UUID,接下来是欲调试的方向。方向有read和 write两种(即读和写,也即收和发,都是相对于 FREESWITCH而言的,下同),也可以使用both参数表示双向都调试。最后一个参数是on或of,分别表示打开或关闭调试。
uuid_debug_media ID号 both on
3、直接使用如下回拨命令进行录音,如果一切正常,说明Aice端没有问题了。
freeswitch> originate user/1002 &record(/tmp/test. wav)
4、FREESWITCH也支持现场抓包,使用下列命令可以在 FREESWITCH控制台上实时看到SIP消息,如:
freeswitch> sofia profile internal siptrace on
freeswitch> sofia profile external siptrace on
上面的命令可以开启不同 Profile的SIP抓包。当a-leg和b-leg分别在不同的 Profile上时可以分别来看,避免消息太多造成干扰。当然,初学者可能不知道实际的SIP消息应该走哪个 Profile,这时可以使用以下命令打开所有 Profile I的抓包
freeswitch> sofia global siptrace on
当然,也可以随时关闭抓包
freeswitch> sofia global siptrace off
5、SIP协议栈底层的问题(那么可能是SIP兼容性的问题或 FREESWITCH本身的BUG),就要打开底层协议栈的调试信息。开启 Sofia协议栈底层的调试器的方法是使用以下命令
freeswitch> sofia loglevel all 9
可以使用以下命令关闭所有底层的调试:
freeswitch> sofia loglevel all 0
Sofia层的日志信息会有很多,如果你比较熟悉的话(一般是开发者),也可以仅打开某一类的日志,如:
freeswitch> sofia loglevel nua 9
三、 使用外部工具抓包
1、打开电话机1001,拨通1002.
2、freeswitch 端口9021 文件路径/usr/local/freeswitch/conf/autoload_configs/,所以在服务器中开启cli控制台:
fs_cli -P 9021
3、tcpdump抓包
(1)ifconfig查看本机网卡:ens33
(2)tcpdump是经典的抓包工具。比如下面的命令可以仅抓取5060端口上的SIP包:
tcpdump -ng-s0-a-vvv-i etho port 5060
其中,-n、q表示不进行域名翻译及减少输出内容;-80表示不限制包长,即争取抓最大的长度;-A表示以ASCI方式输出,这样用眼看起来比较直观;-v表示显示的详细程度,“v”越多则越详细;-i表示使用指定的网卡;por5060表示过滤器,这里我们只关心5060
端口上的SIP包。另外,可以使用-w将结果写入文件中,如下列命令将结果写入/mp/dump.pcap文件中tcpdump-ng-s 0-i etho -w/tmp/dump pcap port 5060
(3)当还需要分析RTP流时,可以将port5060简单改成udp,这样就可以抓取所有的
UDP包:
tcpdump-nq-s0-i etho -w/tmp/dump pcap udp
有时候,如果你是在服务器上抓包,并想只抓某个用户的包,可以根据用户的IP地址来进行过滤。当然这需要先找到用户实际的IP地址,通过如下命令可以找到用户1002的Contact地址:
freeswitchlocalhost> sofia status profile internal reg 1002
四、originate命令
1、freeswitch> originate user/1000 &echo
上述命令中的user/1000就是呼叫字符串。它表示从本地的注册用户中査找该用户的联系地址。呼叫字符串的格式是“类型/参数/参数”,其中第一部分是字符串的类型。
2、 通过逗号(,)或竖线符号(1)将多个呼叫字符串隔开,以达到同振或顺振的目的。如下面命令可同时呼叫1000和1001,两个话机都会振铃,哪个先接听则接通哪个,另一路会自动挂断,这种呼叫方式称为“同振”:
freeswitch> originate user/1000, user/1001 &echo
下列命令就是“顺振”,即第一个号码呼叫失败则呼叫第二个
freeswitch> originate user/1000luser/1001 &echo
3、 originate的第2个参数是一个 exten(可以认为是一个分机号),或者是一个“&”符号加上App。对于后者,我们已经很熟悉了,整个命令的作用是向外发起一个呼叫,建立一个Channel,对方接听后在本端执行一个App,如上面的echo对于前者,与上述的情况类似,在向外发起一个呼叫并等待对方接听后, FREESWITCH就与对方建立了一个 Channel, Channel I的远端当然是接听电话的用户。在本端与上述App的情形不同的是,它会将 Channel 3转人 Dialplan去路由,路由要查找的目的地就是 exten。也就是说,在用户接听后,这种情况跟用户呼人的处理是一样的,都是进人 Dialplan进行路由,如在默认的配置中,下面的两条命令基本上是等价的
freeswitch> originate user/1000 9196
freeswitch> originate user/1000 &echo
前者在1000接听后进人 Dialplan,找到9196这个 exten,然后再执行echo接下来再看第3个参数,它是 Dialplan的类型,如果不设置,默认就是XML。我们在第8章曾讲到过 inline Dialplan,因此也可以在这里试一下,它与上面的例子也是等价的:
freeswitch> originate user/1000 echo inline
第4个参数是 Dialplan的 Context,对于 inline Dialplan,它会忽略 Context,而对于XML则是有效的,如:
freeswitch> originate user/1000 1001 XML public
4、 我们也可以在发起呼叫时自行指定主叫号码,而不使用默认值,如:
freeswitch> originate user/1000 &echo XML default,Seven Du 7777
5、 通过使用通道变量,下列命令也能改变主号名称和号码:
freeswitch> originate origination caller id name=' Seven Du'r origination caller id number=7777]user/1000 &echo
多个通道变量之间使用逗号隔开,有时候有的通道变量里会有逗号,可能造成冲突,因而下面的命令都达不到你想要的效果:
freeswitch> originate absolute codec string=G729, PCMU)user/1000 &echo
freeswitch> originate [ absolute codec string="G729, PCMU, user/1000 &echo
上述命令的本意是在呼叫时,在SDP里向对方提供G729和PCMU编码,但我们执行上述命令,却在日志中看到PCMU被丢掉了:
freeswitch> originate (absolute codec string=G729, PCMU)user/1000 &echo
[DEBUG] switch ivr originate.c: 2060 Parsing global variables
[ DEBUG] switch event.c: 1615 Parsing variable [absolute codec string]=[G729]
所以,我们需要对 Codec字符串里的逗号进行转义,可以使用一个反斜杠来进行转义,如:
freeswitch> originate f absolute codec string=G729\, PCMU)user/1000 &ech
或者,使用“”进行转义,用别的符号代替逗号分隔符,如:
freeswitch> originate (absolute codec string=A: G729: PCMU)user/1000 echo
其中,“”后面跟冒号表示以后要用冒号代替逗号, FREESWITCH在遇到冒号时就会把它用逗号替换回来,这样就可以避免因为逗号冲突而导致错误e。有时候,这些通道变量参数可能是程序里自动生成的,因而计算何时该用逗号可能要多费一些代码,所以 FREESWITCH也支持将不同的变量写到不同的大括号中,如
freeswitch> originate (var1=1)(var=2)(var3=3)user/1000 echo
还有一类通道变量是在方括号中定义的,称为局部通道变量。它唯一作用于某一条腿。在先呼叫某一用户的办公分机时,如果超时,则通过网关gw1呼叫其手机号,如果再超时则通过网关gw2呼叫:
freeswitch> originate (varl=1] [leg timeout-10]user/1000 1
[leg timeout-20] sofia/gateway/gw1/1380000000 1
[leg timeout=20] sofia/gateway/gw2/1380000000
其中, leg timeout只应用于靠近它的那一条腿上,它用于定义呼叫超时,即等待对方返回媒体(如183或200)的超时时间。而varl=1是全局的,每条腿都会有这个变量。通过使用局部的通道变量,就可以为不同的腿(不同的网关或不同的呼叫路径)定义不
同的参数,如这里使用leg_ timeout为不同的腿定义不同的超时时间。
6、 有时候,有些 Early Media对我们没有意义,如我们在主动外呼的应用中(如电话自动催费)希望用户真正接听以后オ对他放音,或进入IVR,这时怎么办?有一个参数可以帮我们做到,如下:
freeswitch> originate (ignore early media=true)sofia/gateway/gw/13800000000
&playback(/tmp/test. wav)
通过指定 ignore early media变量, FREESWITCH在发起呼叫时会忽略对方返回的 Early Media,直到等到收到正常的应答信号(如200OK)才返回。
7、 我们使用 originate命令发起一个呼叫,接通1000和1001两个号码
freeswitch> originate user/1000 &bridge(user/1001)
当上述 originate命令发起呼叫时,建立一个 Channel,然后呼叫1000,1000接听后,在该 Channel上(它相当于a-leg)执行 bridge App, bridge会再建立另一个 Channel(即bleg,来呼叫1001。此时,1000和1001这两个 Channel在信令上建立了桥接关系。1001接听后, bridge会把它们的媒体也桥接起来,此时进入正常通话。实际上,在 FREESWITCH内部, originate和 bridge都是调用同一个函数来实现的,为了简单起见,我们使用如下伪代码 originate(session, new session, dial string);当 originate调用该函数时, session为空,因此相当于调用:originate(NULL, new session, "user/1000");这时它就建立了一个新的 session,即 new session,我们称之为 session a。这里user/1000为呼叫字符串,如果该呼叫字符串包含有{ origination caller id_ number=-1000,则会以1000作为主叫号码(由于主、被叫号码相同,看起来相当于1000呼1000),否则使用默认的000000作为主叫号码。如果a接听了,在调用 bridge时, bridge会进行如下函数调用:originate(session a, new session, "user/1001")i上述函数调用也会建立一个新的 new session(b-leg)来呼叫1001,但与第一次调用不同的是,这次它有参照物了。
8、 我们使用命令呼叫1000和1001两个号码,在1000上显示7777,在1001上显示888下面两种方法是等价的
freeswitch> originate origination caller id number-77771user/1000 &bridge((origination caller id number=8888]user/1001)
freeswitch> originate foriginatioin caller id number=7777)effective caller id number=8888)user/1000 &bridge(user/1001)
这篇关于FreeSwitch(十):基本技能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!