askterisk笔记【一】
in voip on asterisk, asterisk笔记 - Hits()
先看看这些:
相关技术书籍
http://www.asteriskcn.com/index.php?q=forum/14
Asterisk,电话未来之路 这本书翻译得有些生硬,有时看得莫名其妙。
建议先看其第7,8章。 理解电话技术和voip协议。
第七章 理解电话技术
引起振铃音的交流电压和给电话机供电的直流电压.
PS:
电话线里的电压是变化的,既有直流也有交流。 电话在待机的时候,电话线里的电压是负48伏直流,摘机后的电压是正12伏直流,负载一路5伏交流音频信号,合17伏峰值。 振铃时的电压是负48伏直流负载一路75伏交流振铃脉冲,合110伏峰值。
电话响铃时还是有点危险的(人体的安全电压是36伏)。
数字电话,目前我GUO 从家庭到中心局似乎还是模拟技术。
奈奎斯特定理表述为:
“在对信号采样时,采样频率必须高于输入信号带宽的两倍以上才能根据采样信息很好的重构原始信号。”
压扩是一种提高采样动态范围而不丢失重要精度的方法。它工作的原理是量化比较高的振幅时用更大的粒度,量化比较低振幅用比较小的粒度。换句话说,如果你对着电话喊叫,对你声音的采样不像正常讲话那样清晰。喊叫对你的血压不利,所以最好避免。
通常使用两种压扩方法:在北美用μ律,世界的其他地方用A 律。这两种方法的工作原理相同,但是相互不兼容。
在数字音频系统中(正如现代PSTN),如果送到模拟-数字转换器的频率超过采样频率的二分之一就会发生混叠现象(Aliasing)
PSTN 中,有许多不同容量的电路来满足网络的各种需求。局端和用户之间,通常有一条或多条模拟线路,或者通过数字电路传输的几十个通道。在PSTN 的交换局之间(或者大客户),通常使用光纤。
电话呼叫数字化的标准方法是以8 比特每秒采样8000 次,所以我们知道PCM(脉冲编码调制) 编码的电话电路需要的带宽是64,000 bps。这种64-kbps 的通道被称为。DS-0是数字化电信电路的基本模块。
一个T-1 由复用在一起,形成一个1.544-Mbps 的比特流[*]。这个比特流的正式定义是DS-1。
欧洲是E1,一条E1作为32个64K来用,但是时隙0和时隙15是传输控制信令用,所以一条E1可以传30路话音。
这似乎是说,欧洲一条普通电话线可以接30个分机 ?
我朝似乎也是E1?
Asterisk开发:http://blog.csdn.net/lin_bei/article/details/2536569
目前看似乎Asterisk和freepbx都可以用php开发。
api文档:
http://www.asterisk.org/astdocs/api/index.html
最新版本AGI AMI 文档:
https://wiki.asterisk.org/wiki/display/AST/Asterisk+Command+Reference
Asterisk权威文档(第3版).pdf http://ishare.iask.sina.com.cn/f/24400557.html
以下是权威文档笔记:
Asterisk简称为AST
Zapata是连接pstn与计算机的项目,现在发展为Digium Asterisk Hardware Device Interface (DAHDI),可以说它是AST的pstn 引擎。
第二章 Asterisk结构
Asterisk Dialplan 处理各种channel的方式是一致的。
AST基于Modules, 分为:
• Applications
extensions.conf里面的dialplan将会使用的程序
• Bridging modules1.8新特性,主要被app_confbridge使用
• Call detail recording (CDR) modules通话记录,书中说没什么用,推荐的记录方式应该使用channel event logging
• Channel event logging (CEL) modules事件记录
• Channel driverschannel驱动,例如sip驱动
• Codec translators不同语音流编码之间的转换,例如pstn到sip
• Format interpreters语音文件格式转换,如wav到目标channel
• Dialplan functionsdialplan app用到的函数
• PBX modules外围的pbx配置,加强机制。
• Resource modulesast与外界资源,如odbc连接
• Addons modules社区贡献的加强模块,默认是没安装的。
• Test modules开发者使用的测试模块
文件结构:
配置在/etc/asterisk/中
模块文件夹默认在/usr/lib/asterisk/modules,注意,当更新asterisk使用menuselect选项的话,不会自动删除无用的模块,需要手动删除或使用make uninstall
资源文件夹为/var/lib/asterisk ,包含moh,系统提示,AGI脚本等
临时文件 /var/spool/asterisk 存储录音,text到语音
日志文件夹 /var/log/asterisk
dialplan 有三种写法:
/etc/asterisk/extensions.conf 使用传统写法,这个方式最常用
在/etc/asterisk/extensions.ael 里使用Asterisk Extension Logic (AEL)
在/etc/asterisk/extensions.lua里使用lua
连接到pstn需要硬件
第四章 配置
主配置在/etc/asterisk/asterisk.conf 中
可在启动时指定主配置asterisk -C /custom/path/to/asterisk.conf
AGI默认加载文件夹:
astagidir => /var/lib/asterisk/agi-bin
modules.conf 模块加载配置
推荐的做法是,写明不加载的(autoload=yes + noload => xxx)。没必要一条条写明加载的。
indications.conf 语音(方言)配置,DAHDI不使用这个配置。
musiconhold.conf 配置等待音乐
asterisk等待音乐格式是sln结尾文件名,这是因为mp3这样的高压缩格式会消耗cpu性能,所以要转换成低采样率wav格式?
第五章 设备配置
SIP 可以是Peer-to-Peer但对一asterisk来说,是通过asterisk来桥接的。
AST只有通道名的概念,而没有用户的概念,他只关注通道名称,而且,extension在AST里面不仅仅指分机,它的含义是指令集名称。
名称只能由数字字母组成,无空白。推荐使用目标设备mac地址。
最常用的协议时sip和iax(2),配置分别在sip.conf 和 iax.conf中,对应驱动分别是chan_sip.so 和 chan_iax2.so
Freepbx添加sip也是修改的文件sip.conf。
AST加载配置的顺序:
明确指明的块例如: [111]
指定块的模板
[general]
代码硬编码的配置
----
channel配置与dialplan的关系如图:
可见dialplan需要使用这些配置来决定接收目标和发送目标。
channel配置不仅控制呼叫进入系统,也控制呼叫怎样离开系统,例如:
1 call 2,channel配置不仅用于传递呼叫到dial plan,而且引导呼叫从dialplan到目标。
示例:
[office-phone](!) ; create a template for our devices
[0000FFFF0001](office-phone)
从上可见注释使用; ,模板(!), 继承模板(模板名)
udpbindaddr=0.0.0.0 ; listen for UDP requests on all interfaces(0.0.0.0表示所有)
tcpenable=no ; disable TCP support(要么tcp,udp都开,要么开一个,不能全部都关)
type的类型:
peer :使用请求的源端ip和端口匹配配置
user:使用请求的From头来匹配配置
支持ipv6
第12章将会介绍dns(srvrecord)
94页到98页缺失
使用AST CLI:
最有用的为,当修改sip或iax配置后,重新加载使配置生效:
asterisk -r
*CLI> module reload chan_sip.so
*CLI> module reload chan_iax2.so
查看状态:
*CLI> sip show peers ;这个显示当前连接、注册状态
*CLI> sip show users ;这个直接将密码都打出来了,相当于配置信息
*CLI> iax2 show peers
*CLI> iax2 show users
介绍了模拟电话安装,这个需要硬件,还有DAHDI配置。
dialplan重新加载命令:
asterisk -rx "dialplan reload"
或
*CLI> dialplan reload
背靠背的User Agent:
呼叫流程:sip1 –>asterisk; asterisk—>sip2
实际是两个呼叫,AST将其桥接,所以叫做back to back(上图中两个AST背靠背)
会话的过程状态可从CLI中看到,这个便于调试dialplan
第六章 dial plan基础
四个重要概念contexts, extensions, priorities, applications.
Contex
用于分类组,可用字母数字下划线和连字符组(-)成,不能超过79字符。各context是独立的除非他们互相交互
[general], [default], and [globals]是三个固有的特殊上下文。
上图可见context的作用。
Context的最大用途是分配安全策略,见https://wiki.asterisk.org/wiki/display/AST/Important+Security+Considerations
Extensions
这个更像是控制流,定义为:
exten => name,priority,application()
例如exten => 123,1,Answer()
Priorities
如下例:
exten => 123,1,Answer()
exten => 123,2,Hangup()
那么2会在1后执行。
使用n:
exten => 123,1,Answer()
exten => 123,n,do something
exten => 123,n,do something else
exten => 123,n,do one last thing
exten => 123,n,Hangup()
n代表next,就是往下执行的意思,但是注意,1必须有,否则不起作用。
使用 'same =>':
exten => 123,1,Answer()
same => n,do something
same => n,do something else
same => n,do one last thing
same => n,Hangup()
这个一看就知道了怎么用了。
使用Priority labels,这个稍后讲其用途:
exten => 123,n(label),application()
Applications
例如Answer(), Playback(), and Hangup()这些东东。传参数在1.6之前可使用|,从1.6开始就不支持了。
Answer() : 一般是不需要的,但是可以起确保下一步之前已经连接成功的作用。
Progress():一般不需要,向发起端回应当前呼叫状态。
Playback():播放上一次的输出(如果上一次为输入则跳过寻找上一次输出)
Playback(/home/john/sounds/filename) :播放/home/john/sounds/filename.wav 绝对路径
Playback(filename) : 播放/var/lib/asterisk/sounds/filename.wav 默认路径
Playback(custom/filename) 播放/var/lib/asterisk/sounds/custom/filename.wav 相对路径
以上都不能有扩展名。
Background():类似PlayBack但是放音乐同时允许用户输入
Hangup() :
在CLI中运行core show translation 可知道各音频格式转换消耗。
对于这样一个hello world
exten => 200,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
我测试,可以运行,但是声音很卡。
与用户交互
BackGround https://wiki.asterisk.org/wiki/display/AST/Application_BackGround
与playback类似,但是允许用户输入,WaitExten则等待用户输入。
如下例:
[TestMenu]
exten => start,1,Answer() ;应答same => n,Background(main-menu) ;放main-menu.wav并等待用户输入
same => n,WaitExten(5) ;音乐放完了还没有输入则等待用户输入5秒钟
exten => 1,1,Playback(digits/1) ;当用户输入1时,播放1按键音
same => n,Goto(TestMenu,start,1) ;转到TestMenu
exten => 2,1,Playback(digits/2) ;当用户输入2时,播放2按键音
same => n,Goto(TestMenu,start,1) ;转到Testmenu
exten => i,1,Playback(pbx-invalid) ;i代表其他输入
same => n,Goto(TestMenu,start,1)exten => t,1,Playback(vm-goodbye) ;t代表超时,用户没有输入
same => n,Hangup()
Dial https://wiki.asterisk.org/wiki/display/AST/Application_Dial
拨出电话,
一般只拨一个号码如 exten => 105,1,Dial(DAHDI/1) ;转拨到DAHDI通道1
也可以一次拨多个 exten => 105,1,Dial(DAHDI/1&SIP/0004F2001122&IAX2/Softphone) ;使用&连接多个通道,但是这个不是电话会议的功能,起作用时,同时拨这三个通道,但是一旦有通道应答,则与之建立连接,其它通道不再响铃。
Dial允许直接拨未配置的远端资源:
Dial(technology/user[:password]@remote_host[:port][/remote_extension])
可以尝试一下Dial(IAX2/guest@misery.digium.com/s) 这个是Digium提供的测试资源。
Dial的第二个参数为超时时间,如果在超时前连接成功,则此dialplan就结束了(失去控制?),如果超时,则向后执行:
exten => 201,1,Dial(DAHDI/1,10)
same => n,Playback(vm-nobodyavail)
same => n,Hangup()
Dial的三个参数是选项,最常用的是m,表示呼叫方在连接之前会听到hold music而不是响铃音。
第四个参数很少用就不讲了
跳过参数:exten => 1,1,Dial(DAHDI/1,,m) ;这里跳过了第二个参数但设置了第三个参数。
dialplan的变量
exten => 301,1,Set(LEIF=SIP/0000FFFF0001) ;设置变量LEIF
same => n,Dial(${LEIF}) ;引用变量LEIF
变量区分大小写,一般全局变量用全大写,channel变量用驼峰命名法,可使用下划线。
CHANNEL 和 EXTEN是asterisk固有的变量。
全局变量可由所有通道共享,必须定义在globals中:
[globals]
LEIF=SIP/0000FFFF0001
通道变量只在通道中可见,对于参与会话的其他通道也可见:
exten => 202,1,Set(MagicNumber=42)
same => n,SayNumber(${MagicNumber})
环境变量:
${ENV(var)} 获得linux系统环境变量值var是变量名
模式匹配:
以下划线开始:
X 单个0到9的数字
Z 单个1到9的数字
N 单个2到9的数字
[15-7] 方括号, 此例表示1,或是5到7的单个数字
. 一到多个字符,例如:
_. 这个表示所有匹配,一般很少用
_X. 以数字开始的所有字符串
_[0-9a-zA-Z]. 这个就匹配所有的了
! 0到多个字符
多组匹配的情况,会优先选取最精确地(从左到右),例如
exten => _555XXXX,1,Playback(silence/1&digits/1)
exten => _55512XX,1,Playback(silence/1&digits/2)
那么555120会匹配第二个,因为它的精确度高。
匹配示例 127页
这里主要介绍了北美的一些有用的模式,还有NANP:北美号码计划
在dialplan中,可以使用${EXTEN}来获得当前呼叫的号码,这对于使用了匹配的dialplan来说很有用。
${EXTEN:x:y} 的用法
假如呼叫94169671111
• ${EXTEN:1:3} = 416
• ${EXTEN:4:7} = 9671111
• ${EXTEN:-4:4} = 1111 ;最末往前数4位,然后返回此位置向后的四位
• ${EXTEN:2:-4} = 16967 ;从第2位(0为起始索引)开始,但是排除最末4位
• ${EXTEN:-6:-4} = 67 ; 最末往前数6位,排除最末4位
• ${EXTEN:1} = 4169671111 ;第一位之后的
include 语法(注意这与include引导符不一样 #include)
include => context
引入其他context
首先会匹配当前的extention,如果没有匹配再会匹配被引入的context。
详见第七章