




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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;/* * <p> Title: 讯方电信业务平台彩铃业务</p> * <p> Description: 系统启动</p> * <p&g
5、t;create: 2009-11-05</p> * <p>Copyright: Copyright (c) 2009 </p> * <p>Company: 深圳市讯方通信技术有限公司 </p> * author 申毅杰 * version */public class ScpServer /* * 配置文件解析方法 */public static void initConfig() / 解析配置文件Parse parse = new Parse();parse.init();/* * sdk服务 */static S
6、dkService service = null;/* * 主函数 * * param args */public static void main(String args) / 初始sdk服务service = SdkService.getInstance();/ 解析配置文件initConfig();/ 记录启动日志System.out.println("彩铃业务平台V0 SCP系统启动");Log.debug("彩铃业务平台V0 SCP系统启动");/ 启动消息发送线程new SendMsgThread().start(
7、);/ 启动接收消息处理线程new RecvMsgThread().start();/ 打开设备openXMS();/ 系统退出执行的操作Runtime.getRuntime().addShutdownHook(new Thread() public void run() Log.debug("系统正在退出."););/ 主线程不退出while (true) try Thread.sleep(10 * 60 * 1000);Log.debug("主线程运行正常"); catch (Exception e) Log.error(e);/* * 打开设备消息
8、 */public static void openXMS() / 获得socket通信服务类SocketComm comm = SocketComm.getInstance();/ 打开多媒体设备命令byte openMsg = XMSProvider.xms_open("11866");comm.sendMsg(openMsg);通过流程图我们能够得到,AIP_SCP模块程序只与CSDP_ADAPT模块程序相互通信,所以我们可以将两个模块之间的通信划分为发送与接收,并且用两个独立的通信端口来实现两模块之间的信息发送与接收。AIP_SCP接收CSDP_ADAPT消息线程:
9、package munication;import com.xunfang.aip.scp.business.MessageHandle;import com.xunfang.csdp.sdk.logging.Log;import com.xunfang.csdp.sdk.socket.SDKMessage;/* * Title: 讯方电信业务平台彩铃业务 * Description: 接收消息线程处理类 * create: 2009-10-31 * Copyright: Copyright (c) 2009 * Company: 深圳市讯方通信技术有限公司 * author 申毅杰 * ve
10、rsion */public class RecvMsgThread extends Thread /* * 通信服务类 */private SocketComm comm = null;/* * 接收消息线程 */public void run() comm = SocketComm.getInstance();while (true) / 不停地接收信息进行处理try int depth = comm.recvQueueDepth();if(depth>0)SDKMessage msg = comm.receiveMsg();/ 对数据信息解析并处理if ( msg
11、!= null )/启动业务处理线程,对消息进行解析并进行相应处理new MessageHandle(msg).start();continue;Thread.sleep(20); catch (Exception e) Log.error("接受消息处理线程", e);AIP_SCP发送CSDP_ADAPT消息线程:package munication;import com.xunfang.csdp.sdk.logging.Log;/* * Title: 讯方电信业务平台彩铃业务 * Description: 数据发送线程 * create: 2009-10-31 * C
12、opyright: Copyright (c) 2009 * Company: 深圳市讯方通信技术有限公司 * author 申毅杰 * version */public class SendMsgThread extends Thread /* * socket通信类变量 */private SocketComm comm = null;/* * 线程函数 */public void run() /* 获取socket客户端 */comm = SocketComm.getInstance();while (true) try if(MessageCache.sendCache
13、.getLength()=0)Thread.sleep(20);continue;byte message = (byte)MessageCache.sendCache.getContent();int sendLen = comm.sendMsg(message);Log.debug("发送消息" + sendLen + ""+ new String(message); catch (Exception e) Log.error("发送消息错误", e);Log.error(comm);通过接收信息线程获取CSDP_ADAPT模块发
14、送来的消息,并对该消息进行协议解析,消息解析后再根据消息报文的类型进行消息处理。省略case 21:/ 终端呼入TrunkStruct trunk = MessageCache.initTrunk( callerorg, null, null, null, callerAddr, null, calleeorg, calleeorg,null, null, calleeAddr, null, trunkNo, Constant.CALLIN, TrunkState.callin, recode);MessageCache.displayTrunk("终端呼入, ", tru
15、nk);new BusinessHandle( trunk ).start();break;省略当我们得到CSDP_ADAPT模块返回电话呼入状态后,那么我们调用一个业务处理类,对呼入业务进行处理,判断主叫号码与被叫号码是状态是否正常,即是否在我们电话号码在我们平台中有过开户状态(可通过查询平台数据库,来验证平台是否有号码开户),再根据双方的通道状态信息进行判断,当主叫号码与被叫号码双方建立了通道信息后,那么被号可以给主叫播放铃音了,在播放铃音前,我们要先判断被叫的铃音业务是什么:省略/* * 获取铃声路径 */public String getRingUrl( TrunkStruct tru
16、nk ) 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.getConfig().getBasicRing();/ 默认基本铃声路径List<String> list=null;try /根据被叫号码查询
17、彩铃信息,并以彩铃优先级为条件降序排序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 and b.typeid = a.typeid and b.phonenum='&qu
18、ot;).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 startim
19、e=Long.parseLong(temp5);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(typei
20、d)String comdate=temp4;if(nowDate.equals(comdate)ringurl=temp7;return ringurl; catch (Exception ex) Log.error("增加主叫彩铃出错:", ex);return ringurl;省略以上为在AIP_SMP管理平台中对被叫电话号码进行个性化铃音设置,然后当主叫号码拔打被叫号码时,被叫号码则根据不同的铃音业务播放给主叫号码相应的铃音。在此我们可以设置一个播放铃音等待通话的时长,然后再根据此来进行是否建立双向通话通道连接,一旦建立通话通话,那么: 省略/* * 处理类 */p
21、ublic void deal() try / 初始化数据库连接池db = new DBService();db.setAutoCommit(false);phonedb = new PhoneOperateDao(db);/ 电话信息获取数据库服务ringdb = new RingOperateDao(db);/彩铃信息获取数据库服务/ 判断主被叫号码及获取通话时长是否正常if (!getConTime() return;/ - 获得主叫铃音信息 -String callerRing = ringdb.getRingUrl( trunk );PackMsg.playVoice( trunk.
22、getTrunkNo(), "0", "0", "0", callerRing);L(trunk.getCallerorg()+ "|" + trunk.getCalleeorg();String caller = trunk.getCallerorg();String callee = trunk.getCalleeorg();PackMsg.callOut(caller, trunk.getCallerAddr(), callee, trunk.getCalleeAddr() );/初始化通道tr
23、unkcallee = MessageCache.initTrunk( trunk.getCalleeorg(), trunk.getCallee(), trunk.getCalleeArea(), trunk.getCalleephy(),trunk.getCalleeAddr(), null, trunk.getCallerorg(), trunk.getCaller(), trunk.getCallerArea(), trunk.getCallerphy(),trunk.getCallerAddr(), null, -1, Constant.CALLOUT, TrunkState.cal
24、lout, "000");/ 获取振铃是否成功,对应的通道号MessageCache.displayTrunk("-start-waiting结果, ", trunkcallee.getTrunkNo(), trunkcallee.getCallerorg(), trunkcallee.getCalleeorg();trunkcallee = MessageCache.waitforCallee(trunk.getCalleephy(), Constant.CALLOUT, trunk.getCallerorg(), TrunkState.callout
25、result, trunk);MessageCache.displayTrunk("-end-waiting结果, ", trunkcallee.getTrunkNo(), trunkcallee.getCallerorg(), trunkcallee.getCalleeorg();if( trunkcallee.getState()!=TrunkState.calloutresult | trunk.getState()=TrunkState.hangup)/呼出没有返回结果L("呼出没有结果!" + trunkcallee.getSta
26、te()+trunkcallee.getCaller()+" "+trunkcallee.getCallee();if(trunkcallee.getState()= TrunkState.alerting&&trunk.getState()!= TrunkState.hangup)trunkcallee.setState(TrunkState.hangup);L("呼出没有结果!-被叫状态为" + trunkcallee.getState()+" 主叫状态为"+trunk.getState();if(
27、trunk.getState()= TrunkState.hangup)Log.debug("呼出没有结果,主叫挂机,平台挂被叫:" + trunkcallee.getTrunkNo();PackMsg.shutcall(trunkcallee);else if(trunkcallee.getState()= TrunkState.hangup)Log.debug("呼出没有结果,被叫挂机,平台挂主叫:" + trunk.getTrunkNo();PackMsg.shutcall(trunk);return;/根据返回码判断呼出L(&quo
28、t;呼出返回通道号:" + trunkcallee.getTrunkNo();/ 连接主、被叫号码daulcon = daulLink();L("双向连接结果:" + daulcon);if (daulcon) Log.debug(trunk.getTrunkNo() + "主叫连接L:" + trunk.getLinkNo() + "|" + trunkcallee.getTrunkNo() + "连接L:" + trunkcallee.getLinkNo();long start = S
29、ystem.currentTimeMillis();long now = start;Log.debug("通话开始时间:" + start + ", 通话费用: " + connFee + ", 可通话时长:" + connTime);MessageCache.displayTrunk("", trunk);MessageCache.displayTrunk("", trunkcallee);/ 如果有电话挂机,则挂掉另外一个终端,并且完成计时while (true) try Thread.s
30、leep(200); catch (Exception e) Log.error("通话等待错误", e);now = System.currentTimeMillis();if (now - start < connTime * 1000) / 允许通话时间内if ( trunk.getState()=TrunkState.hangup ) / 如果主叫通道挂机,则向被叫发送挂机命令,并跳出Log.debug("主叫挂机,通话时长:" + (now - start);PackMsg.shutcall(trunkcallee);break;if (
31、 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("记录通话信息:" + &qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青岛农业大学《合唱与指挥(一)》2023-2024学年第一学期期末试卷
- 青岛城市学院《视觉艺术公共文化服务》2023-2024学年第二学期期末试卷
- 青岛港湾职业技术学院《液压实验》2023-2024学年第二学期期末试卷
- 青岛职业技术学院《热工与流体力学》2023-2024学年第二学期期末试卷
- 青岛远洋船员职业学院《课堂乐器演奏与教学》2023-2024学年第一学期期末试卷
- 青岛黄海学院《当代社会思潮与青年教育》2023-2024学年第二学期期末试卷
- 青海农牧科技职业学院《建筑环境热力学》2023-2024学年第一学期期末试卷
- 青海建筑职业技术学院《材料性能数值模拟》2023-2024学年第二学期期末试卷
- 青海民族大学《影视三维模型设计》2023-2024学年第二学期期末试卷
- 青海省海东地区民和回族土族自治县2025年五下数学期末监测试题含答案
- 国际航空货运代理实务
- 《咯血的诊治》课件2
- 江苏省连云港市赣榆智贤高中20222023学年高一下学期3月阶段检测语文试题(解析)
- 火力发电厂消防知识培训课件
- MSOP(测量标准作业规范)测量SOP
- 仓库温湿度记录表
- 营养风险筛查(NRS2002)解读
- 复地A2A3附着式升降脚手架施工方案济南复星国际中心A2A3地块总承包工程
- 纸杯制作手工课ppt
- 动物防疫与检疫技术教案
- 销售话术900句顺口溜
评论
0/150
提交评论