freeswitch 指导一
拨号方案
在freeswitch中比较重要的一个部分就是diaplan了,diaplan拨号计划简单的来说就是一种号码规则,他可以根据自己定义的规则,设置对应did(目标号码)或者设置匹配的规则,每一步如何实现,都在这里设置实现的。拨号计划一般都放在安装目录的:conf/dialplan下。首先我们拿一个比较有代表性的拨号计划进行拆分:
<extension name="jdconference"> <condition field="destination_number" expression="^01086465454_(\d{6})$"> <action application="set" data="vccid=8001"/> <action application="set" data="servicekey=900005"/> <action application="answer"/> <action application="set" data="conference_enforce_security=false"/> <action application="conference" data="${1}@default++flags{nomoh}"/> </condition> </extension>
这个拨号计划是一个简单的sip会议呼入的拨号计划。
<extension name="jdconference"></extension>
代表一个拨号计划的开始到结束,name表示设置一个拨号计划的名称,这个名称没有什么强制性的界定,只是方便可以在日志中查看到,在fs的日志匹配上可以看到,自己可以直观的看出匹配走了那个拨号计划,去哪里修改,所以这个名称自己可以设置的简单易懂,起码让人在日志中可以一眼看出。
<condition field="destination_number" expression="^01086465454_(\d{6})$">
这里就是写匹配规则了,condition field表示你需要匹配的信息是取什么参数进行匹配,freeswitch提供匹配的参数很多,有如下参数:
rdnis :重定向号
destination_number :被叫号码
caller_id_name :主叫名称(坐席名称)
caller_id_number:主叫号码
ani Automatic 自动号码(呼叫方主叫号码)
uuid Unique :号码的通话uuid
source :呼叫来源
network_addr :对端ip地址
expression则是设置匹配的正则表达式,这里直接关乎的这个拨号计划是否可以匹配上,freeswitch的正则和平常我们使用的正则都是一样的,只要搞懂这些正则,即可写好一个拨号计划。
1. ^表示匹配以XXX开头的 如:^1234
| 表示或的意思 比如 ^1234|5678
[] 表示匹配一个范围 比如:[0-9] 表示匹配0-9的数字
\d 表示匹配一个数字,比如 \d 就相同于匹配0-9
+ 表示匹配至少一个或者多个,比如 \d+ 表示匹配至少1个数字
* 表示匹配任意0个或者多个 比如\d* 表示匹配0个或者多个
$ 表示匹配什么结尾的,如: 456$ 表示匹配456结尾的
{} 表示精确匹配位数,如 \d{5} 表示精确匹配5位数字
. 表示匹配任意一个字符
平常我们写好拨号计划,不懂正则写的是否正确,我们可以通过进行fs_cli,使用regex 进行校验, 规则为 regex 目标号码|正则 ,如果正确的话,会返回true,如果写的错误的话,会返回false。
这一部分写完之后,其余中间的内容就是我们想实现的内容,执行的内容大体可以分2种类,一种叫action,一种叫anti-action,action是在condition匹配的时候执行,而anti-action是在condition不匹配的时候执行。
action有两个参数,一个是application,一个是data。其中application是指一个注册的应用程序。data是给这个应用程序传递的参数。
在anti-action里不能使用$1这样的变量,原因是expression没有匹配成功,所以$1没有值。
这里简单的介绍一些常用的action命令:
set / unset # 表示写入一个参数,或者取消写入一个参数,data则标识写入的内容,如: <action application="set" data="vccid=8001"/> ,表示写入一个vccid=8001的参数,这样的用法同第二部分在拨号计划中加入{vccid=8001}产生的效果是一样的,我们同样可以通过variable_vccid 在通道事件中取出这个通道变量。 answer:表示接听,这种app可以无需传递data信息,只需 <action application="answer"/>即可完成。 confence: 表示进入一个会议,data中填写相应的会议参数 bridge: 表示进行桥接,data中填写相应转接的相关信息 sleep;睡眠,表示让通话休眠多长的时间,data中可以填写休眠的时间 hangup:挂断,data是可选参数,里面可以填写挂断原因,单参数也不是自己随意设定的,仅可以填写freeswitch hangupcause中的任意参数。
等等,具体各种详细的action方法可以参考资料:
网关
在freeswitch网关 gateway是freeswitch中一个重要组成部分,他关乎的通话的呼出,简单介绍一下,FreeSWITCH里Gateway(网关)的概念。网关又成协议转换器,通常都是进行协议转换。这里说的网关指的是语音网关,如常用的SIP网关,负责SIP协议和七号信令或ISDN PRI(模拟信号)之间的转换。但FreeSWITCH中的网关有时候不一定是真的网关,也可以是另外一个SIP Server(如另一个FreeSWITCH, Asterisk等)。但最终会有一个设备或系统,将SIP转换成模拟信号。简化一下过程,我们认为FreeSWITCH送到的就是真的网关。
其简化后的过程大致如下:
SIP话机 —-> FreeSWICTCH —-> 网关 —-> 运营商 —-> 手机或固话
对接的最终目的都是为了将通话转到网关上,熟悉SIP协议的都知道,其实就是发INVITE消息。按照对接方式,分成认证和非认证。非认证又称IP对接,或者SIP中继对接。简单理解认证方式就是,FreeSWITCH无法随意的将呼叫送到网关上,需要经过网关的认证。非认证方式,只要知道网关地址,大家都可以发起INVITE。这里就可能涉及到安全问题,我们这里暂时先不讨论,我们先来了解2个概念,1个叫profile,一个叫gateway。
Freeswitch中网关的配置都在/usr/local/freeswitch/conf/sip_profiles目录下,
profile 可以根据我们需要设置非常多个,只有我们拥有足够多的端口,安装freeswitch默认只有2个profile,一个是external 一个internal,(其余ipv6的我们默认不使用,一般在安装完成后就删除了),每一个profile都拥有一个xml文件以及一个对应的文件夹,文件夹下存放的就是gateway了。我们首先拿external.xml 来讲解一些重要的配置选项。
<param name="sip-port" value="$${external_sip_port}"/>
这里的value可以设置这个profile的端口
<param name="inbound-codec-prefs" value="$${global_codec_prefs}"/> <param name="outbound-codec-prefs" value="$${outbound_codec_prefs}"/>
这2个可以设置进和出可以支持的编码类型
<param name="rtp-ip" value="$${local_ip_v4}"/> <param name="sip-ip" value="$${local_ip_v4}"/> <param name="ext-rtp-ip" value="ip"/> <param name="ext-sip-ip" value="ip"/>
如果FS有公网运营需要,可以在这里的ext-rtp-ip以及ext-sip-ip上进行添加。
网关配合详解:fs对接的网关大致分2种,一种网关为注册式网关,一种为非注册式网关,这里拿一个比较通用的例子来讲解一下网关的配置:
<include> <gateway name="test"> <param name="realm" value="192.168.42.61:5060"/> <param name="register-transport" value="udp"/> <param name="username" value=""/> <param name="password" value=""/> <param name="from-domain" value="mytestfs"/> <param name="register" value="false"/> <param name="ping" value="20"/> <param name="expire-seconds" value="3600"/> <param name="caller-id-in-from" value="true"/> </gateway> </include>
如上所示,是一个简单的非注册式网关:
<gateway name="test"> 在这里就是设置网关的名称,后续命令或者distributor组也都是使用这个gateway名字进行外呼,所以这些名字自己需要规划好,确保不会出现重复。 <param name="realm" value="192.168.42.61:5060"/>
这里就是设置对应中继地址的ip和端口了
<param name="register-transport" value="udp"/>这里是注册的方式,一般来说都采用udp <param name="username" value=""/> <param name="password" value=""/>
这里就是注册的账号密码了,如果是非注册式这里就可以不用填写了,写可以没有这2行。
<param name="from-domain" value="mytestfs"/>
这里写自己来源名称,可以根据需要自行填写。
<param name="register" value="false"/>
设置是否注册,如果是注册式的就填写true,如果非注册式的就填写false
<param name="ping" value="20"/>
发送心跳的间隔时间,单位为ms
<param name="expire-seconds" value="3600"/>
仅对注册式有效,注册的有效时间,达到了这个时间后,会重新对中继进行注册
<param name="caller-id-in-from" value="true"/>
顾名思义,是否使用from头域中的主叫信息,默认是false的,如果设置后,就可以使用from头域里的主叫信息了。
作者:果冻小玩纸
来源:CSDN
原文:https://blog.csdn.net/swcxy12315/article/details/82782365
版权声明:本文为博主原创文章,转载请附上博文链接!

浙公网安备 33010602011771号