CentOS: Shell 脚本_用于获取install.log的RPM名称,版本号,发行号并将对应的RPM从光盘中拷贝至指定目录

背景:

有时候需要根据已经安装的系统,安装另外一台一样RPM包的机器.获取install.log 的RPM名称,版本号,发行号很重要.

思路:

1.根据install.log, 将里面的信息提取出来并另存为一个文件packages.list 。

2.让系统逐行读取packages.list,并用rpm 的参数-qf 获取已知的rpm 详细信息.

3. 执行拷贝工作.

 

具体代码实现:

copy_allrpms.sh

///////////////////////////////////////////////////////////////////////////

#!/bin/bash

VOIP_CD=/mnt/cdrom

ALL_RPMS_DIR=/mnt/cdrom/CentOS

VOIP_RPMS_DIR=/voip/CentOS

cat /root/install.log |grep Installing | sed ‘s/Installing //g’| sed ‘s/^[0-9]\+://g’ >\ /root/packages.list

packages_list=/root/packages.list

 

cat $packages_list |

while read row; do

#echo $row

Name=`rpm -q –qf=%{name} $row`

echo name: $Name

 

Version=`rpm -q –qf=%{version} $row`

echo version: $Version

 

Release=`rpm -q –qf=%{Release} $row`

echo release: $Release

echo

 

cd $ALL_RPMS_DIR

cp $Name-$Version-$Release* $VOIP_RPMS_DIR

echo $Name-$Version-$Release* $VOIP_RPMS_DIR

done

/////////////////////////////////////////////////////////////////

Cheers!

 

发表在 Linux | 留下评论

Welcome 2012

Hello,大家好!今天是2012的第一天,恭祝大家新年工作顺利,身体健康,阖家幸福!

2012,我们一起Asterisk,一起VoIP! 愿与大家共同学习,共同进步!

发表在 Asterisk | 留下评论

Types of Asterisk Modules(Asterisk的模块类型)

Asterisk有许多不同类型的模块,这些模块中上一个图已经有所呈现了.

Channels Drivers

在上图的顶部,我们可以看到通道驱动(channel drivers). 通道驱动用于Asterisk与外界设备进行通信,以及传送信令和协议到Asterisk的核心(core).

Dialplan Applications

应用程序向系统提供通话功能. 一个应用程序可能会应答一路呼叫,播放一段语音提示,挂断呼叫等.

Dialplan Functions

拨号方案函数用于在通话中检索或者设置变量. 一个函数可能在出局通话中被用于设置CallerID.

Resources

正如它的名字所建议的,Resources是用于向Asterisk提供资源. 关于资源的普通例子包括应用等待(music on hold)和呼叫停泊(call parking).

CODECs

CODEC(Coder/DECoder的简称)是一个用于声音和视频的编码/解码的模块. 典型的codecs由于媒体编码,因此它会消耗一部分带宽.

File Format Drivers

文件格式驱动用于向磁盘存储特殊文件格式的媒体文件,以及通过网络将这些文件转换为媒体流.

Call Detail Record(CDR) Drivers

CDR 驱动用于向磁盘或数据库写入呼叫日志.

Call Event Log(CEL) Drivers

呼叫事件日志有点类似于通话记录,但它比较详细,因为在一通特殊的呼叫中它知道Asterisk在内部做了什么事情.

Bridge Drivers

桥接驱动被用于Asterisk内部的桥接架构中,以及在通话参与者中提供各种桥接呼叫媒体的方法.

现在让我们看看每个每个模块类型的详细内容:

Channel Driver Modules

所有来自外部的呼叫在抵达核心之前均透过一个通道驱动,同时所有出局的呼叫在向外部设备的过程中均通过一个通道驱动.

例如SIP通道驱动,利用SIP协议与外部设备进行通信. 进入到核心时转换SIP信令. 这意味着Asterisk是信令未知的. 因此Asterisk不单止是一个SIP PBX,它还是一个多协议的PBX.

想了解更多各种通道驱动的相关信息,请看[Section 400. Channel Drivers and External Connectivity]

所有的通道驱动具有一个类似这样的文件名: chan_xxxxx.so, 比如chan_sip.so或chan_dahdi.so.

Dialplan Application Modules

拨号方案应用模块给系统提供通话功能. 这些应用程序均被用脚本顺序地定义在拨号方案中.例如,一路通话可能进入Asterisk拨号方案内,然后调用该应用程序应答这一路呼叫.另外一路呼叫可能是从磁盘中播放一个语音提示文件. 第三个应用可能是允许主叫在特定的语音信箱中留下语音口信.

关于拨号方案的更多信息,请看Dialplan Fundamentals(拨号方案基本纲要).

所有应用模块具有类似这样的文件名:app_xxxxx.so, 比如app_voicemail.so.

 

