半桶水开发 CMPP2.0 with Spring + JPA 2

本文介绍了一个基于CMPP2.0协议的短信发送系统实现,利用Spring框架和JPA进行开发。主要内容包括自定义发送代理CMPPProxy类的设计与实现,该类负责短信消息的接收、处理及发送,并支持回执功能。
[list]
[*][url=http://rikugun.iteye.com/blog/296384]半桶水开发 CMPP2.0 with Spring + JPA 1[/url]
[*][url=http://rikugun.iteye.com/blog/296439]半桶水开发 CMPP2.0 with Spring + JPA 2[/url]
[*][url=http://rikugun.iteye.com/blog/297369]半桶水开发 CMPP2.0 with Spring + JPA 3[/url]
[/list]

接上,这贴一下自定义的发送代理

CMPPProxy.java

public class CMPPProxy extends SMProxy {
//保存下发短信的队列
private static BlockingQueue<CMPPDeliverMessage> deliveMsgs = new LinkedBlockingQueue<CMPPDeliverMessage>(15);
/*
* 返回一个实例
* @return CMPPProx 返回一个实例
*/
public static CMPPProxy getInstance() {
if (instance == null) {
instance = new CMPPProxy();
}
return instance;
}
/*
* 获取保存下发短信的队列
* @return BlockingQueue<CMPPDeliverMessage>
*/
public BlockingQueue<CMPPDeliverMessage> getDeliveMsgs() {
return deliveMsgs;
}

protected CMPPProxy() {
super(arg);
}

public void OnTerminate() {
System.out.println("Connection have been breaked! ");
}
/*
* 收到下发短信触发的事件 如果需要返回回执的话就返回一个 CMPPMessage到网关中
* @return CMPPMessage
*/
@Override
public CMPPMessage onDeliver(CMPPDeliverMessage msg) {
byte msgId[] = msg.getMsgId();
if (msg.getRegisteredDeliver() == 1) { //是否要回执
if (String.valueOf(msg.getStat()).equalsIgnoreCase("DELIVRD")) {
System.out.println(String.valueOf(String.valueOf((new StringBuffer("\t\treceived DELIVRD message msgid=[")).append(msg.getMsgId()).append("]"))));
// long submitMsgId = TypeConvert.byte2long(msg.getStatusMsgId());
try {
CMPPDeliverRepMessage cmppdeliverrepmessage = new CMPPDeliverRepMessage(msgId, 0);
return cmppdeliverrepmessage;
} catch (Exception ex) {
CMPPDeliverRepMessage cmppdeliverrepmessage1 = new CMPPDeliverRepMessage(msgId, 9);
return cmppdeliverrepmessage1;
}
} else {
return new CMPPDeliverRepMessage(msgId, 9);
}
} else {
System.out.println("Get a Deliver..");
try {
deliveMsgs.put(msg); //把收到的非回执短信保存到队列中待处理
} catch (InterruptedException ex) {
Logger.getLogger(CMPPProxy.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Total [" + deliveMsgs.size() + "]DeliverMessages");
System.out.println(String.valueOf(String.valueOf((new StringBuffer("\t\treceived non DELIVRD message msgid=[")).append(msg.getMsgId()).append("]"))));
return new CMPPDeliverRepMessage(msgId, 9);
}
}
/*
* 封装过的发送函数
* @param CMPPSubmitMessage 短信
* @return boolean 是否发送成功
*/
public boolean send(CMPPSubmitMessage msg) {
if (msg == null) {
return false;
}
CMPPSubmitRepMessage reportMsg = null;
try {
reportMsg = (CMPPSubmitRepMessage) super.send(msg);

if (reportMsg == null) {
return false;
}
} catch (IOException ex) {
ex.printStackTrace();
return false;
}
return true;
}
/*
*发送短信,带响应内容
* @param CMPPSubmitMessage
* @return CMPPSubmiReptMessage 响应内容
*/
public CMPPSubmitRepMessage sendWithRep(CMPPSubmitMessage msg) {
CMPPSubmitRepMessage reportMsg = null;
try {
reportMsg = (CMPPSubmitRepMessage) super.send(msg);
} catch (IOException ex) {
ex.printStackTrace();
}
return reportMsg;
}
private static Args arg = Env.getConfig().getArgs("CMPPConnect");
public static final String service_Id = Env.getConfig().get("CMPPSubmitMessage/service_Id", "WebSM");
public static final String msg_Src = Env.getConfig().get("CMPPSubmitMessage/msg_Src", "WebSMS");
public static final String connectCode = Env.getConfig().get("CMPPSubmitMessage/src_Terminal_Id", "");
private static CMPPProxy instance;
}
java cmpp2.0 3.0 无jar纯源码demo(含服务端测试工具)[20171205] 找了挺多资料,CMPP的资源很多,但可以参考可用的不多, 特此开源cmpp的DEMO程序,无jar插件,纯源码实现。 语言为:java 工具为:Intellij IDEA 2017 附带第三方CMPP服务器测试工具,便于调试。 注解详细如: private long Msg_Id=0x00;//信息标识,由SP接入的短信网关本身产生,本处填空。 private byte Pk_total=0x01;//相同Msg_Id的信息总条数,从1开始 private byte Pk_number=0x01;//相同Msg_Id的信息序号,从1开始 private byte Registered_Delivery=0x01;//是否要求返回状态确认报告:0:不需要 1:需要 private byte Msg_level=0x01;//信息级别 private String Service_Id="";//业务类型,是数字、字母和符号的组合。 private byte Fee_UserType=0x00;//计费用户类型字段 0:对目的终端MSISDN计费; 1:对源终端MSISDN计费;2:对SP计费 private String Fee_terminal_Id="";//被计费用户的号码 private byte TP_pId=0x00;//GSM协议类型 private byte TP_udhi=0x00;//GSM协议类型。详细是解释请参考 private byte Msg_Fmt=0x0f;//信息格式0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码 (0f)15:含GB汉字 private String Msg_src="";//信息内容来源(SP_Id) private String FeeType="01";//资费类别 01:对“计费用户号码”免费 02:对“计费用户号码”按条计信息费 03:对“计费用户号码”按包月收取信息费 04:对“计费用户号码”的信息费封顶 05:对“计费用户号码”的收费是由SP实现 private String FeeCode="000000";//资费代码(以分为单位) private String ValId_Time="";//存活有效期 private String At_Time="";//定时发送时间 private String Src_Id="";//源号码 SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码 private byte DestUsr_tl=0x01;//接收信息的用户数量(小于100个用户) private String Dest_terminal_Id="";//接收短信的MSISDN号码 private byte Msg_Length;//信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节) private byte[] Msg_Content;//信息内容 private String Reserve="";//保留
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值