知行合一
全部博文(31)
分类: 系统运维
2009-09-08 10:55:30
我们的脚本正变得难以debug。现在,让我们介绍XLOG模块。它实现了XLOG函数。这个函数与LOG()函数很相似,但是它允许你在消息中使用诸如请求URI($ru)的伪变量。下面有一个使用XLOG的例子。
loadmodule "xlog.so"
xlog("L_ERR","Marker 480 ruri=<$ru>");
你可以使用下面的命令来检查最近的XLOG消息:
tail /var/log/syslog
在呼叫盲转中,只有一开始的INVITE消息会被处理,了解这一点是很重要的;我们能够安全地对请求URI和通话进行修改,append_branch不需要被调用。
另一方面,对于忙线时和无人接听时的呼叫前转,在开始的INVITE失败后,要在这时派生消息你就必须要执行append_branch()函数。
t_on_failure(“
t_on_failure()函数告诉OpenSER如果(negative/unsuccessful replies)这些出错状况发生了,就要去处理之。在本上下文中的出错状况是那些以4××和5××开头的错误信息。在调用t_relay()函数之前当你调用t_on_failure时,要告知OpenSER当收到出错信息时将控制权转给failure_route[1]。
failure_route[1] {
##--
##-- If cancelled, exit.
##--
if (t_was_cancelled()) {
exit;
};
failure_route的第一部分处理487 cancelled消息。这个脚本对于此类信息只是简单将处理终止。接下来我们将处理busy消息。
##--
##-- If busy send to the e-mail server, prefix the "b"
##-- character to indicate busy.
##--
if (t_check_status("486")) {
revert_uri();
prefix("b");
xlog("L_ERR","Stepped into the 486 ruri=<$ru>");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
如果状态变为486,那么执行的动作就是还原URI(486是对于INVITE请求的一个出错消息),URI以“b”打头(告知语音邮箱系统要播放线路正忙的消息)并重写主机地址,将消息发送给语音邮箱系统。调用append_branch()来将目的地址添加到请求中。相同的处理逻辑被应用在对消息408和480的处理上。
##-- If timeout (408) or unavailable temporarily (480),
##-- prefix the uri with the "u"character to indicate
##-- unanswered and send to the e-mail
##-- sever
##--
if (t_check_status("408") || t_check_status("480")) {
revert_uri();
prefix("u");
xlog("L_ERR","Stepped into the 480 ruri=<$ru>");
rewritehostport("192.168.1.171");
append_branch();
route(1);
exit;
};
Asterisk服务器上的extesions.conf配置文件要写成下面这样。语音邮箱帐号要创建成同OpenSER上的帐号相符。你也可以整合两个数据库以避免维护双数据库入口,具体请参考上面的教程。
#extensions.conf file
[default]
exten=>_9.,1,Dial(ZAP/g1/${EXTEN})
exten=>_9.,2,hangup()
exten=>_u.,1,Voicemail(u${EXTEN})
exten=>_u.,2,hangup()
exten=>_b.,1,Voicemail(b${EXTEN})
exten=>_b.,2,hangup()
要完成这个实验,对于语音邮箱部分的整合需要asterisk方面的一些经验。这个实验实现起来有些难度。有些IP电话很难发送出busy消息,因为它们有不止一条线路。在获得“486” busy消息之前,要使用所有的线路对于这个实现的成功是很重要的。有一种SNOM的ip电话,具有一个busy按钮用来告知用户电话正忙。为了降低实验难度和复杂性,我们将减少INVITE的超时时间。在产品的环境上,去掉这些语句。
modparam("tm", "fr_timer", 5)
modparam("tm", "fr_inv_timer", 20)
步骤1:测试无人应答的呼叫前转
用1000呼叫1002。这通电话应该捎带着“不可得消息”(unavailable message)转向语音邮箱系统。
步骤2:测试忙线呼叫前转。
将1003摘机。用1000呼叫1003。这通电话应该捎带着“忙线消息”(busy message)转向语音邮箱系统。
这一章中,我们学会了如何使用AVPs来处理诸如呼叫前转之类用户喜好(user preferences)。使用failure_route允许我们实现两种通常情况下的呼叫前转,忙线和无人应答。最后我们还学会了如何将此类消息发送到外部的语音邮箱系统,譬如asterisk服务器。