FreeSwitch连接语音网关配置及使用场景

简介

在学习的过程中需要使用FS和语音网关连接,通过SIP接入运营商呼到手机或者固话。尤其是在人工催收、电销外呼中需要在FreeSWITCH中使用SIP和运营商对接达到指定号码落地的效果,简单描述如下

对接方式

简单介绍一下,FreeSWITCH里Gateway(网关)的概念。网关又成协议转换器,通常都是进行协议转换。这里说的网关指的是语音网关,如常用的SIP网关,负责SIP协议和七号信令或ISDN PRI(模拟信号)之间的转换。FreeSWITCH中的网关可以理解成一个SIP代理。通过SIP代理连接语音网关设备或系统,将SIP转换成模拟信号。简化一下过程, FreeSWITCH完成号码的落地工作

其简化后的过程大致如下:

OPenSIPS —-> FreeSWICTCH —-> 语音网关 —-> 运营商 —-> 手机或固话

对接的最终目的都是为了将通话转到网关上,熟悉SIP协议的都知道,其实就是发INVITE消息。按照对接方式,分成认证和非认证。非认证又称IP对接,或者SIP中继对接。简单理解认证方式就是,FreeSWITCH无法随意的将呼叫送到网关上,需要经过网关的认证。非认证方式,只要知道网关地址,大家都可以发起INVITE。这里可能涉及到安全问题,后面将详细讨论

注册的SIP服务器
通常sip终端都需要注册到某台SIP服务器上(就像手机要连接到基站),以实现呼出和呼入的功能

注册在OpenSIPS上的SIP终端发起的呼叫请求将发送到OpenSIPS,OpenSIPS根据路由脚本配置使用load_balancer(负载均衡)模块或dispatcher(调度模块)将呼叫请求转发到其他sip服务器或网关上。反之当sip服务器或网关呼叫注册在OpenSIPS上的终端时,会呼入到OpenSIPS(只有OpenSIPS有被叫SIP终端的AOR信息),然后opensips再呼叫SIP终端。这是就是一个典型的注册服务器。

配置信息

中继配置
conf\sip_profiles\external

FreeSWITCH需要建立一个网关并注册到网关设备上。见下面配置:

简单的介绍一些这几个参数:

realm:域名
username:认证的用户名
password:认证的密码
from-user:指定在SIP消息中的源用户信息,没有配置则默认和username相同
from-domain:是指定域,它们会影响SIP中的“From”头域。
regitster-proxy:表示注册的地址
outbound-proxy:表示呼出时指向的地址,这里其实和注册地址是一致的
register:是否注册
expire-seconds:注册的间隔时间

这样表示FreeSWITCH作为一个分机注册到网关172.29.1.8上。

拨号规则

在freeswitch中比较重要的一个部分就是diaplan了,diaplan拨号计划简单的来说就是一种号码规则,他可以根据自己定义的规则,设置对应did(目标号码)或者设置匹配的规则,每一步如何实现,都在这里设置实现的,dialplan有多种方式实现,这里我们主要使用默认xml dialplan方式。
xml dialplan拨号计划由多个context组成,每个context中有多个extension。所以context就是多个extension的逻辑集合,它相当于一个分组。一个context的extension和其他context中的extension在逻辑上是隔离的

拨号规则:出局目录

\conf\dialplan\default\

拨号规则:入局目录

\conf\dialplan\public\

#dialplan的完整结构

