织梦CMS - 轻松建站从此开始!

罗索

Asterisk学习手记:双机E1卡互通实验

jackyhwei 发布于 2011-06-21 09:10 点击:次 
用asterisk –cvvvvvvv在A,B两台服务器上分别启动asterisk,如果没有什么问题将出现&CLI>形式的提示符,可以进行调试和指令发 送(可以通过调整vvv字母的多少表示调试信息显示的多少,用Tab键可以自动补全提示行命令)。
TAG:

所需软硬件环境及连接方式

所需软硬件环境
这次测试用了两块E1卡,分别是TE110P和TE210P,按卡上的说明跳成E1模式。两台机器,操作系统CentOS4.X,安装好zaptel,libpri及Asterisk。
安装过程简述如下:
 rpm -q kernel-source zlib zlib-devel openssl openssl-devel
 ;检测上述软件包均已安装,如有缺失不能继续下步工作
 # cd zaptel  进入解压后的Zaptel源码目录
 # make clean ; make install
 # cd ../libpri  进入解压后的libpri源码目录
 # make clean ; make install
 # cd ../asterisk  进入解压后的asterisk源码目录
 # make clean ; make install
 # make samples 
 ;生成默认配置文件
 
 (*注意,如果是CentOS4.3系统,由于系统BUG,编译zaptel时会有错误需打内核补丁)
E1卡连接线
E1卡可以用两种连接线连接,分别是75Ω和120Ω的线。本次测试由于没有找到标准的E1连接线,所以只能用100M的网线代替,只要线不要做得太长,应该问题不大。
E1 卡的接口是Rj-48接口。RJ48是用于T1/E1等串行线路的接口,和以太网的RJ45是一样的。对于接不同的传输,信号定义不一样,本次测试我是按 T1/E1 Trunk and Digital Voice Port (RJ-48)方式做的。以下是各个针脚的信号:Pin1   Signal 1 RX + (input) 2 RX - (input) 3 — 4 TX + (output) 5 TX - (output) 6 — 7 — 8 —
做线时需注意,把RJ48口呈 “凸” 这个形状,线序从左往右为87654321。两边做线时需交叉,1<->4,2<->5交换。
线做好后直接连接到两块E1卡便可。
E1卡驱动加载及配置
 Zapdata安装好之后,需手动加载E1卡的驱动才行,可将其加入到/etc/rc.local内开机时自动加载。加载方法为:
 Modprobe zaptel
 Modprobe wct4xxp(TE210P)  或 wcte11xp(TE110P)
 
 配置相关参数需编辑/etc/zaptel.conf (使用TE110P卡时“[]”内容不需要)
 span=1,1,0,ccs,hdb3,crc4
 [span=2,2,0,ccs,hdb3,yellow]
 bchan=1-15,17-31[,32-46,48-62]
 dchan=16[,47]
 loadzone=cn
 defaultzone=cn
 
 配置/etc/asterisk/zapata.conf:
 1) 屏蔽中间下面这行的配置
 ;signalling=fxo_ls
 2) 取消文件末尾处下列几行注释符号;
 switchtype = euroisdn
 signalling = pri_net (或pri_cpe,两台必须配置不同以便实现双机直接互联)
 group = 1
 channel => 1-15,17-31[,32-46,47-62] (TE110P卡不用配置“[]”内的内容)
 配好后可用ztcfg –vvv看看有没有什么错误。
Asterisk简要配置
在配置之前需要先规化一下,两块E1卡需先各设定一个号码,因条件有限,没有分机,所以我们只能用sip终端做为分机去做测试,这样每台机器需配一个sip帐号。我们规化如下:
机器 Sip帐号 E1卡号码 
A (TE210P) 00000000 02100000000 
B (TE110P) 11111111
11111112 051011111111
051011111112 
下面需对Sip和拨号计划分别进行配置。
配置Sip模块并增加sip帐号
在B服务器上的/etc/asterisk/sip.conf文件内,[general]内的bindport=5058可更改监听端口。

在文件最后,加上:
 [11111111]
 type=friend
 username=11111111
 secret=11111111
 host=dynamic
 context=default
 nat=yes
 canreinvite=no
 disallow=all
 allow=ulaw
 allow=alaw

同样添加11111112账号。

