`
folie2006
  • 浏览: 34512 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PDU短信格式(接收到的)

阅读更多

由于短信收到设备中,设备读取短信是以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();
	}

 

 

另外,发送时的格式与这又不一致了。。。

0
2
分享到:
评论

相关推荐

    PDU短信解析-生成工具.zip

    PDU短信解析工具的作用在于,当接收到PDU格式的短信时,它可以将这些二进制数据还原成普通文本,帮助用户理解短信内容。工具通常会分析PDU字符串,识别出其中的各个字段,如收件人、发件人、短信时间等,并将内容...

    短信pdu编码解码_短信_短信PDU编码_pdu_

    短信PDU解码则是上述过程的逆操作,将接收到的PDU格式的短信恢复成人类可读的文本格式。解码过程包括识别和解析PDU中的各个字段,如电话号码、短信类型、短信内容等。此外,还需要正确处理字符集和校验和,以确保...

    PDU短信格式及说明

    根据提供的文档信息,本文将对PDU短信格式及其在西门子模块中的应用进行详细的解析。主要内容包括:PDU的基本概念、短信格式介绍、西门子模块中的AT指令集使用方法以及具体的示例。 ### PDU基本概念 PDU全称...

    PDU短信编解码demo,c语言

    - `pdu_decode.c`:负责将接收到的PDU数据解码回文本格式。 - `pdu_utils.c`:可能包含一些辅助函数,如二进制与16进制之间的转换,以及对PDU部分的处理。 - `main.c`:主程序,提供命令行接口,允许用户输入文本...

    gsm-PDU.zip_gsm pdu_pdu_pdu.c_pdu短信格式_单片机pdu短信

    通过编译和链接这个文件,可以将PDU短信发送功能集成到单片机应用程序中。 综上所述,掌握PDU格式短信的原理和处理方法对于使用单片机进行GSM短信通信至关重要。通过编写适当的代码并利用GSM模块,我们可以实现从...

    pdu短信格式详细说明(发送和接收)

    #### 三、接收PDU短信的格式 接收PDU短信时,同样需要关注上述参数。不同之处在于: 1. **FO (Field Octet)**:字段标识符,在接收时默认为 **04H**。 2. **其他参数**:接收时的参数与发送时基本相同,但在解析...

    PDU 短信编解码工具(升级版)

    1. 分析接收到的PDU格式短信,提取出发送者、接收者、短信内容等关键信息。 2. 验证短信编码的正确性,避免因为编码问题导致的通信障碍。 3. 快速生成符合规范的PDU编码,用于模拟发送测试短信。 4. 了解不同字符集...

    短信编码PDU生产解析工具

    同时,它还具备PDU包的解码功能,能将接收到的PDU数据还原为可读的文本格式,这对于调试过程中检查短信的正确性非常有帮助。 使用这个工具的过程大致如下: 1. 输入或复制需要发送的中文短信内容。 2. 软件会自动将...

    网页版PDU格式编码_解码

    它针对开发者在短信通信中可能遇到的格式编码和解码需求,提供了直接的操作界面,通过该工具可以轻松实现从短信内容到PDU格式的转换,以及从接收到的PDU数据中恢复出原始的短信文字。更重要的是,它能够生成可以直接...

    AT指令长短信接收PDU格式分析

    ### AT指令长短信接收PDU格式分析 #### 一、引言 随着移动通信技术的发展,短信服务已经成为人们日常生活中不可或缺的一部分。为了适应更复杂的通信需求,如发送长短信等,AT指令集提供了相应的功能来处理这些场景...

    PDU编码 短信的接收与发送

    它涉及到短信的发送与接收过程中的数据格式化,使得短信能够在不同设备之间进行有效的传输。在本文中,我们将详细介绍PDU编码的相关知识点,并探讨其在短信收发过程中的具体应用。 #### 二、PDU编码模式 在GSM协议...

    AT指令发送PDU短信详解

    短信格式的编码主要是有两种一个是 text 格式的,明文不用解码一看就懂, 一个是 PDU 格式的, 国内的都是的 PDU 格式的。 以下分析的都是 PDU 格式数据包。 2.PDU 格式的数据包,发送的数据包和...

    PDU 短信测试.docx

    PDU短信测试主要涉及到GSM通信系统中的短消息服务(SMS),其中PDU(Protocol Data Unit,协议数据单元)是短信的一种编码格式。在GSM网络中,短信可以通过文本模式(Text Mode)或PDU模式(PDU Mode)进行发送。PDU...

    PDU短信编码器

    同时,它也能将接收到的PDU格式短信解码回可读的文本形式。 6. **开发应用**:对于开发人员来说,理解PDU编码是至关重要的,特别是在开发短信服务应用、手机应用或者与GSM网络交互的系统时。PDU短信编码器可以帮助...

    PDU格式发送短信

    完美实现GSM模块发送中文PDU格式短信,包含常用字库

    PDU短信编码工具

    PDU短信编码是一种在GSM通信系统中用于发送和接收短信的二进制编码格式,全称为Protocol Data Unit。这个工具对于那些想要深入了解移动通信技术,尤其是短信服务(Short Message Service, SMS)的人来说非常有用。...

    PDU 短信 解码 编码

    1. **解析PDU**:首先,从接收到的PDU字符串中提取出各个控制参数和数据部分。 2. **提取TP-UDH**:分析TP-UDH,以确定短信的分段情况。 3. **解码TP-UD**:根据选定的字符集对TP-UD进行解码,恢复原始文本内容。 4....

    pdu编码pdu编码

    总的来说,PDU编码是短信通信中的一个重要技术,它允许发送和接收包含各种字符集的短信,尤其是对于支持多语言环境的应用程序来说,理解和运用PDU编码是必不可少的技能。在处理PDU编码时,还需要注意字符填充、校验...

    pdu长短信接收及发送

    - 对于编程实现,通常需要编写函数或库来将普通文本转换为PDU格式,以及将接收到的PDU数据还原为可读文本。 总之,PDU长短信是一种在GSM网络中传输长文本信息的方法,通过分段、编码和解码来实现。理解其格式和...

Global site tag (gtag.js) - Google Analytics