首页 > 学院 > 开发设计 > 正文

6.拨号计划

2019-11-06 08:54:40
字体:
来源:转载
供稿:网友

1.xml Dialplan

XML Dialplan是一系列XML的配置文件组成, 这些XML可以是静态的, 也可以使动态的Freeswitch通过解析相关的结构, 对Dialplan进行路由的呼叫, 决定何种动作1) 配置文件的结构 在Freeswitch.xml中定义 <X-PRE-PROCESS cmd="include" data="dialplan/*.xml" /> 每个Context有多个Extension Extension的name可以是任意合法字符 condition可以对一些条件进行判断,满足指定表达式,执行相应Action 1.Processing说明是处理Dialplan,<1000>主叫号码,1234是被叫号码 2.parsing 解析XML,根据呼叫来源找到Context 3.condition条件是否匹配,匹配成功,进入执行阶段2) 默认的配置文件简介 default, features, public default: 默认的Dialplan, 注册用户都可以通过它打电话 public: 接收外来呼叫, 外来呼叫不可信, 更严格控制3) 正则表达式 ^1234$: ^,开头 $,结尾 ^1234|5678$: |,或 ^123[0-9]$: -,一个区间 ^123/d$: /d,[0-9] ^123/d+$: +,匹配1个或多个它前面的字符,1230,12300.... ^123/d*$: *,匹配0个或多个它前面的字符,123 ^123: 没有$结尾,匹配任何以123开头字符 123$: 匹配以123结尾的字符串 ^123/d{5}$: {5},精确匹配5位,包含前面的一个字符,它匹配以123开头的所有8位电话号码4) 通道变量 使用info,可以查看所有的通道变量 <extension name="Show Channel Variable"> <condition field="destination_number" expression="^1235|info$"> #呼叫1235或info <action application="info" data=""/> </condition> </extension> 所有通道变量都可以在Dialplan中访问,格式是${变量名},${destination_number} <action application="log" data="INFO I know you called ${destination_number}" /> Log级别 0 CONSOLE 1 ALERT 2 CRIT 3 ERR 4 WARNING 5 NOTICE 6 INFO 7 DEBUG 部分通道变量 state 当前Channel的状态 channel_name Channel名称 direction 呼叫方向 read_codec 读Codec read_rate 读采样率 username 用户名 caller_id_name 主叫名称 caller_id_number 主叫号码 network_addr 主叫ip destination_number 被叫号码 uuid Channel UUID source 呼叫来源,mod_sofia,mod_freetdm context Dialplan Context rdnis 原被叫号码,一般用于呼叫转移 channel_name Channel的名字5) 测试条件 大部分针对被叫号码, 但也可以针对IP地址 <condition field="network_addr" expression="^192/.168/.7/.7$"> 测试条件可以迭加 错误: <condition field="network_addr" expression="^192/.168/.7/.7$"> <condition field="destination_number" expression="^1234$"> <action application="log" data="INFO I know you called ${destination_number}"/> </condition> </condition> 正确: <extension name="Testing Stacked Conditions"> <condition field="network_addr" expression="^192/.168/.7/.7$"/> <condition field="destination_number" expression="^1234$"> <action application="log" data="INFO Hahaha, I know you called ${destination_ number}"/> </condition> </extension>6) 动作与反动作 <extension name="Anction and Anti-Action"> <condition field="destination_number" expression="^1234$"/> <condition field="network_addr" expression="^192/.168/.7/.7$"> <action application="playback" data="good-morning.wav"/> <anti-action application="playback" data="good-night.wav"/> </condition> </extension> 如果呼叫来自192.168.7.7,则播放good-morning.wav,否则播放good-night.wav7) 工作机制深入剖析 NEW: 新建一个Channel INIT ROUTING: 解析Dialplan EXECUTE: 执行一系列动作 HANGUP: 挂机 REPORTING: 统计,计费 DESTORY: 销毁,释放资源8) 内联执行 把带有set的Action加上 in-line="true" <action inline="true" application="set" data="greeting=no-greeting.wav"/> 在Hunting阶段,发现带有inline的Action,Freeswitch会直接执行,不用等到Execute 由于它会打乱执行顺序, 使用不当会产生预期外的结果9) 实例 应答类型 被叫应答 被叫忙 被叫无应答 被叫拒绝 其他情况 挂机原因 NORMAL_RELEASE,正常释放 USER_BUSY,拒接,忙 NO_ANSWER,无应答 NORMAL_TEMPORARY_FAILURE,临时故障 TIMEOUT,超时,一般是SIP超时 NO_ROUTE_DESTINATION,呼叫不可达 回声和延迟 echo,delay_echo: 让回声有一定延迟 会议,nb_conference <extension name="nb_conferences"> <condition field="destination_number" expression="^(30/d{2})$"> <action application="answer" data=""/> <action application="conference" data="$1-${domain_name}@default"/> </condition> </extension> 所有呼叫30xx的电话均可加入一个会议 假设呼叫3000,IP是192.168.7.2 3000-192.168.7.2@default 3000-IP是会议室的名字,@default表示一个会议的profile

2.inline Dialplan

内联拨号,在测试或编写程序时,经常用到一些临时或简单的 Dialplan,每次修改XML,效率太低 短小,轻便的Dialplan更高效的完成任务,动态生成Dialplan,无需使用reloadxml直接在命令行写inline Dialplan originate user/1000 echo inline originate user/1000 answer,echo inline

3.其他Dialplan

show dialplan

4.常用的Dialplan App

1) set 设置一个通道变量 <action application="set" data="my_var=1234"/>2) echo 回声,调试用 <action application="echo"/>3) info 打印通道变量 <action application="info"/>4) answer 应答一路呼叫 <action application="answer"/>5) bridge 负责桥接另一路腿,阻塞操作,直到b-leg释放才继续往下走 <action application="bridge" data="user/1000">6) playback 给Channel放音,对主叫放音 <action appliaction="playback" data="/tmp/test.wav"/> <action appliaction="playback" data="/tmp/test2.wav"/> 串联 <action application="playback" data="file_string:///tmp/test.wav!/tmp/test2.wav"/> 远程HTTP <action application="playback" data="http://loaclhost/test.mp3"/> 中断播放,用户按*号键停止7) sleep 设置等待/暂停的一段时间,默认毫秒 <action application="sleep" data="1000"/>8) ring_ready 用于在SIP中给对方回180消息,通知对方振铃 <action application="ring_ready" data="1000"/>9) pre_answer 用于在SIP给对方回183消息,后续的play-back如彩铃 <action application="ring-ready" data="1000"/> <action application="playback" data="/tmp/music.wav"/>10) read 实现播放声音并且等待接受DTMF11) play_and_get_digits 比read更高级

5.在Dialplan使用API命令

6.深入理解通道变量及相关操作

set对单腿赋值 <action application="set" data="my_var=123"/>export对a,b腿同时赋值(即使b不存在) <action application="export" data="my_var=123"/>截取Variable值的部分操作${var:位置:长度} ${var} #原始变量值:1234567890 ${var:1} 234567890 ${var:4:2} 56 ${var:-4:2} 78

7.小结

拨号计划三个核心要素: Dialplan,Context和Extension拨号计划最终目的就是为了给我们返回一组App以及它们的参数 实际呼叫的应答,放音,收号,录音都是由这些APP控制
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表