Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3362596
  • 博文数量: 515
  • 博客积分: 5116
  • 博客等级: 大校
  • 技术积分: 4137
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 11:24
个人简介

黑马王子就是我! 技术认证:系统分析师,网络规划设计师,网络工程师,信息系统监理师,系统集成项目管理师,初级程序员,MCSE,MCDBA,CCNA 目前主攻虚拟化技术,VPN,系统架构,集群和高可用性等。

文章分类

全部博文(515)

文章存档

2023年(11)

2022年(17)

2021年(19)

2020年(28)

2019年(42)

2018年(53)

2017年(41)

2016年(33)

2015年(43)

2014年(25)

2013年(13)

2011年(6)

2010年(28)

2009年(47)

2008年(55)

2007年(26)

2006年(28)

分类: LINUX

2009-05-12 16:27:00

Asterisk系统能够配合一种叫做Zaptel的通信板卡,这种板卡上面又可以支持好多模块实现多种功能。可以连接PSTNISDN等等电路网络,从而变成真正意义上的IPPBX,变成中继网关,使得Asterisk的功能再一次更加丰富强大起来。

 

系统环境:CentOS 4.4,并且预安装开发库以及开发工具(编译需要)。
             Zeptel
四语音模块TDM400板卡,以及4FXO语音模块。

 

基本上需要的源码包有两个:
zaptel-1.4.6.tar.gz
asterisk-1.4.13.tar.gz
注意:安装顺序必须是先Zaptel再安装Asterisk。由于这里不涉及中继电路,所以暂不包含LibPRI部分。

 

 

.编译安装Zaptel
1.
解压Zaptel源码包
[root@IPPBX ~]# tar -zxvf zaptel-1.4.6.tar.gz

 

2.进入Zaptel包内
[root@IPPBX zaptel-1.4.6]# cd zaptel-1.4.6

 

3.进行编译Zaptel前的预配置
[root@IPPBX zaptel-1.4.6]# ./configure

 

4.清除陈旧的已编译文件
[root@IPPBX zaptel-1.4.6]# make clean

 

5.编译Zaptel
[root@IPPBX zaptel-1.4.6]# make all

 

6.安装Zaptel
[root@IPPBX zaptel-1.4.6]# make install

 

 

 

.编译安装Asterisk源码包:
1.
解压Asterisk源码包
[root@IPPBX ~]# tar -zxvf asterisk-1.4.13.tar.gz

 

2.进入Asterisk包内
[root@IPPBX ~]# cd asterisk-1.4.13

 

3.进行编译Asterisk前的预配置,并制定安装路径。
[root@IPPBX asterisk-1.4.13]# ./configure --prefix=/usr/local

 

4.清除陈旧的已编译文件
[root@IPPBX asterisk-1.4.13]# make clean

 

5.编译Asterisk
[root@IPPBX asterisk-1.4.13]# make all

 

6.安装Asterisk
[root@IPPBX asterisk-1.4.13]# make install

 

7.安装配置文件模版
[root@IPPBX asterisk-1.4.13]# make samples

 

8.安装Asterisk程序文档
[root@IPPBX asterisk-1.4.13]# make progdocs

 

 

 

.前期准备工作:
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的几个相关文件。
1zapata.conf:这个是Zaptel的主配置文件。
2zaptel.conf:这个是Zaptel的硬件配置文件。
3zaptel- 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: 1.4.6
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      -- Use instead of /etc/zaptel.conf
  -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   604 pts/1    S    16:43   0:00 /bin/bash /usr/local/sbin/safe_asterisk
root      3031  1.0  0.1  20756  7256 pts/1    Sl   16:43   0:00 /usr/local//sbin/asterisk -f -vvvg -c
root      3069  0.0  0.0   3880   692 pts/1    S+   16:43   0:00 grep asterisk
--------------------------------------------------

 


3.
查看Asterisk的网络连接状态
[root@IPPBX ~]# netstat -nap|grep asterisk
--------------------------------------------------
tcp        0      0 0.0.0.0:2000                0.0.0.0:*                   LISTEN      3031/asterisk      
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 1.4.13, Copyright (C) 1999 - 2007 Digium, Inc. and others.
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.
注册软终端
这里我注册了两个软终端如下
1SIP终端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
--------------------------------------------------

 


2IAX终端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端口1234都通过电话线接入PBX交换机,从PBX交换机中得到馈电。

 


4.
通过PSTN呼叫ZaptelFXO端口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呼叫ZaptelFXO端口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的部分更加凤毛麟角。这篇虽然不复杂,但是过程中遇到许多问题,然后研究了不少国外文档才摸索出来的。不过这样印象也反而深刻。希望这份文档能够帮助和我一样的人,尽可能多的减少精神损耗以及研究阻力。

 

阅读(2102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~