<?xml version="1.0" encoding="utf-8"?>
<document type="freeswitch/xml"><section name="dialplan" description="Regex/XML Dialplan"><context name="default"><extension name="Test Extension" continue="true"></extension></context></section>
</document>extension
#extension相当于路由表的表项,其中每一个extension都有一个name属性,name可以是任意合法的字符串,本身对呼叫流程
#没有任何影响,但给它取一个好听的名字有助于你在查看log时发现它continue="true"
#continue默认值是false,在false情况下condition匹配规则找到对应的extension,就执行对应的action,而不会再继续
#再查找其他的extension了;若continue="true"则所有满足condition规则的action都能得到执行condition
#在extension中可以对一些condition(测试条件)进行判断,如果满足测试条件所指定的表达式,则执行对应的action(动作)
#一般来说测试条件不可以嵌套,但可以叠加(叠加是逻辑与的关系),但FreeSWITCH于2012年底加入了嵌套dialplan的支持
<condition field="network_addr" expression="^192\.168\.1\.251$" break="on-true"></condition>
condition的break参数,为了方便讨论我们假设有两个条件A和B
break="on-false" #第一个次匹配失败时停止(但继续处理其他的extension),这是默认配置,结果相当于A and B
break="on-true" #在第一次匹配成功时停止(但会完成对应的Action,然后继续处理其他extension)
#不成功则继续,所以结果相当于((not A)and B)
break="always" #不管是否匹配都停止
break="never" #不管是否匹配,都继续action
#执行具体的APP或者API动作,一个action通常有两个属性,一个是application代表要执行的APP、另一个是data就是
#APP的参数,当APP没有参数时,data也可以省略
anti-action
#执行反动作,如下代码所示,符合条件就执行action的动作,不符合就执行anti-action动作<extension name="anction and anti-action"><condition field="destination_number" expression="^1234$"><action application="playback" data="good-morning.wav"/><anti-action application="playback" data="good-morning.wav"/><action inline="true" application="playback" data="good-morning.wav"/></condition>
</extension>inline="true"
#正常情况下在hunting阶段是只解析dialplan,不执行action,如果加上inline="true"这一属性,则在hunting阶段就会
#直接执行,而不用等到execut阶段,当然并不是所有的的APP都能用inline执行,适合执行的APP必须能很快的执行,一般只是
#存取某个变量,并且不能改变当前Channel的状态,当然inline也不是解决所有问题的万能钥匙,由于它会打乱执行顺序
#所以使用不当也可能会产生非预期的效果

在FreeSWITCH中配置如下路由,当外呼时就可以将呼叫送至网关上了。然后由网关出局

<extension name="callout"><condition field="destination_number" expression="^10086$">
<action application="bridge" data="sofia/gateway/test/10086"/></condition>
</extension

其它情况

有时候会有这样的场景,用户会要求送指定的号码,首先要向运营商申请外呼的号码,freeswitch上实现外呼呼叫的方式为配置一个网关,指定运营商的接入号和密码,有呼叫这个号码时,运营商会接收freeswitch送过来的号码并指定给被呼叫方

从这里我们可以知道网关对应的外网地址和端口,那只要把呼叫信息发到语音网关即可。执行freeswitch的dialplan出局路由,其中将<action application=“set” data=“gateway=” + dstNum + “”/>"; 把dstNum替换成送出的中继号码。那么需要配置路由如下:

<document type="freeswitch/xml">
<section name="dialplan">
<context name="default">
<extension name="Gateway_Extension">
<condition field="destination_number" expression="^(10086)$"><action application="set" data="callee=$1"/>
<action application="export" data="callee=$1"/>
<action application="export" data="sip_h_caller=9*********"/>
<action application="export" data="sip_h_callee=$1"/>
<action application="export" data="sip_h_ocallId=${uuid}"/>
<action application="export" data="da=true"/>
<action application="set" data="effective_caller_id_number=9**********"/>
<action application="set" data="callerDomain=freeswitch.com"/>
<action application="export" data="callerDomain=freeswitch.com"/>
<action application="set" data="call_timeout=60"/>
<action application="set" data="gateway=" + **dstNum** + "\"/>";
<action application="set" data="record_rate=8000"/>
<action application="set" data="record_sample_rate=8000"/>
<action application="set" data="recording_follow_transfer=true"/>
<action application="set" data="record_append=true"/>
<action application="set" data="answered_time="""/>
<action application="bridge" data="${regex(${sofia_contact(internal/4444@${domain_name})}|^(.+)sip:(.+)@(.+)|%1sip:10086@%3)}"/>
</condition></extension></context></section>
</document>

总结

FreeSWITCH的外呼场景主要通过配置网关注册、拨号计划来实现,实际上外呼中的呼叫、转接、会议都要用到这两个技术

网关如果在同一网段或者网关在FreeSWITCH的外网的话(实际上就是说FreeSWITCH可以直接访问到网关),就采用FreeSWITCH注册到网关或者指向网关的方式,这也是常用的方式。 如果网关在内网,而FreeSWITCH在外网的话,就只能采用内网网关注册到FreeSWITCH的方式。

拨号计划是 FreeSWITCH 中至关重要的一部分。它的主要作用就是对电话进行路由(从这一点上来说,相当于一个路由表)。说的简明一点,就是当一个用户拨号时,对用户所拨的号码进行分析,进而决定下一步该做什么。当然,实际上,它所能做的比你想象的要强大的多。

