在 CentOS 5.4 上安装和配置 Asterisk 和 Digium 卡

asterisk

现在大家基本都在用智能手机,加上我们的工作区已经被 Wifi 覆盖,如果能让每个手机连上 Wifi,通过一个 Asterisk 服务器(网关)给内线打电话的话就会很方便,比如我在周围散步、或者和朋友聊天的话还可以收到办公桌上的内线电话。如何用智能手机(这里主要使用 Nokia E 系列)免费打内线电话呢?首先手机必须通过 Wifi 连上内部网络,然后通过内部网络的一台 Asterisk 服务器和电话线连上内部电话网络(PSTN),Asterisk 在这里相当于一个网关,用来连接 IP 网络和 PSTN 网络,这样我们就可以通过 IP 网上的电话(手机或者软电话)打内部电话(俗称座机)了,如果内部电话使用 IP 电话就更好了,就不用这么麻烦了。

上个星期在自己的 PC 上安装了一个 Digium 电话卡,并且 在 Ubuntu 上源码编译安装了 Asterisk 和 Digium 驱动,测了测效果,电话语音效果还不错。这个星期打算安装在服务器上,SUN 服务器没有 PCI 插槽,找了一台很老的 HP ProLiant ML110,配置是:Intel P4 3GHz CPU, 4GB ECC RAM,足够我们小组的人用了。按照 Asterisk 和 Digium 官方网站的推荐,VPSee 还是决定使用 CentOS 5.4 作为这台 Asterisk 服务器的操作系统。

安装和配置 Asterisk 和 Digium 卡

首先安装 CentOS 5.4 和优化系统,然后加上 Asterisk 的 Repositories:

# vi /etc/yum.repos.d/CentOS-Asterisk.repo
[asterisk-tested]
name=CentOS-$releasever - Asterisk - Tested
baseurl=http://packages.asterisk.org/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.asterisk.org/RPM-GPG-KEY-Digium

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

再加上 Digium 的 Repositories:

# vi /etc/yum.repos.d/CentOS-Digium.repo
[digium-tested]
name=CentOS-$releasever - Digium - Tested
baseurl=http://packages.digium.com/centos/$releasever/tested/$basearch/
enabled=0
gpgcheck=0
#gpgkey=http://packages.digium.com/RPM-GPG-KEY-Digium

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

安装 Asterisk 1.6 和 DAHDI:

# yum install asterisk16 asterisk16-configs asterisk16-voicemail \
dahdi-linux dahd

把 Asterisk 加到启动文件中以便开机就启动 Asterisk:

# /sbin/chkconfig asterisk on

安装完毕,启动和停止 Asterisk:

# /etc/init.d/asterisk start
# /etc/init.d/asterisk stop

插上电话线和电话

Digium 驱动安装成功并重启系统后,Digium 卡上的闪烁灯应该会被点亮,注意在拆机箱、安装 Digium PCI 卡时要把卡接上主机内的电源,这样电话才会听见拨号音。左边黑线连接电话机,右边白线连接电话线(PSTN):

digium card

配置 Digium

先运行 dahdi_genconf 自动生成配置文件,这样会在 /etc/dahdi/ 下面产生一个 system.conf,在 /etc/asterisk/ 下产生一个 dahdi-channels.conf,注意 Zaptel 项目被重新命名为 DAHDI,所以目录和配置文件名也有变化:

# /usr/sbin/dahdi_genconf
# vi /etc/dahdi/system.conf
vi /etc/asterisk/dahdi-channels.conf

配置 Asterisk

给系统分配电话号码,简单说明一下,1)如果要打外线需要先拨 9;2)如果从电话上(连在 Asterisk 服务器上的那个电话)接电话的话,Dial(dahdi/g1,20,rt);3)想把 incoming 电话转接到手机上(电话号码是 9252)的话,Dial(SIP/9252,20):

# vi /etc/asterisk/extensions.conf
[internal]
exten => 9250,1,Dial(SIP/9250,20)
exten => 9250,2,Hangup
exten => 9251,1,Dial(SIP/9251,20)
exten => 9251,2,Hangup
exten => 9252,1,Dial(SIP/9252,20)
exten => 9252,2,Hangup

