分享

FreeSWITCH通过迅时网关连接PSTN

 拿破仑小子 2018-09-20

FreeSWITCH默认的配置是一个家用PBX,因而大家可以很方便地测试各种功能。虽然,我们已处于VoIP时代,但我们身边还有有很多模拟话机和模拟线路,我们希望把它们用起来。事实上,我们经常听到的一个问题就是:我已经基本学会FreeSWITCH了,可是,我怎么让FreeSWITCH上的SIP电话打到我的模拟话机上或者打到我们手机上啊?下面,我们就来看看怎么做。

基本配置

FreeSWITCH是使用软件实现的,如果想连接模拟话机,就需要提供一个模拟的电路接口与话机连接;另外,你的手机位于电信运营商的网络上,因而,你必须能通过一个线路连接到运营商。下面,我们以迅时网关为例来看看怎么做到这些。

所谓网关,一般认为是处于网络中间用于连接两个异构的网络或者协议的设备。大家都知道,FreeSWITCH是使用纯软件实现的,其通信是通过承载于以太网上的SIP协议进行的。而普通的模拟电话则是通过模拟的电话线连接的。我们今天使用的是上海迅时公司生产的一款型号为MX8的网关,它提供一个以太口(ETH)用于连接以及网(及FreeSWITCH),4个模拟电话接口(FXS)用于连接模拟话机,另有4个外线口(FXO)用于接模拟电话线(外线)。设备的外观和前后面板如下图所示:

MX8外观及前后面板

从后面板图中可以看出MX8的各个接口:从右到左依次是电源接口,以太网接口,4个模拟电话口及4个外线口。其中,4个模拟电话口我们称为FXS口,4个外线口称为FXO,前者只能接话机,后者只能接外线。注意在使用中不要接错,如果误将外线接入FXS口有可能会损坏设备。

在本例中,我们假定你的FreeSWITCH使用默认配置,并注册上了一个SIP话机1008,测试拨打9196或9664等号码一切正常。接下来,在ETH口接上网线,FXS-1口接上一个模拟话机,在FXO-1口接上一个电话外线。拓扑结构如下图所示:

MX8网络拓扑结构

上电

连接好相应的设备后我们就可以上电了,上电正常后将看到PWR(电源)和ETH(以太网)指示灯亮。以太口的默认IP地址是192.168.2.218,如果你网络上有DHCP服务,则设备可以自动获取IP地址。无论如何,拿起模拟话机,将可以听到熟悉的拨号音。这时候按下“##”键可以听到设备自动播报设备的IP地址。

知道了设备的IP地址,你就可以在电脑上用浏览器打开 http://ip 进入后台的Web管理界面了。Web管理界面默认的登录密码是“mx8”(小写)。

配置FXS口连接模拟话机

FXS口用于连接模拟话机,该网关的作用就是将你的模拟话机“变”成一个SIP电话。所以,在这里,我们将使用“注册”的方式将每一个FXS口“变”成一个SIP客户端向FreeSWITCH进行注册。

首先,连接MX8的Web配置界面后,依次选择“基本配置” > “SIP”,在“注册服务器”和“代理服务器”中填入FreeSWITCH的IP地址(在本例中是192.168.7.6),在配置页面上选择注册方式为“按线路注册”,使用这种注册方式可以单独配置每个FXS口对应的SIP账号,相当于4个独立的SIP话机。

配置好SIP服务器的地址后,再转到“线路配置” > “用户线功能”页面,如下图所示(笔者使用的版本号是“Rev 1.9.82.331”,其它版本可能稍有出入)。在线路号码中选择一个FXS端口,如FXS-1;电话号码即我们的SIP注册账号,在图中的例子我们使用1009,勾选“注册”复选框,然后在密码栏中输入“1234”,提交后,就可以成功注册到SIP服务器上了。

MX8网关FXS口的配置

如果有多个模拟话机,可以依次注册其他的。拿起话机听到拨号音,便可以类似普通SIP电话一样对外呼叫。当然,模拟话机与SIP话机毕竟是不同的,这一点尤其体现在拨号方式上,要理解这一点需要了解一下我们下一节中讲到的拨号规则。

拨号规则

在上一节我们讲到,SIP话机与普通模拟话机的拨号方式不同。在普通的模拟电话中,拨号时,按下的每一位号码都会实时传到后端的交换机上。因而在打电话时只需要拨完号码等着就行了,交换机在收齐相关号码后会自动帮我们接续。而SIP话机是比较“智能”的设备,它能本地存储号码,在收齐所有号后需要用户按一个“发送”键才能将被叫号码送出去。由于这一点,在刚刚从模拟电话换到SIP话机后,往往会很不适应——经常在拨完了号码后忘了按发送键,瞎等半天没有任何反应。不过,这一点倒是跟手机有些类似,手机也是在收齐了号码后需要按“发送”键才能拨出的。

