2008年02月19日

trixbox 及elastix 默认的密码

trixbox

登录freepbx , maint/password

mysql root密码:  passw0rd ,注意是零,不是字母o

elastix
登录界面: admin / palosanto
mysql root 密码  eLaStIx.2oo7

内嵌freepbx 密码:  admin/admin

To access SugarCRM use:

Username: admin
Password: password
To access A2bill use:

Username: admin
Password: mypassword
To access Flash Operator panel (Since 0.6 version) use:

Password: eLaStIx.2oo7
To access Freepbx (Un-embedded) use:

Username: admin
Password: admin
To access vtigerCRM use:

Username: admin
Password: admin

2007年09月01日

http://blog.sina.com.cn/u/4b226c320100060e
文章引用自: http://asterisk.pbx.in/ast…

subscriber:加入某个group,从而遵从某一个call restricion
subscriber group:可以使用1种call restriction。
call restriction:将numbering plan中各项取出,各自组成成不同的呼叫限制方案
numbering plan:通用,是一个整体的计划,里面包括长途,本地,等各种形式的方案

————————————————————-
以上,用于拨入号码的预处理,实际上是一种过滤,下面才是真正的呼叫处理。
————————————————————–

route:一种策略,根据号码匹配的模式,选择走哪个trunk。
trunk:实际上做通一个链路,供route选择。
analog的,一个POTS就是一条analog trunk
analog的数量由设备定,
ip trunk没有限制数量,并且一个ip trunk连到对方IPPBX后,对方的subscriber 数量是不确定的,由那个IP PBX决定。

Asterisk,开始吧
————————————————————–
什么是asterisk?开源电话平台

Asterisk 通过了电话的开源平台。基本上就是一个软件的PBX。

最初是Digium 公司的Mark Spencer 编写的,这个公司就是他创立的,专门生产并销售Asterisk使用的硬件。Asterisk 简直就是一场电话的革命。

为什么使用Asterisk?
现在电信行业的混乱,因为各种专利技术应用在各种层次的网络上,导致很大的混乱。Asterisk 就是答案——给电信行业普遍的混乱环境带来秩序的革命。

专利技术有什么错?

没错,如果专利技术独立工作的话。就像你有剃须刀和剃须膏没错一样!但是让各种技术互相操作,专利技术就会除了要价过高、客户不满,以及缓慢的开发速度等问题之外的刻板和局限。

我们要Asterisk做什么?

根据情况而定。在一个小实验室,一个pc(x86),500MHz 的奔三,合适的内存,合适的电源,还有Linux (其他os也可以支持)。此外还有Digium 板卡插在系统中,以便连接本地PSTN。

Asterisk支持什么技术?

与 VoIP, PSTN, ISDN, AIX, SIP 有关的任何东西。

比较好的Asterisk参考书?