Dialplan Function Modules

拨号方案函数有点类似于拨号方案应用,它们简单地在一个通道上重新找回或设置一个特殊的设置,或者执行文本操作,而不是在一个特定的通道或呼叫中做工作. 例如,一个拨号方案函数可能是从一路入局的呼叫中过滤掉一些信息从而获取Caller ID信息,或者给主叫输入设置一个超时.

想得到更多拨号方案函数的信息,请看[PBX Features].

所有拨号应用模块都具有类似这样的文件名: func_xxxxx.so,比如func_callerid.so

Resource Modules

Resources给Asterisk提供功能, 这种情况可能会在一路通话中的任何时间发生,甚至有可能另外一个应用正在这个通道中运行着. Resources通常运用在异步的事件当中.比如一路呼叫被搁置时播放音乐等待,或者执行呼叫停泊.

Resource模块均有类似这样的文件名res_xxxxx.so, 比如res_musiconhold.so

Codec Modules

CODEC模块有类似如这样的文件名codec_xxxx.so,比如codec_alaw.so和codec_ulaw.so

CODECs表示的是给媒体流编码(压缩)和解码(解压缩)的 数学算法. Asterisk采用CODEC模块来发送和接收媒体(声音和图像). Asterisk也采用CODEC模块来将不同的格式媒体流间进行转换(或译码).

Asterisk配备的CODEC模块有如下几种媒体类型:

ADPCM,32kbit/s

G.711 alaw, 64kbit/s

G.711 ulaw, 64kbit/s

G.722, 64kbit/s

G. 726, 32kbit/s

GSM, 13kbit/s

LPC-10, 2.4kbit/s

当建立Asterisk的时候,如果在你的系统中检测到了Speex(www.speex.org)开发库的话,那么Speex的CODEC 模块也也会安装.

同样,在建立Asterisk的时候,如果在你的系统中检测到了iLBC(www.ilbcfreeware.org)开发库的话,那么iLBC的CODEC模块也会被安装.

Digium提供基于软件和硬件产品的支持专利保护的G.729A 或者 G.723.1编码格式的商业版本. 想了解更多关于如何购买license或者硬件使得在Asterisk中使用G.729A 或者 G.723.1编码的信息.请访问Digium公司的网站.(Support for the patent-encumbered G.729A or G.723.1 CODECs is provided by Digium
on a commercial basis through both software and hardware products. For more
information about purchasing licenses or hardware to use the G.729A or G.723.1
CODECs with Asterisk, please see Digium’s website.)

支持宝利通(Polycom)的受专利保护的免费的G.722.1 Siren 7和G.722.1C Siren14 CODECs已经在Asterisk中启用.可以在Digium网站下载二进制的CODEC模块.(Support for Polycom’s patent-encumbered but free G.722.1 Siren7 and G.722.1C
Siren14 CODECs can be enabled in Asterisk by downloading the binary CODEC
modules from Digium’s website.)

File Format Drivers

Asterisk 采用文件格式模块来通过网络传输媒体(比如声音和视频)并将它们保存到磁盘中,或者重新从磁盘中取回需要的文件并将这些文件转换成为对应的媒体流.当涉及到CODECs时,通常对于特定的CODECs,在一个磁盘中或者有不止一种格式.

文件格式模块有类似于这样的文件名字:format_xxxxx.so,比如format_wav.so和format_jpeg.so

Call Detail Record(CDR) Drivers

CDR模块用于用多种格式存储通话的详细记录. 比较流行的存储机制包括CSV文件,关系数据库比如PostgreSQL. 通话的详细记录通常包括一个呼叫的记录,然后给出谁打的电话,谁接听,以及通话时长等详细信息.

想了解更多通话记录,请看[Section 370. Call Detail Records]

通话详细记录模块有类似如这样的文件名cdr_xxxx.so,比如cdr_csv.so和cdr_pgsql.so

Call Event Log(CEL) Driver Modules

Call Event Logs记录的是一路呼叫中发生的各个动作. 找这样,他们通常比通话记录更加详细.比如,一个call event log可能显示Alice呼叫Bob,Bob的电话响铃持续了20秒,然后Bob的移动电话又响铃持续了15秒.这时呼叫前往Bob’s的语音信箱. 在这语音信箱中Alice留下了25秒的语言留言然后把通话挂断. 系统也允许记录自定义事件.

Call Event logging 模块有类似于这样的文件名cel_xxxxx.so,例如cel_custom.so和cel_adaptive_odbc.so

Bridging Modules

从Asterisk 1.6.2版本开始,Asterisk给共同(together)桥接呼叫介绍了一个新的方法. 它依赖于各种桥接模块来控制媒体流是如何在一路呼叫中应该为呼叫参与者混合的. 新的桥接模块比以前的方法均被设计得更加灵活和高效.

