6.拨号计划

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.wav

7) 工作机制深入剖析

    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

    实现播放声音并且等待接受DTMF

11) 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控制

来源张永光的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值