当前位置:  编程技术>移动开发
本页文章导读:
    ▪MTK中怎的创建和使用lib        MTK中怎样创建和使用lib MTK中怎样创建和使用lib 博客分类: MTK MTKCC++C# 方法0: MTK平台如何生存LIB库文件: 1. make 文件夹建立需要生成库的mylib,放入c和h文件,单独编译mylib模块 2. make.........
    ▪ 自定义listview高亮成效(item带立体背景效果)        自定义listview高亮效果(item带立体背景效果) 参考了http://www.uplook.cn/index.php?a=kbase&m=Index&c=show&id=6943中的部分代码 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://www.norko.........
    ▪ Asterisk之全面引见       Asterisk之全面介绍    1 Asterisk 体系结构 Asterisk 系统的体系结构非常明晰,他不同于传统的PSTN 交换机,更多的时候,Asterisk 被当做一个连通电话的中间件,Asterisk 的可扩展性使其可以应.........

[1]MTK中怎的创建和使用lib
    来源: 互联网  发布时间: 2014-02-18
MTK中怎样创建和使用lib
MTK中怎样创建和使用lib
    博客分类:
  • MTK
MTKCC++C#
方法0:
MTK平台如何生存LIB库文件:
1. make 文件夹建立需要生成库的mylib,放入c和h文件,单独编译mylib模块
2. make文件中COMPLIST加入mylib
3. 在REL_MMI_GPRS.mak中CUS_REL_MTK_COMP加入mylib
4. 在mtklib文件夹里面放mylib,就ok啦。

方法一:
MTK生成库(ARM) 过程
第一步,生成真机的obj文件
第二步,找到相关的obj文件 D:\LongCheer\build\LC6225_GEMINI\gprs\MT6225o\mmi_app
第三步,把相关的obj文件拷贝到一个目录下面 D:\lib_temp
第四步,打开命令窗口,输入命令 armar -r temp.lib *.obj 生成 temp.lib 库
第五步,输入命令armar -tv temp.lib 可以看到加入的库
也可以这样armar -r xxx.lib x1.obj x2.obj。

方法二:
在option.mak 中单独添加一个模块
COMPLIST += tmptmp
在make中添加tmptmp目录及其那是个文件。
会在gprs\MT6225o\lib目录中有tmptmp.lib

    
[2] 自定义listview高亮成效(item带立体背景效果)
    来源: 互联网  发布时间: 2014-02-18
自定义listview高亮效果(item带立体背景效果)
参考了http://www.uplook.cn/index.php?a=kbase&m=Index&c=show&id=6943
中的部分代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://www.norkoo.com">
	<item android:state_pressed="true">
		<shape>
			<gradient android:startcolor="#ff8c00" android:endcolor="#ffffff"
				android:angle="270" />
			<stroke android:width="2dp" android:color="#dcdcdc" />
			<corners android:radius="2dp" />
			<padding android:left="10dp" android:top="10dp"
				android:right="10dp" android:bottom="10dp" />
		</shape>
	</item>
	<item android:state_focused="true">
		<shape>
			<gradient android:startcolor="#ffc2b7" android:endcolor="#ffc2b7"
				android:angle="270" />
			<stroke android:width="2dp" android:color="#dcdcdc" />
			<corners android:radius="2dp" />
			<padding android:left="10dp" android:top="10dp"
				android:right="10dp" android:bottom="10dp" />
		</shape>
	</item>
	<item>
		<shape>
			<gradient android:startcolor="#ff9d77" android:endcolor="#ff9d77"
				android:angle="270" />
			<stroke android:width="2dp" android:color="#fad3cf" />
			<corners android:radius="2dp" />
			<padding android:left="10dp" android:top="10dp"
				android:right="10dp" android:bottom="10dp" />
		</shape>
	</item>
</selector>