Bridging模块都有类似于这样的文件名bridge_xxxxx.so,例如bridge_simple.so和bridge_multiplexed.so

Call Flow and Bridging Model

既然你已经知道了Asterisk使用的各种模块,让我们通过一个Asterisk系统的来讨论一下呼叫流程的方法. 为了能够解释得清晰,我们假设Alice想拨打一路呼叫给Bob,他们两个均用SIP电话并且已经连接在他们的Asterisk系统中了. 我们看看这中间发生了什么事情!

我们是否应该添加一个图标来帮助解释这个呼叫模型?

1. Alice拨打Bob在Asterisk系统的分机号6002.

2.一个来自Alice电话的SIP消息发送到Asterisk内的SIP通道驱动.

3. SIP通道驱动认证这一路呼叫,如果Alice的电话没有提供正确的凭证,Asterisk将会拒绝这一路呼叫.

4. 在这个时候,我们让Alice的电话与Asterisk通信了.

5. 现在这路来自SIP通道驱动的呼叫进入Asterisk的核心(core). Asterisk在拨号方案中寻找一整套指示来跟踪处理分机6002.

6. 在拨号方案中分机6002告诉Asterisk呼叫Bob的电话.

7. Asterisk拨打了一路通过SIP通道驱动出局路由的电话给Bob.

8. Bob应答了他的呼叫.

9. 这时在Asterisk系统中,我们有了两路独立的呼叫: 一路是Alice,另外一路是Bob的.Asteirsk 这时桥接这两路呼叫(在Asterisk术语中称为通道)的声音.

10. 当一个通道挂断时,Asterisk则示意另外一个通道挂断电话.

就是这样. 我们已经展示了来自外部设备的呼叫是如何流动的. 通过通道驱动然后进入Asterisk的核心,然后通过通道驱动返回至外部设备.

Cheers!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表在 Asterisk | 留下评论

Asterisk Architecture(Asterisk架构)

从框架的角度来看,Asterisk是由很多不同的模块组成的. 模块化的设计思想使得灵活设计基于Asterisk系统基本上没有任何限制。作为一位Asterisk管理员,你有选择地加载那些模块. 你加载的每个模块会给系统提供不同的兼容性.例如,一个模块允许你的Asterisk系统与模拟电话线进行通信. 与此同时,另外一个模块有可能会给通话添加播报兼容能力. 在这一部分,我们将会探讨各种类型的模块和他们提供的兼容性.

Asterisk Architecture, The Big Picture

在我们深入研究各种类型的模块之前,让我们首先停下来然后看看Asterisk的整体架构.

Asterisk Architecture

我们需要给这个图片添加CEL和Bridge模块和拿掉CLI和 Manager模块.

Asterisk 系统的心脏就是core. PBX核心是一个重要的组件,它监守着呼叫桥接. 这个核心还监守着其他的项目,像读取配置文件以及加载其他模块. 我们接下来将会更多地探讨这个核心,但现在只需记住的是其他的模块也连接着它.

从一个逻辑的角度来看,这些模块通常都是以.so作为文件扩展名的,它们一般情况下都在目录/usr/lib/asterisk/modules下. 当启动Asterisk的时候,它会加载这些模块以及给系统添加它们相应的功能.

A Plethora of Modules(众多的模块)

花几分钟回去看看你的Asterisk系统的模块,你将会发现有大量的各种各样的模块. 一个典型的Asterisk系统通常包含超过150个不同的模块.

Asterisk的有些模块是核心的一部分,例如文件名为 pbx_xxxxx.so的.

Cheers!

发表在 Asterisk | 留下评论

Linux中reboot参数的妙用

最近在弄一个Intel 的Desktop Board-D525MW, 在该主板上安装了几个操作系统如:OpenSUSE,CentOS,Trixbox/Elastix(均基于CentOS)等。但这个过程中出现了个小问题:

reboot之后,系统无法真正reboot。而是系统在卸载完所有的应用程序及服务的时候停止不动了。类似如:

Please stand by file rebooting the system:

md: Stopping all md devices

Synchronizing SCSI  cache for dish sda:

Restarting System.

在CentOS的/etc/grub.conf中添加reboot=b. 如:

