cmpp 2.0 短信回复,乱码如何处理?

山城忙碌人 2012-04-06 02:23:52
问题如下:
使用cmpp2.0接口,获取短信回复内容的时候,回复的内容是字母或数字的时候,也会出现乱码,请问如何解决呢?
相关代码和相关输出如下:
public CMPPMessage onDeliver(CMPPDeliverMessage msg) {
CMPPDeliverMessage deliverMsg = (CMPPDeliverMessage) msg;
byte [] content = deliverMsg.getMsgContent();
System.out.println(content .toString()+","+new String(content )+","+new String(content .toString().getBytes("gbk")+","+new String(content .toString().getBytes("utf-8")));
这样输出都是乱码,请问下有经验的朋友,这种问题应该怎么处理呢?
...全文
454 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
山城忙碌人 2012-07-04
  • 打赏
  • 举报
回复
谢谢兄弟!ziggo26
我接收的还是普通的短信,还没有接收到长短信。


我接收到的信息:
msg.getMsgFmt() 有些时候不等8也不等于15

msg.getMsgFmt() 这个值是0 是0就必是乱码。
ziggo26 2012-06-29
  • 打赏
  • 举报
回复
可以参考一下这个,是我的项目里用到的,可以正常显示上行短信

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);
}
山城忙碌人 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

原内容直接new后toString,[B@1360b85 你要new String(原内容,"GBK")这样因为端口发送的是byte[]是个数组
[/Quote]

谢谢!我试一下!
你的意思是:
String resultContent = new String(deliverMsg.getMsgContent(),"GBK");
System.out.println(resultContent );
这样,是吧!
dmbalexander 2012-05-20
  • 打赏
  • 举报
回复
原内容直接new后toString,[B@1360b85 你要new String(原内容,"GBK")这样因为端口发送的是byte[]是个数组
山城忙碌人 2012-04-09
  • 打赏
  • 举报
回复
有谁遇到过这种问题呢? 没有人会吗?
山城忙碌人 2012-04-06
  • 打赏
  • 举报
回复
有谁遇到过这种问题呢?
山城忙碌人 2012-04-06
  • 打赏
  • 举报
回复
特别声明,发数字和字母都会出现乱码!输出信息如下:
Util.print("短信上行的内容 8:==其余编码:" + deliverMsg.getMsgFmt()+ ",手机号码," + deliverMsg.getSrcterminalId()+ ",直接toString,"+ deliverMsg.getMsgContent().toString() + ",原内容直接new:"+ new String(deliverMsg.getMsgContent())+ ",原内容直接new后toString,"
+ new String(deliverMsg.getMsgContent().toString())+ ",new-gbk,"+ new String(deliverMsg.getMsgContent().toString().getBytes("gbk"))+",new-utf,"+ new String(deliverMsg.getMsgContent().toString().getBytes("utf-8"))+ ",直接getByte,"
deliverMsg.getMsgContent().toString().getBytes());

短信上行的内容 8:==其余编码:0,手机号码,XXXX,直接toString,[B@1710da2,原内容直接new:,原内容直接new后toString,[B@1360b85,new-gbk,[B@12e7892,new-utf,[B@1edbcec,直接getByte,[B@1317452
Ade子夜 2012-04-06
  • 打赏
  • 举报
回复
期待着!!

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