黑马王子就是我! 技术认证:系统分析师,网络规划设计师,网络工程师,信息系统监理师,系统集成项目管理师,初级程序员,MCSE,MCDBA,CCNA 目前主攻虚拟化技术,VPN,系统架构,集群和高可用性等。
全部博文(515)
分类: LINUX
2009-05-12 16:27:00
Asterisk系统能够配合一种叫做Zaptel的通信板卡,这种板卡上面又可以支持好多模块实现多种功能。可以连接PSTN、ISDN等等电路网络,从而变成真正意义上的IPPBX,变成中继网关,使得Asterisk的功能再一次更加丰富强大起来。
系统环境:CentOS 4.4,并且预安装开发库以及开发工具(编译需要)。
Zeptel四语音模块TDM400板卡,以及4个FXO语音模块。
基本上需要的源码包有两个:
zaptel-
asterisk-1.4.13.tar.gz
注意:安装顺序必须是先Zaptel再安装Asterisk。由于这里不涉及中继电路,所以暂不包含LibPRI部分。
一.编译安装Zaptel:
1.解压Zaptel源码包
[root@IPPBX ~]# tar -zxvf zaptel-
2.进入Zaptel包内
[root@IPPBX zaptel-
3.进行编译Zaptel前的预配置
[root@IPPBX zaptel-
4.清除陈旧的已编译文件
[root@IPPBX zaptel-
5.编译Zaptel
[root@IPPBX zaptel-
6.安装Zaptel
[root@IPPBX zaptel-
二.编译安装Asterisk源码包:
1.解压Asterisk源码包
[root@IPPBX ~]# tar -zxvf asterisk-
2.进入Asterisk包内
[root@IPPBX ~]# cd asterisk-
3.进行编译Asterisk前的预配置,并制定安装路径。
[root@IPPBX asterisk-
4.清除陈旧的已编译文件
[root@IPPBX asterisk-
5.编译Asterisk
[root@IPPBX asterisk-
6.安装Asterisk
[root@IPPBX asterisk-
7.安装配置文件模版
[root@IPPBX asterisk-
8.安装Asterisk程序文档
[root@IPPBX asterisk-
三.前期准备工作:
1.符号连接Asterisk主配置文件路径,为了方便。
[root@IPPBX ~]# ln -s /etc/asterisk/ astetc
2.通过符号连接就可以进入Asterisk主配置文件路径。
[root@IPPBX ~]# cd astetc/
3.备份SIP配置文件
[root@IPPBX astetc]# cp sip.conf sip.conf.backup
4.备份IAX2配置文件
[root@IPPBX astetc]# cp iax.conf iax.conf.backup
5.备份拨号规则配置文件
[root@IPPBX astetc]# cp extensions.conf extensions.conf.backup
6.备份Zapata板卡主配置文件
[root@IPPBX astetc]# cp zapata.conf zapata.conf.backup
7.确认Asterisk的各种主要调用路径
[root@IPPBX astetc]# cat asterisk.conf
--------------------------------------------------
[directories]
astetcdir => /etc/asterisk
astmoddir => /usr/local/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run
astlogdir => /var/log/asterisk
以上这些都是Asterisk各种主要调用的路径,这些路径上都分类放置了Asterisk的如配置文件、模块、AGI程序、日志等等各种重要部件。反过来,如果当要卸除Asterisk的时候,也可以参考这些给出的路径,将Asterisk进行完整删除。之前我就卸载过一次Asterisk,直接就是 “rm -fr”掉这些路径。
;[options]
;internal_timing = yes
;systemname = my_system_name ; prefix uniqueid with a system name for global uniqueness issues
; Changing the following lines may compromise your security.
;[files]
;astctlpermissions = 0660
;astctlowner = root
;astctlgroup = apache
;astctl = asterisk.ctl
--------------------------------------------------
8.确认Zaptel的模块
[root@IPPBX astetc]# ll /usr/local/lib/asterisk/modules/ |grep chan_zap
--------------------------------------------------
-rwxr-xr-x 1 root root 511766 Nov 9 14:26 chan_zap.so
这个chan_zap.so就是Zaptel的主要模块,如果能够找到这个模块的话那么说明Zaptel基本上成功编译,初步工作成功。
--------------------------------------------------
注意:这个模块的来源是chan_zap.c这件代码,如果当Asterisk进行configure进行环境预检查配置的时候没有发现Zeptel的时候,他不会对chan_zap.c进行编译,所以也不会有chan_zap.so这个模块,因此必定要先搞定Zaptel的安装,然后Asterisk才会把这chan_zap.c代码件部分加入进去编译成chan_zap.so模块。
四.对Asterisk进行主要配置:
1.配置SIP部分
[root@IPPBX astetc]# vi sip.conf
--------------------------------------------------
[sip](!)
type=friend
host=dynamic
disallow=all
allow=gsm
context=test
[9901](sip)
username=9901
secret=123456
[9902](sip)
username=9902
secrest=123456
--------------------------------------------------
2.配置IAX部分
[root@IPPBX astetc]# vi iax.conf
--------------------------------------------------
[iax](!)
type=friend
context=test
disallow=all
allow=gsm
qualify=yes
host=dynamic
transfer=no
auth=md5
context=test
[8801](iax)
username=8801
secret=123456
[8802](iax)
username=8802
secret=123456
--------------------------------------------------
3.配置拨号规则部分
[root@IPPBX astetc]# vi extensions.conf
--------------------------------------------------
[test]
exten => _880X,1,Dial(IAX2/${EXTEN},,r)
exten => _990X,1,Dial(SIP/${EXTEN},,r)
[zapfxo2sip]
exten => s,1,Dial(SIP/9901,,r)
exten => h,1,Hangup()
当FXO接受到呼叫拨入的时候,自动转呼叫SIP终端9901。
[zapfxo2iax]
exten => s,1,Dial(IAX2/8801,,r)
exten => h,1,Hangup()
当FXO接受到呼叫拨入的时候,自动转呼叫IAX终端8801。
--------------------------------------------------
五.对Zeptel进行主要配置:
首先要交代Zaptel的几个相关文件。
(1)zapata.conf:这个是Zaptel的主配置文件。
(2)zaptel.conf:这个是Zaptel的硬件配置文件。
(3)zaptel- channels.conf:这个是Zaptel的通道配置文件,它是由zapata.conf生成的,而且它也不是必须的。它是通过include的方式附加在zapata.conf主配置文件外的,完全也可以把通道的配置定义在zapata.conf文件中而不需要该文件。
在安装好的默认情况下,主配置路径/etc/asterisk/下会有一个Zaptel的主属性配置文件zapata.conf,在这个文件中配置了 Zaptel部件的全部属性,而且一开始的时候Zeptel也只有这一个配置文件。但是实际上Zeptel不仅仅只有这一个配置文件,它仍然需要其它配置文件,如zaptel.conf以及zapata-channels.conf,但是后来两者是需要由zapata.conf这个主配置文件生成并在这个基础上修改才能使Asterisk-Zaptel工作起来的。接下来就简要交代一下步骤。
1.生成zaptel.conf以及zapata-channels.conf配置文件。
[root@IPPBX astetc]# genzaptelconf
使用这个命令会生成以下两个硬件和通道配置文件,而这两个配置文件是一开始没有的。
(1)/etc/zaptel.conf (注意,这个文件是直接在/etc/目录下的。)
(2)/etc/asterisk/zapata-channels.conf
2.分析硬件通道配置文件生成命令
[root@IPPBX astetc]# man genzaptelconf
--------------------------------------------------
NAME
命令名
genzaptelconf -- generates zaptel configuration (TDM adaptors)
生成zaptel配置(时分多路适配器)
DESCRIPTION
描述
genzaptelconf is a script to detect zaptel devices (currently mostly
TDM cards are supported). It generates both /etc/zaptel.conf and
/etc/asterisk/zapata-channels.conf
这是一个用来探测zaptel设备(TDM卡通常支持)的脚本。它会同时生成/etc/zaptel.conf以及/etc/asterisk/zapata-channels.conf这两个文件。
FILES
相关的文件
/etc/zaptel.conf
The configuration file used by ztcfg to configure zaptel
devices. re-written by genzaptelconf
. A backup copy is saved to /etc/zaptel.conf.bak
/etc/zaptel.conf是用来被ztcfg命令调用来配置zaptel设备配置文件。可以通过genzaptelconf命令来通过重新生成的方式来改写。每次重新生成时,会把原来的配置文件备份成/etc/zaptel.conf.bak。
/etc/asterisk/zapata.conf
The configuration file of Asterisk鈙 chan_zap. Not modified
directly by genzaptelconf. If you want genzaptelconf鈙 setting
to take effect, add the following line at the end of zap-
ata.conf:
#include "zapata-channels.conf"
/etc /asterisk/zapata.conf是模块chan_zap.so会首先调用读取的主配置文件。而其它的zaptel配置文件都是由 genzaptelconf生成出来而不是手动写出来的。它其中一个会生成的通道配置文件就是zapata-channels.conf。在 zapata.conf的最后加入 #include "zapata-channels.conf" 来使zapata.conf主配置文件外连接这个通道配置文件。
/etc/asterisk/zapata-channels.conf
This is the snippet of chan_zap configuration file that gen-
zaptelconf generates.
. A backup copy is saved to /etc/asterisk/zapata-chan-
nels.conf.bak
/etc/asterisk/zapata-channels.conf是由genzaptelconf生成的zaptel通道配置文件,每次重新生成时,会把原来的配置文件备份成/etc/asterisk/zapata-channels.conf.bak。
--------------------------------------------------
3.配置zaptel硬件配置文件
[root@IPPBX astetc]# vi /etc/zaptel.conf
--------------------------------------------------
# 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
这个是通过/usr/sbin/genzaptelconf脚本命令生成而来,然后我在这个基础上作一些配置修改。
# Span 1: WCTDM/0 "Wildcard TDM400P REV I Board 1"
fxsks=1
fxsks=2
fxsks=3
fxsks=4
这里是四个模块接口。注意,这里的fxsks的信令模式,其实是表示该四个接口为FXO通道接口。
(理由:FXO通道使用FXS信令,连接的对端是FXS端口,在Asterisk中,配置就是这样反着写的!这个会在Asterisk很多其它地方出现,这里特别声明!)
# Global data
#loadzone = us
#defaultzone = us
这里是指定区域,默认的us被我后来注释掉了。
loadzone = cn
defaultzone = cn
在这里我指定为cn。
--------------------------------------------------
4.察看zaptel的通道配置
[root@IPPBX astetc]# ztcfg -vvv
--------------------------------------------------
Zaptel Version:
Echo Canceller: MG2
Configuration
======================
Channel map:
Channel 01: FXS Kewlstart (Default) (Slaves: 01)
Channel 02: FXS Kewlstart (Default) (Slaves: 02)
Channel 03: FXS Kewlstart (Default) (Slaves: 03)
Channel 04: FXS Kewlstart (Default) (Slaves: 04)
四条FXO端口已经被配置,再特别提醒一边,这里的FXS指的是“FXO端口-使用FXS信令模式-连接FXS对端”,所以标示为FXS。也说明它自己是一个FXO端口。在Asterisk中都是这样“显示相反的”。这个会在Asterisk很多其它地方出现,是使人感到困惑的地方之一,请务必注意。
4 channels to configure.
--------------------------------------------------
5.察看ztcfg命令
[root@IPPBX astetc]# ztcfg --help
--------------------------------------------------
ztcfg: invalid option -- -
Usage: ztcfg [options]
Valid options are:
-c
-d [level] -- Generate debugging output. (Default level is 1.)
-f -- Always reconfigure every channel
-h -- Generate this help statement
-s -- Shutdown spans only
-t -- Test mode only, do not apply
-v -- Verbose (more -v's means more verbose)
--------------------------------------------------
6.配置zaptel通道
[root@IPPBX astetc]# vi zapata-channels.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
这个文件也是通过/usr/sbin/genzaptelconf生成的,然后我在这个基础上作一些配置修改。
; Span 1: WCTDM/0 "Wildcard TDM400P REV I Board 1"
;;; line="1 WCTDM/0/0 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=zapfxo2sip
这个是在拨号方案extenions.conf中的context名称。
channel => 1
context=default
;;; line="2 WCTDM/0/1 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=zapfxo2sip
channel => 2
context=default
;;; line="3 WCTDM/0/2 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=zapfxo2iax
channel => 3
context=default
;;; line="4 WCTDM/0/3 FXSKS"
signalling=fxs_ks
callerid=asreceived
group=0
context=zapfxo2iax
channel => 4
context=default
以上指定了四个通道,并对每个通道进行了一些配置修改。
--------------------------------------------------
7.修改zapata主配置文件
[root@IPPBX astetc]# vi zapata.conf
--------------------------------------------------
#include "zapata-channels.conf"
由于通道信息配置在了zapata-channels.conf文件里,所以要把那个文件包含进来。在zapata.conf配置文件最后只需要添加以上这么一行。
--------------------------------------------------
六.启动Asterisk:
1.将Asterisk运行起来
[root@IPPBX ~]# /usr/local/sbin/safe_asterisk
2.查看Asterisk的运行进程信息
[root@IPPBX ~]# ps aux|grep asterisk
--------------------------------------------------
root 3026 0.0 0.0 4432
root 3031 1.0 0.1 20756
root 3069 0.0 0.0 3880
--------------------------------------------------
3.查看Asterisk的网络连接状态
[root@IPPBX ~]# netstat -nap|grep asterisk
--------------------------------------------------
tcp 0 0
udp 0 0 0.0.0.0:2727 0.0.0.0:* 3031/asterisk
udp 0 0 0.0.0.0:4520 0.0.0.0:* 3031/asterisk
udp 0 0 0.0.0.0:5060 0.0.0.0:* 3031/asterisk
udp 0 0 0.0.0.0:4569 0.0.0.0:* 3031/asterisk
unix 2 [ ACC ] STREAM LISTENING 8487 3031/asterisk /var/run/asterisk.ctl
--------------------------------------------------
七.测试:
1.进入控制台
[root@IPPBX astetc]# /usr/local/sbin/asterisk -crvvvg
--------------------------------------------------
Asterisk
Created by Mark Spencer <>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
== Parsing '/etc/asterisk/asterisk.conf': Found
== Parsing '/etc/asterisk/extconfig.conf': Found
Connected to Asterisk 1.4.13 currently running on IPPBX (pid = 3031)
-- Remote UNIX connection
Verbosity is at least 3
调整排错等级
IPPBX*CLI> core set debug 255
Core debug was 0 and is now 255
调整显示信息等级
IPPBX*CLI> core set verbose 255
Verbosity was 3 and is now 255
显示Zaptel的通道
IPPBX*CLI> zap show channels
Chan Extension Context Language MOH Interpret
pseudo default default
1 zapfxo2sip default
2 zapfxo2sip default
3 zapfxo2iax default
4 zapfxo2iax default
重新载入zaptel通道模块
IPPBX*CLI> reload chan_zap.so
The 'reload' command is deprecated and will be removed in a future release. Please use 'module reload' instead.
-- Reloading module 'chan_zap.so' (Zapata Telephony)
== Parsing '/etc/asterisk/zapata.conf': Found
== Parsing '/etc/asterisk/zapata-channels.conf': Found
--------------------------------------------------
2.注册软终端
这里我注册了两个软终端如下
(1)SIP终端9901
--------------------------------------------------
-- Registered SIP '9901' at 192.168.0.199 port 22058 expires 3600
-- Saved useragent "eyeBeam release 1004p stamp 31962" for peer 9901
[Nov 9 16:49:01] NOTICE[3057]: chan_sip.c:14719 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 9901
Really destroying SIP dialog 'MzJjZDZiZTYxYTE3NWFkMDFlYTJiMTJkYWVlMjRlYWM.' Method: SUBSCRIBE
--------------------------------------------------
(2)IAX终端8801
--------------------------------------------------
-- Registered IAX2 '8801' (AUTHENTICATED) at 192.168.0.199:4569
[Nov 9 16:49:29] NOTICE[3044]: chan_iax2.c:5933 update_registry: Restricting registration for peer '8801' to 60 seconds (requested 300)
Really destroying SIP dialog 'NGZiMDcyMTBiMTM2ZWUxMGQ1ZmE1N2ViY2EzYTFlNTg.' Method: REGISTER
--------------------------------------------------
3.连接Zaptel模块的FXO端口
Zaptel板卡FXO端口1、2、3、4都通过电话线接入PBX交换机,从PBX交换机中得到馈电。
4.通过PSTN呼叫Zaptel的FXO端口1,它会转呼叫SIP/9901这个软终端。
--------------------------------------------------
[Nov 9 16:50:01] NOTICE[3057]: chan_sip.c:14719 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 9901
Really destroying SIP dialog 'ZjM2YTdlODJkOTk3NzA4YzVmMzU3MDVmODMyMGZlYzc.' Method: SUBSCRIBE
-- Starting simple switch on 'Zap/1-1'
[Nov 9 16:50:31] NOTICE[3099]: chan_zap.c:6371 ss_thread: Got event 18 (Ring Begin)...
[Nov 9 16:50:32] NOTICE[3099]: chan_zap.c:6371 ss_thread: Got event 2 (Ring/Answered)...
-- Executing [s@zapfxo2sip:1] Dial("Zap/1-1", "SIP/9901||r") in new stack
-- Called 9901
-- SIP/9901-0964bea8 is ringing
-- SIP/9901-0964bea8 answered Zap/1-1
== Spawn extension (zapfxo2sip, s, 1) exited non-zero on 'Zap/1-1'
-- Executing [h@zapfxo2sip:1] Hangup("Zap/1-1", "") in new stack
== Spawn extension (zapfxo2sip, h, 1) exited non-zero on 'Zap/1-1'
-- Hungup 'Zap/1-1'
Really destroying SIP dialog Method: BYE
--------------------------------------------------
5.通过PSTN呼叫Zaptel的FXO端口3,它会转呼叫IAX2/8801这个软终端。
--------------------------------------------------
[Nov 9 16:55:02] NOTICE[3057]: chan_sip.c:14719 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 9901
Really destroying SIP dialog 'MzVhMzRmYWExZDM3ZjQwOGI2MWIzMzBhOWJjYTgyMGI.' Method: SUBSCRIBE
-- Starting simple switch on 'Zap/3-1'
[Nov 9 16:56:55] NOTICE[3122]: chan_zap.c:6371 ss_thread: Got event 18 (Ring Begin)...
[Nov 9 16:56:56] NOTICE[3122]: chan_zap.c:6371 ss_thread: Got event 17 (Polarity Reversal)...
-- Executing [s@zapfxo2iax:1] Dial("Zap/3-1", "IAX2/8801||r") in new stack
-- Called 8801
-- Call accepted by 192.168.0.199 (format gsm)
-- Format for call is gsm
-- IAX2/8801-1 is ringing
-- IAX2/8801-1 answered Zap/3-1
-- Hungup 'IAX2/8801-1'
== Spawn extension (zapfxo2iax, s, 1) exited non-zero on 'Zap/3-1'
-- Executing [h@zapfxo2iax:1] Hangup("Zap/3-1", "") in new stack
== Spawn extension (zapfxo2iax, h, 1) exited non-zero on 'Zap/3-1'
-- Hungup 'Zap/3-1'
--------------------------------------------------
OK,到这里成功了,虽然是比较简单的测试模型。一些用例也是出于最基本的原则考虑的。但是在国内Asterisk的可用参考相当说,中文的、可以参考一下资料想也不要想,基本上没有,关于Zaptel的部分更加凤毛麟角。这篇虽然不复杂,但是过程中遇到许多问题,然后研究了不少国外文档才摸索出来的。不过这样印象也反而深刻。希望这份文档能够帮助和我一样的人,尽可能多的减少精神损耗以及研究阻力。