splashimage=(hd0,0)/grub/splash.xpm.gz
#hiddenmenu
title trixbox (2.6.18-128.1.10.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.1.10.el5  ro noht maxcpus=1 root=LABEL=/ reboot=b

或者在OpenSUSE的/boot/grub/menu.list中添加boot=b。如:

7 ##YaST – generic_mbr
8 gfxmenu (hd0,1)/boot/message
9 ##YaST – activate
10
11 ###Don’t change this comment – YaST2 identifier: Original name: linux###
12 title Desktop — openSUSE 11.4 – 2.6.37.1-1.2
13     root (hd0,1)
14     kernel /boot/vmlinuz-2.6.37.1-1.2-desktop root=/dev/disk/by-id/ata-Hitachi_HTS545016B9A300_100623PD6B0    0CXHLU1TB-part2 resume=/dev/disk/by-id/ata-Hitachi_HTS545016B9A300_100623PD6B00CXHLU1TB-part1 splash=silen    t quiet showopts vga=0x31a reboot=b

保存并退出。系统在下次启动后才会生效。

如下附上reboot的参数及解释:

/* reboot=b | s | t | k | e [, arm | old] | p
54   warm   Don’t set the cold reboot flag
55   cold   Set the cold reboot flag
56   bios   Reboot by jumping through the BIOS (only for X86_32)
57   smp    Reboot by executing reset on BSP or other CPU (only for X86_32)
58   triple Force a triple fault (init)
59   kbd    Use the keyboard controller. cold reset (default)
60   acpi   Use the RESET_REG in the FADT
61   efi    Use efi reset_system runtime service
62   pci    Use the so-called “PCI reset register”, CF9
63   force  Avoid anything that could hang.
64 */

该方法在OpenSUSE-11.4/CentOS-5.7/Trixbox-2.6.2.3/Elastix-2.2.0/Elastix-2.0.4/Elastix-1.6.0中测试通过。

Cheers!

 

发表在 Asterisk | 留下评论

Record Application(录音应用)

为了创建自己的auto-attendant或者IVR菜单. 你或许会想录下自己的个性语音提示.一个简单的做法就是运用Record()应用。Record()首先播放一声”哔”,然后开始录音直到你在电话键盘上按下#键.这时录音会被保存为指定的文件名并作为应用的第一个参数。之后继续下一个优先级的extension。如果在按下#之前挂断了呼叫,那么录音将会被中断。例如下面的这些extensions录了一段gsm格式的语言提示并保存在en/sub-directory下,然后将这个录音播放出来:

exten => 6597,1,Answer(500)

same => n,Record(en/custom-menu.gsm)

same => n,Wait(1)

same => n,Playback(custom-menu)

same => n,Hangup()

Recording Formats(录音格式)

当运用Record()应用时,你必须要给录音文件指定一个Asterisk支持的扩展名。在Asterisk命令行中执行`core show file formats`可以查看到一个Asterisk支持的文件格式列表.

当前你已经学会了如何创建一个简单的auto-attendant菜单了.现在让我们构建一个根据具有实用性质的菜单,来找到Alice或者Bob或者通过姓名拨打的目录。

Procedure 216.1. 构建一个具有实际应用的Auto-Attendant菜单

1. 给[docs:users]添加一个分机6599,这个分机用于将呼叫发送到一个新的命名为[docs:day-menu]的context。你的分机应该与如下类似:

exten => 6599,1,Goto(day-menu,s,1)

2. 添加一个命名为[docs:day-menu]的context,并包含如下内容:

[day-menu]

exten =>s,1,Answer(500)

same =>n(loop),Backgroud(custom-menu)

same => n,WaitExten()

 

exten => 1,1,Goto(users,6001,1)

exten => 2,1,Goto(users,6002,1)

exten => 9,1,Directory(vm-demo,users,fe)

exten =>*,1,VoiceMailMain(@vm-demo)

exten =>i,1,Playback(option-is-invalid)

same =>n,Goto(s,loop)

 

exten => t,1,Playback(are-you-still-there)

same =>n,Goto(s,loop)

1. 拨打分机6597开始启动录音一个auto-attendant语音提示。你的提示音应该类似如:“感谢你的来电,Alice请按1,Bob请按2,或者公司姓名目录请按9”. 当结束录音时,按#号键.这时Asterisk将会将你刚刚的录音播放出来.如果你觉得不满意,尽管拨打6597再录一次直至满意为止。

2. 拨打分机6599测试auto-attendant菜单。

仅仅用来几行代码,你就可以构建一个你自己的auto-attendant菜单。在继续下一个部分之前,你尽管可以进行多次的试验这个auto-attendant。

 

Cheers!

 

发表在 Asterisk | 留下评论

Directory Application(目录应用)

我们下一个要讲述的应用就是Directory(), 它呈献的是主叫可以根据姓名拨打的目录. 它询问主叫输入前面的几位数字或者被叫到名字, 然后在文件voicemail.conf的指定语音邮件上下文尝试寻找到匹配的名字. 如过在已录制的问候语中寻找到了,那么Asterisk将会播放这个问候语.否则Asterisk会将被叫名字逐个字母读出.

Directory([voicemail_context,[dialplan_context,[options]]])

Directory()应用自带三个参数:

voicemail_context

在voicemail.conf内,voicemail_context是用于搜索匹配的目录项(directory entry).如果没有指定,那么将会搜索到默认的上下文[docs:default].

dialplan_context

当主叫找到了他们的要寻找的目录项,Asterisk将会在这个context中拨打对应的extension。

options

有一整套用于根据姓名拨打的目录选项参数, 通常使用的参数有f-用于搜索基于第一个名字而不是第二个。还有参数e-读取分机号码以及名字。

Directory() Options

为了能够看到Directory()应用的参数里,在Asterisk CLI中输入`core show application Directory`即可.

exten =>6501,1,Directory(vm-demo,users,ef)

现在你可以拨打6501来测试你的通过姓名拨打的目录功能了。

 

Cheers!

发表在 Asterisk | 留下评论

Auto-attendant and IVR Menus

在这一部分我们将会讲述一些关于如何建立语音菜单的东西, 语音菜单通常指的是自动服务业(auto-attendants)或IVR菜单. IVR表示Interface Voice Response(语音应答接口).通常用来表示主叫通过用电话键盘上的触碰按键来导航的系统。当主叫在他们的键盘按下一个键的时候,电话就会发出两个音频,通称DTMF音频.DTMF表示Dual Tone Multi-Frequency(双音多频).Asterisk 可以识别DTMF音频并作出相应的回应.

让我们开始学习在Asterisk拨号方案中如何建立IVR菜单:

Background and WaitExten Applications

Background()应用播放一个语音提示,但它会倾听DTMF的输入,Asterisk一直尝试地在当前的拨号方案中寻找与DTMF输入匹配的分机,如果寻找到了匹配的分机,Asterisk将会发送该路呼叫到对应的extension.

和Playback()应用一样,Background()应用只需自带语音提示文件的名字即可,因此无需添加文件的后缀名.

Multiple Promts(多语音提示)

如果在Background()应用当中需要播放多个语音,简单地用&符号将这些语语音文件的文件名串联起来即可.

exten => 6123,1,Background(prompt1&prompt2&prompt3)

在Background()应用会遇到有一个问题就是你可能会让Asterisk在播放完语音提示之后等待几秒钟.为了能够做到这一点,你可以调用WaitExten()应用.你通常会看到在Background()应用之后会立即调用WaitExten()应用.WaitExten()应用的第一个参数就是主叫在输入一个分机号前需要等待的秒数. 如果不支持第一个参数,那么Asterisk将会使用内嵌的响应超时(超时可以通过修改拨号方案函数TIMEOUT()实现).

[auto_attendant]

exten => start,1,Verbose(2,Incoming call from ${CALLERID(all)})

same =>n,Playback(silence/1)

same =>n,Background(prompt1&prompt2&prompt3)

same =>n,WaitExten(10)

same =>n,Goto(timeout-handler,1)

exten =>timeout-handler,1)