<电话未来之路>(http://www.asterisk-docs.o…

找到,编译,安装,在第3,4章中,包含了到哪里去找那些文件之类的信息。还有编译时的需要注意的选项,需要配置的模块,和在运行时载入的模块。

相关:
gcc, glibc-kernheaders, cpp, binutils, glibc-headers, glibc-devel

此外, 安装bison 和 open ssl

大多数标准的distro都自带

推荐distro:基于RedHat和 RH的 distro (版本没指定)

组件:
Asterisk
Zaptel
libpri

Asterisk:Asterisk 程序文件,还有配置,监控的工具

Zaptel: Zapata 项目中硬件的核心模块和驱动,如果要与PSTN或者其他网络接口,需要它。

libpri: 与Primary Rate Interface ISDN的接口库。

还有,如果基准时间参考,需要安装ztdummy 模块(第3章中解释)

有用的网页:
PSTN: http://en.wikipedia.org/wi…
G.729: http://en.wikipedia.org/wi…
G.711: http://www.freesoft.org/CI…
Digium: http://en.wikipedia.org/wi…
Asterisk: http://en.wikipedia.org/wi…
Free World Dial-up: http://en.wikipedia.org/wi…
Asterisk Architecture: http://www.asteriskdocs.or…

重要链接:

Putty:
http://www.chiark.greenend…
Asterisk 通道:
http://www.voip-info.org/w…

重要信息:

Asterisk machine on the LAN: 90.0.0.3

Asterisk的目录结构:(更确切的说,是Asterisk使用的目录)

/etc

包含了zaptel.conf文件(只有一个)

/usr/lib/asterisk/modules

所有的asterisk可载入的模块都在这里,一般来说,所以的模块都是启动的时候载入的

注意:要更改启动时载入的模块,或者是模块载入的方式,你可以修改/etc/asterisk/modules.conf文件

/etc/asterisk

包含了所有的asterisk配置文件

/var/lib/asterisk

agi-bin: agi 脚本

固件:兼容设备固件

映像:在这个目录下寻找映像(如果通道支持)

关键字:这个文件中有基于RSA一类的认证关键字

mohmp3:当配置了持有音乐的时候,这个目录是放置mp3的(注意,mp3应该使用恒比特率编码,并且没有id标签。)

sounds:所有的语音提示

/var/spool/asterisk

qcall:撤销了——包含了特殊呼叫方法的呼叫信息文件——不是打电话的好方法,因为这种方式太硬性了——不再使用。使用outgoing替代。

Outgoing:现在打电话的法国闹事——呼叫信息目录普遍使用。

Tmp:中间/临时数据

Voicemail:语音和问候语。通过修改/etc/asterisk/voicemail.conf文件可以修改。

/var/run

处理系统中运行进程的id(包括asterisk)

/var/log/asterisk

Asterisk在这里生产日志,通过/etc/asterisk/logger.conf来配置。

/var/log/asterisk/cdr-csv

用来存储呼叫详细记录,逗号分割,例如csv(地址簿格式)

重要:很多时间会使用cdr,ast附件包的代码可以在mysql数据库中存储cdr,用于记录呼叫详细记录

外部交换借口/通道接口

FXO :Digium Dev-Lite kit上的红口:Foriegn eXchange Office:这个通道(接口)的动作角色是fxo,利用fxs协议——就是说这个模块需要插入到pstn。

FXS(Digium卡的绿口):Foriegn eXchange Station,它表现得像fxs,读的是fxo协议——所以要插入终端设备——注意,这里插pstn,会烧坏!

配置Foriegn eXchange Station文件:
让你对常见的通道接口进行管理/comm 通道硬件,决定如何在连接的设备之间进行握手。

注意:使用zapata.conf文件完成非常重要的通道配置——激活或者失效类似回形针、回声处理之类的功能。详细程度到pstn添加到那个端口,信令控制等——如果这里配置不正确,甭指望系统能工作正常。

拨号计划:

在extensions.conf中指定。

Dialplan:
拨号计划:在 /etc/asterisk 文件中

拨号计划语法由以下组成部分:

上下文(context) :
写在[]里面 , 定义上下文来创建独立的空间

注意:最重要的一个上下文的应用就是提供安全性:要获得更多信息,看安装文件中SECURITY 文件。
例如:
[incoming]
statement 1—
statement 2—
[next-context]
注意:当下一个定义的上下文开始的时候,现在这个上下文就结束了。
分机:非常简单。与普通的PBX一样。分机号的意思是你在连接到系统之后拨打的号码以获得某个终端/服务-不仅是 asterisk
分机以如下格式定义:

exten =>
分机的组成部分:exten => name, priority, application()
例如 exten => 123, 1, Answer() 的意思是当另一端拨打123,调用asterisk/apps /Answer(),优先级别为1。优先级别通常从1开始。数字越小,级别越高。例如,级别1就比级别2要高。(现在,有一些称为非数字化的级别——非常好,继续读!)一个很好的例子:

exten => 123, 1, Answer()
exten => 123, 2, Hangup()
会发生什么情况,无论什么人拨打123,系统都会首先执行answer(),然后当answer结束的时候,过渡到hungup()。你看,都是执行的顺序和优先级。

还有一些特殊的分机,例如s,比如我们前面的例子中123的位置,后面再解释

记住:
所有的优先级别都是从1开始,其他的必须遵循这个顺序。Ast不会处理其他的,会认为是出错。

分机可是任何,不仅是数字,例如名字。

优先级:我想在前面讨论分机的时候已经讨论了优先级别。
非数字的优先级:
我们会在Answer() … Hangup() 后使用n来代替实际的优先级别数字。
exten => 123, 1, Answer()
exten => 123, n, Hangup()
Asterisk会自动给优先级别+1, 所以你就不用每次记着并输入这个数字了
Also, in Asterisk v2, we’ve got a way to put labels tp priorities:
exten => 123, 1, Answer()
exten => 123, n(Hangup), Hangup()

Applications:

应用程序:

应用程序是真正执行你的拨号计划的程序。拨号计划定义了顺序——应用程序就按照它去做。工作内容可以是任何东西,从播放声音到接受当前通道上的按键输入。(http://www.voip-info.org/w…了解asterisk通道,虽然听起来很好笑,但是我是对通道很迷惑)

简而言之,应用程序是真正干活的,当有人拨打123的时候,参考以上示例。

我们可以通过友好的邻居应用程序传递参数,把它们放在逗号或者竖线分割的列表中。

例如:
exten => 123, 1, DoSomething(Arg_1,Arg_2,Arg_3,..,Arg_n)
或者exten => 123, 1, DoSomething(Arg_1|Arg_2|Arg_3|..|Arg_n)

开源中,你随意!

特别分机:
‘s’是个特别的分机——它处理环境中任何的输入,没有特定目标。S意味着开始。

例如
[incoming]
exten => s,1,application( )
exten => s,2,application( )
exten => s,3,application( )
现在,只要呼叫进入,就带有最高级别,进入s。当我们补充了应用程序之后,我们就是创建了自己的拨号计划

填入应用程序名(分配正确的优先级别)

exten => s,1,Answer( )
exten => s,2,Playback(hello-world)
exten => s,3,Hangup( )
这就是asg拨号计划了

这个拨号计划会:

1. 接电话 (接听已经建立了通道的呼叫,这个呼叫就是从这个通道来的,在进行任何处理之前,先把电话接听.没有参数传递。
2. 播放语音,给出了语音文件的路径,通常在 /var/lib/asterisk/sounds/, gsm 格式,后缀名为.gsm。如果有多个文件都符合这个文件名,ast就播放那个cpu负载(翻译成本)最小的,翻译成本与不同的文件格式有关。在cli下面输入show translation可以看到,参数,语音文件名,还有路径,如果这个文件没有在标准路径下。

3. 挂掉活动通道,主叫方就是从这个通道进行呼叫的,很必要,确保主叫没有继续拨号计划。没有参数

为拨号计划添加逻辑:

Background() 应用程序: 它与 playback() 非常像, 只是在播放语音的时候,如果用户拨打号码,语音中断,然后呼叫那个分机。例如,主叫拨打分机x,会以第一优先级转到分机x上面去。

语法:
Background(sound_file)
例子:
extend => s,n,Background(sound_filename)
回拨语音文件,直到用户输入分机号,——在创建语音菜单的时候有用。

但是playback()不会接受输入,会一直拨,直到语音文件结束。

Goto() 应用: 如其名,主叫跳到某个 context / extension / priority上去.
语法:
Goto(context, extension, priority)
例子:
exten => 1,n,Goto(incoming,s,1)
把控制权交给下一个上下文,分机s, 优先级别 1 – 预先订制拨号计划跳转的流程,

链接:
Xlite sip电话- 免费的: http://www.xten.com/index….

载入Ubuntu:
Ubuntu, 是一个比较新的桌面友好的distro ,放在Asterisk专用的机器上.

重要内容:
Ubuntu 很好 – 对桌面来说
我们必须装很多内容才能在ast服务器上用.
所以一般来说: 不要使用桌面disrto ,如果你计划在上面跑服务器的话- Fedora 是更好的选择.
但是也没有坏处- 有耐心,万事可达.

载入Ubuntu的基本原因就是为了图形化工具Firefox和Acrobat。只是费很多CPU和内存,x历史遗留问题。

所以我们继续的是一台新机器,从新开始运行ast

下面开始真正体验ast系统。经过良好调整的Ubuntu可以阅读PDF文档。

带有safe_asterisk 脚本的ast二进制文件在/usr/sbin中,昨天咱们编译过了如果ast异常,safe_asterisk脚本会引起ast的core dump,默认情况下是在第9终端开启ast。

开始ast我们使用safe_asterisk脚本,或者运行ast二进制文件来手工启动ast。在运行safe_asterisk脚本的时候,在9终端上载入ast的CLI(终端号可以配置),执行ast二进制文件载入ast,作为后台程序
我们还可以用初始化脚本来启动或者关闭ast。
见书71页

求助:
asterisk -h
其它命令行参数:
-c 显示Asterisk CLI (或控制面板)
-v 设置 CLI 的详细程度- 例如v (verbose), vv (very verbose), vvv (very very verbose)
-g 告诉asterisk 创建core dump,一会用gdb调试
-r 远程-连接到一个已经运行的Asterisk进程上 (与网络远程连接没有关系)
-rx远程执行 – 执行引号内的命令 ( "restart now") 不需要真的启动CLI

还有好多命令

Beginning an affair with Asterisk – Day 6
asterisk-dev 准备好 -
asterisk-dev的配置:
Distro: Ubuntu 5.10 (Breezy Badger)
Asterisk version: 1.2.1
运行配置: 图形下完全多用户模式(运行级别5)
asterisk-dev 机器上还装载了很多其他内容.

本章的任务:

1. Linux下Xlite客户端的配置,以便与asterisk-dev上我们的测试 Asterisk 服务器共同工作.
链接:
Xten 网站: http://www.xten.com/
Xlite 下载页面e: http://www.xten.com/index….

2. 录些 gsm 音频格式的音频文件:
welcome messege
timeout messege

我们使用免费的基于Windows的软件(aghhh..) 来进行录制,格式转换和音频标准化 . 它工作非常好,并且最重要符合我们的要求- 快速录制,不需要撞墙很长时间。

链接: 录制/ 转换/ 处理软件-
录制: Recordpad Trial Version – http://www.nch.com.au/reco…
音频转换(WAV to GSM): Switch Freeware Version – http://www.nch.com.au/swit…
音频编辑和处理: Wavepad Trial Version – http://www.nch.com.au/wave…
轻松快速创建音频文件,转换格式,并且标准化到正常的语音级别,让声音没有分叉。可惜不是开源并且在Linux下… .

注意:以上软件只是生成测试录音,为学习而已。Enterux Solutions (或者客户端, Enterux) 许可证要求不需用于任何商业目的。
这个开源的 zgsmplay 可用来测试我们的新gsm音频文件,在 Linux上

链接: http://freshmeat.net/relea…

3. 写第一个拨号方案:

我们的分机配置文件 extensions.conf如下:

[incoming]

欢迎界面,

exten => s,1,Background(enterux/welcome)

exten => i,1,Playback(enterux/invalid-extension)
exten => i,n,Goto(incoming,s,1)

exten => t,1,Playback(enterux/call-will-be-disconnected)
exten => t,n,Hangup()

; 呼叫方可以拨打的用户分机
exten => 0,1,Dial(SIP/0) ; Operator
exten => 1,1,Dial(SIP/1) ; Sales staff – 使用&连接多个接收者,例如 SIP/staff_1&Sip/staff_2 – 最先接起来的电话就被连接。
exten => 2,1,Dial(SIP/2) ; Support staff -使用&连接多个接收者,例如 SIP/staff_1&Sip/staff_2 – 最先接起来的电话就被连接。

exten => 202,1,Goto(incoming,s,1)
exten => 201,1,Goto(incoming,s,1)

要使上面的拨号计划起作用, sip.conf 需要如下设置:

[201]
user=201
type=friend
secret=1234
host=dynamic
context=incoming

[202]
user=202
type=friend
secret=1234
host=dynamic
context=incoming

[1234]
user=1234
type=friend
secret=1234
host=dynamic
context=incoming

;用户添加 0-operator, 1-sales ,2-support
[0]
user=0
type=friend
secret=1234
host=dynamic
context=incoming
[1]
user=1
type=friend
secret=1234
host=dynamic
context=incoming
[2]
user=2
type=friend
secret=1234
host=dynamic
context=incoming

配置Xlite,完成拨号计划。

参考103页(拨号计划基本章节)

4.观察结果:

如果一个登录到ast服务器上的一个软电话拨打201/202,预记录就会播放欢迎语音。

"Welcome to Enterux Solutions. Press 0 for an operator, 1 for sales and 2 for Support. Thank you."

拨打0,1 , 2之后,通过Dial() 应用程序拨打合适的用户

如果分机号码不对,就播放语音
"You have dialled an invalid extension. Please try again.".

软件电话 Xlite 没有声音了,出错说找不到声音驱动
分别试验了Kiax ,Linphone. Twinkle

Twinkle好用了. (仍然出错 "无法读 .DCOPserver_asterisk-dev_0; Please check that the dcopserver program is running" 在启动栏 – 这样就好了).继续,测试拨号计划

链接:
Twinkle SoftPhone: http://www.twinklephone.co…

装好Twinkle (and a little prayer) 我们修改#1号拨号计划:

extensions.conf 文件:

[incoming]

; 欢迎
exten => s,1,Background(enterux/welcome)

exten => i,1,Playback(enterux/invalid-extension)
exten => i,n,Goto(incoming,s,1)

exten => t,1,Playback(enterux/call-timeout)
exten => t,n,Playback(enterux/thankyou)
exten => t,n,Hangup()

exten => 0,1,Playback(enterux/connecting-to-operator)
exten => 0,n,Dial(SIP/0,10,r) ; Operator
exten => 0,n,Playback(enterux/line-not-answering)
exten => 0,n,Hangup()
exten => 0,102,Playback(enterux/line-busy)
exten => 0,103,Hangup()

exten => 1,1,Playback(enterux/connecting-to-sales)
exten => 1,n,Dial(SIP/1,10,r) ; &连接多个分机号码
exten => 1,n,Playback(enterux/line-not-answering)
exten => 1,n,Hangup()
exten => 1,102,Playback(enterux,line-busy)
exten => 1,103,Hangup()

exten => 2,1,Playback(enterux/connecting-to-support)
exten => 2,n,Dial(SIP/2,10,r) ; &连接多个分机号码
exten => 2,n,Playback(enterux/line-not-answering)
exten => 2,n,Hangup()
exten => 2,102,Playback(enterux/line-busy)
exten => 2,103,Hangup()

exten => 202,1,Goto(incoming,s,1)
exten => 201,1,Goto(incoming,s,1)

(参考107页)

sip.conf如下:

[201]
user=201
type=friend
secret=1234
host=dynamic
context=incoming

[202]
user=202
type=friend
secret=1234
host=dynamic
context=incoming

[1234]
user=1234
type=friend
secret=1234
host=dynamic
context=incoming

;用户添加 operator, sales and support
[0]
user=0
type=friend
secret=1234
host=dynamic
context=incoming
[1]
user=1
type=friend
secret=1234
host=dynamic
context=incoming
[2]
user=2
type=friend
secret=1234
host=dynamic
context=incoming

以下是拨号计划的内容:
系统可接收 0,1,2,201,202.
现在,我们的接线总机连到了201和202上面——就是说,欢迎信息只在拨打201和202分机时播放。

我们添加了超时、忙碌和没有应答的功能。阅读106页代码。
Ast的设置是,当没有人接听电话的时候,被叫分机就响2声,然后回拨错误消息。如果被叫的分机应答了,ast就接通,两个人可以占用一个全双工通道。

这是个非常简单的配置,只有最基本的应答函数,最基本的呼叫处理和连接两个用户的能力,用Dial()这个应用程序。我们实际测试过,虽然有实质的延迟,2-4秒,就好像是一个人在讲话,另一个人在重复。这确实存在。有能力的话就写几行代码让两个语音通道互连(相似类型或者不同类型)。

现在我们只试验 "incoming" 这一条,还添加了另外的 "internal" 并对这个文件extensions.conf 进行了验证:

[incoming]

; Extensions for welcoming caller
exten => s,1,Background(enterux/welcome)

exten => i,1,Playback(enterux/invalid-extension)
exten => i,n,Goto(incoming,s,1)

exten => t,1,Playback(enterux/call-timeout)
exten => t,n,Playback(enterux/thankyou)
exten => t,n,Hangup()

exten => 202,1,Goto(incoming,s,1)
exten => 201,1,Goto(incoming,s,1)

; 呼叫正确的分机

exten => 0,1,Playback(enterux/connecting-to-operator)
exten => 0,n,Dial(SIP/0,10,r) ; Operator
exten => 0,n,Playback(enterux/line-not-answering)
exten => 0,n,Hangup()
exten => 0,102,Playback(enterux/line-busy)
exten => 0,103,Hangup()

exten => 1,1,Playback(enterux/connecting-to-sales)
exten => 1,n,Dial(SIP/1,10,r) ;
exten => 1,n,Playback(enterux/line-not-answering)
exten => 1,n,Hangup()
exten => 1,102,Playback(enterux,line-busy)
exten => 1,103,Hangup()

exten => 2,1,Playback(enterux/connecting-to-support)
exten => 2,n,Dial(SIP/2,10,r) ; & 连接 SIP/staff_1&Sip/staff_2
exten => 2,n,Playback(enterux/line-not-answering)
exten => 2,n,Hangup()
exten => 2,102,Playback(enterux/line-busy)
exten => 2,103,Hangup()

[internal]
exten => 0,1,Goto(Internal,0,1)
exten => 1,1,Goto(Internal,1,1)
exten => 2,1,Goto(Internal,2,1)

sip.conf 文件如下所示:

[201]
user=201
type=friend
secret=1234
host=dynamic
context=incoming

[202]
user=202

type=friend
secret=1234
host=dynamic
context=incoming

[1234]
user=1234
type=friend
secret=1234
host=dynamic
context=incoming

; 0: operator, 1:sales and 2:support
[0]
user=0
type=friend
secret=1234
host=dynamic
context=internal
[1]
user=1
type=friend
secret=1234
host=dynamic
context=internal
[2]
user=2
type=friend
secret=1234
host=dynamic
context=internal

0,1 , 2的条款发生了变化从[incoming] 到 [internal]

与以前类似,只是现在要使用的是不同的contexts。

—————————————————
在 Asterisk 拨号计划中使用变量

在拨号计划中使用变量

在 asterisk中设置变量:
JOHN=SIP/1
引用变量Asterisk:
exten => 123,1,Dial(${JOHN})

很简单.
注意:不需要大写变量名 – 这里是为了清晰

变量的类型:

全局变量:
所有的context都可以访问的变量。
全局变量在拨号计划的最前面[globals] context中声明.
还可以在拨号计划中声明全局变量:
[global]
JOHN=SIP/1
或者
[some context]
exten => 123,1,SetGlobalVar(JOHN=SIP/1)

全局变量的生命周期是到ast关闭为止。

渠道变量:
渠道变量与特定呼叫或者呼叫通道有关。
渠道变量的生命周期限制在呼叫的范围内.
有许多预定义的渠道变量- 见README.variables 文件 doc/ subdirectory.

设置渠道变量:
exten => 123,1,Set(MAGICNUMBER=42)

环境变量:
提供了通过dialplans访问Unix环境变量的方法.
参考环境变量:
UNIXPATH=${ENV(PATH)}
Asterisk中的模式匹配:
Asterisk 会尝试匹配任何以下划线开头的符号

你可以在模式匹配中使用如下的符号:
X 表示 0 到 9
Z 表示 1 到 9
N 表示 2 到 9
[] 表示范围 (例如, [15-7] 匹配1,5,6 or 7)
. 通配符

举例:
_9. 会匹配所有以9开头的数字,例如 92, 932344,99999,91,等.
_XXX 匹配3个数字的串,每个数字的范围是0到9,例如321, 999,123, 等.

使用匹配模式,:通常手工添加每个可能的分机是非常枯燥乏味的。模式匹配简单多了。

出线中继(Outbound trunk):要让用户可以通过ast网络拨打外面的电话号码,我们可以启用出线中继。
比较好的方案如下:
-> 使用变量名来引用中继名。这可以让我们即时修改中继,不会引起错误
-> 使用编写正确的 context来合理划分拨号计划. 这可以保证系统免受意外,或者恶意的未经授权的使用。

下面看一些函数和条件分支,看看extensions.conf

[incoming]

; s 和 t分机
exten => s,1,Background(enterux/welcome)
exten => t,1,Hangup()

; 接受对201的呼叫
exten => 201,1,Goto(s,1)

; GotoIf() 函数
exten => 345,1,Set(TEST=greet)
exten => 345,n,GotoIf([{TEST}=greet]?10:20)
; Asterisk 给 GotoIf传递一串参数
exten => 345,10,Playback(weasels-eaten-phonesys)
exten => 345,20,Playback(office-iguanas)

; 倒数,使用 GotoIf() 和命名的优先级
exten => 346,1,Set(COUNT=10)
exten => 346,n(say),SayNumber(${COUNT})
exten => 346,n,Set(COUNT=[{COUNT}-1])
exten => 346,n,GotoIf([{COUNT}>0]?say:thank)
exten => 346,n(thank),Playback(auth-thankyou)
exten => 346,n,Hangup()

; 基于Caller Id 识别的呼叫拒绝
exten => 347,1,Set(REJECT_NUM=201) ; The number to be rejected (can also be done without a variable)
exten => 347,n,Set(CALLER=${CALLERIDNUM})
exten => 347,n,GotoIf([{CALLER}=${REJECT_NUM}]?reject-messege:welcome)
exten => 347,n(reject-messege),Playback(abandon-all-hope)
exten => 347,n,Hangup()
exten => 347,n(welcome),Playback(welcome)
exten => 347,n,Hangup()

; 不同的呼叫拒绝示例347
exten => 348,1,GotoIf([{CALLERIDNUM}=201]?30:20)
exten => 348,20,Goto(201,1)
exten => 348,30,Playback(abandon-all-hope)
exten => 348,n,Hangup()

; 按时间播放语音,利用GotoIfTime()函数
exten => 349,1,Playback(good)
exten => 349,n,GotoIfTime(04:00-11:59,*,*,*?good-morn)
exten => 349,n,GotoIfTime(12:00-16:59,*,*,*?good-aft)
exten => 349,n,GotoIfTime(17:00-03:59,*,*,*?good-eve)
exten => 349,n(good-morn),Playback(morning)
exten => 349,n(good-aft),Playback(afternoon)
exten => 349,n(good-eve),Playback(evening)
exten => 349,n,Hangup()

; Planning on holiday
exten => 350,1,GotoIfTime(*,*,26,jan?closed,s,1)
; 以上的意思是说,如果是1月 26,按照以下的优先级别 1 of s 的close context分机优先级别,否则是open context的 1 of s extension
; 如下所示
exten => 350,n,Goto(open,s,1)
exten => 350,n,Hangup()

[open]
exten => s,1,Playback(welcome)
exten => s,n,Hangup()

[closed]
exten => s,1,Playback(sorry2)
exten => s,n,Hangup()

你可以拨打相应的分机

B2BUA的hardphone call flow

2006-10-25 11:37:03

大中小
基本流程很正常,已经很熟悉
说其中的细节:

B2BUA的方式,就是两个UA背靠背,分别接通两边的会话,做个中间人。

5088@141 ————> PBX 12 ————–> 5010@131

———————->
INVITE 5010@12

TO:5010@12
FROM:5010@12

VIA:141

CONTACT:5088@141

<———————-
100

TO:5010@12
FROM:5010@12

VIA:141

CONTACT:5010@12

——————->
INVITE 5010@131

TO:5010@131
FROM:5088@12

VIA:12

CONTACT:5088@12

<——————-
180

TO:5010@131
FROM:5088@12

VIA:12

<———————
180

TO:5010@12
FROM:5088@12

VIA:141

CONTACT:5010@12

<———————
200

TO:5010@131
FROM:5088@12

VIA:12

CONTACT:5010@131

———————->
ACK 5010@131

TO:5010@131
FROM:5088@12

VIA:12

<———————
200

TO:5010@12
FROM:5088@12

VIA:141

CONTACT:5010@12

———————->
ACK 5010@12

TO:5010@12
FROM:5088@12

VIA:12

<———————–
BYE 5088@12

TO:5088@12
FROM:5010@12

VIA:131

————————->
200

TO:5088@12
FROM:5010@12

VIA:131

CONTACT:5088@12

<———————
BYE 5088@141

TO:5088@12
FROM:5010@12

VIA:12

———————->
200

TO:5088@12
FROM:5010@12

VIA:12

将用户(user)与设备(device)区分开来--内线分机的高级应用

http://blog.sjhx.com/read.php/128.htm

常规指令
Authenticate:鉴别用户
VMAuthenticate:根据“voicemail.conf”鉴别用户
Curl:接受外接URLs的修复。支持POSTing
DUNDiLookup:用DUNDi查寻号码
SendDTMF:发送独裁的DTMF数据
SendImage:发送图像档案
SendText:发送给客户正文消息
SendURL:发送给客户USL以显示
System:执行系统命令
Transfer:将访客转移到另一个扩展名
TrySystem:0回复执行系统命令
Wait:稍等
WaitExten稍等:
WaitForRing:等待呼叫申请
WaitMusicOnHold:等待,在线音乐
Billing
ForkCDR:将CDR分成两个独立的实体
NoCDR:确保 asterisk没有把CRD保存为特定的呼叫
ResetCDR:重新安装CDR数据
SetAccount:设置帐簿号码
SetAMAflags:开通AMA标志开户的渠道
SetCDRUserField:建立CDR用户领域
AppendCDRUserField:给CDR用户附加数据
Call management (hangup, answer, dial, etc)
Answer:如果呼叫回复一个信道
Busy:显示忙的情形等待挂断
ChanIsAvail:如果信道可以利用即核查
Congestion:显示拥塞等待挂断
Dial:设置一个指令连接当前的信道
DISA:直接访问内在系统
Hangup: 无条件挂断
Ringing显示呼叫
Caller presentation (ID, Name etc)
CallingPres:更改呼叫者的身份介绍
LookupBlacklist: 从黑名单数据库上查询访客的身份 姓名和号码
LookupCIDName: 从当地的数据库查询访客的身份和姓名
PrivacyManager:如果没有CallerID过来,要求输入电话号码
SetCallerID: 建立CallerID,发生矛盾服从CallerID
SetCallerPres:建立访客资料的独立信道
SetCIDName:建立呼叫者身份 姓名,发生矛盾服从CallerID
SetCIDNum: 只建立访客的身份号码(没有姓名),发生矛盾服从CallerID
SoftHangup: 请求挂断转到另一个信道
Zapateller:拥SIT阻止远程商人
ADSI
•  ADSIProg:将 Asterisk ADSI Scripts 加载到电话
•  GetCPEID: 获得 ADSI CPE ID
Database handling
•  DBdel: 从数据库中删除一个键. 发生矛盾服从 DB.
•  DBdeltree: 从数据库中删除群. 发生矛盾服从 DB.
•  DBget:从数据库中找回数值. 发生矛盾服从DB.
•  DBput: 在数据库中储存一个数值. 发生矛盾服从DB.
•  MYSQL:执行不同的 mySQL 数据库行为
查 Asterisk database 找更多的信息.
Application integration
•  AGI: 执行一套AGI 适应程序
•  DeadAGI: 在中断的信道上执行AGI
•  EAGI: 执行一套 AGI 适应程序
•  EnumLookup:在 ENUM 中查找号码
•  Macro: 执行较大的程序
•  NoOp: 不进行操作,可将数值打印到控制太进行调试
•  Perl: res perl 是Apache 的 mod_perl, 只适用于 Asterisk
•  PHP: res_php 不需要就可将PHP与进行一体化处理
•  Read: 用DTMF读变量
•  TXTCIDName: 从 TXT 记录中查找访客的姓名
•  UserEvent:发送任意结果给界面处理器

 
Control flow & timeouts
•  AbsoluteTimeout: 建立呼叫最长时间
•  DigitTimeout: 建立数据间的最长时间间隔
•  Goto:转到优先码,扩展名和过渡段
•  GotoIf: 条件展转接
•  GotoIfTime: 当前的条件转接
•  Random: 在拨号栏中随机跳动
•  ResponseTimeout: 设置等候回应的最长时间
•  While: 开始一个当循环- *1.2beta
•  EndWhile: 结束一个当循环 – *1.2beta
•  ExecIf: 条件执行 – *1.2beta

 
String & variable manipulation
•  Cut: 串处理功能,发生矛盾支持 CUT.
•  ImportVar: 赋数值变量
•  Math: 进行简单的计算
•  Prefix: 预设主要的数据
•  SetGlobalVar:赋数值变量
•  Set: 设信道变量和功能值
•  SetVar: 赋数值变量(如果不允许,使用 Set)
•  StripLSD: 消除附加的数据
•  StripMSD: 消除主要的数据
•  SubString: 在一个预设的变量中保存子链数据
•  Suffix:添加附加数据
Sounds:录音重放
•  Background: 当执行其它命令的时候播放声音文件
•  BackgroundDetect: 用谈话探测背景文件
•  ControlPlayback: 用快进,重绕和离开当前命令控制器播放声音文件
•  DateTime: 显示日期/和时间
•  Echo: 重复声音回复到永福端
•  Festival: 使用欢快的声音合成器朗诵课文
•  Milliwatt: 在0分贝产生持续的1000赫兹的音调
•  MP3Player: 播放MP3声音文件
•  MusicOnHold: 无限度地播放音乐
•  Playback: 播放一个声音文件
•  Playtones: 当执行其它命令的时候播放声音列表
•  SayUnixTime: 显示日期/和时间
•  SayAlpha: 显示字母
•  SayDigits: 显示阿拉伯数字
•  SayNumber: 显示数字
•  SayPhonetic:显示语音
•  SetMusicOnHold: 在控制系统上显示默认的音乐
•  SetLanguage: 为录音重放显示语言转换
•  StopPlaytones: 停止播放音调列表

查看Asterisk sound files 获取更多信息 
语音: 录音和监测
•  ALSAMonitor: 监测ALSA控制台
•  ChangeMonitor: 转换监测的路线文件名
•  ChanSpy:通用的路线干涉
•  Dictate: 听写的录音和播放
•  Monitor: 录音电话会话到声音文件
•  MuxMon:记录和混合电话支架
•  Record: 记录电话会话到语音文件
•  StopMonitor: 停止监测路线

 
SIP 命令
•  SIPdtmfMode: 在SIP呼叫过程中转换DTMF模式
•  SIPGetHeader: 从SIP邀请信息中获取标题
•  SIPAddHeader: 填标题到外部的SIP邀请
•  suplimental resource SIPCallPickup:在获取组中获取打入的电话
•  sipredirect: 发送SIP 302信息到呼叫者
 
ZAP 命令
•  Flash: 编辑到Zap主页
•  ZapBarge: 干涉Zap路线
•  ZapRAS: 提供ISDN数据服务
•  ZapScan: 扫描Zap路线到监督程序调用
•  查看 Asterisk zap channels, zapata.conf 获取等多信息.
语音邮件和会议
•  Directory: 规定语音邮件扩展目录
•  HasNewVoicemail: 有条件的分枝到优先权+101
•  MailboxExists: 检查邮箱是否存在
•  MeetMe:简单的 MeetMe 会议桥
•  MeetMeAdmin: MeetMe 会议管理
•  MeetMeCount: MeetMe参与者计算
•  VoiceMail: 语音留言
•  VoiceMailMain: 进入语音系统
•  VMAuthenticate: 基于语音邮箱鉴别用户
查看 voicemail.conf 获取更多的信息
列队和ACD操纵
•  AddQueueMember: 自动添加排队成员
•  AgentCallbackLogin: 呼叫代理商回叫注册
•  AgentLogin: 呼叫代理商注册
•  AgentMonitorOutgoing: 记录代理商的外出呼叫
•  ParkAndAnnounce: 停放和宣告
•  ParkedCall: 回复被停放的呼叫
•  PauseQueueMemeber: 中止代理
•  Queue: 排队等代呼叫
•  RemoveQueueMember: 自动移交列队成员
•  UnpauseQueueMemeber: 重新开始代理

警报监测/中心站
警报接受站:仿效一个Ademco 连接ID的警报接受站

业余无线电接受装置/转发器连接
Rpt:支持业余无线电接受装置和商业化的两种转发器连接

外部应用(不是在CVS里)
Asterisk app_dbodc:用unixODBC进行拨号方案修正
DynExtenDB:数据库中的存储扩充
Iconv:字符切换设置
app Prepaid:为Postgres 所设计的
PPPD:邮件后台程序连接器

Bristuff & zaphfc applications
•  PickUp: 大多数路线是独立的;是bristuff片的一部分
•  PickUpChan:接收指定路线
•  PickupSIPuri
•  PickDown: 挂断长途电话
•  Steal: 接受中转电话
•  Devstate: 产生一种安装设备驱动程序状态来改变事件(忙,打电话…)
•  Segfault:用 segfault 撞击Asterisk
•  ZapEC: 对于Zap能或者不能的回波消除
•  Autoanswer: 在指定范围内自动回话
•  AutoanswerLogin: 登陆到自动回话应用程序
vISDN applications
VISDN交叠拨号
Sirrix 路径的应用
•  SrxEchoCan: 不能/能回波消除
•  SrxDeflect: 偏转进入的电话
•  SrxMWI:在Sirrix组上 设置/重新设置信息等待指示(MWI)

一直在看<Asterisk,电话未来之路CHN2>这个电子文档,却越看越糊途。于是在N+X次的Baidu后找到这个文档:

[separator]

===================================================

 http://skytony.spaces.live.com/blog/cns!3ADCAF7D549E5C1E!209.entry

 

配置文件 “extensions.conf” 包含了Asterisk的拨号方案(dial  plan)。它的所有操作的控制和执行流程的主要方案。它控制呼入和呼出是如何被处理和路由。这里是你配置连接行为的地方。
 
"extensions.conf"的内容以“节”的形式组织。它可以静态设置和定义,作为上下文被执行。设置节有general 和 globals 两种形式,由系统管理员完全定义。一种特殊类型的“contexts”是 macros,由用户自定义,命名前缀是“macro-”,这是可重用的模式,如同编程语言里的“过程”。extensions.conf中每一节都由 []中的节名开始。这使得extensions.conf具有和windows世界里传统的ini文件非常相似的结构。
 
 
Asterisk v1.2中的新东西: 默认情况下,有一个新的选项“autofallthrough”被设置成了“yes”. 这个设置改变了以前的规则使得遇忙,阻塞,挂起的呼叫被立即终止。如果你正在为IVR写一个extension.你必须使用“WaitExten”应用程序。
 
[general]   extentions.conf文件的顶部,配置几个设置。
[globals]  接着,在[globals]节中,你可以定义全局变量/常量,以及他们的初始值。
 
Contexts 和 Extensions
     在[general]和[globals]之后,extentions.conf文件的剩余部分就是dialplan的定义了。
dialplan是由contexts的集合组成的。每个context是由extensions的集合组成。
 
Extension 模式
     当你在context中定义extension时,你不仅使用文字数字,字母,还要匹配extension模式。
 
 
Context包括的内容
   一个extension context可以嵌套另一个,参考一下下面的范例:
 Context "default":
         Extension       Description
         101             Mark Spencer
         102             Wil Meadows
         0               Operator 

Context "local":
         Extension       Description
        _9NXXXXXX        Local calls
        include => "default" 

Context "longdistance":
         Extension       Description
         _91NXXNXXXXXX   Long distance calls
         include => "local"

 
这里我们定义三种 extension
第一种content: default 允许拨打三个电话extension: Mark, Wil, and the Operator.
 
第二种content: local      一个扩展模式:允许拨打7位数字号码(本地呼叫),同时也包括
                                   “default” context,这样也允许用户拨打 Mark,Wil,或者是操作员。
 
第三种content: longdistance 一种允许拨打长途呼叫的扩展模式。它同时也包括上述的两种模式
                       (default 和 local)
 使用扩展context,你可以谨慎的控制哪些人使用计费服务(内线,市话,长途)
 
如果一个拨叫号码匹配多个模式,你可以参阅一下“扩展模式的排序”
 
 
当Asterisk从一个通道上收到一个呼入连接,Asterisk从context定义中查询通道命令。context根据用户拨打的 extension定义了不同的命令集。例如,如果用户拨打的是“123”,context可以提供提供一套命令集来指导如何去做。如果用户拨“9”, context可以提供另一套命令集来指导做什么,同时context可以提供一套命令集来控制用户拨打的任何以“555”开头的号码。
 
某些类型的友好连接,比如来自外线的呼入,用户没有拨打extension,在这种情况下,…
 
比方说,举个例子,你有一个信道“Zap/1”,它连接到你办公室中的一个电话手持设备。假如在Zap信道的的配置文件 (zapata.conf)中,你为Zap信道1定义了context=john.这样当你使用那个手持设备拨打一个号码时,Asterisk在 extension.conf中寻找名为“john”的context,找出它所应该做的(工作)。
在extensions.conf中定义一个名为john的context,应该以下面的样子开始:
 
[john]
 
每一个context,你需要定义一个或者多个extensions,Asterisk根据不同的号码拨叫用来比较。
每个extension,通过命令集列表告诉了Asterisk应该做什么。
 
 
 Extensions
 
extension 有两种类型: literal 和 pattern
 
literal extension 可以是一个号码,就像123。它也可以包括出现在传统电话中的标准的符号*和#,因此,12#89*是一个有效的extension.某些电话拨号盘有一些特殊的标着 A,B,C 或者 D 的 DTMF键。extension也可以使用这些字母来定义。实际上,extension的名字可以包含任何字母和数字以及某些标点符号。
   
       extension名字是大小写敏感的?是的。有时是大小写敏感的,有时不是。当用户使用他们的VoIP电话拨打名为"OFFICE"的  extension 时,Asterisk不会执行名为“Office”的extension中定义的命令。另一方面,extension的名字不是大小写敏感的,因此你不能在一个content中
定义仅仅是大小写不同的extension.因此你不能为“OFFICE”extension定义一套程序集,同时为"office"extension也定义一套程序集。
 
预定义的Extension名称。
Asterisk为特定的目标指定了一些extension名称。
  • i:Invalid
  • s:Start
  • h:Hangup
  • t:Timeout
  • T:AbsoluteTimeout
  • o:Operator

详细信息: Asterisk standard extensions

定义Extension

不同于传统的PBX,extension是和电话,接口,菜单等联系在一起的。在Asterisk中,一个extension是定义成命令执行列表的。就像Dial和GotoIf命令,具有基于不同的条件转到某个地方的能力。

 

当一个extension被拨叫,标为优先级1的命令被执行,紧接着是2,等等。

这将一直持续到:

  • 呼叫被挂起。
  • 命令返回代码-1(表示失败)
  • 下一个更高优先级的命令不存在。(注意:Asterisk不会跳过丢失的优先级别)
  • 呼叫被路由到一个新的extension

 

extension.conf 文件中的句法,一个extension执行的每一步是下面这个格式的:

 

exten = extension,priority,Command(parameters)

 

这里等号也可以用一个箭头来修饰,就是“=〉”,一种在很多例子中经常可以被看到的格式。

 好了,假如一个“context”,名为“john”。在每一个context中,你可以定义一个或多个 extension.每一个extension中,你定义一组命令集。你如何定义这些extension和命令?你需要一个文本编辑器来编辑 extensions.conf文件。当然,也可以使用某些不错的工具:GUI tool.

 

extension中的执行步骤和命令行组件是下面的样子:

  • extension  是extension的标签,可以是字符串常量或者是动态的模式-匹配许多可能的电话号码。
  • priority 通常是正数(特例参见注意)。它是一个extension中的每个命令行的排序号码。第一个可执行命令的priority值为“1”。因此当Asterisk将一个呼叫转入一个extension时,它将首先寻找priority值为1的命令。如果没有优先值为1的行,那么这个extension将不会匹配这个拨入的号码。当执行完优先值为1的命令之后,Asterisk将把priority的值增加到2,除非命令本身决定下一个要执行的优先值。如果extension中没有定义下一个priority,Asterisk将完成对这个 extension的处理,即使是存在一个比丢失的命令的优先级更高的命令。

注意:特殊情况下,字符串也会被用于指定优先级(参见 Asterisk standard extensions)。

  • command 是命令的名称(也被称为“应用程序”)。详见 Asterisk Commands List.
  • parameters 依赖于命令。某些命令没有参数,在这种情况下省略参数。

范例

   exten=>123,1,Answer

   exten=>123,2,Playback(tt-weasels)

   exten=>123,3,Voicemail(44)

   exten=>123,4,Hangup

这是单个名为“123”的extension的定义。但一个呼叫被安排到 extension 123,Asterisk将自己回答这个呼叫,播放一个名为“tt-weasels”的声音文件,提示用户是否留下语音邮件,然后挂断电话。

应该注意的是,Asterisk没有关注这几行代码在extensions.conf文件中的顺序。你可以以不同的顺序混合这几行代码,就像下面的例子,它与之前的例子没有什么不同,因为Asterisk使用priority来标示每一行的执行顺序。

 

   exten=>123,4,Hangup

   exten=>123,1,Answer

   exten=>123,3,Voicemail(44)

   exten=>123,2,Playback(tt-weasels)

  
定义extension时的其它选项包括被称为“ex-girlfriend”逻辑的选项。这个逻辑将匹配extension,不管是来自外部还是内部,关键是看拨入人的呼叫ID(caller id).例如:

 

      exten=>123/100,1,Answer()

      exten=>123/100,2,Playback(tt-weasels)

      exten=>123/100,3,Voicemail(123)

      exten=>123/100,4,Hangup()

  

只有当呼入人的ID号为100时,这个extension才被匹配,并且执行接下来的选项。这个也可以通过模式匹配来完成,如下所示:

     exten=>1234/_256NXXXXXX,1,Answer()

     and so on …

 

只有以256开头的Caller ID才会匹配“1234”这个模式。这在保持本地呼叫时是很有用的。

 

你甚至可以做这样的事情:

     exten=>s,1,Answer

     exten=>s/9184238080,2,Set(CALLERID(name)=EVIL BASTARD)

     exten=>s,2,Set(CALLERID(name)=Good Person)

     exten=>s,3,Dial(SIP/goodperson)

 

定义context的语法关键字有: exten,include,ignorepat以及switch

     详见:How Does Asterisk Handle "Match As You Go" Dialing?

 

这种extension的排序办法存在的一个弊端是-如果你需要插入或删除一个priority时,你必须手动重新全部编号。我正在搞这么一个工具用来处理这件事情,感兴趣的话,可以尝试一下:give it a try

 

Asterisk1.2以后的版本有一个新的方法处理这件事情。第一个优先级给它编号,接下来的优先级给它命名成“n”. 深入的了解:Asterisk Priorities

 

变量和表达式

支持变量的结构 ${VARIABLENAME}

使用表达式的结构${EXPRESSION} ,这里表达式可以是常用表达式,比较表达式,加法表达式等等。

标准变量见: Asterisk variables 。表达式的描述见: Asterisk readme.variables

 

extensions.conf 文件中的全局变量和信道变量的更多信息,见Using Variables in Asterisk Dialplans

1.2版本中的新的拨号功能,见:Using Functions in Asterisk Dialplans

 

载入

在设置发生了改变之后,如果想重新加载拨号方案,无需加载所有的Asterisk配置文件。可以使用extension加载命令:Asterisk CLI

 

一个大文件还是几个小文件?

当在extension.conf文件中使用 #include<filename> 声明时,包含了其它的文件。用这个办法你可以启动这样一个系统:extensions.conf是主文件,users.conf包含你的本地用户,services.conf包含各种服务-例如会议系统。使用这个方法,拨号方案可能更容易维护。#include<filename>声明不同于include<context>声明。#include声明在所有的配置文件中都可以使用。

 

转到其它的Asterisk

 

语法:

[iaxprovider]

switch=>IAX2/user:[key]@server/context

 

指定转到其它的服务器。userkey 需要在被呼入的服务器的iax.conf文件中定义。

 

context是被转入的服务器的extensions.conf文件中的context.

例子: Asterisk – dual servers

 

从外部控制 extensions.conf

 

             Asterisk extensions from mysql

             所有的 .conf 文件都可以使用 #include 声明包含另一个.conf 文件。

使用范例:

 #include "my-extra-config-file"

[globals]

ALL= Zap/1&SIP/1000&SIP/1001

 

[default]

exten=>s,1,Answer

exten=>s,2,Playback(welcome-message)

exten=>s,3,Goto(context-in-include-file,s,1)          ;go to include 文件中定义的 context

 

范例:

使用宏创建extension

[globals]

PHONE1=Zap/1

PHONE2=SIP/6002

 

[macro-oneline]

exten=>s,1,Dial(${ARG1},20,t)

exten=>s,2,Voicemail(u${MACRO_EXTEN})

exten=>s,3,Hangup

exten=>s,102,Voicemail(b${MACRO_EXTEN})

exten=>s,103,Hangup

 

[local]

exten=>6601,1,Macro(oneline,${PHONE1})

exten=>6602,1,Macro(oneline,${PHONE2})

Asterisk学习资料

Asterisk /hacker.wuying 

 Asterisk译为星号(*)在很多应用中被用做通配符,Astrisk做为PBX系统的完美名称,原因之一是Asterisk可以连接数目庞大的接口类型,包括:

  1模拟接接口,如你的电话线或模拟电话.

  2数字线路,如T-1和E-1线路

  3Voip协议,如SIP和IAX

  目前正式版本是IAX2,但是IAX1的所有格式都已经停掉.所以当说到IAX都是特拽IAX2

  使用接口配置文件

  1.Zaptel.conf:硬件接口基层配置,我们将建立一个FX0和一个FXS通道.

  2.zapata.conf:硬件配置Asterisk的接口.

  3.extension.conf:拨号方案文件.

  4.sip.conf:配置SIP协议的文件

  5.iax.conf:配置呼入和呼出IAX通道的文件

FXO与FXS通信

    区别:区别简单,就在于连接的那端提供拨号音.FXO不生成拨号音,而是接收.FXS端口提供拨号音和震铃电压,在有呼叫的时候提醒用户.两者接口都提供双向通讯(同时双方向的通讯传输).

    如果Asterisk有个兼容FXO端口,就可以把电话线接入这端口,可以使用这根电话线呼叫和接收电话呼叫.同理,如果有个FXS端口,可以连接一部模拟电话,Asterisk就可以呼叫这部电话,可能也可以呼叫.(端口:通过配置使用的信令进行定义)

    FXS卡必须像中心局(CO)进行运转,使用FXO信令.同理,FXO卡连接CO,就意味着它需要像终端进行运转,使用FXS信令.

Zaptel配置(FXO)

    在/etc/zaptel.conf文件,用于配置硬件,可以定义FXS端口与FXO信令的配置

fxsks=1  ;定义fxs端口采用通道1以ks信令协议

;fxoks=2  ;定义fxo端口采用通道2以ks信令协议

loadzone=us

defaultzone=us

 

    信令协议:Loop start(ls),ground start(gs),kewlstart(ks),使用ks外信令协议,把fxoks中的ks替换ls或gs,Asterisk的模拟电路推荐ks信令协议.

  

******编辑完zaptel.conf文件,需要使用/sbin/ztcfg -vv装载配置到硬件(不须要详细输出可以省略-vv);修改信令方法需要重启.在编辑sip.conf和iax.conf文档后,分别需要装载chan_iax2.so和chan_sip.so

 Zapata配置

[trunkgroups]  ;定义一个主干组

; define any trunk groups

[channels]    ;硬件通道和他们选项信令方式.

; hardware channels  ;硬件通道

; default  ;默认 

busydetect=yes   ;增加这两行,要不FXO口不能检测到挂机信号。
busycount=5 

usecallerid=yes    ;设置来电显示

hidecallerid=no    ;设置去电不隐藏号码

callwaiting=yes   ;设置呼叫等待

threewaycalling=yes   ;开启三方通话(先闪断,再呼叫第三方,再闪断,就可以实现三方通话)

transfer=yes    ;转叫前转(需要三方通话支持)

echocancel=yes   ;回声消除

echotraining=yes   ;回音练习(会话前发个声音,用于测试回声)

; define channels  ;定义通道

context=from-test    ; Context内执行指令需要在extensions.conf内定义 [from-test]

signalling=fxs_ks    ;FXO通道使用FXS信令

channel => 2 ; PSTN放在端口2上

    允许zaptel和其它设备通过PCI硬件安装到系统中,编辑udev

[root@ask asterisk]# vi /etc/udev/rules.d/50-udev.rules

#在末尾添加上以下

KERNEL="zapctl",        NAME="zap/ctl"

KERNEL="zaptimer",      NAME="zap/timer"

KERNEL="zapchannel",    NAME="zap/channel"

KERNEL="zappseudo",     NAME="zap/pseudo"

KERNEL="zap[0-9]*",     NAME="zap/%n"

Dialplan配置
 

    基本的拨号方案,使用Echo()校验工作通道双向通讯; 

[from-test]

exten => s,1,Answer()

exten => s,n,Echo()

SIP

  

    SIP(会话初始协议),通常用于VOIP电话,进行呼叫建立,呼叫协商,呼叫结束.它帮助两个端互相通认,但它不处理媒体;当呼叫建立后,他通过实时传输协议(RTP)在电话A到电话B直接传输媒体.

 SIP和RTP

    SIP是一个应用层的信令协议.他使用的端口是5060(通常)进行通信.SIP可以通过UDP和TCP传输层协议进行传输.Asterisk目前没有TCP用于传输SIP信息.

    RTP用于端点间传输媒体(语音),Asterisk中RTP使用大数字的无特权端口(默认10,000到20,000)

    SIP优点:普通的被接受和结构灵活.其它的VOIP协议还有H.323,IAX,MGCP.

 SIP配置

    /etc/asterisk/sip.conf文件中:

[general]

context=default

srvlookup=yet  ;建立一个逻辑和可解析地址的方法,你可以达到这个地址,还可以获取DNS很多好处

[10000]

username=10000  ;用户名

type=friend    ;可以定义用户(user)\端(peer)\朋友(friend)

secret=123456   ;认证密码

record_out=Always;去电录音Adhoc须要时,Never从不,Always总是
record_in=Never ;来电录音

callgroup    ;呼叫组,默认为"1"

pickupgroup   ;代接组

disallow     ;不允许编码

allow      ;允许编码

port=5060     ;端口号

qualify=yes    ;监视Asterisk服务器与电话之间是否延时(默认2,000可达;yes可替换毫秒)

context=default  ;指令的地点

host=dynamic    ;要求号码要注册,以便Asterisk如何找到电话.(static则不需要注册)

dtmfmode=rfc2833 ;

mailbox=10000@device

callerid=test1 <10000>

canreinvite=no  ;

    用户户类型是用于认证呼入呼叫;端类型用于呼出呼叫;朋友类型两种都用.(这个常用在sip.conf与iax.conf中用到)

  

  IAX  

    IAX(Inter Aasterisk eXchange)协议通常用于服务器间通信.IAX和SIP协议最大区别在于媒体(语音)在端点之间传输的方式不同.

    Asterisk默认情况是在5060端口接收SIP信令,在10000-20000端口接收RTP(媒体)流.而IAX所有的信令和媒体流都通过一个端口4569进行传输.这种方式的好处是IAX协议能更适合在NAT相关拓扑的应用.

    IAX用户习惯对进入PBX系统的呼叫进行鉴权和处理.对从PBX系统呼出的呼叫,Asterisk应用IAX的iax.conf文件的端点进入(条目)对远端进行鉴权)

    通过iax.conf设置进行呼叫的鉴权和处理:

[general] ;至少需要一个主要段落,主要定义IAX协议的相关设置.

jitterbuffer=no

register => remote_number:password@domain ;注册到远程服务器上,告诉服务器当前位置(互联网位置)在哪

[REC_SERVER]

type=user ;用user来定义呼入呼叫的类型

context=incoming ;进行呼入呼叫鉴定

auth=rsa

inkeys= ;公钥,是Asterisk标准

通过extensions.conf设置一个incoming的context:

[incoming]

exten => remote_number,1,Dial(SIP/number) ;拨打远程号码时(呼入)转移到number(内部)号码上

   ——–以上是IAX入局配置,下面配置出局IAX连接——–

    在iax.conf设置呼出条目

[REMOTE_SERVER]

type=peer  ;用peer定义呼出类型

host=my.receiving.server.ca  ;接收服务器域名或IP地址

username=number  ;接收服务器认证用户(账户号码)

secret=password  ;接收服务器认证密码(账户密码)

qualify=yes  ;不时检查远端的服务器是否响应用

disallow=all  ;用于复位原来设置的所有编码信息

allow=gsm  ;支持gsm编码

allow=libc  ;支持libc编码

allow=g726  ;支持持g726编码

****使用disallow复位原来设置的所有编码信息.再重新设置支持的编码,优先级从高到低

    在extensions.conf设置

[to_remove]

exten => remove_number,1,Dial(IAX2/REMOVE_SERVER/number)

拨号方案语法

   

    Asterisk的拨号方案在文件extensions.conf中定义(/etc/asterisk/extensions.con)

    extensions.conf(四部分:context,extension,priorities,application)

    context:用于对extensions组命名,把拨号方案的不同部分进行分离,免得交织在一起.

    表示方法是把名字放在[]的中间,名字只能用a~z,A~Z,0~9,以及连字号和下划线组成(空格不在允许的字符里面,context中不要使用空格).如:[context1],[incoming],[default];所有放在context定义的之后的指令都是这个context一部分,直到下一个context定义的开始.

    context的一个重要用途就是加强安全性.如果没有仔细设计拨号方案,可能会造成别人盗用你的系统的不良后果.

    extensions:extensions是asterisk要执行的指令,由来电或通道上所拨数字来触发.可以定义电话分机  

    extension的语法是单词exten后面跟着一个由等号和大于号组成的箭头,如:exten => extension的名字

    一个完整的extension由三部分组成:

extensions的名字或号码

priority(每个extension可以有多个步骤,步骤的编号称作priority)

    应用(或者命令),针对呼叫完成一些动作

    这三个部分用英文逗号分开,如:

    exten => name,priority,application()

    priorities:每个extension都可以有几个步骤,称作priorities。如:

exten=>50001,1,Answer()  #编号为1的priority,执行接听电话

exten=>50001,2,Hangup()  #编号为2的priority,然后挂电话

    必须确保priority从1开始并且连续的编号

    application:动作,比如:播放声音,接受音频拨号输入或者挂断电话等.

Application

Answer(),Playback()和Hangup()应用

    Answer()应用于接听正在响铃通道,它不需要任何参数.

    Playback()应用在通道上播放事先录制好的语音文件.指定一个文件名(不带扩展名),可以使用绝对路径与相对路径.

  Hangup()应用在于挂断一个正在活动的通道.

Background(),Goto()应用

  Background()它也播放事先录制好的语音文件,但它等待按键,然后执行对应extension.

    防止Background()后超出按键范围,使用i来解决问题.

    防止Background长时间没有选择,使用t来决解问题.

  Goto()应用使得在拨号方案的不同部分有序的转移非常容易.

    Goto()应用有三个参量分别是context,extension,和priority.即Goto(context,extension,priority)

Dial()应用

  Dial()有4个参量,

    第一个是:呼叫的被叫地(传输技术/远地资源)如:SIP/50000或Zap/1.可以同时拨打多个通道如:

exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000)

    第二个是:超时,单位"秒".给定超时参量Dial会一直对被叫地进行呼叫,直到超时后才放弃,如果没有给定,将直到接听或主叫挂机,如果呼叫在超时前接听,通道就被桥接,拨号完成

  补充:如果超时后被叫地没有应答,则会继续Dial()的extension下一个priority.如果被叫地通道忙,Dial()将转到priority n+101(n是Dial()被调用的priority),如果存在的话,将能够处理被叫地忙的方式接叫未接电话.

    第三个是:可选择参量,它会可以影响到Dial()的行为,如:

exten => 601,1,Dial(SIP/50000,30,Ttwr)

  其中T表示允许主叫用户按"#"转接呼叫;t表示允许被叫用户按"#"转接呼叫;r表示为被叫用户产生振铃声;w用户按"*"键开始录音.

    最后一个是:URL参量.如:

exten => 601,1,Dial(SIP/60000@asterisk.voip.org)

exten => 602,1,Dial(Zap/1/5732381)

任何参量都可以为空如:

exten => 601,1,Dial(SIP/60000,,T)

exten => 601,1,Dial(SIP/60000)

综合上面举个例子:

[test]
exten => s,1,Answer()
exten => s,2,Background(enter-ext-of-person)
exten => 601,1,Dial(Zap/1,30,Ttrw)
exten => 601,2,Playback(vm-nobodyavail)
exten => 601,3,Hangup()
exten => 601,102,Playback(tt-allbusy)
exten => 601,103,Hangup()
exten => 602,1,Dial(SIP/50000,30,Ttrw)
exten => 602,2,Playback(vm-nobodyavail)
exten => 602,3,Hangup()
exten => 602,102,Playback(tt-allbusy)
exten => 602,103,Hangup( )
exten => i,1,Playback(pbx-invalid)
exten => i,2,Goto(test,s,1)
exten => t,1,Playback(vm-goodbye)
exten => t,2,Hangup()

Extension,不能多于80个字符,也不能少于1个字符(601/602) 

——2007-01-05-修改

变量 

在拨号方案中使用变量可以减少打字、增加清晰度,也有助于在拨号方案中加入逻辑.

这里的变量有全局变量,通道变量和环境变量.

全局变量:

  全局变量应该在extensions.conf文件的开始利用[globals]这个context定义或利用 SetGlobalVar()应用.如:

[globals]

80000=Zap/1

[internal]

exten => 123,1,SetGlobalVar(80000=Zap/1)

通道变量

  通道变量与特定的呼叫相关的变量,通道变量只能在当前呼叫存在其间定义,并只能用于参与该呼叫的通道.通道变量使用 Set()应用来设置.如:

exten => 601,1,Set(80000=Zap/1)

环境变量

  环境变量是一种在 Asterisk 中访问操作系统环境变量的方法.这些变量以${ENV(var)}形式引用,其中的 var 是所要引用的操作系统环境变量.

  综合上面举例:

[globals]

PSTN=Zap/1

TEST=SIP/80000

[test]

exten => s,1,Answer()

exten => s,2,Background(enter-ext-of-person)

exten => 101,1,Dial(${PSTN},10)

exten => 101,2,Playback(vm-nobodyavail)

exten => 101,3,Hangup()

exten => 101,102,Playback(tt-allbusy)

exten => 101,103,Hangup()

exten => 102,1,Dial(${TEST},10)

exten => 102,2,Playback(vm-nobodyavail)

exten => 102,3,Hangup()

exten => 102,102,Playback(tt-allbusy)

exten => 102,103,Hangup()

exten => i,1,Playback(pbx-invalid)

exten => i,2,Goto(incoming,s,1)

exten => t,1,Playback(vm-goodbye)

exten => t,2,Hangup()

[default]

exten => 101,1,Dial(${PSTN},,r)

exten => 102,1,Dial(${TEST},,r)

模式匹配

模式匹配

  使用模式及匹配是用不同的字母和符号来代表可能要匹配的数字.模式总是用一个下划线 (_) 开始,它告诉Asterisk 要做模式匹配,这不是一个 extension 名字.(这意味着不能使用下划线作为 extension 名字的开始字符.)

模式匹配语法

  在下划线之后,可以使用一个或者多个下面列出来的字符:

X:匹配 0-9 的任何数字;

Z:匹配 1-9 的任何数字;

N:匹配 2-9 的任何数字;

.(句号)通配符,匹配一个或多个字符;

[15-7]:匹配1,5,6,7; 

  使用${EXTEN}通道变量:Asterisk会把通道变量${EXTEN}设置为所拨的数字.通过sayDigits()检测拨到号码内容如:

exten => _9XXXXXXX,1,SayDigits(${EXTEN})

;SayDigits()应用会把所拨的8位extension读出来

exten => _9XXXXXXX,1,SayDigits(${EXTEN:1})

;只读出来后7位数,其中"1"表示不拨前面1位数

exten => _9XXXXXXX,1,SayDigits(${EXTEN:-1})

;只读出来最后1位,其中"1"表示只拨出最后1位数

去话拨号(PSTN)

举例:按"9"后拨打外线,去电时,去除"9";加放"ignorepat => 9"是为了使按完"9"后还可以听到拨号音;加入"Congestion()"应用是挂机或忙的时候播放快忙音(拥挤声音).

—本地去话拨号—

[outbound-local]

ignorepat => 9

exten => _9NXXXXXX,1,Dial(Zap/1/${EXTEN:1})

exten => _9NXXXXXX,2,Congestion()

exten => _9NXXXXXX,102,Congestion()

—再加入紧急电话拨号—

exten => 9119,1,Dial(Zap/1/119)

exten => 119,1,Dial(Zap/1/119)

exten => 9110,1,Dial(Zap/1/110)

exten => 110,1,Dial(Zap/1/110)

—长途电话拨号—

[outbound-long]

exten => _90NXXNXXXXXX,1,Dial(Zap/1/${EXTEN:1})

exten => _90NXXNXXXXXX,2,Congestion()

exten => _90NXXNXXXXXX,102,Congestion()

Includes

Asterisk通过Includes实现在一个context中使用另一个context.格式:includes => context

[internal]

include => outbound-local

include => outbound-long

exten => _80XXX,1,Dial(SIP/${EXTEN},30,r)

exten => _80XXX,2,Playback(vm-nobodyavail)

exten => _80XXX,3,Hangup()

exten => _80XXX,102,Playback(tt-allbusy)

exten => _80XXX,103,Hangup()

表达式和可变操作

表达式

  表达式是变量,运算符和数值的联合,当你把它们组合到一起就会得到一个表达式结果.在Asterisk 中,表达式总是以$符合作为开始,以方括号“[]”来扩住表达式.如:

$[expression]

$[${COUNT} + 1]

$[${COUNT} / 2]

;引用变量,必须把这个变量名用花括号"{}"括起来,而且在前面加上美元符号"$" 标示出来

运算符

  布尔型运算符

  expr1 | expr2("|"或运算):如果expr1的值是真值,那么运算符将赋expr1的值,否则将赋expr2的值.

  expr1 & expr2("&"与运算):如果两个表达式的值都为true,运算符将赋值为expr1,否则赋值为0.

  expr1{=,>,>=,<,<=,|=}expr2:如果自变量都是整数,这些运算符将得到一个整数的比较结果;否则,它们将得到字符串的结果.如果给定的关系是正确地,这个结果是1,否则就是0.

  数学运算符

  expr1{+, -}expr2:运算符能得到整数自变量的加法或者减法地结果.

  expr1{*,/,%}expr2:运算符能分别得到整数自变量的乘法,除法或是余数的结果.

  正则表达式运算符

  expr1:expr2:运算符匹配 expr2到expr1,这里的expr2必须是一个正则表达式.

  ***Asterisk 的分析程序非常简单,因此在你输入时,在运算符和其他数值之间至少需要一个空格.

拨号方案函数

   拨号方案函数可以使你增加更多的功能到你的表达式中.

语法

   基本语法:FUNCTION_NAME(argument).如果要引用函数的值,和引用变量的值一样,用美元符号“ $” 加上花括号“{}” 括起函数表达式.如:

${FUNCTION_NAME(argument)}

函数也可以嵌套封装其他的函数,如:

${FUNCTION_NAME(${FUNCTION_NAME(argument)})}

拨号方案函数 

  函数常常用来连接set()应用,来取得或者赋值一个变量的值.举个例子,计算一下一个字符串的长度,并读出这个长度;

exten=>123,1,set(TEST=example)      ;赋值example变量给TEST

exten=>123,2,saynumber(${LEN(${TEST})})  ;计算出变量TEST长度,并读出长度数

结果是:7

  如果我们要设置一个动态通道的超时,应该用TIMEOUT()函数.这个函数可以接受以下三个中的一个做为自变量,分别是absolute,digit和response.他们对应的应用是AbsoluteTimeout(),DigitTimeout()和ResponseTimeout().用 timeout()函数,设置数字的超时,我们可以set()函数, 如:

exten=>s,1,set(TIMEOUT(digit)=30) 

  ***这个函数中没有${}.它和给一个自变量赋值一样,我们就赋值给一个函数,是不使用${}封装的.

Linux /hacker.wuying 

功能最强在的编辑器——vi
vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件。当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来,以后在UNIX世界里必将畅行无阻、游刃有余,因为其他几种文本处理器并非UNIX标准配备。说不定别人的Linux机器没安装joe或pico,如果您不会vi,那您可能就没辄了。
vi的基本概念
基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:
1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。
2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。
3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。
不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。
vi的基本操作
进入vi
在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:
$ vi testfile
有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,转换入Insert后再说。
切换至Insert mode编辑文件
在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。这时候您就可以开始输入文字了。
i: 插入,从目前光标所在之处插入所输入的文字。
a: 增加,目前光标所在的下一个字开始输入文字。
o: 插入新的一行,从行首开始输入文字。
Insert的切换→Command mode,按Esc键
您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。
离开vi及存文件
在Command mode下,可按冒号“:”键入入Last line mode,例如:
:w filename (输入“w filename”,将文章存入指定的文件名filename)
:wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)
:q! (输入“q!”,强制离开并放弃编辑的文件)

