由于短信收到设备中,设备读取短信是以PDU格式显示的,但是咱们程序就需要对这类格式进行解释了,网上找了很多资料,但是都是不全,东一块西一块的。
首先来看一下我做的一些测试吧,看demo来讲解
// 07 683108501415F4 【1-12】服务中心的电话号码
// 00 【1】协议数据单元类型
// 05 {长度} A1 {类型} 0180F6 {地址}【2-12】发送方SME的地址
// 00 【1】参数显示SMSC以何种方式处理SM (比如FAX,、Voice等)
// 08 【1】参数表示用户数据(UD)采用什么编码方案
// 11509051208023 【7】参数表示SMSC接收到消息时的时间戳
// 80 【1】用户数据段长度
// 5BF94E0D8D77FF0C60A853D19001768463074EE467098BEF002C8BF768385B9E540E91CD65B053D19001002E7F168F91002200310030003000380036002253D190015230003100300030003800364F7F752877ED4FE184254E1A5385002C67E58BE253CA529E74064E1A52A166F465B94FBF002EFF08653653D1514D8D39FF09
// 【0-140】SM数据
// =========================================================================
// 07 683108100005F0
// 60
// 10 A1 2125------------ //这里为发送者手机号,我给 - 替换了
// 00
// 08
// 11 50 91 70 34 20 23
// 8C
// [05 00 03 DC 02 01] //<----这个为多条短信时,网上的其它文档没有说明
// 9EC46E90003A55114E2D4E2D4E2D867D8FDB6821594B8FDB00205730753C593A5730753C9ED166970020662F4E2D4E2D4E2D4E2D4E2D67AF5706660E56ED593A5730753C534F67E58F698FDB534F67E557288FDB56E065F6534F56FD5730753C534F67E5662F4E2D4E2D4E2D4E2D4E2D67AF5706660E56ED593A5730753C534F67E58F698FDB
我的思路是把上面的信息一块块读取出来。。所以方法比较笨。
1. 取短信中心号长度
就是上面的最开始2位,如:07
static String getServiceCenter(SmsBean smsBean , String sms) {
// 如 : 07 * 2 + 2就得到短信中心号的所有长度
smsBean.setServiceCenterLength(smsBean.getServiceCenterLength() * 2 + 2);
String centerNumber = sms.substring(0, smsBean.getServiceCenterLength());
smsBean.setPduCenterNumber(centerNumber);
log.debug("PDU格式短信中心号码:" + smsBean.getPduCenterNumber());
smsBean.setTemp(sms.replaceAll(smsBean.getPduCenterNumber(), "").substring(2));
centerNumber = centerNumber.substring(2);
StringBuilder builder = new StringBuilder();
// 把号码调整后去除86开头或者由于不足偶数引起补全的F字符
for (int i = 0; i < centerNumber.length(); i += 2) {
builder.append(centerNumber.charAt(i + 1)).append(centerNumber.charAt(i));
}
return builder.toString().replaceAll("^86|F", "");
}
2.提示发件人号码
static String getTelphone(SmsBean smsBean) {
// 读取长度
int beginIndex = Integer.parseInt(smsBean.getTemp().substring(0, 2), 16);
if (beginIndex % 2 != 0) {
// 奇数 +1
beginIndex++;
}
// 跳过 {长度}、{类型} = 4位
smsBean.setPduTelphone(smsBean.getTemp().substring(4, beginIndex + 4));
log.debug("PDU格式的发送方号码:" + smsBean.getPduTelphone());
String telphone = smsBean.getPduTelphone();
smsBean.setTemp(smsBean.getTemp().replaceAll(smsBean.getPduTelphone(), "").substring(8));
// 清除{PDU手机号}去除{长度}、{类型}、{类型}、{编码}的长度8位
StringBuilder builder = new StringBuilder();
for (int i = 0; i < telphone.length(); i += 2) {
builder.append(telphone.charAt(i + 1)).append(telphone.charAt(i));
}
return builder.toString().replaceAll("F", "");
}
3 . 提取短信发送时间
static String getDataTime(SmsBean smsBean) {
log.debug("PDU格式发送时间:" + smsBean.getTemp().substring(0, 14));
//这里的02做法不太合理,由于现在是20XX年了,所以这里添加了这个,要是出现19XX的话就错误了。
String date = "02" + smsBean.getTemp().substring(0, 12);
smsBean.setTemp(smsBean.getTemp().substring(16));
StringBuilder builder = new StringBuilder();
for (int i = 0; i < date.length(); i += 2) {
builder.append(date.charAt(i + 1)).append(date.charAt(i));
}
//这里调用了我写的另一个工具类时行日期格式转换。。
return DateUtils.format(builder.toString(), DatePattern.PATTERN_TWO.getPatten(), DatePattern.PATTERN_ONE.getPatten());
}
4. 提取短信内容
public static String getContent(SmsBean smsBean) {
log.debug("短信内容PDU格式:" + smsBean.getTemp());
// 得判断是否为多条短信发送过来,目前规范中没找到具体的这个说明,所以这里只能判断如果带这个
Matcher matcher2 = Pattern.compile("050003.{2}\\d{2}\\d{2}").matcher(smsBean.getTemp());
StringBuilder _beginStr = new StringBuilder();
while (matcher2.find()) {
// 移除并分析追加短信头
String begin = matcher2.group();
if (begin != null) {
begin = begin.replaceFirst("^050003.{2}", "");
if (begin.length() == 4) {
_beginStr.append("(共").append(begin.substring(0, 2)).append("条,第");
_beginStr.append(begin.substring(2, 4)).append("条) ");
}
}
break;
}
return _beginStr.append(UnicodeConversion.decodeUCS2(smsBean.getTemp().replaceFirst("050003.{2}\\d{2}\\d{2}", ""))).toString();
}
另外,发送时的格式与这又不一致了。。。
分享到:
相关推荐
短信PDU编码,直接填入接收者号码,及短信内容可生成PDU编码 短信PDU解码,可解析接收到的编码格式为PDU的短信内容
完美实现GSM模块发送中文PDU格式短信,包含常用字库
详细说明了pdu格式下的发送短信,和接收短信的详细格式,和参数含义的详细说明
用C语言设计PDU正常短信以及长短信的编码解码
AT指令接收超长短信时PDU报文格式分析,对于AT指令接收超长短息的合并具有很大的参考价值
真正正确的PDU编码,希望对大家更有用!
在这个例子里面。提供了一个 SmsDemo.dll 可以调用动态链接库中的函数实现短信的收发...用户可以收发 PDU 格式的短信,调用十分简单,在例子里都有注释,源码以及生成的可运行文件都在其中,有兴趣的朋友可以下载看看。
短信格式的编码主要是有两种一个是 text 格式的,明文不用解码一看就懂, 一个是 PDU 格式的, 国内的都是的 PDU 格式的。 以下分析的都是 PDU 格式数据包。 2.PDU 格式的数据包,发送的数据包和...
用短信猫做的支持PDU短信发送和接收的编码
pdu格式短信协议,发送短信格式详细介绍,接收短信格式详细介绍
GSM PDU接收和发送短信格式要求 GSM和单片机结合完成短信的接收和发送。
pdu长短信接收及发送,如何拼接以及各个部分数据的详细解释
GSM_8转7bit ,GSM_7转8bit,PDU_收短信, PDU_发短信 PDU发送接收编解码.zip
SMS PDU格式短信发送接收参考手册,很好用用的短信开发指南
介绍计算机上实现gsm modem短消息收发的模式,描述gsm modem PDU 模式,包括PDU 模式下的gsm modem模块UCS2 编码、解码原理,以及gsm modem发送与接收PDU 串的编制方式, VB 中的MSCOMM 控件,实现gsm modem短消息...
一个简单的SMS短信接收程序,采用PDU模式
主要讲解PDU格式的短信的格式,包括发送的短信的格式和接收的短信的格式。 讲得还是挺详细的。 中文的编码这个里面暂时没有,我会再发一个附件,里面包含获取汉字编码的小软件。
详细介绍PDU短信的接收和发送格式,以及格式的编解码。
pdu格式说明中文版,里面举了两个例子,一个是发送的短信一个是接收的短信,讲解很详细。