实验14 基于彩铃平台开发个性化彩铃业务功能_第1页
实验14 基于彩铃平台开发个性化彩铃业务功能_第2页
实验14 基于彩铃平台开发个性化彩铃业务功能_第3页
实验14 基于彩铃平台开发个性化彩铃业务功能_第4页
实验14 基于彩铃平台开发个性化彩铃业务功能_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、e-Bridge 电信业务平台实验指导书 开发类实验十四基于彩铃平台开发个性化彩铃业务功能 知识准备14.11熟悉SDK开发包的使用;1对数据库操作比较熟悉。SDK开发包帮助文档 实验目的14.2 1对电话彩铃业务流程的了解; 2熟练掌握数据库的操作; 3熟练掌握SDK包的使用。 训练内容14.3 14.3.1硬件、软件准备1、搭建好MyEclipse开发环境的pc机器一台和搭建好Linux测试环境的pc机器一台(可以使用虚拟机操作系统环境);2、电话机一台,及电信业务开发平台硬件环境需要,彩铃铃音文件若干;3、电信业务开发平台彩铃平台中已有的AIP_SMP模块,电信业务开发平台CSDP_AD

2、APT模块。AIP_SMP模块:AIP_SMP模块为彩铃业务管理配置模块,在AIP_SMP管理模块中主要用来对彩铃平台的统一管理及基础数据的配置,还包括用户的管理和一些查询统计功能。CSDP_ADAPT模块:CSDP_ADAPT模块为电信业务集成开发模块,主要提供API接口,方便我们程序调用,然后来控制语音设备(具体接口请参照SDK开发包帮助文档)。14.3.2数据准备在配置有测试环境的pc电脑上,创建并初始化彩铃平台所使用到的AIP_SCP数据库,配置AIP_SMP模块中铃音文件存放地址。通过AIP_SMP模块平台,先进行电话号码开户的操作,及在现有平台的彩铃业务基础之上,为开户的电话号码设

3、置个性化彩铃业务,为后面实验测试做准备。 实验设备及实验网络拓扑14.4无 实验步骤14.5 训练内容1.3上图给出的是一个完整的两个电话号码用户之间从拔号到通话结束这段操作的通信流程。而我们开发的的功能为在用户拔号时,被叫用户未摘机所释放的铃音给主叫用户听。从上面的电话流程图可以看出,我们要监听两个主被叫之间的连接及通话状态,并控制两个号码之间的连接状态。在开发环境中,我们打开开发工具,然后导入aip_scp工程。入口函数类:package com.xunfang.aip.scp;import munication.SendMsgThread;import munication.Socket

4、Comm;import munication.RecvMsgThread;import com.xunfang.aip.scp.config.Parse;import com.xunfang.csdp.sdk.agent.SdkService;import com.xunfang.csdp.sdk.logging.Log;import com.xunfang.csdp.sdk.xms.XMSProvider;/* * Title: 讯方电信业务平台彩铃业务 * Description: 系统启动 * create: 2009-11-05 * Copyright: Copyright (c) 2

5、009 * Company: 深圳市讯方通信技术有限公司 * author 申毅杰 * version */public class ScpServer /* * 配置文件解析方法 */public static void initConfig() / 解析配置文件Parse parse = new Parse();parse.init();/* * sdk服务 */static SdkService service = null;/* * 主函数 * * param args */public static void main(String args) / 初始sdk服务se

6、rvice = SdkService.getInstance();/ 解析配置文件initConfig();/ 记录启动日志System.out.println(彩铃业务平台V0 SCP系统启动);Log.debug(彩铃业务平台V0 SCP系统启动);/ 启动消息发送线程new SendMsgThread().start();/ 启动接收消息处理线程new RecvMsgThread().start();/ 打开设备openXMS();/ 系统退出执行的操作Runtime.getRuntime().addShutdownHook(new Thread() publ

7、ic void run() Log.debug(系统正在退出.););/ 主线程不退出while (true) try Thread.sleep(10 * 60 * 1000);Log.debug(主线程运行正常); catch (Exception e) Log.error(e);/* * 打开设备消息 */public static void openXMS() / 获得socket通信服务类SocketComm comm = SocketComm.getInstance();/ 打开多媒体设备命令byte openMsg = XMSProvider.xms_open(11866);com

8、m.sendMsg(openMsg);通过流程图我们能够得到,AIP_SCP模块程序只与CSDP_ADAPT模块程序相互通信,所以我们可以将两个模块之间的通信划分为发送与接收,并且用两个独立的通信端口来实现两模块之间的信息发送与接收。AIP_SCP接收CSDP_ADAPT消息线程:package munication;import com.xunfang.aip.scp.business.MessageHandle;import com.xunfang.csdp.sdk.logging.Log;import com.xunfang.csdp.sdk.socket.SDKMessage;/* *

9、 Title: 讯方电信业务平台彩铃业务 * Description: 接收消息线程处理类 * create: 2009-10-31 * Copyright: Copyright (c) 2009 * Company: 深圳市讯方通信技术有限公司 * author 申毅杰 * version */public class RecvMsgThread extends Thread /* * 通信服务类 */private SocketComm comm = null;/* * 接收消息线程 */public void run() comm = SocketComm.getInst