Command mode功能键列表
在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。
(1)I、a、o切换进入Insert mode。[超级常用]
(2)移动光标
vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母
h、j、k、l,分别控制光标左、下、上、右移一格。
按Ctrl+B:屏幕往后移动一页。[常用]
按Ctrl+F:屏幕往前移动一页。[常用]
按Ctrl+U:屏幕往后移动半页。
按Ctrl+D:屏幕往前移动半页。
按 0 (数字零):移动文章的开头。[常用]
按 G:移动到文章的最后。[常用]
按 w:光标跳到下个word的开头。[常用]
按 e:光标跳到下个word的字尾。
按 b:光标回到上个word的开头。
按 $:移到光标所在行的行尾。[常用]
按 ^:移到该行第一个非空白的字符。
按 0:移到该行的开头位置。[常用]
按 #:移到该行的第#个位置,例:51、121。[常用]
(3)删除文字
x:每按一次删除光标所在位置的后面一个字符。[超常用]
#x:例如,6x 表删除光标所在位置的后面6个字符。[常用]
X:大字的X,每按一次删除光标所在位置的前面一个字符。
#X:例如,20X 表删除光标所在位置的前面20个字符。
dd:删除光标所在行。[超常用]
#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]
(4)复制
yw:将光标所在处到字尾的字符复制到缓冲区中。
(想在和#x、#X的功能相反)
p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。
yy:复制光标所在行。[超常用]
p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)
#yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]
p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用)
“ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer
“ap:将放在buffer a的数据粘贴。
“b3yy:将三行数据存入buffer b。
“b3p:将存在buffer b的资料粘贴
(5)取代
r: 取代光标所在处的字符:[常用]
R:取代字符直到按Esc为止。
(6)复原(undo)上一个指令
u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]
.: .可以重复执行上一次的指令。
(7)更改
cw:更改光标所在处的字到字尾$处。
c#w:例如,c3w代表更改3个字。
(8)跳至指定行
Ctrl+G:列出光标所在行的行号。
#G:例如,15G,表示移动光标至文章的第15行行首。[常用]
Last line mode下指令简介
读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”三键的其中一键进入Last line mode。
1.列出行号
set nu: 输入“set nu”后,会在文章的每一行前面列出行号。
2.跳到文章的某一行
#:井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用]
3.寻找字符串
/关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。
?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。
4.取代字符串
1,$s/string/replae/g:在last line mode输入“1,$s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,$s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。
%s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s和1,$s是相同的功能,c则是表示要替代之前必须再次确认是否取代。
1,20s/string/replace/g:将1至20行间的string替代为relpace字符串。
5.存文件
w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用]
#,# w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。
6.离开
q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!”
qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]


