Extjs 性能降低的可能原因

见天终于找出一个问题,我们的应用要打开一个Ext.Window窗口,然后可以关闭它再打开。问题是,第一次打开很好,速度不错,再以后打开就非常慢,有时甚至达到5秒以上的延迟。由于系统比较复杂,开始一直找的是网络问题,服务端调用问题,后来发现不是这些原因,而是Extjs绘制很慢。

逐个排除,发现是多了这么一句话 renderTo: document.body,

这样导致在调用show之前就绘制了一次,然后show又绘制了一次。后来发信这个问题别人也遇到过了。

http://blog.csdn.net/tianxiaode/article/details/6525486

另外一个问题是,有个Ext.window里面有个很大的dom元素,我们发现使用hide(),show()方法显示比较卡,有时甚至几秒钟。我们的解决方法是,要隐藏时将这个window位置设置到用户看不到的地方,要显示时再把它移回来。这样明显速度快多了。发现Extjs本身就是使用这种方式来显示隐藏对话框的。看来这确实是个问题。

现在看来,Extjs使用还真得小心,你说C容易内存泄露,Extjs也会。如果不注意尾巴的话,你打开dom树,就会发现一堆垃圾在那没回收,到后来就是越来越慢。

 

--如果给我一个美工,我将丢弃Extjs。

Continue reading Extjs 性能降低的可能原因

background-attachment:fixed 问题

今天发现background-attachment:fixed原来不是这么简单:

见:http://reference.sitepoint.com/css/background-attachment

The value fixed stops the background-image from scrolling with its containing block. Note that although the fixed background-image may be applied to elements throughout the document, its background-position is always placed in relation to the viewport. This means the background-image is only visible when its background-position coincides with the content, padding, or border area of the element to which it is applied. Thus, a fixed background-image doesn’t move with elements that have a scrollbar—see overflow—because it’s placed in relation to the viewport.

我真是晕,fixed的情况下,不管background-attachment:fixed设置到哪个元素,其background-position是依据body来定位的。

使用background-attachment:scroll则是相对本元素定位。

测试FF,IE8,Chrome都是这样。

 

可依据这个例子来看:

><html> <head> <style type="text/css"> .hi { height:200px; width:200px; border:1px solid blue; background-image:url('eg_bg_03.gif'); background-repeat:no-repeat; background-attachment:fixed; background-position:left top; padding: 0px; }

Continue reading background-attachment:fixed 问题

Photoshop转ico插件

这段时间补了一下PS的课,稍微熟悉了点,但还是很多地方不熟,用七拼八凑的知识做了个本站的logo:

logok

还凑合吧。

这里说一下PS转ico的插件,PS不知为什么不支持存储为ico,所以还得下个插件来保存:

http://www.telegraphics.com.au/svn/icoformat/trunk/dist/README.html

安装方法上面有,不过这里没找到下载地址,还是到

http://www.hiliuyun.cn/wp-content/uploads/2010/01/PhotoShop-ico-lpugin.zip

这里下载的。

 

参见:

http://www.hiliuyun.cn/2010/01/photoshop-png%E6%A0%BC%E5%BC%8F%E8%BD%ACico%E6%8F%92%E4%BB%B6.html

Continue reading Photoshop转ico插件

XPath namespace的情况

今天使用Dom4j取节点,试了半天都没取到,真是很纳闷,用了这么久的函数今天突然不行了?仔细一看,原来xml节点带名空间。

下面引用自: http://www.cnblogs.com/PunkChen/archive/2008/04/02/1134304.html

xml代码example:
<report  xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.15" id="1">
    <list-property name="cssStyleSheets">
        <structure>
            <property name="fileName">D: eport.css</property>
        </structure>
    </list-property>
</report>
第一个方案.设置你的xpath的命名空间setNamespaceURIs

public class TransferXML {
    public static void main(String[] args) throws Exception{
        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);
        XPath x = document.createXPath("//design:list-property");
        x.setNamespaceURIs(map);
        List nodelist = x.selectNodes(document);
        System.out.println(nodelist.size());
    }
}
第二个解决方案:设置你的DocumentFactory()的命名空间 setXPathNamespaceURIs
public class TransferXML {
    public static void main(String[] args) throws Exception{
        Map map = new HashMap();
        map.put("design","http://www.eclipse.org/birt/2005/design");
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//design:list-property");
        System.out.println(tmp.size());
    }
}
第三种方法:本人用的,最笨也是最通用的方法,就是不使用开发环境给你提供的一系列对象,而是用XPath语法中自带的local-name() 和 namespace-uri() 指定你要使用的节点名和命名空间。
当你遇到使用xslt来样式化xml时,就知道这个笨方法的好处了:
public class TransferXML {
    public static void main(String[] args) throws Exception
        SAXReader saxReader = new SAXReader();
        File file = new File("D:\test.xml");
        Document document = saxReader.read(file);
        List tmp = document.selectNodes("//*[local-name()='report' and namespace-uri()='http://www.eclipse.org/birt/2005/design']/* [local-name()='list-property']");
        System.out.println(tmp.size());
    }
}

