freeswitch中拨号计划
1、正则表达式
例子 | 说明 |
^1234$ | ^匹配字符串的开头,$ 匹配字符串的结尾, 表示严格匹配1234 |
^1234 |5678$ | |是或的意思,表示匹配1234或5678 俯视人物 |
^123[0-9]$ | 表示匹配1230、1239 |
^123\d$ | \d等于[0-9] |
^123\d+$ | 表示匹配123开头的至少4位数的数字串 |
^123\d*$ | 表示匹配123开头的至少3位数的数字串 |
| |
^123 | 由于没有结尾的$,表示匹配任何以123开头 的数字串,或后面是字母的情况 |
123$ | 表示匹配任何以123结尾的字符串 |
^123\d{5}$ | {5}表示精确匹配5位,包含它前面的一个 字符。匹配以123开头的所有8位数字串 |
^123(\d+)$ | 跟^123\d+$是相同的;匹配结果中除123 之外的数字都将存储在$1这个变量中, 在后面可以引用 |
^123(\d)(\d+)$ | 如果用它跟12345678匹配,则匹配成功, 结果是$1=4,$2=5678 |
. | .表示匹配任意一个字符,“.*”表示匹配 任意字符串 |
| |
FreeSwitch提供了简单的API可以测试你写的正则表达式是否正确,只需要在命令行输入“regex 要匹配的字符串 | 正则表达式”即可。如:
freeswitch> regex 1234 | \d
true
freeswitch> regex 1234 | \d{4}
true
freeswitch> regex 1234 | \d{5}
fal
freeswitch> regex 1234 | ^123
true
2、通道变量
在FreeSwitch中,每一次呼叫都由一条或多条“腿(Call Leg)组成,其中的一条腿又成为一个Channel(通道),每一个Channel都由很有属性,用于标识Channel的状态、性能等,这些属性称为Channel Variable(通道变量),可简写为Channel Var、Chan Var或Var。
log的作用就是将信息写到日志中,他的第一个参数是loglevel,就是log的级别,不同的级别在彩色的终端上能以不同的颜色显示,日志的级别有以下几种(数越大显示越详细):
0 - CONSOLE
1 - ALERT
2 - CRIT
3 - ERR
4 - WARNING
5 - NOTICE
6 - INFO
7 - DEBUG
3、测试条件
大部分的测试条件都是针对被叫号码的,但你也可以对其他变量进行测试,如在
Dialplan的l中IP地址就可以这样测试:
<condition field="network_addr" expression="^192\.168\.200\.158$">
Dialplan中的测试条件
变量 | 说明 |
context | Dialplan当前的Context |
rdnis | 被转移的号码过年为什么吃饺子 |
destination_number | 被叫号码 |
网络伦理 dialplan | Dialplan模块的名字 |
caller_id_name | 主叫名称 |
一句话形容春天 caller_id_number | 主叫号码 |
| |
ani | 主叫的自动号码识别 |
aniii | 主叫类型 |
uuid | 本Channel的唯一标志 |
source | 呼叫源,来自哪个Freeswitch模块 |
chan_name | Channel名字 |
network_addr | 主叫IP地址 |
year | 当前的年 |
| |
yday | 一年中的第几天 |
mon | 月 |
mday | 日 |
week | 一年中第几周 |
班主任工作总结 mweek | 本月中的第几周 |
鹅鹅鹅古诗作者 wday | 一周中的第几天 |
hour | 小时,0-23 |
| |
鲫鱼功效
minute | 分,0-59 |
minute-of-day | 一天中的第几分钟(1-1440) |
| |
除此之外,测试还接受用户在用户目录中设置的变量,但必须使用${}对变量进行引用。如下面toll_allow就是在用户目录中设置的:
<condition field="${toll_allow}" expressio="internation">
如果在你的用户目录中设置以下变量,可以在Dialplan中通过condition一行进行相关测试。
用户目录中的设置:
<ur id="1000">
<variables>
<variable name="my_test_var" value="my_test_value"/>
</variables>
</ur>
Dialplan中的测试条件:
<condition field="${my_test_var}" expressio="my_test_value$">
测试条件不可以嵌套,但可以迭加。如下:
<extension name="Testing">
<condition field="network_addr" expression="^192\.168\.200\.158$"/>
<condition field="destination_number" expression="^1234$">
<action application="log" data="INFO , I know you called ${destination_number}"/>
</condition>
</extension>
两个condition是迭加关系,即只有在IP地址和被叫号码两个条件都匹配的情况下才执行
action,否则就跳过本extension ,继续解析下一项。
迭加的condition还可以构成其他关系,break参数就是用于实现这个功能,它有以下几个值:
on-fal:第一次匹配失败时停止,但继续处理其他extension ,这个是默认的配置。
on-true:第一次匹配成功时停止,会先完成对应的action,再继续处理其他extension。
always:不管是否匹配,都停止。
never:不管是否匹配,都继续。
假设呼叫1234,如果ip地址是192.168.200.158,就播放早上好,如果ip是192.168.200.159,就播放晚上好,设置如下:
<extension name="Testing">
<condition field="destination_number" expression="^1234$"/>
<condition field="network_addr" expression="^192\.168\.200\.158$" break="on-true">
<action application="playback" data="good-morning.wav"/>
</condition>
<condition field="network_addr" expression="^192\.168\.200\.159$">
<action application="playback" data="good-night.wav"/>
</condition>
</extension>
4、动作与反动作
<extension name="Testing">
<condition field="destination_number" expression="^1234$"/>
<condition field="network_addr" expression="^192\.168\.200\.158$" break="on-true">
<action application="playback" data="good-morning.wav"/>
<anti-action application="playback" data="good-night.wav"/>
</condition>
</extension>
如果呼叫ip地址来自192.168.200.158则播放good-morning.wav,否则播放good-night.wav。
兴华大学