标签: vi
2005年11月04日

 

1、彼得原理

每个组织都是由各种不同的职位、等级或阶层的排列所组成,每个人都隶属于其中的某个等级。彼得原理是美国学者劳伦斯·彼得在对组织中人员晋升的相关现象研究后,得出一个结论:在各种组织中,雇员总是趋向于晋升到其不称职的地位。彼得原理有时也被称为向上爬的原理。 这种现象在现实生活中无处不在:一名称职的教授被提升为大学校长后,却无法胜任;一个优秀的运动员被提升为主管体育的官员,而无所作为。 对一个组织而言,一旦相当部分人员被推到其不称职的级别,就会造成组织的人浮于事,效率低下,导致平庸者出人头地,发展停滞。 因此,这就要求改变单纯的根据贡献决定晋升的企业员工晋升机制,不能因某人在某个岗位上干得很出色,就推断此人一定能够胜任更高一级的职务。将一名职工晋升到一个无法很好发挥才能的岗位,不仅不是对本人的奖励,反而使其无法很好发挥才能,也给企业带来损失。

2、酒与污水定律

酒与污水定律是指把一匙酒倒进一桶污水,得到的是一桶污水;如果把一匙污水倒进一桶酒,得到的还是一桶污水。在任何组织里,几乎都存在几个难弄的人物,他们存在的目的似乎就是为了把事情搞糟。最糟糕的是,他们像果箱里的烂苹果,如果不及时处理,它会迅速传染,把果箱里其他苹果也弄烂。 烂苹果的可怕之处,在于它那惊人的破坏力。一个正直能干的人进入一个混乱的部门可能会被吞没,而一个无德无才者能很快将一个高效的部门变成一盘散沙。组织系统往往是脆弱的,是建立在相互理解、妥协和容忍的基础上的,很容易被侵害、被毒化。 破坏者能力非凡的另一个重要原因在于,破坏总比建设容易。一个能工巧匠花费时日精心制作的陶瓷器,一头驴子一秒钟就能毁坏掉。如果一个组织里有这样的一头驴子,即使拥有再多的能工巧匠,也不会有多少像样的工作成果。如果你的组织里有这样的一头驴子,你应该马上把它清除掉,如果你无力这样做,就应该把它拴起来。

 3、木桶定律