exten => 92461,1,Dial(dahdi/g1,20,rt)
exten => 92461,2,Hangup

exten => _9.,1,Dial(dahdi/g2/${EXTEN:1})

[incoming]
exten => s,1,Answer()
exten => s,2,Dial(dahdi/g1,20,rt)
; exten => s,1,Dial(SIP/9252,20)

给手机或 SIP 软电话分配电话号码

# vi /etc/asterisk/sip.conf
[9250]
type=friend
context=internal
username=9250
host=dynamic                    ; This device needs to register
canreinvite=no                  ; Typically set to NO if behind NAT
dtfmode=rfc2833
nat=no                          ; X-Lite is behind a NAT router
disallow=all
allow=ulaw
subscribecontext=internal
mailbox=9250@internal                   ; Subscribe to status of multiple mailboxes

[9251]
type=friend
context=internal
username=9251
host=dynamic                    ; This device needs to register
canreinvite=no                  ; Typically set to NO if behind NAT
dtfmode=rfc2833
nat=no                          ; X-Lite is behind a NAT router
disallow=all
allow=ulaw
subscribecontext=internal
mailbox=9251@internal           ; Subscribe to status of multiple mailboxes

;Nokia Cellphone
[9252]
type=friend
context=internal
username=9252
host=dynamic                    ; This device needs to register
qualify=no
port=5060
notransfer=yes
disallow=all
allow=alaw

修改完配置文件后需要 Asterisk 重新导入配置文件:

# /usr/sbin/asterisk -vvvvvvvr
localhost*CLI> reload

测试

手机必须是支持 Wifi,SIP 的智能手机,VPSee 在 Nokia E51/E60/E61/E70/E71/N82 上都测试过没有问题,如果没有手机的话也可以用任何 SIP 软电话(比如 X-Lite 等)客户端测试。测试具体配置可以看 用 Nokia 手机连接 Asterisk 打 SIP 电话 的后半部分。

在 Ubuntu 9.10 上安装 Asterisk 和 Digium 卡

很久没有关注 Asterisk 了,现在 Asterisk 出了 1.6 版本,有一个较大的变化就是 Zaptel 项目被重新命名为 DAHDI,导致有些配置文件名和配置文件放置的地方有了点变化,对于习惯了 1.4 的用户有点不适应,而且好多资料都是按照 1.4 版本写的,比如那个经典免费书:Asterisk: The Future of Telephony.

以前写过一篇 如何用 Nokia 手机连接 Asterisk 打局域网 SIP 电话 的文章,是在没有 Digium 电话卡的情况下做的一个纯 VoIP 服务器。如果有电话卡的话就可以连到 PSTN 网络,这样电脑就可以通过 IP 网络给固定电话(PSTN )打电话。VPSee 用的是 Digium TDM400P PCI 语音电话板卡(见图),有4个口,1个连 PSTN 电话线(FXO),剩下 3个连电话机(FXS)。整个安装过程和配置操作在 Ubuntu Desktop 9.10 上完成,如果要看 CentOS 版本上面的安装过程可以看这篇,这里只给出了安装过程,具体 Digium 卡和 Asterisk 的配置过程可以看这篇:在 CentOS 5.4 上安装和配置 Asterisk 和 Digium 卡

digium card

安装前准备

先安装一些编译 Asterisk 需要的必备包:

# apt-get install build-essential subversion make linux-source kernel-package

再安装 Linux 内核头文件,安装的时候会有提示选择哪个版本的 linux-libc-dev,选择一个和当前内核版本对应的 linux-libc-dev 就可以了:

# apt-get install linux-kernel-headers
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package linux-kernel-headers is a virtual package provided by:
  linux-libc-dev 2.6.31-19.56
You should explicitly select one to install.
E: Package linux-kernel-headers has no installation candidate

# apt-get install linux-libc-dev

安装 linux-headers,同样的,需要从众多头文件版本中选择一个和当前内核版本相对应的 linux header 版本:

# apt-get install linux-headers
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package linux-headers is a virtual package provided by:
...
  linux-headers-2.6.31-19-generic-pae 2.6.31-19.56
  linux-headers-2.6.31-19-generic 2.6.31-19.56
  linux-headers-2.6.31-19-386 2.6.31-19.56
  linux-headers-2.6.31-19 2.6.31-19.56