这里我们还是讨论模拟话机。在用户摘机后,相连的交换机就开始向话机播放拨号音并启动收号程序。一般来说,电话号码是有规律的。比方说110,交换机知道它是一个短号码,收到三位110后就不会等待下面的拨号了,因而保证能够快速接续。另外大家熟悉的手机号码也都是定长的,所以交换机在收齐足够的位数后就会快速接续。

现在,我们将模拟话机接到MX8网关上,因而该网关就需要具备收号功能。为了保证快速地接续,它定义了一些拨号规则。如果所拨的号码匹配该拨号规则,就会将号码立即送出去(即向SIP服务器发送INVITE消息)。笔者使用的网关默认的拨号规则如下::

01[3,5,8]xxxxxxxxx010xxxxxxxx02xxxxxxxxx0[3-9]xxxxxxxxxx12011[0,2-9]111xx123xx95xxx100xx1[3,5,8]xxxxxxxxx[2-3,5-7]xxxxxxx8[1-9]xxxxxx80[1-9]xxxxx800xxxxxxx4[1-9]xxxxxx40[1-9]xxxxx400xxxxxxxx.Tx.##xx*xx##

可以比较容易地看出,其中第1行是匹配常见的手机号,第2行匹配北京的固定电话号码,其他的依此类推。我们在这里不介绍这些规则的具体含义,读者如果在使用时可以自行参考网关设备的使用手册。在这里,需要注意的是,这些默认的拨号规则不一定适合你的需要。比如,如果你想拨打内网的一个分机号1200,由于在规则匹配时匹配到第5行的120就终止了,因而INVITE消息中的被叫号码就只是120,只要有这条规则存在,1200就永远也拨不出去(通常的解决办法是去掉该行规则,如果拨打真正的外网的120时拨0120并通过相关的号码变换规则实现)。

当然,如果你不理解这些的具体含义又一时找不到手册的话也不要紧,可以尝试把这些规则全删掉(事实上,上述拨号规则是现行PSTN网络中的拨号规则,如果你将网关用于内网,几乎一定要这么做),而在拨号时拨完所有号码后在后面再加上一个“#”号,MX8网关收到“#”号后就会立即将前面收到的号码送出,而不包含最后的“#”号(当然,如果被叫号码中要求包含“#”号的情况下还是可能会有问题,那时候就真需要参考设备手册了)。

因此,为了简单起见,在此我们清空所有拨号规则。

拨打测试

注册成功后,就可以从1008上呼叫1009了。正常情况下1009将振铃,摘机就可以通话。如果从1009拨叫1008,则需要在拨号最后多按一个#号,以加快拨号速度。当然,如果你不想再最后输入#号而让拨号规则智能一点,那么就按上一节的方式在拨号规则加入一条,如“10xx”,它代表10开头的4位号码。

配置FXO连接外线

FXO口可以连接运营商提供的电话线(我们称为外线)与外界通话。在MX8中,连接到FXO口的电话线称为中继线。切换到“线路配置” > “中继线功能”可以看到如下图所示的界面。在这里,在线路号码中选择一个端口,如FXO-1;外线号码填入运营商给我们分配的电话号码(实际上在这里可以是任意号码,它只是作为一个标志使用);我们不像FXS那样使用注册方式向FreeSWITCH注册,而是使用“中继对接”方式与FreeSWITCH对接,因此,我们不选注册复选框;接入方式选择“绑定”,并输入绑定号码(该绑定号码一般应该是运营商提供给我们的电话号码,但同样,也可以是做任意值,我们这里以88888888为例)。

MX8网关FXO口配置

通过使用绑定方式,我们可以在FXO口有来话时自动路由到FreeSWITCH上(后面会讲到具体配置)。另外的方式是选择二次拨号方式,我们先来讲一下二次拨号方式。

注意,FXO口的功能相当于一个电话机,如果有人拨打该外线对应的电话号码(为了简单起见,我们以88888888为例),它是无法知道我们在该外线上到底接了一个电话机还是模拟网关的。当然,如果我们直接在外线接了一个电话机,有人打电话时就会振铃,我们就可以进行接听。但是,这里,我们接了一个模拟网关,如果有电话呼进来,模拟网关就可以代替我们接听。但接听后下一步该怎么办呢?一般来讲,它可以给用户再放一个拨号音(有的网关可以设置在这里有一个比较简短的语音提示,称为IVR),这样,主叫用户就可以通过再次通过DTMF按键进行拨号以拨打我们的内线号码。