水桶定律是讲一只水桶能装多少水,这完全取决于它最短的那块木板。这就是说任何一个组织,可能面临的一个共同问题,即构成组织的各个部分往往是优劣不齐的,而劣势部分往往决定整个组织的水平。 水桶定律与酒与污水定律不同,后者讨论的是组织中的破坏力量,最短的木板却是组织中有用的一个部分,只不过比其他部分差一些,你不能把它们当成烂苹果扔掉。强弱只是相对而言的,无法消除,问题在于你容忍这种弱点到什么程度,如果严重到成为阻碍工作的瓶颈,你就不得不有所动作。

 4、马太效应

《新约·马太福音》中有这样一个故事:一个国王远行前,交给3个仆人每人一锭银子,吩咐道:你们去做生意,等我回来时,再来见我。国王回来时,第一个仆人说:主人,你交给我的一锭银子,我已赚了10锭。于是,国王奖励他10座城邑。第二个仆人报告:主人,你给我的一锭银子,我已赚了5锭。于是,国王奖励他5座城邑。第三仆人报告说:主人,你给我的1锭银子,我一直包在手帕里,怕丢失,一直没有拿出来。于是,国王命令将第三个仆人的1锭银子赏给第一个仆人,说:凡是少的,就连他所有的,也要夺过来。凡是多的,还要给他,叫他多多益善.这就是马太效应,反应当今社会中存在的一个普遍现象,即赢家通吃. 对企业经营发展而言,马太效应告诉我们,要想在某一个领域保持优势,就必须在此领域迅速做大。当你成为某个领域的领头羊时,即便投资回报率相同,你也能更轻易地获得比弱小的同行更大的收益.而若没有实力迅速在某个领域做大,就要不停地寻找新的发展领域,才能保证获得较好的回报。

 5、零和游戏原理