我觉得第三种最方便,虽然有点繁琐,往往那个名空间是多余的东西,我们处理的数据不需要关心它,所以使用低三种方法时,可以将and namespace-uri()='http://www.eclipse.org/birt/2005/design 这个条件不要,那么不管它是什么名空间,只要是要选取得节点名就被包含了。

 

不得不吐槽:为什么不用json呢?

 

参见:

http://www.cnblogs.com/PunkChen/archive/2008/04/02/1134304.html

Continue reading XPath namespace的情况

再谈p3p与第三方cookie

之前的文章 http://kazge.com/archives/91.html 初略了解了一下p3p,这次重温一下。

P3P是w3c 开发的协议 Platform for Privacy Preferences Project (P3P)。

主要用途是:

允许第三方cookie使用,这样的场景例如:

一个站点A.com包含了一个iframe,这个iframe指向了另外一个域的站点B.com。

那么B想要设置cookie并有时需要获得它,这就是第三方cookie。

注意,这里B能设置的cookie的domain 值还是b.com,但是相对于整个页面来说访问的是A.com所以叫做第三方cookie,B.com仍然是不能操作A.com的cookie的,否则就乱套了。 这个其实也不存在什么跨域的意思。

要让B.com能操作它的第三方cookie,B.com的页面需要使用P3P header来让浏览器来允许它这样做。

什么情况会发生这种应用场景:

1:第三方访问统计分析网站。

2:A 站点集成其他站点应用。

 

参见:

http://kazge.com/archives/91.html

Continue reading 再谈p3p与第三方cookie

IE 回车 提交表单问题

现在当我写一个form时,总是提心吊胆的,因为最近我几次遇到回车导致表单提交的情况,当然,这任然是在“神奇的IE”里面出现的奇迹。

这里所说的问题都是说在文本框里回车导致的,你在别的地方回车当然没这个问题。

网上有人总结了:

http://www.cnblogs.com/cxd4321/archive/2012/05/07/2486926.html

 

我们有时候希望回车键敲在文本框(input element)里来提交表单(form),但有时候又不希望如此。比如搜索行为,希望输入完关键词之后直接按回车键立即提交表单,而有些复杂表单,可能要避免回车键误操作在未完成表单填写的时候就触发了表单提交。

要控制这些行为,不需要借助JS,浏览器已经帮我们做了这些处理,这里总结几条规则:

1、如果表单里有一个type=”submit”的按钮,回车键生效。

2、如果表单里只有一个type=”text”的input,不管按钮是什么type,回车键生效。

3、如果按钮不是用input,而是用button,并且没有加type,IE下默认为type=button,FX默认为type=submit。

4、其他表单元素如textarea、select不影响,radio checkbox不影响触发规则,但本身在FX下会响应回车键,在IE下不响应。

5、type=”image”的input,效果等同于type=”submit”,不知道为什么会设计这样一种type,不推荐使用,应该用CSS添加背景图合适些。

实际应用的时候,要让表单响应回车键很容易,保证表单里有个type=”submit”的按钮就行。而当只有一个文本框又不希望响应回车键怎么办呢?我的方法有点别扭,就是再写一个无意义的文本框,隐藏起来。根据第3条规则,我们在用button的时候,尽量显式声明type以使浏览器表现一致。

我再补充type=”image”的BT情况,当用户会车时,竟然会触发这种标签的onclick事件---这就是奇迹,它就在那里!

 

然后再联系一下IE form提交的另外的问题http://kazge.com/archives/356.html , 这就是我为什么提心吊胆的原因了。

Continue reading IE 回车 提交表单问题

oracle11g XE 使用经历

我这次使用oracle 11g XE(express edition)算是浅尝辄止,我的机器几年前装过8,9i都不是很卡,几年过去,都到11g了,安装到很顺利,但是一开服务,我的机子就做不了事了,开个网页都卡的不行。

还试用了sql developer 3,不需要oracle客户端(TNS连接方式), sql编辑按空格有提示。

导入客户的sql脚本,结果n多表空间要建,真是麻烦。

用惯了mysql现在不习惯oracle这个笨家伙了,我的mysql服务一直开机启动,根本没什么影响。

 

另外在oracle官网上下载都需要注册oracle用户,且速度奇慢。

Continue reading oracle11g XE 使用经历

askterisk笔记【二】

第二十章 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]l.com,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笔记【二】

askterisk笔记【一】

先看看这些:
相关技术书籍
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 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的关系如图:

image

可见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]是三个固有的特殊上下文。

image

上图可见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笔记【一】

asterisk freepbx freeswitch trixbox elastix freeiris opensips fusionpbx 等等

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 等等

Pagination


Total views.

© 2013 - 2019. All rights reserved.

Powered by Hydejack v6.6.1