下面是我自己的代码
listview_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- focused -->
	<item android:drawable="@color/white" android:state_focused="true" />
	<!-- focused and pressed -->
	<item android:drawable="@color/white" android:state_focused="true"
		android:state_pressed="true" />
	<!-- pressed -->
	<item android:drawable="@color/tab_blue" android:state_pressed="true" />
	<!-- default -->
	<!-- <item android:drawable="@color/white" /> -->
	<item>
		<shape 
			android:shape="rectangle">
			<gradient android:startColor="#ffffff" android:endColor="#EDEDED"
				android:angle="-90" />
		</shape>
	</item>
</selector>


使用:在listview里面的item的layout中:android:background="@xml/listview_item_bg"

    
[3] Asterisk之全面引见
    来源: 互联网  发布时间: 2014-02-18
Asterisk之全面介绍

 

 1 Asterisk 体系结构

Asterisk 系统的体系结构非常明晰,他不同于传统的PSTN 交换机,更多的时候,Asterisk 被当做一个连通电话的中间件,Asterisk 的可扩展性使其可以应用的各个领域,基于Asterisk的产品如 trixbox , freeries等,图3.1为Asterisk的内核结构。

Asterisk 内核包含了五个必要的核心操作模块和四个可加载的应用接口,它们共同组成了Asterisk的完整结构,五个核心模块分别是:PBX核心模块、动态加载器模块、实时调度和I/O管理器、编解码转换模块和应用启动器模块,四个扩展客家在接口分别是:编码转换接口、Asterisk通道接口(SIP,IAX等)、扩展应用接口(AGI,AMI),文件格式接口。

 

Asterisk是基于模块化设计的,通过模块的动态加载实现设定的功能,用户可通过动态加载需要的模块。每当Asterisk启动,动态模块加载器就会加载模块的驱动程序。这些模块包括通道驱动、文件格式、会话记录、编解码器、应用启动器等。

 Asterisk 启动后,其PBX核心即启动一个monitor线程监听通道消息,接受并处理通道上的会话请求,这些请求包括会话的初始或通道(Channel)的拆除等。通道接口负责管理会话呼入者的连接状态,无论VOIP连接、PRI连接还是ISDN连接,通道接口会给每一个呼叫的绘画建立一个信道,然后根据需要将这些信达澳彼此相连接,具体的连接细节都将由Asterisk的内核完成。

扩展应用接口允许各式各样的任务模块运行在Asterisk平台上:电话会议、语音信箱、在线数据交换等等。通过这些接口,开发人员可以在电话呼叫的任意阶段与Asterisk交互,可以编写全新的电话应用程序,例如,笔者在开发过程中实现话务员自动报号功能时即在坐席与客户接通时执行一个AGI接口程序,实现向客户报告话务员编号功能。

2  Asterisk内核初始化流程

Asterisk的模块初始化工作由Asterisk 负责,包括系统的启动、初始化各个模块等工作,其中 main()函数是系统的入口,这里负责初始化文件日志系统、设置RTP/RTCP端口、信令通道的初始话(如SIP)等, main()函数通过调用load_modules()函数加载各个模块并且注册各个app的入口函数,load_pbx()函数负责加载Asterisk内嵌的函数,它通过读取全局数组builtins中每个app的信息,然后调用ast_register_application注册app的各个入口函数,模块初始化流程如图 3-2 所示。


 

3  Asterisk 呼叫流程

每一个Asterisk通话都包括一个incoming 连接和一个outbound连接,每个电话都是通过一种通道驱动建立起来的,比如本文开发的系统采用SIP通道,其他通道如ZAP,IAX等,每一类通道驱动都有自己私有的通道数据结构,如SIP通道结构chan_sip ,这些私有的结构从属于一个通用的Asterisk通道数据结构ast_channel。

Asterisk 会话建立流程如图3.3 所示。

呼入抵达的场景如下:

1) 呼叫到达监听接口,被某一类通道驱动的接口感知,如 SIP socket.

2) 通道驱动创建一个PBX通道并且为这个通道开启一个PBX线程。

3)执行拨号方案。

4)在这时候至少发生下面其中之一:

a. Asterisk 应答这个呼叫并且播放媒体数据或者读取媒体数据,比如IVR业务。

b.拨号方案促使Asterisk 通过拨号应用函数 Dial 创建一个外呼通道。

5)Asterisk 桥接通道,呼叫成功建立

Asterisk 外呼场景如下:

1) Dial创建一个outbound PBX通道并且要求对应的通道驱动创建一个呼叫2)当电话被接通,asterisk桥接媒体流,使得第一个通道的呼叫者能够与    第二路通道的被呼叫者进行通话

3)有些情况下,呼入和呼出的通道使用相同的技术方案和兼容的编解码技术,这时候就会使用本地桥接。这种本地桥接方案中,通道驱动在内部直接传送到来的语音数据到对外的流中,而不通过PBX发送语音帧。

4)如果是SIP协议,将会有一个"external native bridge",asterisk重定向端点,使得语音直接在呼叫者和被呼叫者之间传送。信号被保存下来以方便提供正确的CDR记录。

植入通道(Masquerading channels):

有些情形下,一个通道可能植入到另一个通道中。这种情景在呼叫转移中比较常见,新的通道植入并且接管桥接的工作,旧的通道就成了僵通道而被挂起。


 

4  Asterisk 拨号方案编程

拨号方案是Asterisk系统的核心,因为它定义了Asterisk如何处理来话和去话,拨号方案由指令和步骤序列组成,Asterisk按步骤来执行这些指令。与传统电话系统不同,Asterisk的拨号方案是完全可定制的。

拨号方案由四部分组成:Context, Extensions, Priorities和Applications.

1) Context

拨号方案被分成几个段,这些成为Context, Context用来对Extension的组命名,它把拨号方案的不同部分进行分离,避免彼此交织在一起,在一个Context 中定义的Extension 完全独立于在另一个Context中定义的Extension,Context 的表示方法是把名字放在[]中。

2) Extensions

每一个Context 内,可以定义一个或多个Extension,Extension是要执行的指令,由来电或者通道上所拨的数字来触发。

一个完整的Extension有三个要素:

(1) Extension 的名字或号码。

(2) Priority ,每个扩展可以包含多个步骤,步骤号称作Priority;

(3) Application ,针对呼叫执行的特定动作。

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

Exten => name, priority, application()

下面是笔者开发的系统中拨号方案的一部分,实现语音留言功能

 