零和游戏是指一项游戏中,游戏者有输有赢,一方所赢正是另一方所输,游戏的总成绩永远为零,零和游戏原理之所以广受关注,主要是因为人们在社会的方方面面都能发现与零和游戏类似的局面,胜利者的光荣后面往往隐藏着失败者的辛酸和苦涩。 20世纪,人类经历两次世界大战、经济高速增长,科技进步、全球一体化以及日益严重的环境污染,零和游戏观念正逐渐被双赢观念所取代。人们开始认识到利已不一定要建立在损人的基础上。通过有效合作皆大欢喜的结局是可能出现的。 但从零和游戏走向双赢,要求各方面要有真诚合作的精神和勇气,在合作中不要小聪明,不要总想占别人的小便宜,要遵守游戏规则,否则双赢的局面就不可能出现,最终吃亏的还是合作者自己。

6、华盛顿合作规律

华盛顿合作规律说的是一个人敷衍了事,两个人互相推诿,三个人则永无成事之日。多少有点类似于我们三个和尚的故事。 人与人的合作,不是人力的简单相加,而是要复杂和微妙得多。在这种合作中,假定每个人的能力都为1,那么,10个人的合作结果有时比10大得多,有时,甚至比1还要小。因为人不是静止物,而更像方向各异的能量,相互推动时,自然事半功倍,相互抵触时,则一事无成。 我们传统的管理理论中,对合作研究得并不多,最直观的反映就是,目前的大多数管理制度和行为都是致力于减少人力的无谓消耗,而非利用组织提高人的效能。换言之,不妨说管理的主要目的不是让每个人做得更好,而是避免内耗过多。

 7、手表定理

