FreeSwitch gateway配置详解

1.简单说明

简单介绍一下,FreeSWITCH里Gateway(网关)的概念。网关又成协议转换器,通常都是进行协议转换。这里说的网关指的是语音网关,如常用的SIP网关,负责SIP协议和七号信令或ISDN PRI(模拟信号)之间的转换。但FreeSWITCH中的网关有时候不一定是真的网关,也可以是另外一个SIP Server(如另一个FreeSWITCH, Asterisk等)。但最终会有一个设备或系统,将SIP转换成模拟信号。简化一下过程,我们认为FreeSWITCH送到的就是真的网关。

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

SIP话机 --> FreeSWICTCH --> 网关 --> 运营商 --> 手机或固话

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

2.参数说明

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

配置目录在FreeSWITCH 安装目录的下的conf/sip_profiles/external/ 增加一个test.xml

<gateway name="test"/>

        <param name="realm" value="www.example.com"/>

        <param name="register-proxy" value="192.168.1.8"/>

        <param name="username" value="4444"/>

        <param name="password" value="!@#qwe123"/>

        <param name="from-user" value="4444"/>

        <param name="from-domain" value="www.example.com"/>

        <param name="register" value="true"/>

        <param name="outbound-proxy" value="192.168.1.8"/>

        <param name="expire-seconds" value="120"/>

</gateway>

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

    realm:域名

    username:认证的用户名

    password:认证的密码

    from-user:指定在SIP消息中的源用户信息,没有配置则默认和username相同

    from-domain:是指定域,它们会影响SIP中的“From”头域。

    regitster-proxy:表示注册的地址

    outbound-proxy:表示呼出时指向的地址,这里其实和注册地址是一致的

    register:是否注册,认证模式为true,非认证模式为false

    expire-seconds:注册的间隔时间

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

3.认证模式下路由

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

    <extension name="callout">

      <condition field="destination_number" expression="^10086$">

        <action application="bridge" data="sofia/gateway/test/10086"/>

      </condition>

    </extension>

4.非认证模式下路由

4.1配置网关,非认证模式下路由与认证模式下路由相同

<extension name="callout">

<condition field="destination_number" expression="^10086$">

<action application="bridge" data="sofia/gateway/test/10086"/>

</condition>

</extension>

4.2 没有配置网关,直接指向IP地址

<extension name="callout">

<condition field="destination_number" expression="^10086$">

<action application="bridge" data="sofia/internal/192.168.1.8:5080/10086"/> </condition>

</extension>

4.3 其它情况

有时候会有这样的场景,网关在内网中,而FreeSWITCH在公网中,FreeSWITCH无法直接指向内网地址,也没法注册到网关设备上。这个时候就需要用到NAT了,让内网网关注册到公网的FreeSWITCH上。内网注册过去之后,会在路由器上“打洞”,即做了一个内外网端口映射。FreeSWITCH无法直接到达网关,但是通过外网端口就能到达内网的网关了(这里由于NAT有多种类型,并不一定能成功,但通常情况下是可以的)。这时候假设内网网关以分机4444注册到FreeSWITCH上。(其实也可以用别的方式来做,比如在路由器上做端口映射,内网和外网做端口映射,不过这种方式不够灵活)

在FreeSWITCH的console里调用

sofia_contact 4444

得到结果

sofia/internal/sip:4444@171.221.76.7:17480

从这里我们可以知道网关对应的外网地址和端口,那只要把呼叫信息发到171.221.76.7:17480即可。但我们实际想呼叫的号码可能是手机号,或者固话,这里简单起见,还是用10086。就需要把这个4444号码替换成10086。那么需要配置路由如下:

<extension name="callout">

    <condition field="destination_number" expression="^10086$">

        <action application="bridge" data="${regex(${sofia_contact(internal/4444@${domain_name})}|^(.+)sip:(.+)@(.+)|%1sip:10086@%3)}"/>

    </condition>

</extension>

 

### FreeSWITCH 外呼配置与实现方法 #### SIP 账号注册 为了使 FreeSWITCH 实现外呼功能,前提条件之一是拥有一个有效的 SIP 账号。如果尚未有此账号,则需向服务提供商申请并完成注册过程[^1]。 #### 配置 sip_profile.xml 文件 编辑 `sip_profiles/external` 下的 XML 配置文件来定义外部通信参数。这通常涉及到设置服务器地址、端口以及其他必要的认证信息: ```xml <param name="ext-rtp-ip" value="$${local_ip_v4}"/> <param name="ext-sip-ip" value="$${local_ip_v4}"/> <!-- 更多配置项 --> ``` 上述代码片段展示了如何指定用于传输 RTP 和 SIP 数据包的 IP 地址。 #### 创建拨号计划 (dialplan) 通过修改 dialplan/XML 中的相关部分可以定制呼叫流程逻辑。下面是一个简单的例子展示怎样构建一个能够拨打特定号码的路由规则: ```xml <extension name="outbound_call"> <condition field="destination_number" expression="^(.*)$"> <action application="bridge" data="sofia/gateway/mygw/$1"/> </condition> </extension> ``` 这里假设已经存在名为 mygw 的网关连接到 PSTN 或其他 VoIP 提供商,并且 `$1` 表示匹配任意长度字符作为目标电话号码。 #### 发起呼叫命令 最后,在 Lua 或者 ESL(Embedded Scripting Language) 环境下编写脚本来触发实际通话行为。例如利用 mod_event_socket 模块发送 API 请求给 FreeSWITCH 来启动一次新的会话: ```lua api = freeswitch.API() status = api:executeString("originate {originator=1000} user/1001 &park()") if status ~= "success" then freeswitch.consoleLog("ERR", "Failed to originate call.\n") end ``` 这段 Lua 代码尝试从分机 1000 向另一个内部用户 1001 发送邀请建立语音通道;而 `&park()` 则意味着一旦接通就立即将其置于等待状态直到进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值