FreeSwitch连接语音网关配置及使用场景相关推荐

  1. FreeSwitch连接讯时语音网关配置和全部使用场景

    在学习的过程中需要使用FS和语音网关连接,拨打内部.外部号码,自己测试成功后,记录下配置步骤,方便,自己和他人 1. 配置讯时语音网关 (1)用户线配置→用户线功能 配置 FXS口 因为FXS口配置的 ...

  2. Freeswitch服务+语音网关设备发送短信功能

    本文档主要介绍的是发送短信的场景.语音通讯后续补充. 业务场景:由于产品部署在视频网.或者公安网这种内部网络,无法使用互联网,发送短信提醒的实现方案有两种 一种是是使用短信猫设备,插入手机卡,调用短信 ...

  3. 性能优化之数据库和数据源连接池配置

    什么?!数据库连接拿不到? 今天在公司对系统进行压测,由于我的sit和dev和uat环境都是用的用的是一个数据库服务器,我让用户在的sit进行压测,分别是单线程测试,并发测试,但是用户一开始测,我的三 ...

  4. redis专题:redis键值设计、性能优化以及redis连接池配置

    文章目录 1.redis键值设计 ①:key设计规范 ②:value设计规范 2. 命令使用优化 3. redis连接池配置参数设计 4. redis连接池预热 5. redis的key过期删除策略 ...

  5. 服务器协议和交换机怎么转换,服务器与交换机连接怎样配置

    服务器与交换机连接怎样配置 内容精选 换一换 Windows网络负载平衡(NLB)支持单播.多播.IGMP多播等三种方式.采用单播模式的NLB配置简单,可以跨网段访问,但会出现端口泛洪的问题,因此一般 ...

  6. Packet Tracer - 配置扩展 ACL - 场景 1

    Packet Tracer - 配置扩展 ACL - 场景 1 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 R1 G0/0 172.22.34.65 255.255.255.224 ...

  7. Freeswitch连接SIP电话

    Freeswitch连接SIP电话 本篇主要介绍如何用freeswitch连接SIP电话,freeshswitch最典型的应用是作为一个服务器(背靠背的用户代理),并用电话客户端软件(一般叫软电话)连 ...

  8. SpringBoot2/SpringBoot/Java动态数据源配置、动态连接池配置、多数据源负载均衡

    Java动态数据源配置.动态连接池配置.多数据源负载均衡 大家好,今天给大家推荐一个自产的连接池插件.废话不多说,本文接口分为以下主题: 1. 插件开发背景: 2. 插件提供的能力: 3. 插件的使用 ...

  9. reportConfig.xml两种数据源连接的配置方式

     在reportConfig.xml配置文件中,我们提供了两种数据源连接的配置方式,分别如下: 1.jndi数据源配置(即:在dataSource中配置) 此配置适用于在j2ee的服务器中配置了j ...

  10. Kettle连接HiveServer2配置和常见问题解决

    Kettle连接HiveServer2配置和常见问题解决 参考文章: (1)Kettle连接HiveServer2配置和常见问题解决 (2)https://www.cnblogs.com/xieys- ...

最新文章

  1. stm32链接电脑提示无法识别的驱动设备
  2. 嵌入式C语言基础(二)
  3. android l 电池,DIY新技能--M1L换电池
  4. RabbitMQ学习之Flow Control
  5. QByteArray使用方法举例
  6. php 合计,表格怎么合计总数
  7. 验证座机号码是否输入格式正确
  8. 『Hammerspoon』Mac 锁屏自动开关蓝牙
  9. 计算机 高级软件工程师考试试题,高级软件工程师8月考试试题A卷带答案.doc
  10. 获得与回馈丨点评中国两大金融机构基于OpenStack的网络联合实践
  11. Adb connection Error:远程主机强迫关闭了一个现有的连接。
  12. 【MFC】多国语言工具栏
  13. 阳春三月,再送32本书,快来快来!
  14. 蓝桥杯算法训练-隐匿的刺客
  15. SylixOS进化简史
  16. 【Effective C++】总结
  17. CPU运行功耗和什么相关?消耗的电能都去哪了?
  18. Ansys electronics desktop 2020R1安装之后出现了很大的问题
  19. 微软亚洲研究院“牵手”莲花山视觉研究院
  20. PostgreSQL高可用集群

热门文章

  1. CFS三层内网环境 渗透流程
  2. Android 消息通知栏用法详解(一)
  3. 手机短信校验(前端js)
  4. 如何扩展关键词,以及使用python多线程爬取bing搜索结果
  5. 网易云音乐修改名字怎么老是服务器错误,网易云音乐为什么改了名字?网抑云是怎么回事...
  6. 两行代码实现微信电脑版多开
  7. 怎么把视频复制到IPAD
  8. Day04_Manuals for Python@lisongye - list列表
  9. Android手机ram大小,安卓手机RAM容量演进史,如何从192MB走到16GB,HTC:我有话要说...
  10. 使用pygame实现双人五子棋游戏