硬件安装
TDM400P01.jpg

买来的TDM400P是带2个FXO端口,2个FXS端口的。
黄色的模块是FXS模块。黑色的模块是FXO模块。这些模块其实都是可以拆卸的,可以灵活组合。

FXS的S就是station的意思。表示一个站点,其实就电话机。简称S口。
FXO的O就是Office的意思。表示一个局端,相当于电话局给你提供的端口。简称O口。

所以O口出来的线是要插到电话机上的。S口是用来替换电话机的。
不要接错哦。


TDM400P02.jpg

卡的右下角还有个4芯的D型电源插口,记得在安装卡的时候顺手把电源给接上。否则是听不到拨号音的。
另外TDM400P这块卡只支持PCI2.2以上规格的插槽(只要不是特别老的主板,应该不会有问题)。

软件安装

在centos下有2种方式可以安装:

A.rpm包安装
先添加Asterisk和Digium的Repositories

# vi /etc/yum.repos.d/CentOS-Asterisk.repo

[asterisk-tested]
name=CentOS-$releasever - Asterisk - Tested
baseurl=
enabled=0
gpgcheck=0
#gpgkey=

[asterisk-current]
name=CentOS-$releasever - Asterisk - Current
baseurl=http://packages.asterisk.org/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=

# vi /etc/yum.repos.d/CentOS-Digium.repo

[digium-tested]
name=CentOS-$releasever - Digium - Tested
baseurl=
enabled=0
gpgcheck=0
#gpgkey=

[digium-current]
name=CentOS-$releasever - Digium - Current
baseurl=http://packages.digium.com/centos/$releasever/current/$basearch/
enabled=1
gpgcheck=0
#gpgkey=

执行命令安装
# yum install dahdi-linux dahdi-tools asterisk16 asterisk16-configs
# chkconfig asterisk on

用这种方法安装目前只能安装到asterisk1.6版。而1.6并不是LTS版本
(long-term support:长期支持版本,asterisk的LTS版本提供至少4年的维护更新)
所以建议采用编译方式安装asterisk1.8版。

B.编译安装
linux下编译东西总是要先打上一堆的包,把编译环境先弄好。

# yum update
# yum install kernel*
然后最好重启一下机器

安装编译所需的环境
# yum install bison bison-devel ncurses ncurses-devel zlib zlib-devel openssl openssl-devel gnutls-devel gcc gcc-c++ mysql-devel libxml2-devel sqlite-devel make autoconf


这个目录里有相应的包
用wget下载到/usr/src/里,tar zxvf解包。

或者用svn方式
# yum install subversion
# svn co libpri
# svn co dahdi-kernel
# svn co dahdi-tools
# svn co asterisk

从软件到硬件的结构如下:
Asterisk -> chan_dahdi.so -> /dev/dahdi -> dahdi -> hardware driver(wctdm) -> hardware
所以编译的时候是有顺序的。
dahdi的编译依赖于 libpri,而Asterisk的编译也要先有dadhi存在。

如果只用IP语音,不需要模拟接口的话,libpri和dadhi都不需要安装。

编译安装 libpri:
# cd /usr/src/libpri
# make clean
# make
# make install

编译安装 dahdi-kernel:
(这就是模拟接口卡的驱动,从asterisk1.4开始驱动就从zaptel切换到dahdi了)
# cd /usr/src/dahdi-kernel
# make clean
# make
# make install

编译安装 dahdi-tools:
# cd /usr/src/dahdi-tools
# make clean
# ./configure
# make
# make install
# make config

最后编译安装 asterisk:
# cd /usr/src/asterisk
# make clean
# ./configure
# make
# make install
# make samples(添加sample配置文件,这步可以不做)

# chkconfig asterisk on

每升级一次Linux内核都要重新编译一次dahdi!

无论是rpm包安装还是编译安装,只要是驱动加载正常。TDM400P就会4个端口全部亮灯。(在非通话状态下也是亮灯的)

TDM400P03.jpg

有时候dahdi编译/安装正常,但是TDM400P卡就是不亮灯
lspci可以看到
Network controller: Tiger Jet Network Inc. Tiger3XX Modem/ISDN interface

# /etc/init.d/dahdi restart
可以看到一切都ok,但是有一行
driver should be 'wctdm' but is actually 'netjet'
这个问题是Tiger ISDN内核模块被当作了digium语音卡了
在/etc/modprobe.d/blacklist.conf设置黑名单来防止这种情况发生 
blacklist hisax
blacklist netjet 
blacklist isdn
blacklist mISDN_core 
blacklist mISDN_ipac
设置完重启一下就好了

dahdi配置

先运行dahdi_genconf命令
会配置自动对/etc/dahdi/system.conf,/etc/asterisk/dahdi-channels.conf这2个文件进行配置
然后要确定/etc/asterisk/dahdi-channels.conf这个文件被/etc/asterisk/chan_dahdi.conf文件调用
如果没有包含的话请运行以下命令: 
echo "#include dahdi-channels.conf" >> /etc/asterisk/chan_dahdi.conf