[gfdvoice]
exten => h,1,NoOp(hangup in voicemail)
exten => h,n,Goto(default,h,1) exten => _X.,1,NoOp()
exten => _X.,n,Answer 
exten => _X.,n,Set(sound_file=${CUT(sound_file,.,1)})
exten => _X.,n,Playback(${sound_file}) 
exten => _X.,n,Set(CDR(userfield)=${CDR(userfield)}#rf=${monitor_name})
exten => _X.,n,Set(rcd__start_time=${EPOCH})  
exten => _X.,n,Record(${VOICE_MAIL_PATH}/${monitor_name}.wav,5,120)
exten => _X.,n,Set(rcd_end_time=${EPOCH})
exten => _X.,n,playback({monitor_name})
exten => _X.,n,hangup()
 

到此为止,已经创建了一个简单的拨号方案,呼叫进来时,Asterisk先应答这个呼叫,播放声音文件提示用户留言,接下来开始录音,最终挂断,值得注意的是此拨号方案在用户挂断后可以走到另一个Context,在实际的系统中,此功能用来实现用户挂断后的CDR(呼叫详细记录)生成及短信发送功能。

3.4   Asterisk AGI编程

3.4.1 一个使用AGI 的例子

在具体讲解AGI之前,让我们看一个例子,在此图(3.4)中可以看到AGI在整个呼叫过程中的位置及作用。


 

从图中我们可以看到拨号方案调用一个AGI接口实现查询数据库功能,下面我们再看一段应用AGI的具体代码。

exten => _X.,n,GotoIf($["${web_400}" != "1"]?4:5)

exten => _X.,n,Agi(agi://${AGI_SERVER}:${AGI_PORT}/fs.agi)

 

 

上述代码中exten => _X.,n,Agi(agi://${AGI_SERVER}:${AGI_PORT}/fs.agi)为AGI的具体调用方式,AGI名字为fs 采用java语言编写。

 

5   AGI介绍

作为Asterisk与外部交互的主要方式,AGI (Asterisk Gateway Interface)提供给开发者强大的功能及灵活性, 利用AGI, 开发者可以采用任何一种编程语言(perl, php, c,java 等)编写AGI程序与Asterisk交互,Asterisk 与AGI通过标准输入输出流交换信息,如图3-5所示,Asterisk内部通过输入输出流与外部资源交互信息,实际交互过程中Asterisk 默认给AGI传送相应输入变量,AGI程序接收后处理,返回信息给Asterisk ,Asterisk通过拨号方案调用AGI,而每一次拨号方案的执行属于一个通道(channel),实际的交互过程为AGI与某一通道交互信息。

 

 

下面为笔者打开AGI  DEBUG 模式下的实际交互过程。

拨号方案为:

exten => _X.,1,Answer

exten => _X.,n,Set(DID=${EXTEN})

exten => _X.,n,Set(CLID=${CALLERID(num)})

exten => _X.,n,AGI(SomeScript.php)

其中exten => _X.,n,AGI(hello.php)为AGI的调用。

部分控制台交互过程如下:

AGI  Tx >> agi_request: hello.php.php

AGI  Tx >> agi_channel: SIP/25946-0821ea88

AGI  Tx >> agi_type: SIP

AGI  Tx >> agi_extension: 998866015810370728

AGI  Tx >> agi_priority: 1

上述控制台信息中,AGI通过标准输入,从Asterisk接收信息,当AGI脚本执行时,Asterisk会向脚本发送各种信息,可以在做其他事情之前通过标准输入获取这些信息,每项数据一行,发送完毕Asterisk会发送一个空行,表示结束,如 AGI Tx >> agi_request: hello.php.php 表示请求的AGI名字。

 

 

6  合理使用AGI

虽然使用AGI有很大的灵活性,但是AGI对系统的性能有很大影响,因为Asterisk内部AGI的实现是以进程方式被调用,所以,每调用一次AGI就会创建一个进程,这在大型的呼叫中心系统中对性能影响很大,所以AGI的使用要适当,实际开发过程中AGI主要用来操作数据库以及一些复杂的业务逻辑,笔者在开发系统过程中即采用这种方式,比如呼叫进来后先执行一个agi程序,此程序根据被叫号查询开通此号码的企业,如果企业开通,则取出企业的IVR配置,如采用彩铃还是直播队列等,AGI通过设置企业业务逻辑相关的变量,返回给拨号方案,拨号方案根据这些变量走不同的业务逻辑,如果企业未开通则终止服务并记录呼叫详细记录(CDR),写入数据库。

下面为笔者总结的使用AGI的5条原则:

    (1) AGI的执行应尽快结束:为了提高系统响应速度,AGI应尽快返回拨号方案。

    (2) AGI应用程序中不能有阻塞动作:包括Dial,MeetMe 等application。

    (3) 利用Asterisk通道(channel)挂载变量与AGI交互.

    (4) 基于虚拟机的语言不适合写AGI程序(fastAGI除外)。

    (5) 在拨号方案与AGI之间的权衡。

本章介绍了Asterisk系统及其内核,详细讨论了Asterisk编程两大方向,拨号方案及AGI,并列举了笔者开发的系统中的一些例子,从本章我们可以得出结论,Asterisk不但定义了一套完整的体系结构,还提供了丰富的业务扩展能力,Asterisk主要竞争力和核心价值亦体现在此,同时,良好的体系结构使得Asterisk必将是传统PBX的替代品,成为通信领域里程碑式的产品,随着VOIP通信的普及,Asterisk必将展示出更多优秀的技术特性。


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3