手表定理是指一个人有一只表时,可以知道现在是几点钟,当他同时拥有两只表时,却无法确定。两只手表并不能告诉一个人更准确的时间,反而会让看表的人失去对准确时间的信心。 手表定理在企业经营管理方面,给我们一种非常直观的启发,就是对同一个人或同一个组织的管理,不能同时采用两种不同的方法,不能同时设置两个不同的目标,甚至每一个人不能由两个人同时指挥,否则将使这个企业或这个人无所适从。 手表定理所指的另一层含义在于,每个人都不能同时选择两种不同的价值观,否则,你的行为将陷于混乱。

8、不值得定律

不值得定律最直观的表述是:不值得做的的事情,就不值得做好。这个定律再简单不过了,重要性却时时被人们忽视遗忘。不值得定律反映人们的一种心理,一个人如果从事的是一份自认为不值得做的事情,往往会保持冷嘲热讽,敷衍了事的态度,不仅成功率低,而且即使成功,也不觉得有多大的成就感。 因此,对个人来说,应在多种可供选择的奋斗目标及价值观中挑选一种,然后为之奋斗。选择你所爱的,爱你所选择的,才可能激发我们的斗志,也可以心安理得。而对一个企业或组织来说,则要很好地分析员工的性格特性,合理分配工作,如让成就欲较强的职工单独或牵头完成具有一定风险和难度的工作,并在其完成时,给予及时的肯定和赞扬;让依附欲较强的职工,更多地参加到某个团体*同工作;让权力欲较强的职工,担任一个与之能力相适应的主管。同时要加强员工对企业目标的认同感,让员工感觉到自己所做的工作是值得的,这样才能激发职工的热情。

