长短信处理方案
上次写过对短信发送的处理,并没有体现出对长短信的处理方案,在实际应用中发现了以下问题,对于短信长度超过指定的大小时会出现截短的现象.
原信息地址:(里面有源码,和相关的配置),主要对以下方法进行修改
http://blog.csdn.net/fjfdszj/archive/2008/12/18/3549811.aspx
1)这种方案是处理长短信的方式(可以实现向客户端发送的连续的多条短信合并成一条在客户端的手机上显示)
/**
* 华为短信发送类处理(公用类)
*
* @param 短信类,包括手机号,内容,序号
*/
public int SendMessage(SmsBean sms) {
// 当短信收发接口为空时重新初始化
if (myProxy == null) {
System.out.println("myProxy==null");
ProBaseConf();
System.out.println("myProxy信息:" + myProxy.toString());
}
// System.out.println("myProxy.getConnState():"+myProxy.getConnState().toString());
// 返回结果
int result = 0;
// 发送号码
ArrayList telList = sms.getMobileNoList();
dest_Terminal_Id = new String[telList.size()];
for (int i = 0; i < telList.size(); i++) {
dest_Terminal_Id[i] = telList.get(i).toString();
}
// 存活有效期
valid_Time = new Date(System.currentTimeMillis() + (long) 0xa4cb800); // new
// Date();//
// 定时发送时间
at_Time = null;// new Date(System.currentTimeMillis() + (long)
// 0xa4cb800); //new Date();
// 用户手机上显示为短消息的主叫号码
// src_Terminal_Id=src_Terminal_Id+"001";
//封装回执短信处理机制
String src_TerminalTmp=src_Terminal_Id;
if(sms.getSn().length()==8){
src_TerminalTmp=src_TerminalTmp+sms.getSn();//组装原发送号
}
try {
byte[]messageUCS2;
messageUCS2 = sms.getSmsContent().getBytes("UnicodeBigUnmarked");
int messageUCS2Len = messageUCS2.length;
//长短信长度
int maxMessageLen = 120;
//长短信发送
tp_Udhi= 1;
msg_Fmt = 0x08;
int messageUCS2Count=0;
if(messageUCS2Len % (maxMessageLen - 6)==0)
messageUCS2Count = messageUCS2Len / (maxMessageLen - 6);
else
messageUCS2Count = messageUCS2Len / (maxMessageLen - 6) + 1;
//长短信分为多少条发送
byte[]tp_udhiHead = new byte[6];
tp_udhiHead[0] = 0x05;
tp_udhiHead[1] = 0x00;
tp_udhiHead[2] = 0x03;
tp_udhiHead[3] = 0x0A;
tp_udhiHead[4] = (byte)messageUCS2Count;
tp_udhiHead[5] = 0x01;
pk_Total=messageUCS2Count;
//默认为第一条
for (int i = 0; i < messageUCS2Count; i ++ )
{
tp_udhiHead[5] = (byte)(i + 1);
pk_Number=i+1;
if (i != messageUCS2Count - 1)
{
//不为最后一条
msg_Content = byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), (i + 1) * (maxMessageLen - 6));
}
else
{
msg_Content = byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), messageUCS2Len);
}
// 初始化提交信息
CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(pk_Total,
pk_Number, registered_Delivery, msg_Level, service_Id,
fee_UserType, fee_Terminal_Id, tp_Pid, tp_Udhi,
msg_Fmt, msg_Src, fee_Type, fee_Code, valid_Time,
at_Time, src_TerminalTmp, dest_Terminal_Id,
msg_Content, reserve);
CMPPSubmitRepMessage submitRepMsg = (CMPPSubmitRepMessage) myProxy.send(submitMsg);
if (submitRepMsg!= null) {
result = 1;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return result;
}
return result;
}
2)长短信拆分发送显示前缀方案:(这种方案首先保证数据的完整性,同时有时序性)
/**
* 华为短信发送类处理(公用类)
*
* @param 短信类,包括手机号,内容,序号
*/
public int SendMessage(SmsBean sms) {
// 当短信收发接口为空时重新初始化
if (myProxy == null) {
System.out.println("myProxy==null");
ProBaseConf();
System.out.println("myProxy信息:" + myProxy.toString());
}
// System.out.println("myProxy.getConnState():"+myProxy.getConnState().toString());
// 返回结果
int result = 0;
// 发送号码
ArrayList telList = sms.getMobileNoList();
dest_Terminal_Id = new String[telList.size()];
for (int i = 0; i < telList.size(); i++) {
dest_Terminal_Id[i] = telList.get(i).toString();
}
// 存活有效期
valid_Time = new Date(System.currentTimeMillis() + (long) 0xa4cb800); // new
// Date();//
// 定时发送时间
at_Time = null;// new Date(System.currentTimeMillis() + (long)
// 0xa4cb800); //new Date();
// 用户手机上显示为短消息的主叫号码
// src_Terminal_Id=src_Terminal_Id+"001";
//封装回执短信处理机制
String src_TerminalTmp=src_Terminal_Id;
if(sms.getSn().length()==6){
src_TerminalTmp=src_TerminalTmp+sms.getSn();//组装原发送号
}
try {
//msg_Content分隔
// 发送内容
String smscontent = sms.getSmsContent().toString();
int len=smscontent.length();//字符长度
int pagesize=59; //每页大小138~139,对应89
//double page=Math.ceil((double)len/(double)pagesize); //页数
int page=0;
if(len % pagesize>0)
{
page=len/pagesize+1;
}else
page=len/pagesize;
//长短信发送方法
pk_Total=page;
msg_Fmt=15;
for (int m = 1; m <= page; m++) {
msg_Content=null;
try {
if (m==page) {
msg_Content = ("("+m + "/" + page+")" + smscontent.substring(0)).getBytes("GBK");//UTF-16BE ,GBK
} else {
msg_Content = ("("+m + "/" + page +")"+ smscontent.substring(0,pagesize)).getBytes("GBK");//UTF-16BE, GBK
smscontent = smscontent.substring(pagesize).intern();// 页面截取为下一轮准备
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//长短信发送方法
pk_Number=m;
// 初始化提交信息
CMPPSubmitMessage submitMsg = new CMPPSubmitMessage(pk_Total,
pk_Number, registered_Delivery, msg_Level, service_Id,
fee_UserType, fee_Terminal_Id, tp_Pid, tp_Udhi,
msg_Fmt, msg_Src, fee_Type, fee_Code, valid_Time,
at_Time, src_TerminalTmp, dest_Terminal_Id,
msg_Content, reserve);
CMPPSubmitRepMessage submitRepMsg = (CMPPSubmitRepMessage) myProxy.send(submitMsg);
if (submitRepMsg!= null) {
result = 1;
}
/*
if (submitRepMsg.getResult() == 0) {
result = 1;
}
* */
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return result;
}
return result;
}
3.比较,总结
方案一:将客户需要接收的一条长短信内容整合成一条信息,比较容易对一件事情进行处理.
方案二:可以支持那些不支持接收长短信的手机.这种交互方式会比较好.
现在使用的系统采用的是方案一,最初采用的是方案二,但客户提出处理的时候需要对短信进行合并处理,这样可能会比较好的节省流量.
分享到:
相关推荐
《中国移动短信协议(CMPP2.0)详解》 中国移动短信协议,简称CMPP,是通信行业中用于短信服务的一种重要协议。...在实际应用中,应结合具体业务场景,灵活运用CMPP2.0的各种特性,以实现最佳的短信服务解决方案。
总结,CMPP 2.0 C#源码为开发者提供了一套完善的短信服务解决方案,其稳定性和可靠性已经在多个工程中得到验证。通过理解CMPP协议和源码实现,开发者可以更好地利用这个工具,实现高效、安全的短信服务。
总的来说,"CMPP2.0模拟软件"是开发和维护基于CMPP协议的短信服务应用的重要辅助工具,它帮助开发者在实际部署前验证和优化其解决方案,确保服务的稳定性和可靠性。通过深入理解和熟练使用这款软件,可以提高短信...
综上所述,CMPP2.0商业网关是基于C#的高效短信传输解决方案,具有强大的长短信处理能力和灵活的配置选项,结合SQL Server数据库支持,能够满足各种商业场景下的短信服务需求。配合提供的资源文件,用户可以快速部署...
CMPP2.0主要用于短消息的提交、查询和接收,而CMPP3.0在2.0的基础上增加了更多功能,如支持长短信、彩信和WAP Push等。在Netty4框架下实现CMPP协议,可以充分利用Netty的非阻塞I/O模型,提高系统的并发处理能力和...
在CMPP2.0中,短信被分为普通短信和长短信两类。长短信是指超过70个字符的短信,需要通过特殊编码方式拆分成多条短消息发送。尽管此平台目前仅支持普通短信,但开发者可以根据需求自行修改源码来实现长短信功能。 ...
本资源“最新cmpp模拟器.zip”包含了一个Windows版的CMPP2.0模拟器,用于模拟中国移动短信网关的行为,帮助开发者在开发和测试短信应用时,无需实际连接到真实的短信网关就能进行调试和验证。这对于短信服务提供商...
CMPP3.0是该协议的一个版本,它在CMPP2.0的基础上进行了优化和扩展,提供了更高效、更安全的数据交换机制。 在这个“C# 版CMPP3.0短信程序”中,我们主要讨论以下几个关键知识点: 1. **C#编程语言**:C#是一种...
CMPP2.0主要处理单条短信提交、查询、接收等功能,而CMPP3.0在2.0的基础上增加了群发、长短信拆分与合并、上行短信处理等特性,提升了系统的并发处理能力。该库实现了这两个版本,能够适应不同的业务需求。 EMPP则...
中国移动的CMPP2.0(China Mobile Packet Platform)协议是一种专为短信服务设计的通信协议,主要...通过学习和掌握CMPP2.0协议以及如何使用模拟网关,开发者可以更好地为中国移动的短信服务提供稳定可靠的解决方案。
例如,2.0版本支持长短信的拆分与合并,提高了短信处理的效率,并引入了更丰富的错误代码,使得故障定位更加准确。此外,2.0版本还支持多连接并发,可以有效提高短信服务的吞吐量。 **短信服务流程** 1. **连接...
CMPP3.0在CMPP2.0的基础上进行了优化和增强,提高了系统的处理能力和安全性。 CMPP3.0协议的核心组成部分包括连接建立、消息传输、状态报告以及断开连接等环节。在连接建立阶段,SP通过TCP连接到SP Gateway,并进行...
CMPP2.0主要适用于单向的短信服务,如验证码发送、营销短信等,而CMPP3.0则在2.0的基础上增加了交互式和双向短信功能,如短信回复、上行短信处理等。这两个协议都具有高并发处理能力和低延迟的特点,适合大型企业或...
CMPP2.0是其第二个版本,提供了一种点对点的通信方式,支持大规模并发处理,适用于高负载的短信业务。该协议包括连接管理、消息提交、接收、查询等功能,且具备较高的灵活性和扩展性。CMPP2.0文档应该详细阐述了协议...
SGIP适合对速度要求高的场景,CMPP2.0则更适合处理复杂业务逻辑,而SMPP则为全球范围内的跨平台通信提供了标准化解决方案。了解并掌握这些协议对于开发和维护短信服务系统至关重要,可以优化通信效率,提升用户体验...
CMPP2.0主要用于普通短信的发送,而CMPP3.0则增加了对彩信和WAP Push的支持,同时提升了处理能力,适合大规模并发的短信业务。 TCPServerPressureTest.exe是该压测工具的主要执行程序,它模拟大量客户端同时发送...
实现了以CMPP2.0和CMPP3.0移动短信网关协议方式接入中国移动短信服务,可以作为标准的企业短信平台,商务短信平台和短信发送平台解决方案。 兼容所有移动短信网关,支持长短信和wappush,提供业务对接接口,发送速度...
CMPP2.0和CMPP3.0是中国移动的短消息传输协议,它们允许高效地处理大量短信并发请求。 2. **HTTPS接口**:用于客户端的CRM系统或其他业务系统与短信平台之间的安全通信,确保数据传输的隐私性和完整性。 3. **...
2.2.1 CMPP 2.0 话单:CMPP(China Mobile Peer to Peer)是中国移动制定的短消息传输协议,话单包含与CMPP 2.0协议相关的字段,如消息ID、连接ID、服务代码等。 2.2.2 CMPP 3.0 话单:CMPP 3.0增加了更多的业务支持...