08年了,我也把07年所做的工作总结一下。望各位朋友不吝指教。
一、名词解释
SMPP:短消息点对点协议,SMPP协议是一个国际标准,有SMS论坛制定,官方网址为smsforum.net,截至2006年7月2日,最新版本是5.0。曾经流行的版本是3.3、3.4。SMPP协议向后兼容的。
SMC:短消息服务中心
ECME:扩展短消息实体
二、简要介绍
基于SMPP协议研发的互通短信网关,所有unicom发向中国移动和中国电信的短信都通过此系统提交给unicom互通短信网关,系统角色为SMC,unicom充当ECME,由SMSC主动下发短消息(DeliverSM)给unicom短信中心,设计速度为250条/秒(运营商规定)。
系统采用spring进行ioc配置,h2内存数据库,数据库访问采用spring jdbc,基于多线程和Socket编程。
主要程序介绍:
三、主体程序介绍
SMSCService:系统启动的主程序,实现启动、暂停监听服务,启动暂停消息下发服务功能。
while (keepRunning) {
System.out.println();
System.out.println("- 1 start listener");
System.out.println("- 2 stop listener");
System.out.println("- 3 client");
System.out.println("- 4 start deliverMessage");
System.out.println("- 5 stop deliverMessage");
System.out.println("- 0 exit");
System.out.print("> ");
optionInt = -1;
try {
option = keyboard.readLine();
optionInt = Integer.parseInt(option);
} catch (Exception e) {
optionInt = -1;
}
switch (optionInt) {
case 1:
startlistener();
break;
case 2:
stoplistener();
break;
case 3:
listclienter();
break;
case 4:
startdeliverMessage();
break;
case 5:
stopdeliverMessage();
SMSCListener:服务监听程序,当ECME连接上SMC后,生成SMSCSession。
public synchronized void start() throws IOException {
debug.write("going to start SMSCListener on port " + port);
if (!isReceiving) {
serverConn = new com.logica.smpp.TCPIPConnection(port);
serverConn.setReceiveTimeout(getAcceptTimeout());
serverConn.open();
keepReceiving = true;
if (asynchronous) {
debug.write("starting listener in separate thread.");
Thread serverThread = new Thread(this);
serverThread.start();
debug.write("listener started in separate thread.");
} else {
debug.write("going to listen in the context of current thread.");
run();
}
} else {
debug.write("already receiving, not starting the listener.");
}
}
try {
Connection connection = null;
serverConn.setReceiveTimeout(getAcceptTimeout());
connection = serverConn.accept();
if (connection != null) {
SMSCSession session = new SMSCSession(connection);
session.setHashSet(hashSet);
Thread thread = new Thread(session);
thread.start();
sessionFactory.register(session);
debug.write("SMSCListener launched a session on the accepted connection.");
} else {
debug.write("no connection accepted this time.");
}
} catch (InterruptedIOException e) {
debug.write("InterruptedIOException accepting, timeout? -> " + e);
} catch (IOException e) {
event.write(e, "IOException accepting connection");
keepReceiving = false;
}
SMSCSession:实现ECME连接上来的消息解码,调度相应的服务(接受消息或发送消息)。
if (calendar.getTimeInMillis() < (enquire_LinkTime + enquire_LinkTimeout * 1000)) {
//判断是否连接超时
try {
debug.write("SMSCSession going to receive a PDU");
pdu = receiver.receive(getReceiveTimeout());
} catch (Exception e) {
debug
.write("SMSCSession caught exception receiving PDU "
+ e.getMessage());
}
if (pdu != null) {
if (pdu.isRequest()) {
debug.write("SMSCSession got request "
+ pdu.debugString());
requestWorker.clientRequest((Request) pdu);
} else if (pdu.isResponse()) {
debug.write("SMSCSession got response "
+ pdu.debugString());
requestWorker.clientResponse((Response) pdu);
} else {
debug
.write("SMSCSession not reqest nor response => not doing anything.");
}
}
}else
{
keepReceiving=false;
}
RequestWorker:处理ECME和SMC之间的消息,缋SUBMIT_SM,SUBMIT_MULTI,ENQUIRE_LINK等消息。
// TODO 根据业务规则进行用户合法性验证
commandStatus = checkIdentity((BindRequest) request);
if (commandStatus == 0) { // authenticated
System.out.println(request.debugString());
BindResponse bindResponse = (BindResponse) request
.getResponse();
serverResponse(bindResponse);
// success => bound
bound = true;
} else { // system id not authenticated
// get the response
response = request.getResponse();
// set it the error command status
response.setCommandStatus(commandStatus);
// and send it to the client via serverResponse
serverResponse(response);
// bind failed, stopping the session
session.stop();
}
ResponseWorker:处理DELIVER_RESP消息,与发送消息的时间进行对比,实现超时重发和保存消息预处理。
if (isOutTime(sendsm.getDealTime())) {// dealTime如果没有填写,此时永远处理不到
sendsm.setState(SendSM.STATE_SMSC_FAIL);
reportFailQueue.put(sendsm, 100);
//分类保存
if (sendsm.getMessageType() == SendSM.MESSAGETYPE_CORP) {
reportQueue.put(sendsm, 100);
} else if (sendsm.getMessageType() == SendSM.MESSAGETYPE_CLIENT) {
reportQueue_P.put(sendsm, 100);
}
} else {
// 重新压回接收队列
deliverQueue.put(sendsm, 100);
}
DeliverMessage:从发送队列里取出待发短信,提交DELIVERSM消息至RequestWorker,由RequestWorker下发消息至ECME.
while (list != null && list.size() > 0) {
try {
sendsm = list.remove(list.size() - 1);
if (sendsm != null) {
deliverSM = this.convertSendsm(sendsm);
} else {
deliverSM = null;
}
if (deliverSM != null) {
if (session.send(deliverSM)) {
SMSCLog.SendLog(deliverSM);
sendsm.setSequenceNumber(String
.valueOf(deliverSM
.getSequenceNumber()));
sendsm.setDealTime(DataFormat.yyyy_MM_dd_HH_mm_ss
.format(new Date()));
deliverQueue.put(sendsm, 1000);
}
}
Thread.sleep(intervalTime);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
SaveService:基于spring jdbc实现的批量取出消息和批量保存的DAO实现。
count = saveQueue.drainTo(list, batchSize);
if (logger.isDebugEnabled()) {
logger.debug("get element count["+count+"] from saveQeueue.");
}
if (count > 0) {
int total = batchSave.batachSave(list);
if (logger.isDebugEnabled()) {
logger.debug("Save ["+total+"] records.");
}
}
if (count < batchSize) {
if (logger.isDebugEnabled()) {
logger.debug("sleep "+sleepTime);
}
//小于0, 休眠
Thread.sleep(sleepTime);
} else {
Thread.yield(); //让其他程序有机会运行
}
其它若干辅助类,就不一一介绍了。
因为时间比较紧,系统是在logica smsc的基础修改完成的,本人1周完成。主是加入了业务所需要的东西。因涉及非技术问题,此处只取了一部份代码。
ps:
做这个项目的时候,主要是为适应xx省smsc经过huiway改造之后的话单分检,大家开始都没有注意有可能出现这种情况,时间紧(大约只有1周时间),压力大(自己以前还没有smsc角色的程序,对smpp中的DeliverSM消息不太熟,后来果然在上面载了跟头,测试时总发现下发出去的消息是乱码,反复测试,编码格式也换了9种,后来才发现有个DeliverSM中的setDataCoding没有设置,郁闷),经过自己的努力和同事的帮助。基本上在一周内完成,包括测试用例。
现在这个系统已上线,到目前为止已正常运行2个月,从未出现过大问题。运行平台为redhat enterprise 4。
分享到:
相关推荐
“sgip”可能是“Short Message Gateway Interface Protocol”的缩写,即短信网关接口协议,是中国联通等运营商使用的标准协议之一,用于与短信中心(SMSC)通信。“傲天”指的是提供API的第三方服务提供商,可能...
中国联通短信网关接入程序是基于SGIP1.2协议实现的,这个协议是中国联通用于与SP(服务提供商)进行通信的一种标准。SGIP1.2是SMGP(Short Message Gateway Protocol)的升级版本,主要用于短信的发送、接收、查询等...
标题中的“联通的短信网关程序sgip1.3”指的是中国联通用于处理短信服务的网关应用程序,这个程序是基于SGIP(Short Message Internet Protocol)1.3版本开发的。SGIP是一种在中国广泛使用的短信传输协议,它允许...
【联通 VAC 程序代码 - for unicom VAC】相关的知识点主要集中在通信行业的增值服务应用,特别是中国联通的增值服务接入代码。VAC(Value-Added Service Center)是运营商为提供增值业务服务而设立的中心,它允许...
标题“mi4-unicom-onekey-recovery.zip”暗示了这是一个专为小米4(Mi4)手机用户设计的恢复工具包,主要目的是帮助用户轻松进行系统恢复或升级。描述中的“让小米伙伴用着顺手的工具”进一步确认了这个工具的易用性...
该协议支持连接模式、轮询模式等多种工作方式,包括提交短信、接收短信、查询状态、退订等操作。在开发基于CMPP的短信应用时,模拟网关可以帮助开发者模拟真实的网络环境,进行功能测试和性能评估。 2. SGIP1.2协议...
UNICOM3是一款强大的串行通信软件,主要用于对嵌入式系统进行程序下载、在线调试和故障诊断。它支持多种通信协议,如RS-232、RS-485、TCP/IP等,能适应各种复杂的网络环境。通过UNICOM3,工程师可以方便地将编译好的...
SGIP(China Unicom Short Message Gateway Protocol)是中国联通推出的一种专用于短信服务的协议,它允许第三方服务提供商(SP)直接与联通的短信网关进行交互,实现短信的发送和接收。该协议在2001年十月发布了...
20130608更新的Unicom IP
在中国的电信行业中,三大运营商——中国移动、...通过深入学习这些文档,可以了解到如何建立和维护与运营商短信系统的连接,如何封装和解析短信报文,以及如何处理各种通信异常,从而提升短信服务的质量和用户体验。
5. **ISMG/SMSC** - 交互式短消息服务网关和短消息服务中心,处理SMS消息。 6. **集中用户数据和计费系统** - 存储用户信息,进行计费处理。 7. **内容适配系统** - 负责不同格式的内容转换。 8. ** ENUM DNS** - ...
"SMP.rar_smp_收发短信_移动_移动 短信_联通 短信"是一个专注于短信收发功能的软件包,它实现了对四大网络——移动、联通、电信、网通的支持,使得用户可以通过单一平台进行跨网络的短信通信,极大地提升了通信效率...
Unicom-Mini 是一款实现中国联通MINI电子营业厅设备的业务功能;该项目主要由客户端和服务器组成。客户端主要有购买电子卡,充值缴费,话费查询等功能,服务器主要是接收客户端发过来的业务包,然后查询数据后再把...
联通SGIP1.2协议,全称为China Unicom Short Message Gateway Interface Protocol 1.2,是中国联通推出的一种短消息网关接口标准,用于实现第三方应用与中国联通短信中心之间的通信。这个协议主要用于企业或服务提供...
安卓手机使用PPPoE拨号连接unicom简单教程 本篇教程旨在指导用户如何使用安卓手机通过PPPoE拨号连接unicom无线网络。下面是详细的操作步骤和相关知识点: 一、PPPoE拨号的基本概念 PPPoE(Point-to-Point ...
【标题】"new-unicom-sign" 指的可能是一个与中国联通相关的签名或认证系统,这通常涉及到网络通信安全和身份验证。在JavaScript环境下,这样的系统可能利用前端技术实现用户交互,同时与后端服务器进行安全通信。 ...
2018-CCF大数据与计算智能大赛-电信行业现有用户智能套餐个性化匹配模型-中国联通大赛-半决赛第二名-【多类别】,嵌入】_2018-CCF-BDCI-China-Unicom-Researcher
SGIP1.2是中国联合通信公司在2001年推出的一个短消息网关系统接口协议的版本。这个协议主要设计用于在短消息服务中心(SMSC)与服务提供商(SP)之间进行高效、可靠的数据交换,以支持短信业务的运营。SGIP1.2的目的...
在提供的文件名称列表中,“unicom-ig-master”可能代表项目的主分支或源代码仓库。"master"通常是Git版本控制系统中的默认分支,存放项目的主要代码和最新稳定版本。这暗示项目可能采用了Git进行版本控制,便于团队...
com.sinovatech.unicom.ui.apk