9、蘑菇管理

蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。相信很多人都有过这样一段蘑菇的经历,这不一定是什么坏事,尤其是当一切刚刚开始的时候,当几天蘑菇,能够消除我们很多不切实际的幻想,让我们更加接近现实,看问题也更加实际。 一个组织,一般对新进的人员都是一视同仁,从起薪到工作都不会有大的差别。无论你是多么优秀的人才,在刚开始的时候,都只能从最简单的事情做起,蘑菇的经历,对于成长中的年轻人来说,就象蚕茧,是羽化前必须经历的一步。所以,如何高效率地走过生命的这一段,从中尽可能汲取经验,成熟起来,并树立良好的值得信赖的个人形象,是每个刚入社会的年轻人必须面对的课题。

10、奥卡姆剃刀定律

1 2世纪,英国奥卡姆的威廉主张唯名论,只承认确实存在的东西,认为那些空洞无物的普遍性概念都是无用的累赘,应当被无情地剃除。他主张如无必要,勿增实体。这就是常说的奥卡姆剃刀。这把剃刀曾使很多人感到威胁,被认为是异端邪说,威廉本人也因此受到迫害。然而,并未损害这把刀的锋利,相反,经过数百年的岁月,奥卡姆剃刀已被历史磨得越来越快,并早已超载原来狭窄的领域,而具有广泛、丰富、深刻的意义。     奥卡姆剃刀定律在企业管理中可进一步演化为简单与复杂定律:把事情变复杂很简单,把事情变简单很复杂。这个定律要求,我们在处理事情时,要把握事情的主要实质,把握主流,解决最根本的问题,尤其要顺应自然,不要把事情人为地复杂化,这样才能把事情处理好。