最近朋友介绍一个小项目,其中涉及到网络电话,要实现pc2phone的拨号通话,自然用到了VOIP相关的技术。今天先把文章的整体信息写出来,后面再完善,对于Asterisk我了解还很少,不准确之处大家多多提点。
概要介绍:
在这之前没接触过这方面的东西,google一番之后认识了Asterisk,以及在其基础上集成封装的Trixbox。通过了解,Trixbox自动安装了Asterisk以及其所需的软件包、硬件驱动等,同时集成了FreePBX,包括web管理界面,另外还有CDR记录在mysql中。
要实现pc2phone有多种方式,一种是用SIP接入语音网关,一种是用IAX接入提供商的Asterisk,一种是申请电信运营商的IP电话通道(如公用电话、IC电话等,这些有特别的计费反极信号,在后面会提到),还有一种就是用自家的电话线(这种就不能按IP资费计费了,走的是家用电话资费)。因为一期主要是做功能演示,为了坚决的贯彻节约成本的原则,买了一块Wildcard X100P 卡(在淘宝上花了98大洋),插上电话线就开工了。
实现过程:
第一步,安装Trixbox 。网上有Trixbox的ISO下载,刻成光盘,从光驱启动即可。在这个地方我遇到郁闷了我两天的问题。我当时贪心,下载的是最新版本trixbox- 2.6.0.18-i386.iso。安装过程没有问题,但启动过程中出现找不到引导区的问题。后来一步一步降版本,终于找到trixbox- 2.4.2.0.iso 才完成安装。同时要注意的是,这是基于CentOS 5 Linux Kernel 2.6.18-53.1.4.e15内核的安装版本,安装过程中会自动全部格式化掉硬盘。切记切记。
第二步,配置。Trixbox在安装过程中就对Asterisk进行了默认的配置,新增两个SIP类型的extension就可实现pc2pc的通话了,终端使用的是xlite。(具体的配置过程后面补上来,网上也有很多的)
第三步,开发自己的软终端电话。对于Asterisk来说,SIP、IAX以及ZAP IP电话等都可以与之通信。我使用的是IAX,原因有两个,一是在网上找到了开源的库,二是IAX对于NAT的穿透比SIP容易,因为其信令和数据都用的同一端口4569。当然,Trixbox已经实现了NAT的穿透,总之各有优缺点。
第四步,FXO外呼的实现。由于刚接触星号,很多底层以及细节的东西都不是很了解,所以在这个地方遇到很多问题。按照我解决的过程来描述。Trixbox自带安装了zap的驱动,所以在PCI插上x100p之后,即可检测到该卡了。
在CLI控制台输入 zap show status可看到:
trixbox1*CLI> zap show status
Description Alarms IRQ bpviol CRC4
Wildcard X100P Board 1 OK 0 0 0
说明检测到了X100P,同时电话线也是正常连接的。Trixbox默认了9开头的外呼规则(outbound routes),名为 9_outside,可在web管理UI上看到,trunk sequence默认的是走的ZAP。于是一时振奋不已,连忙9加上自己的手机号,多次测试,却都不能接通。现象就是在xlite上看到接通了,但是手机并没有响。。。论坛帖子如下:
http://www.trixbox.com.cn/viewthread.php?tid=2372&extra=page%3D1
在群里也问了很多朋友,都没能解决。网上说的都是默认的就可以打出去了,怎么我偏偏遇着就打不出去呢,让我还一阵心酸啊。最后在一个日文网站上发现这几句(无意中搜到的,虽然对日本有成见,但这次着实很感激):
原文地址是:http://ttanimu.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=amonth%3D7%26ayear%3D2007
X100Pというアナログモデムカードを利用するとAsteriskをPSTNと接続できます。
これのセットアップを行います。
genzaptelconf
を実行します。これで
ztcfg -vv
の実行結果が
1 channels configured.
なら成功です。
X100Pからプッシュ契約していないアナログ回線で外線発信する場合は
"/etc/asterisk/zapata-auto.conf" の
channel => 1
の行の直前に
pulsedial=true
を入れておけば発信できるようになります。
红色的部分非常重要!!!是添加在/etc/asterisk/zapata-auto.conf文件中的,全部的文件内容如下:
; Autogenerated by /usr/sbin/genzaptelconf -- do not hand edit
; Zaptel Channels Configurations (zapata.conf)
;
; This is not intended to be a complete zapata.conf. Rather, it is intended
; to be #include-d by /etc/zapata.conf that will include the global settings
;
; Span 1: WCFXO/0 "Wildcard X100P Board 1"
;;; line="1 WCFXO/0/0"
signalling=fxs_ks
callerid=asreceived
group=1
;context=from-pstn
pulsedial=true
context=default
channel => 1
不认识日文,但估计应该就是那个所谓的判断反极信号的配置了,否则无法在x100p上实现外呼。另外,绿色部分是默认的context,跟zap show chennels里面的pseudocontext不一致,换成红色的才能呼出去,这个我还没有明白为什么。于是外呼问题解决。然后同时另一个问题又出来了,手机是ring了,但是接听没有声音。网上搜索出来无声音的情况,都是SIP在NAT后的问题,也就是 RTP穿越NAT的问题。而我的问题是终端与服务器在同一内网,Asterisk通过电话线外呼,所以与NAT并没有关系。问题集中在zap相关的配置上了。
/etc/zaptel.conf是自动更新的,主要是配置硬件信息,我只有一个FXO口,所以其中包含以下内容:
# Autogenerated by /usr/sbin/genzaptelconf -- do not hand edit
# Zaptel Configuration File
#
# This file is parsed by the Zaptel Configurator, ztcfg
#
# It must be in the module loading order
# Span 1: WCFXO/0 "Wildcard X100P Board 1"
fxsks=1
# Global data
loadzone = cn
defaultzone = cn
其中的 两个 = cn 是我手动改的,默认是us 。
/etc/asterisk/zapata.conf 是配置硬件口和通道映射,以及相关通道属性的。
;
; Zapata telephony interface
;
; Configuration file
[trunkgroups]
[channels]
language=cn
context=from-zaptel
signalling=fxs_ks
rxwink=300 ; Atlas seems to use long (250ms) winks
;
; Whether or not to do distinctive ring detection on FXO lines
;
;usedistinctiveringdetection=yes
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
callprogress=yes
echocancel=yes
echocancelwhenbridged=no
;echotraining=800
hanguponpolarityswitch=yes
rxgain=0.0
txgain=0.0
group=1
callgroup=1
pickupgroup=1
immediate=no
busydetect=yes
busycount=5
toneduration=100
;faxdetect=both
faxdetect=incoming
;faxdetect=outgoing
;faxdetect=no
;Include genzaptelconf configs
#include zapata-auto.conf
;channel => 1
group=1
;Include AMP configs
#include zapata_additional.conf
这个问题也是查了很多,都没能解决,结果在不是该问题的帖子里面找到了解决方法。以上红色的是参考http://www.voipuser.org/forum_topic_10148.html进行添加的,默认的是没有的
再进入到CLI控制台,
至此,外呼通话实现。初次呼出的接通时间比较长,在10秒以上。。。。这个还待解决。今天先写到这里,后面再来完善。trixbox1*CLI> zap restart
Destroying channels and reloading zaptel configuration.
== Parsing '/etc/asterisk/zapata.conf': Found
== Parsing '/etc/asterisk/zapata-auto.conf': Found
== Parsing '/etc/asterisk/zapata_additional.conf': Found
-- Registered channel 1, FXS Kewlstart signalling
-- Automatically generated pseudo channel