首先把模拟语音板卡的制式修改成中国制式(制式不对的话会造成设备工作不正常)
修改/etc/dahdi/system.conf文件的以下两项: 
loadzone = cn 
defaultzone = cn

修改/etc/asterisk/indications.conf: 
country = cn

运行以下命令:
service wctdm stop 
modprobe dahdi 
modprobe wctdm opermode=CHINA 
dahdi_cfg -vvvv

开启asterisk进行测试 
运行命令: asterisk -vvvvvvvvgc
asterisk参数
-c console控制台
-v 繁简程度,debug信息的多少
-g 如果asterisk突然瘫痪,生成一个供gdb做trace的核心文件
-r 用来重新连接到一个已经运行的asterisk进程(相对于-c而言,如果asterisk已经启动)
-cvvv 启用console的3级程度的debug输出
-vvvvvvvvc | tee /tmp/debug.log 系统瘫痪时输出一个debug文件
进入asterisk控制台后输入命令: dahdi show channels 
显示当前的通道:

*CLI> dahdi show channels Chan Extension Context Language MOH Interpret Blocked State pseudo default default In Service 1 from-internal default In Service 2 from-internal default In Service 3 from-pstn default In Service 4 from-pstn default In Service

这些通道的信息就保存在/etc/asterisk/dahdi-channels.conf
dahdi_genconf命令已经自动配置好了,一般来说无需修改。

asterisk配置

asterisk的配置文件都在/etc/asterisk内,默认是没有任何配置文件的。
如果在安装asterisk时,输入make samples,会生成一堆的样本配置文件。

这次的试验只需要2个配置文件:sip.conf和extensions.conf。

sip.conf是用于设定IP分机的配置文件,IP话机/wifi phone/电脑终端软件的电话号码都在这个文件进行设定。

[general]  //全局设定
context=from-internal  //context就相当于是标识符,各个配置文件直接靠这个context相关关联
port=5060  //sip协议的标准端口是5060
bindaddr=0.0.0.0 //允许来自所有IP地址的sip会话
srvlookup=yes //检索DNS的svr记录
disallow=all //禁止的音频编码。all的意思是,除了指定的编码,其它全部禁止
allow=ulaw //允许的编码格式
allow=alaw
allow=gsm
language=cn  //语言设定。默认是英语

[4201]  //单个分机的设定
type=friend  //user只能接电话,peer只能打电话,friend接/打电话都可以
defaultuser=4201  //SIP的user ID
secret=4201  //SIP的认证密码
canreinvite=no  //asterisk是否进行语音流(rtp包)的中继。yes为不中继,语音流在终端用户间直接传送。
host=dynamic  //sip客户端是否需要绑定IP地址。在DHCP的环境下选dynamic就可以

[4202]
type=friend
defaultuser=4202
secret=4202
canreinvite=no
host=dynamic

[4203]
type=friend
defaultuser=4203
secret=4203
canreinvite=no
host=dynamic

extensions.conf是分机的配置文件,这里一共是5个分机。
模拟分机的号码这里是4001和4002。插在TDM400P最上面的2个端口上。
4201-4203是sip分机,可以接ip电话机,软件,和wifi phone。

[from-internal]
exten => 4001,1,Dial(DAHDI/1-1/outgoing_number) // dial 4001 to dialout from dahdi 1
exten => 4001,2,Hangup

exten => 4002,1,Dial(DAHDI/2-1/outgoing_number) // dial 4001 to dialout from dahdi 1
exten => 4002,2,Hangup

exten => 4201,1,Dial(SIP/4201)
exten => 4201,2,Hangup
exten => 4202,1,Dial(SIP/4202)
exten => 4202,2,Hangup
exten => 4203,1,Dial(SIP/4203)
exten => 4203,2,Hangup

from-internal就是在sip.conf里配置的context。
这个context在/etc/asterisk/dahdi-channels.conf里面也是有的,必须都匹配。
然后使用asterisk -vvvvvvvvgc进行调试,先使用reload命令,让修改过的配置生效。
如果aserisk已经在运行的话要用-r参数去连接。
这里Dial(DAHDI/1-1/outgoing_number)这端口我是在asterisk里用debug状态看到的。要根据实际端口去填写。
话机一旦摘起,相应的端口就会起来。

在做实际测试之前,为了避免防火墙过滤的问题,临时可以先将iptables的策略全部清空
#iptables -F
#/etc/init.d/iptables save
#/etc/init.d/iptables restart
等一切调通之后,再加载防火墙。我自己的机器是放在内网里的,直接连在外网上的朋友慎用!

到了这步之后就可以使用3CX,X-Lite这类的软件做连接测试了。

X-LITE01.jpg

X-Lite的配置画面

X-LITE02.jpg

配置成功之后,软件界面的左上角会显示分机号码。状态也变成Available。

软件的测试通过后,就可以用支持wifi的手机测试了。iphone4和andriod2.3版以上的手机都支持。
配置内容和手机一样。

配置到这里,这次的试验算是告一段落,还有很多功能和问题还没有遇到。

如果配置中出现什么奇怪的问题,你可以尝试重新运行dahdi_genconf命令。重新asterisk的make samples。
再干净的配置下,配合debug重新配置