friend表示该帐号可以呼入呼出,username表示帐号,secret表示密码,host表示帐户所在域名或者地址,nat表示是 否进行媒体代理,disallow=all表示禁止主叫的所有媒体类型,allow=ulaw表示允许g711的U律编码,disallow和allow 是或的关系。

在A服务器上建00000000的帐号,其它配置都一样。
配置拨号计划
编辑B服务器上/etc/asterisk/extensions.conf文件,在最后加入:
exten => _021.,1,SetCallerID(051011111111)
exten => _021.,n,Dial(Zap/g1/${EXTEN:0})
exten => _021.,n,Hangup
模 拟环境假设B服务器本地号码为0510开头,A服务器本地号码为021开头,当B服务器上的本地账号拨打021开头号码时,由于不是本地号码,通过E1出 局,转呼叫到A服务器,并送主叫号码为本地051011111111号码方便回拨(当然该号码并不实际存在,下面会对号码处理)
exten => _0510.,1,Dial(SIP/${EXTEN:4},20,rt)
exten => _0510.,n,Hangup
当被叫号为0510开头时,为本地号码,去除0510前缀直转本地SIP账号(条件限制,无直接物理分机,使用软电话模拟)

例如当A服务器转0510开头的出局呼叫到B服务器时,来电打到051011111111时,就自动转到sip帐号11111111上。然后是挂断动作。
而 当从B服务器上呼叫021开头号码如02100000000时,设置透传号码为051011111111,并通过Zap模块的g1拨出去(也就是从E1卡 出局)。g1(group 1,见Zapata.conf配置),$(EXTEN)表示被叫号码,呼叫A服务器上的02100000000号码。

A服务器上对应的,则配置为:
exten => _021.,1,Dial(SIP/${EXTEN:3},20,rt)
exten => _021.,n,Hangup
即上面B服务器送来021开头号码的出局呼叫时(同时也处理本地呼叫,A服务器相同),去除021前缀呼叫本地SIP账号。
exten => _0510.,1,SetCallerID(02100000000)
exten => _0510.,n,Dial(Zap/g1/${EXTEN:0})
exten => _0510.,n,Hangup
同上,A服务器上呼叫0510开头号码时,需出局转给B服务器处理,设置一个021开头的本地账号后通过E1送出呼叫。

Asterisk双机E1简单互通测试
 用asterisk –cvvvvvvv在A,B两台服务器上分别启动asterisk,如果没有什么问题将出现&CLI>形式的提示符,可以进行调试和指令发 送(可以通过调整vvv字母的多少表示调试信息显示的多少,用Tab键可以自动补全提示行命令)。
 使用软电话以11111111,11111112和00000000账号分别登录到B和A服务器上,下面进行测试。
 1111111[1|2]拨打05101111111[2|1],1111111[2|1]软电话振铃,可以通话,模拟本地通话。
 1111111[1|2]拨打02100000000,00000000软电话振铃,可以通话,模拟E1拨出(对于11111111账号,B服务器)和呼入(对于00000000账号,A服务器)。
Asterisk拨号计划高级配置
 上文作为一个简单的模拟环境,号码的拨号计划配置相对简单,在实际应用环境中可能并不能满足需求,我们有必要对Asterisk在拨号计划配置中对号码和拨号流程的逻辑处理方式有深入了解,以便配置满足实际需求的灵活的拨号计划。
 下面列举一个例子,即从B通过E1出局的呼叫时,不是固定送出一个主叫号码,例如本例中可以让发起呼叫的SIP账号的末位是奇数时设置一个主叫号送出,如为偶数,则送出另一个主叫号。
 B服务器的配置文件可改为:
 exten => _0510.,1,Dial(SIP/${EXTEN:4},20,rt)
 exten => _0510.,n,Hangup
 
 exten => _021.,1,Set(lastnum=${CALLERID(num):-1})
 exten => _021.,2,GotoIf($[${lastnum} % 2]?5)
 exten => _021.,3,SetCallerID(051011111112)
 exten => _021.,4,Goto(6)
 exten => _021.,5,SetCallerID(051011111111)
 exten => _021.,6,Dial(Zap/g1/${EXTEN:0})
 exten => _021.,n,Hangup
 
  可以在B的 sip.conf中再增加几个账号,测试可知,当SIP账号末位是奇数时,呼叫02100000000时,在02100000000上可以看到主叫号码是 051011111111,而末位是偶数时,则为051011111112,下面,将对上例中的配置进行分析,分简要介绍Asterisk的命令,函数, 变量和表达式语法等相关知识。
 配置文件中的,_0510.等用来匹配被叫号码,可以是一个直接号码,也可以用通配符进行匹配,其通配符格式可查看其官方文档。
  匹配号码之后的数字则表示前述号码匹配成功后的处理步骤,按数字编号依次一条一条执行,但也可以通过Goto等跳转命令进行跳转执行,数字不可重复和编号 错误,否则会导致拨号计划逻辑错误,如未使用Goto等跳转命令(跳转命令需要真实的编号值),可以从编号2起用n代替(或在Goto用到的实际编号之后 使用),系统自动递增序号免除手工管理麻烦。
 最后一项则是Asterisk拨号计划的处理命令字段,在命令字段中可以使用命令、函数、变量和 表 达式,可以简单的只有一个命令,如Hangup(不带参数的命令),挂断电话,也可以是Dial(Zap/g1/${EXTEN:0}) (带参数的命令),拨打Zap通道通过E1呼出电话,参数中又有变量${EXTEN},还可以有表达式,如GotoIf($[${lastnum} % 2]?5)中的$[${lastnum}%2],用“$[...]”包含起来的字段即表达式。