...
You should explicitly select one to install.
E: Package linux-headers has no installation candidate

# apt-get install linux-headers-2.6.31-19-generic

还需要安装一些包:

# apt-get install libconfig-tiny-perl libcupsimage2 libcups2 \
libmime-lite-perl libemail-date-format-perl libfile-sync-perl \
libfreetype6 libspandsp1 libtiff-tools libtiff4 libjpeg62 \
libmime-types-perl libpaper-utils psutils libpaper1 ncurses-dev \
libncurses-dev libncurses-gst ncurses-term libnewt-dev libnewt-pic \
libxml2 libxml2-dev libspandsp-dev libspandsp1

安装 Asterisk

把工作目录切换到 /usr/src/ 下,以后所有操作都在这个目录下进行:

# cd /usr/src/

下载 asterisk, dahdi-kernel, dahdi-tools, libpri 的源代码:

# svn co http://svn.digium.com/svn/asterisk/trunk asterisk
# svn co http://svn.digium.com/svn/dahdi/linux/trunk dahdi-kernel
# svn co http://svn.digium.com/svn/dahdi/tools/trunk dahdi-tools
# svn co http://svn.digium.com/svn/libpri/branches/1.4/ libpri

编译安装 libpri:

# cd /usr/src/libpri
# make clean
# make
# make install

编译安装 dahdi-kernel:

# 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 config

运行和测试 Asterisk

最后检查一下 Asterisk 是否工作以及 Digium 卡的驱动是否装好:

# asterisk -r
...
localhost*CLI>

# lsmod | more
...
dahdi                 199240  11 xpp,dahdi_transcode,wcb4xxp,wctdm,wcfxo,wctdm24
xxp,wcte11xp,wct1xxp,wcte12xp,dahdi_voicebus,wct4xxp
...

用 Nokia 手机连接 Asterisk 打 SIP 电话

这是一篇很老的笔记了,好像是06年的,今天有时间整理出来。当时正在做一个 VoIP 项目,开发一个支持视频、语音的 SIP softphone,并且还要支持文字聊天、presence 等功能。开发完后测了几个其他的 SIP phone,语音都没有问题。那时候手机 WiFi 很火,VPSee 很想看看自己的 SIP phone 能不能连得上手机。

每个 SIP 厂商对 SIP 标准的支持都不一样,大部分时候任意两个 SIP 电话都可以通话,但有时候某个 SIP phone 因为 SIP 兼容性问题不能连到另一个 SIP phone,或者有时候信号很差。Microsoft 的 MSN 其实是基于 SIP 协议的,不过 Microsoft 在 SIP 上加了很多自己的东西,改进过多又封闭代码,导致 MSN 基本和 SIP 没有什么关系了。Nokia 手机上的内置 SIP 看上去很简单,只提供最基本的功能使用,而且是系统一部分,封闭。Symbian 的 SDK 不包括 SIP/RTP 库,如果要在 Symbian 上开发自己的 SIP 电话的话还需要开发自己的 SIP/RTP 库,很麻烦,目前有个叫 pjsip 的 open source SIP 库已经被移植到了 Symbian 上。

Nokia 手机没有网络插口,不能用网线上网,只能通过 WiFi 连网。打造一个测试环境需要几个部件:同时支持 WiFi 和 SIP 的手机、WiFi 网络和 VoIP 服务器。支持 WiFi 和 SIP 的 Nokia 手机主要型号集中在 E 系列和 N 系列,VPSee 用 Nokia E70、E61、N66、E71 测试过都没有问题。首先用手机登录 WiFi,设置 SIP 配置文件(服务器地址、用户名、密码)后注册到局域网的一台 Asterisk VoIP 服务器上。然后用我们开发的 SIP softphone 或者注册到 VoIP 服务器后拨号给手机。连接如下:
手机 —- WiFi —- VoIP 服务器 —- SIP softphone

安装 Asterisk

wget --passive-ftp ftp.digium.com/pub/asterisk/asterisk-1.4.4.tar.gz

tar zxvf asterisk-1.4.4.tar.gz
mv asterisk-1.4.4 /usr/src

cd /usr/src/asterisk-1.4.4
make clean
./configure
make
make install
make samples


继续阅读 »