10、ance();while (true) / 不停地接收信息进行处理try int depth = comm.recvQueueDepth();if(depth0)SDKMessage msg = comm.receiveMsg();/ 对数据信息解析并处理if ( msg != null )/启动业务处理线程,对消息进行解析并进行相应处理new MessageHandle(msg).start();continue;Thread.sleep(20); catch (Exception e) Log.error(接受消息处理线程, e);AIP_SCP发送CSDP_ADAPT消息线程:packa

11、ge munication;import com.xunfang.csdp.sdk.logging.Log;/* * Title: 讯方电信业务平台彩铃业务 * Description: 数据发送线程 * create: 2009-10-31 * Copyright: Copyright (c) 2009 * Company: 深圳市讯方通信技术有限公司 * author 申毅杰 * version */public class SendMsgThread extends Thread /* * socket通信类变量 */private SocketComm comm = n

12、ull;/* * 线程函数 */public void run() /* 获取socket客户端 */comm = SocketComm.getInstance();while (true) try if(MessageCache.sendCache.getLength()=0)Thread.sleep(20);continue;byte message = (byte)MessageCache.sendCache.getContent();int sendLen = comm.sendMsg(message);Log.debug(发送消息 + sendLen + + new String(m

13、essage); catch (Exception e) Log.error(发送消息错误, e);Log.error(comm);通过接收信息线程获取CSDP_ADAPT模块发送来的消息,并对该消息进行协议解析,消息解析后再根据消息报文的类型进行消息处理。省略case 21:/ 终端呼入TrunkStruct trunk = MessageCache.initTrunk( callerorg, null, null, null, callerAddr, null, calleeorg, calleeorg,null, null, calleeAddr, null, trunkNo, Cons

14、tant.CALLIN, TrunkState.callin, recode);MessageCache.displayTrunk(终端呼入, , trunk);new BusinessHandle( trunk ).start();break;省略当我们得到CSDP_ADAPT模块返回电话呼入状态后,那么我们调用一个业务处理类,对呼入业务进行处理,判断主叫号码与被叫号码是状态是否正常,即是否在我们电话号码在我们平台中有过开户状态(可通过查询平台数据库,来验证平台是否有号码开户),再根据双方的通道状态信息进行判断,当主叫号码与被叫号码双方建立了通道信息后,那么被号可以给主叫播放铃音了,在播放铃

15、音前,我们要先判断被叫的铃音业务是什么:省略/* * 获取铃声路径 */public String getRingUrl( TrunkStruct trunk ) String caller = trunk.getCaller();String calleeArea = trunk.getCalleeArea();String callee = trunk.getCallee();String nowDate = Tools.getNowDate();long nowDateTime=Long.parseLong(Tools.getNow();String ringurl = Parse.ge

16、tConfig().getBasicRing();/ 默认基本铃声路径List list=null;try /根据被叫号码查询彩铃信息,并以彩铃优先级为条件降序排序String sql = new StringBuffer().append( select a.typepriority,a.typeid,b.phonenum,b.caller,date,b.starttime,b.endtime,c.realpath from ec_ringtype a, ec_phoneringset b, ec_ringfile c ).append( where c.fileid=b.fileid an

17、d b.typeid = a.typeid and b.phonenum=).append(callee+).append( order by typepriority desc ).toString();list = db.getList(sql);for(String temp:list)/0:基本彩铃 1:时间段彩铃 2:主叫彩铃 3:纪念日彩铃String typeid=temp1;if(0.equals(typeid)ringurl=temp7;return ringurl;else if(1.equals(typeid)long startime=Long.parseLong(te

18、mp5);long endtime=Long.parseLong(temp6);if(nowDateTime=startime&nowDateTime=endtime)ringurl=temp7;return ringurl;else if(2.equals(typeid)String callerTemp=temp3;if(caller.equals(callerTemp)ringurl=temp7;return ringurl;else if(3.equals(typeid)String comdate=temp4;if(nowDate.equals(comdate)ringurl=tem

19、p7;return ringurl; catch (Exception ex) Log.error(增加主叫彩铃出错:, ex);return ringurl;省略以上为在AIP_SMP管理平台中对被叫电话号码进行个性化铃音设置,然后当主叫号码拔打被叫号码时,被叫号码则根据不同的铃音业务播放给主叫号码相应的铃音。在此我们可以设置一个播放铃音等待通话的时长,然后再根据此来进行是否建立双向通话通道连接,一旦建立通话通话,那么: 省略/* * 处理类 */public void deal() try / 初始化数据库连接池db = new DBService();db.setAutoCommit(f

20、alse);phonedb = new PhoneOperateDao(db);/ 电话信息获取数据库服务ringdb = new RingOperateDao(db);/彩铃信息获取数据库服务/ 判断主被叫号码及获取通话时长是否正常if (!getConTime() return;/ - 获得主叫铃音信息 -String callerRing = ringdb.getRingUrl( trunk );PackMsg.playVoice( trunk.getTrunkNo(), 0, 0, 0, callerRing);L(trunk.getCallerorg()+ | + tr

21、unk.getCalleeorg();String caller = trunk.getCallerorg();String callee = trunk.getCalleeorg();PackMsg.callOut(caller, trunk.getCallerAddr(), callee, trunk.getCalleeAddr() );/初始化通道trunkcallee = MessageCache.initTrunk( trunk.getCalleeorg(), trunk.getCallee(), trunk.getCalleeArea(), trunk.getCalleephy()

22、,trunk.getCalleeAddr(), null, trunk.getCallerorg(), trunk.getCaller(), trunk.getCallerArea(), trunk.getCallerphy(),trunk.getCallerAddr(), null, -1, Constant.CALLOUT, TrunkState.callout, 000);/ 获取振铃是否成功,对应的通道号MessageCache.displayTrunk(-start-waiting结果, , trunkcallee.getTrunkNo(), trunkcallee.getCalle

23、rorg(), trunkcallee.getCalleeorg();trunkcallee = MessageCache.waitforCallee(trunk.getCalleephy(), Constant.CALLOUT, trunk.getCallerorg(), TrunkState.calloutresult, trunk);MessageCache.displayTrunk(-end-waiting结果, , trunkcallee.getTrunkNo(), trunkcallee.getCallerorg(), trunkcallee.getCalleeorg();if(

24、trunkcallee.getState()!=TrunkState.calloutresult | trunk.getState()=TrunkState.hangup)/呼出没有返回结果L(呼出没有结果! + trunkcallee.getState()+trunkcallee.getCaller()+ +trunkcallee.getCallee();if(trunkcallee.getState()= TrunkState.alerting&trunk.getState()!= TrunkState.hangup)trunkcallee.setState(TrunkSta

25、te.hangup);L(呼出没有结果!-被叫状态为 + trunkcallee.getState()+ 主叫状态为+trunk.getState();if( trunk.getState()= TrunkState.hangup)Log.debug(呼出没有结果,主叫挂机,平台挂被叫: + trunkcallee.getTrunkNo();PackMsg.shutcall(trunkcallee);else if(trunkcallee.getState()= TrunkState.hangup)Log.debug(呼出没有结果,被叫挂机,平台挂主叫: + trunk.getT

26、runkNo();PackMsg.shutcall(trunk);return;/根据返回码判断呼出L(呼出返回通道号: + trunkcallee.getTrunkNo();/ 连接主、被叫号码daulcon = daulLink();L(双向连接结果: + daulcon);if (daulcon) Log.debug(trunk.getTrunkNo() + 主叫连接L: + trunk.getLinkNo() + | + trunkcallee.getTrunkNo() + 连接L: + trunkcallee.getLinkNo();long start

27、= System.currentTimeMillis();long now = start;Log.debug(通话开始时间: + start + , 通话费用: + connFee + , 可通话时长: + connTime);MessageCache.displayTrunk(, trunk);MessageCache.displayTrunk(, trunkcallee);/ 如果有电话挂机,则挂掉另外一个终端,并且完成计时while (true) try Thread.sleep(200); catch (Exception e) Log.error(通话等待错误, e);now =

28、System.currentTimeMillis();if (now - start connTime * 1000) / 允许通话时间内if ( trunk.getState()=TrunkState.hangup ) / 如果主叫通道挂机,则向被叫发送挂机命令,并跳出Log.debug(主叫挂机,通话时长: + (now - start);PackMsg.shutcall(trunkcallee);break;if ( trunkcallee.getState() = TrunkState.hangup ) / 如果被叫通道挂机,则向主叫发送挂机命令,并跳出Log.debug(被叫挂机,通话时长: + (now - start);PackMsg.shutcall(trunk);break; else / 否则挂机,并跳出Log.debug(%主叫余额不足,通话结束时间: + now);PackMsg.shutcall(trunkcallee);PackMsg.shutcall(trunk);break;/ 记录数据库通话信息/recodeCon(start, now, Tools.formatDate2(start), Tools.formatDate2(now);Log.debug(记录通话信息: + 开始时间: + start + ,结束时间

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论