第二十章 AMI
Asterisk Manager Interface主要提供AST系统监控以及管理功能,它可以要求AST做一些事情,例如发起一个新呼叫。
需要的配置:
manager.conf
;
; 打开AMI并本地访问
[general]
enabled = yes
webenabled = yes
bindaddr = 127.0.0.1
;
; 创建用户hello,密码world
;
[hello]
secret=world
上面的配置打开了http访问,这个需要配置http.conf(注意这个不是apache的httpd.conf)但是我安装的ASteriskNow并没有这个http.conf配置文件,也没打开http访问,常见的还是使用tcp访问,默认端口是5038。
如果没发现这个文件http.conf,可以自己加一个:
[general]
enabled=yes
bindaddr=0.0.0.0
bindport=8088
prefix=gui ;这个前缀用于http请求的url前缀
enablestatic=yes
这样的话请求AMI应该是:
http://localhost:8088/gui/rawman?action=login&username=hello&secret=world
然后重新加载:CLI>core reload
如果登陆不成功,还要看manager.conf中deny设置是否禁止了你的ip访问。
协议:
主要有两种协议:
Manager events 只从AST到AMI客户端的单项事件
Manager actions AMI客户端请求AMI会得到返回Action Response。
对于http连接,事件需要通过poll来获取。
下面是开源AMI客户端库。
Adhearsion Ruby http://adhearsion.com/
StarPy Python http://starpy.sourceforge.net/
Asterisk-Java Java http://asterisk-java.org/
介绍几个有用的AMI应用:
Asterisk GUI这个包含在AsteriskNow中 ,参见http://www.asterisk.org/asterisknow/developers/gui-guide
第二十一章 AGI
内置的dialplan写法可能有很多不便之处(如果你熟知一门编程语言的话),使用AGI则可以使用其他编程语言来控制呼叫流程,但是这么做还是离不开native dialplan的参与。
例如
exten => 500,1,AGI(hello-world.sh)
这里就调用了shell脚本的AGI
打开AGI调试:
*CLI> agi set debug on
AGI变种
Process-Based AGI:
最简单的AGI,调用方式AGI(command[,arg1[,arg2[,...]]]) command可以使绝对路径,相对路径,arg1…是AGI需要传入的参数。
执行AGI时,与AST交互的方式是通过stdin 和 stdout来进行的。
有点:简单
缺点:太简单,高并发时建议使用FastAGI
EAGI (Enhanced AGI)
相对于AGI,除了stdin和stdout外还可以获得单向只读语音流(app_jack提供获得AST之外音频流的功能)。
*CLI> core show application EAGI
优点:简单
缺点:性能消耗比Process-Based AGI高
DeadAGI
这个已被废弃,不要使用。
FastAGI—AGI over TCP
使用tcp连接,不再是每个call一个进程,提高效率。
exten => 1234,1,AGI(agi://192.168.1.199:4573,arg1,arg2,arg3)
FASTAGI支持srvrecord
exten => 1234,1,AGI(hagi://shifteight.org)
优点:效率较好
缺点:实现FASTAGI Server比较复杂
Async AGI—AMI-Controlled AGI
异步AGI,可以使AMI调用AGI。
exten => 1234,1,AGI(async:agi)
这种方式的流程是,当执行上面一句时,会等待,然后,在AMI客户端中向·这个通道发命令,以这样的方式来执行。
对于要执行AGI的影虎需要在manager.conf中指明权限
[hello]
secret = world
read = agi ;有读权限
write = agi ;有写权限
优点:AMI可使用AGI
缺点:最复杂的一种用法
会话过程
调用AGI或EAGI后,会话建立,自定义参数(如agi_arg_0)和固有参数(如agi_request)会传入:
对于Async AGI,开始时AMI会发送事件Manage Events,例如:
Event: AsyncAGI
Privilege: agi,all
SubEvent: Start
Channel: SIP/0000FFFF0001-00000000
Env: agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F0000FFFF0001-00000000%0A \
agi_language%3A%20en%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201285219743.0%0A \
agi_version%3A%201.8.0-beta5%0Aagi_callerid%3A%2012565551111%0A \
agi_calleridname%3A%20Julie%20Bryant%0Aagi_callingpres%3A%200%0A \
agi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0A \
agi_dnid%3A%20111%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20LocalSets%0A \
agi_extension%3A%20111%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0A \
agi_accountcode%3A%20%0Aagi_threadid%3A%20-1339524208%0A%0A
一旦会话开始,AGI就可以发送命令和获得回应,命令的执行是序列化的,一个执行完毕才会执行下一个。
AGI会话的终止
各种AGI的行为不一样:
Process-based AGI/FastAGI:
会话挂断会通知AGI程序来做后续处理。(1.4之前是直接中断,不会通知)
Process-based AGI 会发SIGHUP 信号
FASTAGI会发HANGUP信号。
可以通过这样来禁止发送SIGHUP /HANGUP信号:
;
; Don't send SIGHUP to an AGI process
; or the "HANGUP" string to a FastAGI server.
;
exten => 500,1,Set(AGISIGHUP=no)
same => n,AGI(my-agi-application)
如果禁用,则相当于DeadAGI模式,会话其实结束了,但仍可以执行。不过只能执行不需要交互的命令,具体看每个命令的文档说明。
对于Async AGI,如果会话中断,会发中断提示,如果想要主动中断会话,AMI客户端需要发送ASYNCAGI BREAK命令。
AGI各种开发语言库:
Adhearsion Ruby http://adhearsion.com/
StarPy Python http://starpy.sourceforge.net/
Asterisk-Java Java http://asterisk-java.org/
Asterisk-perl Perl http://asterisk.gnuinter.net/
PHPAGI PHP http://phpagi.sourceforge.net/
第二十五章 web 接口
这一章介绍了有名的相关项目:
坐席管理
http://www.asternic.org/ Flash Operator Panel 免费
http://www.fop2.com/ Flash Operator Panel2 15个以上收费
http://www.cdr-stats.org/ Call Detail Records 分析统计工具
http://www.asterisk2billing.org/ 计费系统 A2Billi ng
第十八章 外部服务
使用XMPP
需要res_jabber模块,默认是没有安装的,如果要支持gtalk的话,需要chan_gtalk,chan_jingle(这两个依赖res_jabber)
centos上需要iksemel:
yum install iksemel-devel openssl-devel
现在假设res_jabber安装好了,需要配置 jabber.conf
[general]
debug=no
autoprune=no
autoregister=yes
auth_policy=accept
[asterisk]
type=client
serverhost=talk.google.com ;这里连到了gtalk
[email protected] ;xmpp用户名
secret=<super_secret_password> ;xmpp密码
port=5222
usetls=yes
usesasl=yes
status=available
statusmessage="Ohai from Asterisk"
dialplan:
exten => 106,1,Verbose(2,Example using the Local channel) ;一开始就呼叫dialplan
same => n,Dial(Local/[email protected]${CONTEXT}/n&Local/[email protected]${CONTEXT}/n)
exten => jabber,1,Verbose(2,Send an XMPP message and expect a response) ;接到呼叫发送xmpp消息
; *** This line should not have any line breaks
same => n,JabberSend(asterisk,[email protected],Incoming call from
${CALLERID(all)}. Press 2 to send to voicemail.) ;消息不能换行
same => n,Set(JabberResponse=${JABBER_RECEIVE(asterisk,[email protected],6)})
same => n,GotoIf($["${JabberResponse}" = "2"]?voicemail,1)
same => n,Hangup()
exten => dial,1,Verbose(2,Calling our desk)
same => n,Dial(SIP/0000FFFF0002,15)
same => n,Goto(voicemail,1)
exten => voicemail,1,Verbose(2,VoiceMail)
same => n,Answer()
; *** This line should not have any line breaks
same => n,Set(VoiceMailStatus=${IF($[${ISNULL(${DIALSTATUS})}
| "${DIALSTATUS}" = "BUSY"]?b:u)})
same => n,Playback(silence/1)
same => n,VoiceMail([email protected],${VoiceMailStatus})
same => n,Hangup()
这个例子是通过发送xmpp消息来让xmpp用户来选择。
与skype整合
可以通过skype发、接消息,呼叫好友
LDAP整合
TextToSpeech
Festival 和 Cepstral 引擎
暂看到这里……
Continue reading askterisk笔记【二】
先看看这些:
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 modules
1.8新特性,主要被app_confbridge使用
• Call detail recording (CDR) modules
通话记录,书中说没什么用,推荐的记录方式应该使用channel event logging
• Channel event logging (CEL) modules
事件记录
• Channel drivers
channel驱动,例如sip驱动
• Codec translators
不同语音流编码之间的转换,例如pstn到sip
• Format interpreters
语音文件格式转换,如wav到目标channel
• Dialplan functions
dialplan app用到的函数
• PBX modules
外围的pbx配置,加强机制。
• Resource modules
ast与外界资源,如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/[email protected]/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。
详见第七章
Continue reading askterisk笔记【一】
voip这开源框架太多,都有点糊涂了,这里整理一下他们的关系:
asterisk http://www.asterisk.org/
这个不用多说
freepbx http://www.freepbx.org/
FreePBX 是一个用来控制 Asterisk 的图形化接口。
Elastix http://www.elastix.org/
系统集成了最优秀的工具,它使 Asterisk PBX 拥有一个简单易操作的界面,还增加了自己的设备,允许外界创新,使其成为开源通讯最好的软件包。Elastix 的目标就是要发展成为一个稳定、可调节和易操作的软件系统。这些特点使 Elastix 成为 Asterisk PBX 的首选。
集成SugarCRM和电话计费系统;
集成即时信息服务器 (Openfire);
trixbox http://fonality.com/trixbox/
正是为了解决 Asterisk[1] 难于配置的问题,大约在两年前,Asterisk @Home 项目悄悄地出现了。它提供了日渐完善的一体化安装方案,普通用户也可以在安装向导的指引下,完成从 Linux 系统安装到 PBX 系统配置的全部过程。2006年5月,当 AAH2.8 出现的时候,它已经整合了Asterisk[1]、FreePBX(一套基于Web的 Asterisk[1] 配置管理系统)、MySQL 和 SugarCRM[2]。在全球范围内得到了包括企业和行业用户在内的广泛用户支持。在这种形式下,社区的主要开发者开始谋求改变 AAH的本名和原定位,将 AAH 发展成一个真正的产品,于是,Trixbox1.0 产生了。2006年10月,VoIP 产品和解决方案提供商 Fonality 并购了Trixbox,使其有了进一步发展的坚实后盾。
需要指出的是,Trixbox 并不是简单地把 Asterisk 和 SugarCRM[2] 叠加在了一起,而是进行了深层次的整合,例如,在 SugarCRM [2]中,只要点击客户的电话号码,VoIP 客户端软件就能够自动进行拨号动作。
freeiris http://www.freeiris.org
Freeiris(前身为Astercon2)是一款开源的电话通信平台,含盖了计费、注册管理、PBX、数字中继、呼叫中心等业务需要。系统基于Asterisk、Perl、Linux、PHP等技术实现,在不修 改asterisk本身的情况下采用外挂形式开发。目前系统可以控制管理SIP、IAX、H323、等软协议的通信。在硬件层上,支持大量的硬件产品,包 括数字中继(ISDN PRI / ISDN BRI),模拟中继(FXO / FXS),以及各种SIP与IAX的终端设备等
似乎是国人写的
SER,OpenSER http://www.iptel.org/ser/
这个真有点昏,SER一般指Openser,现在停止开发了,而由在其基础上又出现两个开源框架Kamailio 和 OpenSIPS 。
目前有SER+Asterisk组合,就是让SER承担SIP路由部分。
Kamailio http://www.kamailio.org/w/
参见SER
OpenSIPS http://www.opensips.org/
OpenSIPS是一个成熟的开源SIP服务器,除了提供基本的SIP代理及SIP路由功能外,还提供了一些应用级的功能。OpenSIPS的结构非常灵活,其核心路由功能完全通过脚本来实现,可灵活定制各种路由策略,可灵活应用于语音、视频通信、IM以及Presence等多种应用。同时OpenSIPS性能上是目前最快的SIP服务器之一,可用于电信级产品构建。
FreeSWITCH http://www.freeswitch.org/
FreeSWITCH 是一个开源的电话交换平台,从一个简单的软电话客户端到运营商级的软交换设备几乎无所不能。能原生地运行于Windows、Max OS X、Linux、BSD 及 solaris 等诸多32/64位平台。可以用作一个简单的交换引擎、一个PBX,一个媒体网关或媒体支持IVR的服务器等。它支持SIP、H323、Skype、Google Talk等协议,并能很容易地与各种开源的PBX系统如sipXecs、Call Weaver、Bayonne、YATE及Asterisk等通信。 FreeSWITCH 遵循RFC并支持很多高级的SIP特性,如 presence、BLF、SLA以及TCP、TLS和sRTP等。它也可以用作一个SBC进行透明的SIP代理(proxy)以支持其它媒体如T.38等。FreeSWITCH 支持宽带及窄带语音编码,电话会议桥可同时支持8、12、16、24、32及48kHZ的语音. 而在传统的电话网络中,要做到三方通话或多方通话需要通过专门的芯片来处理,其它像预付费,彩铃等业务在PSTN网络中都需要依靠智能网(IN)才能实现,而且配置起来相当不灵活
fusionpbx http://www.fusionpbx.com/
fusionpbx是freeswitch图形WEB接口
搞清楚了,原来说白了就三大家族asterisk和freeswich另加SER系列的。 而且freeswitch和asterisk还是有些渊源的。 参见http://kazge.com/archives/869.html
Continue reading asterisk freepbx freeswitch trixbox elastix freeiris opensips fusionpbx 等等