51,411
社区成员
发帖
与我相关
我的任务
分享
public CMPPMessage onDeliver(CMPPDeliverMessage msg) {
String msisdn = msg.getSrcterminalId();
String serverNum = msg.getDestnationId();
try {
if (msg.getMsgContent() != null && msg.getMsgContent().length > 0) {
msisdn = msg.getSrcterminalId();
String msgContent = "";
int len = msg.getMsgContent().length;
if (len <= 0) {
return super.onDeliver(msg);
}
/**
* 长短信的头6个字节要特殊处理 前3个字节为5、0、3开头表示是长短信 第4个字节:这批短信的唯一标志
* 第5个字节:这批短信的数量。如果一个超长短信总共5条,这里的值就是5
* 第6个字节:这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2
*/
byte byte1 = 0;
byte byte2 = 0;
byte byte3 = 0;
if (len >= 3) {
byte1 = msg.getMsgContent()[0];
byte2 = msg.getMsgContent()[1];
byte3 = msg.getMsgContent()[2];
}
if (byte1 == 5 && byte2 == 0 && byte3 == 3) {
byte byte4 = msg.getMsgContent()[3];
byte byte5 = msg.getMsgContent()[4];
byte byte6 = msg.getMsgContent()[5];
// 短信内容从第7位开始取
byte[] msgBytes = new byte[msg.getMsgContent().length - 6];
System.arraycopy(msg.getMsgContent(), 6, msgBytes, 0, msg.getMsgContent().length - 6);
String content = new String(msgBytes, "UnicodeBigUnmarked");
// 短信内容前加一个序号,表示是第几条短信
content = byte6 + content;
logger.debugT("收到一个长短信,共" + byte5 + "条,此条是第" + byte6 + "条");
String key = msisdn + "_" + byte4;
if (longMsgMap.containsKey(key)) {
List contentList = (List) longMsgMap.get(key);
contentList.add(content);
if (contentList.size() == byte5) { // 短信已经收完,可以开始组合长短信
String[] contentStr = new String[byte5];
for (int i = 0; i < byte5; i++) {
String temp = (String) contentList.get(i);
int index = Integer.parseInt(temp.substring(0, 1));
contentStr[index - 1] = temp.substring(1, temp.length());
}
for (int i = 0; i < byte5; i++) {
msgContent += contentStr[i];
}
logger.debugT("手机号: " + msisdn + " 发来短信(长度:" + msgContent.length() + "),内容:" + msgContent);
longMsgMap.remove(key); // 从MAP中清除该长短信
parseSMS(serverNum, msisdn, msgContent);
}
} else {
List contentList = new ArrayList();
contentList.add(content);
longMsgMap.put(key, contentList);
}
} else {
logger.debugT("收到一个短短信");
msgContent = new String(msg.getMsgContent(), "GBK");
if (msg.getMsgFmt() == 8) {
msgContent = new String(msg.getMsgContent(), "UnicodeBigUnmarked");
}
logger.debugT("手机号: " + msisdn + " 发来短信(长度:" + msgContent.length() + "),内容:" + msgContent);
parseSMS(serverNum, msisdn, msgContent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return super.onDeliver(msg);
}
private void parseSMS(String serverNum, String msisdn, String msgContent) {
logger.infoT("正在处理" + msisdn + "发送到" + serverNum + "的短信:" + msgContent);
}