当然,既然我们已经有了FreeSWITCH,我们就可以用FreeSWITCH做任何我们想做的事。所以,这里我们选择绑定方式。在绑定号码88888888后,对于任何外线来话,该网关都会直接向FreeSWITCH发送INVITE消息(在设置了正确的路由的情况下),被叫号码为88888888。FreeSWITCH在收到后,就可以进入Dialplan,播放IVR,引导来电用户进行下一步的操作。在这种情况下,FreeSWITCH需要先对来电应答(发送SIP 200 OK消息),这样,网关收到200 OK消息后才应答进来的呼叫(相关于我们摘机),并建立通话。

当然,FreeSWITCH也可以自己直接将该来电桥接(bridge)到一个内线号码号码上,让该内线号码振铃。如果有多条外线,可以分别插在不同的FXO口上,对内也可以一一对应不同的内线电话(分机)。当外面的人拨打这些外线号码时,电话就能从某一个FXO口进来,并最终向对应的内线电话振铃。这种方式,就称为DID(Direct Inbound Dialing,对内直接呼叫)。同时这些外线号码就称为“DID号码”,也简称DID。广义上讲,即使对这些外线来话不是一一对应到内线分机上的,也称为DID,在这种情况下,可以认为DID就是一个外线接入号,是一个被叫号码。

这儿配置好了以后,我们还不足以建立它与FreeSWITCH通话。要灵活地对来话去话进行处理,我们还要用到路由的概念。

配置路由

对于一个网关设备来讲,路由的概念就像是小朋友图书上常见的连线题。如下图所示,MX8主要有三种输入和输出端口,分别是FXS、FXO、和IP(即SIP),从某一个输入进来的通话称为来话,如果让它从另外一个端口出去(称为去话),则只需要将输入和输出端口之间画一条线,这条线就叫做路由。

路由示意图

当然在实际的MX8网关中,路由并不是靠画线,而是靠路由表来控制的。路由表的语法也很简单。首先进入“拨号及路由”页面,我们添加如下的路由:

IP 1009 ROUTE FXS 1FXO x ROUTE IP 192.168.7.6:5080IP x ROUTE FXO 5,6,7,8

其中,第一行表示,所有从IP侧(即FreeSWITCH)进来的呼叫,如果被叫号码是1009,则将该呼叫路由到FXS的第1个口上(当然,在此我们使用注册方式,MX8已经知道该怎么做,这一条路由其实是不需要的);第二行表示,所有从FXO来的呼叫,不管被叫号码是什么(x),统一路由到一个IP地址上,也就是我们就的是我们FreeSWITCH服务器的地址192.168.7.6,并且,我们在这里使用5080端口,以避免对网关发来的INVITE请求进行鉴权。

下面,我们分几种情况进行说明。

1)模拟话机做主叫。当它发起呼叫时,由于我们在这里使用了向FreeSWITCH“注册”的方式,因而相当于网关设备把它转换成了一个SIP话机,网关设备就会向FreeSWITCH发起INVITE请求,接下来的接续流程就是跟SIP话机做主叫是一样的,呼叫进入FreeSWITCH的Dialplan,然后进行下一步的路由。

2)模拟话机做被叫。如果在FreeSWITCH中有人呼叫该模拟话机的号码(如1009),FreeSWITCH只是认为它就是一个普通的SIP用户,因而会找到网关设备注册时的Contact地址(即网关的IP),并向该网关发INVITE请求。网关收到INVITE请求后,查找路由表,并匹配到上述路由表中的第一行,因而,连接在相关的FXS口的模拟话机就会振铃。

3)接受模拟外线呼入。如果外面的电话从外线呼入,来话就到达网关的FXO口。网关从上述路由表中查到第2行所示的路由,并向192.168.7.6:5080发送INVITE请求。FreeSWITCH在收到INVITE请求后,会进入路由阶段,我们在日志中就可以看到类似如下的输出:

Processing 139xxxxxxxx <139xxxxxxxx>->88888888 in context public

注意,其中的88888888就是我们设置的DID。因此,为了能处理该通话,我们需要在public Dialplan中添加类似如下的配置:

上述配置可以在日志中显示来话Channel的相关信息,并进入一个IVR,提示来电用户进行下一步操作。

4)通过模拟外线呼出。如果需要让本地话机通过模拟外线呼出,则需要首先在FreeSWITCH中做一条路由,将去话路由到MX8网关上,如,我们在default Dialplan(default.xml)中添加如下内容:

其中,192.168.7.14为MX8的IP地址,当电话路由到这里时,FreeSWITCH将向该IP的5060端口发送INVITE SIP请求。注意,正则表达式“^0(.*)$”匹配所有以0开头的电话号码,并将除0之外的号码作为被叫号码(俗称“吃掉0”)发到MX8上去,因此,一般要在实际的被叫号码前多加一个0。

除此之外,我们也可以在FreeSWITCH中将MX8网关看成一个外部网关,因而我们可以在FreeSWITCH中添加一个网关(其中192.168.7.14为MX8网关的IP地址):

其中,FreeSWITCH仅把MX8网关看作一个以中继方式对接的设备,因而不需要向其注册(“register=false”)。

然后,就可以使用如下的Dialplan将本地用户的去话路由出去。

总这,外呼的电话请求到达MX8以后,MX8就查找它自己的电话路由表,以决定对这一通电话怎么处理。在我们的例子中,MX8会查找到以下的路由表项:

IP x ROUTE FXO 5,6,7,8

该路由表表示,从IP(以太网口)进来的呼叫,不管被叫号码是什么(x代表任意号码),全部路由到FXO口上,FXO端口的选择顺序依次是5、6、7、8。

注意,笔者使用的MX8有4个FXS口和4个FXO口,FXO口的端口范围是5~8。在呼出时,如果检测到某个端口忙,则会按顺序选择下一个端口进行呼出。

小结

上面我们讲的是FreeSWITCH配合MX8最基本也是最通用的配置,我们简单来总结一下。对于FXS口,是要接模拟话机的,因而我们使用注册的方式,并使用“按线路注册”方式,这样,每个FXS口对于FreeSWITCH来说就相当于一个独立的SIP话机。而对于FXO口来说,我们一般把它们当做中继线来用,也就是说不管从哪条线进来的呼叫我们都做同样的对待;呼出也是一样,只要能选到一条空闲的线路呼出就可以了。

当然,不管如何呼入呼出,只要控制好了路由,便可以灵活地对呼叫进行控制了。

其他配置

除了上面配置的之外,还有其它一些配置在此我们也值得提一下。

安全性

在电话系统中,我们一定要考虑到安全性,因为谁都不希望别人通过自己的电话系统盗打免费电话。我们上面提到的系统配置在安全性方面的问题不大,我们再从头梳理一遍。

在FreeSWITCH侧,默认的配置只有本地用户(我们FSX口的用户也属于本地用户)才能向“外”打电话,因此不会出现未授权的盗打行为。对于呼入的电话(从网关的FXO口来的),会路由到FreeSWITCH的5080端口上,该端口默认对应的Dialplan为public,一般来说在public里设置的Dialplan只能访问本地的IVR,本地分机等,不会再重新路由通过外线呼出,因而也是安全的。

问题在MX8网关一侧。我们知道,在上述配置中任何发往MX8的请求都会路由到FXO口进而通过外线呼出。也就是说,任何人只要知道MX8的IP地址就有可能通过我们的FXO口往外打电话,当然,这不是我们想要的。当然解决这个问题也不难,只需要在MX8的管理界面“拨号及路由” > “IP过滤”中增加一个白名单的IP地址就可以了。也就是说,我们把FreeSWITCH的IP地址加入白名单,这样,MX8就只响应FreeSWITCH发送过来的INVITE请求,其它IP地址发过来的呼叫都会拒绝,因而,有效地避免了盗打电话的发生。

主叫号码检测

对于网关来讲,还有其他的一些常用功能,比较典型的如主叫号码检测。对于一个从外线(FXO口)进来的来话而言,如果我们在外线上开通了来电显示功能,则可以在向SIP服务器发送INVITE之前检测主叫号码。

一般来说,现行的模拟线路都使用FSK(Frenquency Shift Keying,移频键控)方式来传送主叫号码。主叫号码在第一声振铃和第二声振铃的时间隔内传送。所以,如果使用主叫号码检测,接续时间就会长一点。从倒数第二幅图中可以看出我们勾选了“来电号码检测”功能。

开启了来电号码检测后,如果外线没有开通来电显示功能(通常该功能作为运营商的增值业务,是要单独收费和开通的),则肯定检测不到主叫号码。MX8网关在这时通常使用我们“绑定”的号码做为SIP侧的主叫号码。

回声