全部的函数说明资料可以查看:
http://www.voip-info.org/wiki/index.php?page=Functions
常用的函数有:
CALLERID    设置或读取主叫信息(主叫号码,描述,ANI,DNIS,RDNIS等)
CHANNEL   设置或读取通话通道的参数(如某条ZAP通道的状态)
CUT   类似SUBSTR的函数,一般用于号码的截取(号码连接不需使用函数)
ENV   设置或读取系统环境变量值
IF   判断表达式的真假
LEN  计算字符串长度(一般用于判断是否为0检测有无主叫号码)
MATH  进行数学表达式的计算
MD5  计算MD5
REGEX 正则匹配,格式("<reg ex>" <data>)
SET  最常用的,自定义变量的设置

全部模块的命令说明资料可以查看:
http://www.voip-info.org/wiki/index.php?page=Asterisk+-+documentation+of+application+commands
常用模块常用命令有:
普通呼叫处理
Wait  等待一定时间
WaitExten 等待用户按键直到超时时间
Answer 在主叫方表现为,电话已接通
Busy  在主叫方表现为,忙
ChanIsAvail  检测某个通道是否可用
Dial  拔打某个通道
Hangup 在主叫方表现为,电话已挂断
Ringing 在主叫方表现为,听到振铃

流程控制
Goto  直接跳转到某个拨号计划的某个数字编号(默认为当前拨号计划)
GotoIf  配置条件判断,如果为真才跳转到指定的数字编号
GotoIfTime 在指定时间条件满足时跳转到指定的数字编号
GotoSub 跳转到指定的Sub(子计划),可以在数字后增加计划名,与普通使用数字编号跳转不同的是在Sub中可以用Return返回主干
GotoSubIf 同上,进行条件判断后跳转到Sub
Return  Sub中返回主干

声音控制
Background 播放背景音乐
Playback 播放声音,与背景音乐不同的是,用户需听完播放后方能继续拨号计划的执行
SayUnixTime 播报时间
SayAlpha 读字符
SayDigits 读数字,一个数字一个数字读
SayNumber 读数值,与前一个不同的是,本命令能识别数值单位
Record  录音

其它
MeetMe 参加会议
VoiceMail 语音信箱

系统预定义的变量可以参考:
http://www.voip-info.org/wiki/index.php?page=Asterisk+variables
${CALLERID} 主叫信息 ,取号码${CALLERID(num)}
${DATETIME} 当前时间信息
${EXTEN}  被叫号码

表达式语法逻辑可参考:
http://www.voip-info.org/wiki/view/Asterisk+Expressions
基本格式:$[expr1 operator expr2]
逻辑操作:
“|”,“&”,“!”

比较操作:
“=”,“!=”,“<”,“>”,“<=”,“>=”

算术操作
“+”,“-”,“*”,“/”,“%”

正则操作:
“expr1 : regex”,“expr1 =~ expr2”

其它:
“expr1 ? expr2 :: expr3 ”

(zblue78)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14585.html]
本文出处:CSDN博客 作者:zblue78
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容