辞职后我就在yiDong从事短信和群发的工作,从北京方面的专家哪里学会了发送短信,一开始只能发送短短信,就是不超过140个字符,如果超过我就分割然后分成短的发送。一直不能发送超过140字符的。后来经过我阅读了很多人帖子才实现,主要是看了下面的内容,然后修改了代码才实现的。希望能够帮助和我一样迷茫的朋友把。
http://blog.csdn.net/pwlazy/archive/2010/03/05/5349625.aspx大家有什么不明白的可以看这里,写的很好。
我来说说我的实现吧:
1.以前我们可以发短短信的的时候的那个CMPPSubmitMessage。我们还是会用这个。我开发使用的是华为的一个短信开发包做的。这个包是移动给的。要做短信网关都可以叫移动提供。发短信用的是这个com.huawei.smproxy.CMPPSMProxy.send(CMPPSubmitMessage
msgvo) 方法发送的。长短信也是用这个发送。
CMPPSubmitMessage 类中的几个属性给说明一下:
/**
* 相同Msg_Id的信息总条数,从1开始
*/
int pkTotal = 1;
/**
* Pk_number 1
Unsigned Integer 相同Msg_Id的信息序号,从1开始
*/
int
pkNumber = 1;
/**
* Registered_Delivery 1
Unsigned Integer 是否要求返回状态确认报告:
0:不需要
1:需要
2:产生SMC话单
(该类型短信仅供网关计费使用,不发送给目的终端)
*/
int registeredDelivery
= 1;
/**
* Msg_level 1 Unsigned Integer
信息级别
*/
int msgLevel = 3;
/**
* Service_Id 10 Octet String 业务类型,是数字、字母和符号的组合。
*/
String serviceID = "XXXXX";
/**
* Fee_UserType
* 计费用户类型字段
0:对目的终端MSISDN计费;
1:对源终端MSISDN计费;
2:对SP计费;
3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
*/
int
feeUserType = 2;
/**
*
被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
*/
String feeTerminalID = "";
/**
* GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
*/
int tpPID = 0;
/**
*
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
*
长消息:1.短消息是:0
*/
// int tpUDHI
= 0;
/**
* 信息格式
0:ASCII串
3:短信写卡操作
4:二进制信息
8:UCS2编码
15:含GB汉字 。。。。。
*/
// int msgFMT =
8;
/**
* 信息内容来源(SP_Id)
*/
String msgSrc = "XXXX";
/**
* 资费类别
01:对“计费用户号码”免费
02:对“计费用户号码”按条计信息费
03:对“计费用户号码”按包月收取信息费
04:对“计费用户号码”的信息费封顶
05:对“计费用户号码”的收费是由SP实现
*/
String feeType =
"01";
/**
* 资费代码(以分为单位)
*/
String feeCode = "0";
/**
* 存活有效期,格式遵循SMPP3.3协议
*/
Date validTime =
null;
/**
* 定时发送时间,格式遵循SMPP3.3协议
*/
Date atTime = null;
/**
*
源号码
SP的服务代码或前缀为服务代码的长号码,
网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,
该号码最终在用户手机上显示为短消息的主叫号码
*/
//String srcTerminalID
= "XXXXXX";
/**
* 接收短信的MSISDN号码
*/
//String[] destTerminalID =
{"XXXXX"};
这个类中很多地方是可以不用管的,要以长短信要修改的有:
1.// int tpUDHI = 1; 这个要修改为1.
2 int msgFMT = 8;
只能用UCS2编码格式
3 将长短信分成好几条短短信发送。
第1,2好修改。
第3点,我这里写了一个实现类:
import java.util.ArrayList;
import
java.util.List;
public class LongMessageByte {
public static
List
List
new ArrayList
try {
byte[] messageUCS2;
messageUCS2 = message.getBytes("UnicodeBigUnmarked");
int messageUCS2Len
= messageUCS2.length;// 长短信长度
int maxMessageLen = 140;
if
(messageUCS2Len > maxMessageLen) {// 长短信发送
//int tpUdhi = 1;
//长消息是1.短消息是0
//int msgFmt = 0x08;//长消息不能用GBK
int
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;// 默认为第一条
for (int i = 0; i < messageUCS2Count;
i++) {
tp_udhiHead[5] = (byte) (i + 1);
byte[]
msgContent;
if (i != messageUCS2Count - 1) {// 不为最后一条
msgContent=byteAdd(tp_udhiHead,
messageUCS2,
i*(maxMessageLen-6),
(i+1)*(maxMessageLen-6));
list.add(msgContent);
} else {
msgContent=byteAdd(tp_udhiHead,
messageUCS2, i*(maxMessageLen-6),
messageUCS2Len);
list.add(msgContent);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return
list;
}
private static byte[] byteAdd(byte[] tpUdhiHead,
byte[] messageUCS2, int i,
int j) {
byte[] msgb = new
byte[j-i+6];
System.arraycopy(tpUdhiHead,0,msgb,0,6);
System.arraycopy(messageUCS2,i,msgb,6,j-i);
return
msgb;
}
}
以前发短短信时是这样的:
message = new CMPPSubmitMessage(pkTotal, pkNumber,
registeredDelivery, msgLevel, serviceID, feeUserType,
feeTerminalID, tpPID,0,15,
msgSrc,
feeType, feeCode, validTime, atTime, srcTerminalID,
destTerminalID, msgContent.getBytes(“GBK”),
"");
现在发第消息时就如下发:
List
LongMessageByte.getLongByte(msgContent);
for(byte[]
msg:list){
message = new CMPPSubmitMessage(pkTotal, pkNumber,
registeredDelivery, msgLevel, serviceID, feeUserType,
feeTerminalID, tpPID, 1,
8, msgSrc,
feeType, feeCode, validTime,
atTime, srcTerminalID,
destTerminalID,msg, "");
System.out.println(message);
System.out.println(sender.getConnState());
returnMsg =
sender.send(message);
System.out.println(returnMsg);
}
这样就行了,具体的协议可以去看看http://blog.csdn.net/pwlazy/archive/2010/03/05/5349625.aspx这位大家写的。
转自:http://hi.baidu.com/hhayy7758/item/e7a3c7c7952d4860f6c95d53