另一个值得一提和功能是“回声消除”。回声一般是在话机等终端设备上产生的,典型的场景就是从话筒中传出的声音又传回到了麦克风里去了(相当于声音反射,称为回声),这样,对端就会在电话中听到自己的声音,听起来会感觉不舒服(产生回声的原因是对端终端的问题,即,如果你能听到回声,那一定是对端的终端设备将你的声音又反射了回来)。如果设备有较好的回声消除功能,它可以检测麦克风的输入,如果里面包含话筒中刚刚输出过的内容(它应该能记住一段时间的内容),则自动在传到对方之间将这部分声音数据去掉。这种技术就称为回声消除。

在上面的图中我们也勾选了回声消除功能,它在检测到回声时能起到一定的作用。另外,一副比较好的耳机也能大大减少回声(声音的输出直接传的耳朵里,很少会扩散到麦克风中)。

逃生

在模拟电话中,馈电是有交换机做的,所以,即使家里断了电,也不影响打电话。但一旦接了网关,网关是需要加电才能工作的,因此万一停电,网关就停止工作了,这时候所有的外线来话都无法正常路由了,有时候有响应重要的通信功能。为此,一般的模拟网关都设置了断电逃生功能。在MX8上,默认的配置是,如果网关断电,从FXO口进来的通话就向第一个FXS口的话机振铃,MX8在这个时候就相当于一根普通的电话连接线。

在FreeSWITCH使用ACL

大家也许对为什么我们要将FXO口的来话要送到FreeSWITCH的5080端口有疑问,实际上,在上面我们也或多或少地解释了。当然要理解这里的逻辑还需要更深入的了解FreeSWITCH,在此,我们就不多讲了。实际上,FreeSWITCH也可以在5060端口接收INVITE请求的,只不过,它默认会对来话进行认证,这时候就需要在MX8侧将FXO口也作为一个用户“注册”到FreeSWITCH上去。

不过,这种方法不推荐使用,具体的原因在你实践中慢慢就知道了。在此,我们介绍另外一种方法。在FreeSWITCH中可以通过ACL设置从哪些IP地址过来的INVITE免认证。方法就是修改acl.conf.xml文件,在domains那个ACL列表中加入如下一行:

这样,就把MX8的IP地址加入FreeSWITCH的信任列表里,以后从该IP发往FreeSWITCH的请求就不需要再进行认证了。当然,FreeSWITCH在收到来话后由于没有认证匹配不到本地的用户,因此,还会到public Dialplan中进行路由,即除了在MX8中将路由表中的“:5080”去掉外,其它的什么都不需要改。而这种用法也是安全的。

当然,配合相关的ACL和Dialplan设置,实际上在MX8上的FSX口也可以不用“注册”的,但这种设置显然需要比较高级的SIP及FreeSWITCH知识,在此,我们就不多讲了。

调试与排错

在实际的应用中,不可避免会遇到各种非预期的情况,这时候就需要进行调试。在调试时,只要理清了设备的逻辑连接关系,一段一段地查找问题,一般来说还是比较容易解决的。比方说,如果按上述操作配置好以后,有FXO口的外线呼入,在FreeSWITCH侧看不到日志的话,说明呼叫没有送到FreeSWITCH上,这时候就需要在MX8侧查起。而如果从FreeSWITCH发起的外呼,无法正常接续的话,也是需要在MX8侧查。

如果电话已到达FreeSWITCH,则通过FreeSWITCH的日志可以看出接续是否正常,并能通过相关的FreeSWITCH知识查找问题原因。一般来说,电话到达FreeSWITCH之后都会查找Dialplan,在日志中就会看到类似如下的行(该行是绿色显示的):

[INFO] mod_dialplan_xml.c:558 Processing 133xxxxxxxx <>->8888888 in context public

该行提供主、被叫号码及Dialplan context的信息,从该行继续往下看,一般能较清楚地看到呼叫路由及接续的流程。

在有些情况下,日志不足以告诉我们详细的原因,则可以通过跟踪SIP消息实现,在MX8和FreeSWITCH中都可以开启SIP消息跟踪,其中,在FreeSWITCH中,可以通过如下命令开启:

sofia global siptrace on

另外,也可以用tcpdump、Wireshark之类的工具在操作系统层面进行抓包。总之,在抓到SIP消息后,就能更方便的分析各种接续流程和呼叫失败原因了。

总结

在本文中,我们以MX8为例讲了它与FreeSWITCH的互联互通,并讲了几个典型的配置。在实际使用中,需要对两者非常熟悉才能用起来得心就手,而这些,就靠读者自己多多练习了。MX8中有非常多的配置参数,具体的需要参考设备的使用手册或咨询厂家的技术支持,而FreeSWITCH方面,最好的参考资料就是新出版的《FreeSWITCH权威指南》一书了。

通信是很有趣的东西,多多练习,才能有更多的收获。最后,祝大家心情愉快,工作顺利。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多