same => n,Dial(${GLOBAL(OPERATOR)},30)

same =>n,Voicemail(operator@default,${IF($[${DIALSTATUS} = BUSY]?b:u)})

same =>n,Hangup()

Goto Application and Priority Labels

在我们创建一个auto-attendant(自动服务员)菜单之前,让我们涉及几个有用的拨号方案应用. Goto()运行我们从拨号方案内的一个位置跳到另外一个.Goto()应用的参数均比我们目前为止看到的应用的参数复杂.但不要让它吓倒了.

Goto()应用可以调用一个,两个或者三个参数. 如果Goto()应用只调用一个简单的参数,那么Asterisk将会在当前的extension中调到指定的优先级(或者它的标签).如果你指定两个参数,Asterisk将会读取第一个参数作为在当前context内的跳入点,把第二个参数作为extension的优先级.如果你给应用传入三个参数,那么Asterisk将会假设他们是分别将要跳入的context, 优先级.

[startingContext]

exten => 100,1,Goto(monkeys)

same => n,NoOp(we skip this)

same =>n(monkeys),Playback(tt-monkeys)

same =>n,HangUP()

exten => 200,1,Goto(start,1)   ;play tt-weasels then tt-monkeys

exten => 300,1,Goto(start,monkeys); only play tt-monkeys

exten => 400,1,Goto(JumpingContext,start,1) ;play hello-world

exten => start,1,NoOp()

same => n,Playback(tt-weasels)

same =>n(monkeys),Playback(tt-monkeys)

[JumpingContext]

exten => start ,1,NoOp()

same => n,Playback(hello-world)

same => n,Hangup()

SayDigit, SayNumber, SayAlpha, and SayPhonetic Applications

当还没有完全涉及auto-attendant菜单时,让我们介绍几个用于给主叫读取各种各样信息的应用. SayDigits()和SayNumber()应用均用于向主叫读取指定的号码.如果想用SayDigits()和SayNumber()应用,简单地将你想要播报的号码传送给它作为第一个参数.

