cmpp2.0長簡訊的處理方案
長簡訊處理方案
上次寫過對簡訊傳送的處理,並沒有體現出對長簡訊的處理方案,在實際應用中發現了以下問題,對於簡訊長度超過指定的大小時會出現截短的現象.
原資訊地址:(裡面有原始碼,和相關的配置),主要對以下方法進行修改
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.比較,總結
方案一:將客戶需要接收的一條長簡訊內容整合成一條資訊,比較容易對一件事情進行處理.
方案二:可以支援那些不支援接收長簡訊的手機.這種互動方式會比較好.
現在使用的系統採用的是方案一,最初採用的是方案二,但客戶提出處理的時候需要對簡訊進行合併處理,這樣可能會比較好的節省流量.