SayDigits()应用一次只读取一个你指定的号码.例如,SayDigit(123), Asterisk将会这样都回:“one two three”. 另外一方面,SayNumber()应用将会把号码作为一个整体的数字来读回.例如:SayNumber(123),Asterisk将会这样读回:”one hundred twenty three”.

SayAlpha()和SayPhonetic()应用均用于向主叫拼写一个字母数字混合的字符串. SayAlpha()每次只读取一个指定的字符串一个字母. 例如,SayAlpha(hello)将会将会拼写“hello”的一个字母.SayPhonetic()应用将会用国际音标向主叫拼写,SayPhonetic(hello)回读为“Hotel Echo Lima Lima Oscar”.

我们将用这四个应用来通过这个指南来给主叫回读一些数据. 与此同时,你也可以尽管在你的拨号方案中添加一些例子来尝试这些应用。这里有一些例子:

exten => 6592,1,SayDigits(123)

exten => 6593,1,SayNumber(123)

exten => 6594,1,SayAlpha(hello)

exten => 6595,1,SayPhonetic(hello)

Creating a Simple IVR Menu

我们继续前进并引用我们所学到各个应用来建立一个简单的auto-attendant菜单.在一个新的context中建立一个auto-attendant或IVR菜单是惯例的做法.它与其他拨号方案内的分级保持着独立.在extensions.conf中将如下添加至你的拨号方案中用以创建一个新的demo-menu 上下文.在这个新的上下文中,我们将会创建一个简单的菜单,它提示你输入一个或两个数字并返回你刚输入的数字.

示例语音提示

请注意如下(还有这个指南中其他的例子)我们使用的示例语音提示都是extra语音包当中的.如果你早前没有安装这个extra语音包,那么你现在最好把它安装好.

[demo-menu]

exten => s,1,Answer(500)

same => n(loop),Background(press-1&or&press-2)

same =>n,WaitExten()

exten => 1,1,Playback(you-entered)

same => n,SayNumber(1)

same =>n,Goto(s,loop)

exten =>2,1,Playback(you-entered)

same => n,SayNumber(2)

same =>n,Goto(s,loop)

在我们使用上面这个demo-menu之前,我们需要添加一个分级到[docs:users]context来将主叫重定向到我们的菜单中. 这你的拨号方案中添加如下这行到[docs:users]

exten => 6598,1,Goto(demo-menu,s,1)

执行reload从新加载拨号方案 ,然后拨打6578测试auto-attendant菜单.

Handling Special Extensions

我们已经创建了一个基本的auto-attendant菜单, 我们现在将它变得更强壮一点.让它能够处理一下特殊的情况,比如主叫输入一个无效的分机,或者一个分机都没输入等情况.Asterisk用于一套用来处理上述情形的extensions.他们都用单独一个字母来命名.因此我们推荐不要创建任何用单个字母命名的extension. 通常大多数的extensions包括:

i: the invalid entry extension(无效的分级输入)

如果Asterisk无法在Background()和WaitExten()应用中找到一个与当前context中被拨打的数字匹配的extension,那么它会将这路呼叫发送到i 分机.

t: the response timeout extension(回应超时的分机)

当主叫在给Background()和WaitExten()应用输入回应之前等待的时候太长了,而且在当前的上下文中没有更多优先级了,那么呼叫将会被送到t 分机.

s: the start extension(开始分机)

当一路来自模拟线路的呼叫拨打至Asterisk,那么该呼叫将会送到s 分机. s分机也用在宏当中.

h: the hangup extension(挂断分机)

当一路呼叫被挂断了,Asterisk将会在当前的context中执行h 分机. 这一种在一路呼叫完成后拆收线路时典型的用法.

o: the operator extension(操作员分机)

当主叫正在录一条语音留言时,如果他们在的电话键盘上按的0号键,那么主叫将会被重定向到o分机. 这是一种典型的做法,因为这样可以让主叫能够通过拨打0号键找到操作员.

a: the assistant extension

这个分机与o分机类似,只是它只在主叫录语音留言的时候按*号键时才触发。这是找到assistant(助手)典型做法.

我们添加如下几行到[docs:demo-men] context中来处理无效输入和超时. 修改你的[docs:demo-menu] context来匹配如下这个:

[demo-menu]

exten => s,1,Answer(500)

same =>n(loop),Background(press-1or&press-2)

same =>n,WaitExten()

exten => 1,1,Playback(you-entered)

same =>n,SayNumber(1)

same =>n,Goto(s,loop)

exten => 2,1,Playback(you-entered)

same =>n,SayNumber(2)

same =>n,Goto(s,loop)

exten =>i,1,Playback(option-is-invalid)

same =>n,Goto(s,loop)

exten => t,1,Playback(are-you-still-there)

same =>n,Goto(s,loop)

现在再次拨打你的auto-attendant菜单 (通过拨打6598). 这时在auto-attendant菜单中尝试输入一个无效的数字(比如3).将冗余度调到3或更大你可以在Asterisk的命令行接口当中看到类似如下的信息:

– Executing [6598@users:1] Goto(“SIP/demo-alice-00000008″, “demo-menu,s,1″) in new stack
– Goto (demo-menu,s,1)
– Executing [s@demo-menu:1] Answer(“SIP/demo-alice-00000008″, “500″) in new stack
– Executing [s@demo-menu:2] BackGround(“SIP/demo-alice-00000008″, “press-1&or&press-2″) in new stack
– <SIP/demo-alice-00000008> Playing ‘press-1.gsm’ (language ‘en’)
– <SIP/demo-alice-00000008> Playing ‘or.gsm’ (language ‘en’)
– <SIP/demo-alice-00000008> Playing ‘press-2.gsm’ (language ‘en’)
– Invalid extension ’3′ in context ‘demo-menu’ on SIP/demo-alice-00000008
– Executing [i@demo-menu:1] Playback(“SIP/demo-alice-00000008″, “option-is-invalid”) in new stack
– <SIP/demo-alice-00000008> Playing ‘option-is-invalid.gsm’ (language ‘en’)
– Executing [i@demo-menu:2] Goto(“SIP/demo-alice-00000008″, “s,loop”) in new stack
– Goto (demo-menu,s,2)
– Executing [s@demo-menu:2] BackGround(“SIP/demo-alice-00000008″, “press-1&or&press-2″) in new stack
– <SIP/demo-alice-00000008> Playing ‘press-1.gsm’ (language ‘en’)
– <SIP/demo-alice-00000008> Playing ‘or.gsm’ (language ‘en’)
– <SIP/demo-alice-00000008> Playing ‘press-2.gsm’ (language ‘en’)

如果你在auto-attendant菜单中没有输入任何东西. 那么超过大约10秒的时候,你将会听到Asterisk跳转到了t分机.

Cheers!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表在 Asterisk | 留下评论

Dialplan Fundamentals(拨号方案基本纲要)之–Adding Voice Mail to Dialplan Extensions(给拨号方案中的分机添加语音留言)

给分机添加语音留言功能很简单,Asterisk语音留言模块提供了两个关键的用于处理语音邮件的应用.第一个命名为VoiceMail(),它允许主叫给知道的语音信箱留下语音口信. 第二个命名为VoiceMailMain(),它允许邮箱拥有者找回他们的口信并修改它们的问候语.

VoiceMail Application(语音留言应用)

  1. Mailbox: 这个参数指定了语音留言信息应该留下的语音信箱.它应该是一个语音信箱号码和用@符号(像6001@default)将语音邮件context串联在一起的.语音邮箱会被许多语音邮件context分开,就像extension被拨号方案的context分开一样.
  2. options: 一个或多个用来控制问候语的参数. 最流行的选项包括用来播放不可用消息的u选项, b选项用于播放忙消息,s选项用于跳过由系统产生的指示.

Configuring Voice Mail Boxes

既然我们涵盖了两个主要的语音邮件应用,那我们来看看voicemail的配置吧。voicemail的选项邮件箱均在voicemail.conf中设置。这个文件有三大主要的部分:

[general]部分

在voicemail.conf的顶端,你可以找到[general]部分,这部分配置文件主要控制语音邮件系统的的基本部分.比如每个邮箱能支持信息量的最大数量, 语音邮件的最大长度等等。想了解更多信息,请看看voicemail.conf示例里的参数设置.

[zonemessages]部分

[zonemessages]部分用来定义世界各地的时区设置. 每个邮箱可以分配一个特定的时区,以致使得发布的时间和日期都与他们当地的一致.在该部分指定的时区也可以控制发布时间和日期的方法.比如用哪种方式格式读取一天24小时。

Voice Mail Contexts

除了[general]和[zonemessages]之外,其他用括弧括起来的部分均为voicemail的context. 在每个context内,你可以定义一个或多个邮件箱.为了定义一个邮件箱,我们设置一个邮件箱号码,PIN号码,邮箱拥有者的名字,主邮箱地址,从邮箱地址,还有一系列的邮箱选项(用管道符号隔开).如下所示:

exten =>pin,full name,email address,short email address, mailbox options

通过分析,short email address是一个用于接收较短的邮件,通常比较适合移动设备比如手机或者手持设备。它不接收带附件的邮件.

为了给分机6001和6002添加voicemail功能,将如下两行添加到voicemail.conf的底部.

[vm-demo]

6001 =>8762,Alice Jones,alice@example.com,alice2@example.com,attch=n0|tz=central|maxmsg=10

6002 =>9271,Bob Smith,bob@example.com,bob2@example.conf,attach=yes|tz=eastern

既然我们定义了语音信箱了,我们就到Asterisk控制台执行voicemail reload命令来使Asterisk重新加载voicemail.conf文件。我们也可以通过执行voicemail show users来确认已经创建的邮箱用户.

 

server*CLI> voicemail reload
Reloading voicemail configuration...
server*CLI> voicemail show users
Context    Mbox  User                      Zone       NewMsg
default    general New User                                0
default    1234  Example Mailbox                           0
other      1234  Company2 User                             0
vm-demo    6001  Alice Jones               central         0
vm-demo    6002  Bob Smith                 eastern         0
5 voicemail users configured.

既然我们定义了邮件箱了,我们给分机6001和6002分机添加一个优先级,这个优先级允许主叫在他们各自的邮箱里留下语音邮件。我们也定义了分机6500,这个分机允许Alice和Bob查看他们的语音邮件信息。在extensions.conf里将你的[users]context修改成如下:

[users]

exten => 6000,1,Answer(500)

exten =>6000,n,Playback(hello-world)

exten =>6000,n,Hangup()

exten => 6001,1,Dial(SIP/demo-alice,20)

exten =>6001,n,VoiceMail(6001@vm-demo,u)

exten =>6002,1,Dial(SIP/demo-bob,20)

exten =>6002,n,VoiceMail(6002@vm-demo,u)

exten =>6500,1,Answer(500)

exten =>6500,n,VoiceMailMain(@vm-demo)

在Asterisk CLI中执行`dialplan reload`来重新加载拨号方案. 通过从一个分机拨打到另外一个分机并等待20秒测试这个语音邮件系统.你将会被连接到一个语音邮件系统并在那里留下一个口信.你也可以拨打6500来重新收回那个口信.当听到提示时,输入邮箱号码和邮箱的PIN号码即可.

在VoiceMailMain()应用中,你也可以在语音邮箱菜单中通过按0键录下邮箱拥有者的名字,电话不可用时的问候语,或者忙音问候语等.在继续下一部分前,请在Alice和Bob之间录下至少一个问候语.

当然还有更多的Voicemail功能,例如如何在语音消息之间移动,在语音储存文件夹之间移动或者一些前向消息等等。

Cheers!

 

发表在 Asterisk | 留下评论

Dialplan Fundamentals(拨号方案基本纲要)之–Dial Application(Dial应用)

既然你已经学习了拨号方案的基本应用的用法,那让我们一起具体的看看之前分机6001和6002尝试给一个外部设备振铃的Dial()应用吧. 如果这路呼叫被应答了,它将会将两个通道桥接在一起并做一些必要的协议或编解码的转换.它也会处理一些进展回应消息(忙,无人接听,一直振铃)。

Dial()和拨号方案

请注意,如果Dial()应用成功地将两个通道桥接在一起,那么这路呼叫将不在往下执行剩下的拨号方案了.如果Dial()应用不能够将呼叫通道和被拨打的设备桥接起来,那么这路呼叫将会继续执行下一个优先级.

Dial()应用自带四个参数:

一. Devices

  1. 你想呼叫的设备清单。设备被指定为技术或通道驱动,斜线以及设备或账户名字.例如,SIP/demo-alice用的是SIP通道驱动来呼叫在sip.conf的demo-alice部分中被指定的设备.IAX2通道驱动的设备采用IAX2/demo-george 的形式,DAHDI通道采用DAHDI/1的形式.
  2. 当呼叫时通过一个设备(比如网关)或运营商到达另一个号码时,语法形式是technology/device/number比如SIP/my_provider/5551212或者DAHDI/4/5551212.
  3. 为了一次拨打多个设备,采用符号字符(&)简单地将多个设备串联在一起即可.应答第一个的设备将会桥接主叫,并且其他端点会停止振铃.
  4. exten => 6003,1,Dial(SIP/demo-alice&SIP/demo-bob,30)

二 . 超时

在放弃或者执行下一个优先级前允许设备振铃的时间.

三.  选项

有大量的可以设置用于外呼,屏蔽内呼,区别振铃音或更多功能的参数. 在Asterisk控制台输入`core show application dial`可以获取一张完整的可用参数的清单.如果你想指定多个参数,简单地将它们串联起来即可. 例如,你想同时用*m*和H选项,则将它设置为mH.

四. URL

第四个参数就是一个发送给端点的URL.很少端点可以利用URL做任何事情,但有很多(大多数软电话)可以在URL上做到这点一样功能.

Cheers!

 

发表在 Asterisk | 留下评论