手机接收的PDU串的分析(包含7-bit和UCS2解码,超长短信解释)

本文介绍了如何解析手机接收的PDU串,包括7-bit和UCS2编码的解码,以及处理超长短信的方法。通过AT命令接口与串口通信,理解短信的结构和编码方式,例如短信的70字符限制,超长短信的分段标志,以及不同编码类型的转换。提供了C#代码示例进行PDU解码,并解释了超长短信报文标志的含义。
摘要由CSDN通过智能技术生成

网络中这方面的资源还挺多的,特别是发短信的源码。利用AT(attention)命令接口控制SIM卡的活动,虽然我们也许不会去写嵌入式系统,但仍然建议基于串口/USB口通过Modem/手机编写AT高级语言编程的朋友们先找本较新版本的《AT Commands Interface》手册读读。对AT命令接口有个认识之后,再去开发你的解决方案。另外,通过串口连接Modem,还需要对串口的基础知识有一些了解,比如基本的常识:端口名称(COM1,COM2...)、波特率(正确的波特率才能与设备正常通信,在终端看到正确的字符编码,否则会是乱码)、校验位(这里通常为0)、数据位(这里通常为8)、停止位(这里通常为1)、读写超时(比如100ms)、串口缓冲区、握手协议(Handshake,通常不设定,由设备自己控制)、RTS是否启用(这里应该启用)、DTR是否启用等等。

.NET Fromework 2.0之后,我们有两种方法解决与串口的通信问题,第一种方式,利用.NET框架中提供的SerialPort类,它可以很好的通过事件的方式监听串口数据,对缓冲区控制也不错,但是要注意,接收事件是在另一个线程进行的,你可能需要维护发送与接收串口数据的同步。第二种方式,使用网络上流传较多的JustinIO类,很简单的类,实现了读写串口的API方法(Read和Write),比较简单易用,但是功能有限,也许需要二次开发。还要明白串口的收发数据的长度需要从缓冲区里读写,也没有读完了或者写完了的说法,只是有数据就提供,需要由自己编写代码来判断数据的长短,是否读取完整。

关于AT命令接口的问题,你需要了解,每条AT命令以CR结束(我也查到过CRLF结束的),命令的返回信息则是被CRLF首尾括起的字符串。什么时候返回什么样的数据,成功(如<CRLF>OK<CRLF>)或者失败(如<CRLF>ERROR<CRLF>但不仅限于它)的提示都需要有一些了解。对得到的回应数据进行分析取舍,来电时或者来短信时,会自动返回的数据。推荐编程之前使用PComm Terminal软件(在国内的大型软件下载站内能够搜索下载到),向Modem测试AT指令。

当我们收到短信时,可能会收到这样的数据:

+CMTI: "SM",1

+CMTI: "SM",2

然后通过AT+CMGR=1或者AT+CMGR=2读取SIM卡中的短信内容,如果设置了PDU格式,那么会得到PDU数据。如果在之前设定过AT+CNMI=2,1,0,0,0,那么短信息会跳过SIM卡的存储,直接显示出收到的数据。将短信模式设置为PDU模式时(at+cmgf=0),在PDU解码时需要注意编码方式,通常有汉字信息的采用UCS2编码(最多70字符),纯英文信息采用7-bit编码(有7位编码算法,可以将ASCII的数字、大小写字母转换成该编码,但是标点符号就无能为力了,最多160字符),图像和铃声采用8-bit编码(最多140字节)。在7位编码的时候建议用文本模式(at+cmgf=1)去读取短信,就不必进行7-bit解码,而且能够显示正确的标点。 
下面是设备收到PDU信息时得到的PDU字串的解码分析,仅供参考:

 

  1. using System;   
  2. using System.Text;   
  3. using System.Globalization;   
  4.   
  5. class Test   
  6. {   
  7.     static void Main()   
  8.      {   
  9.         string[] pdus =   
  10.          {   
  11.             "0891683108401105F0240D91685149910183F0000890013261604423026D4B",   
  12.             "0891683108401105F0040D91683105706027F50008900162311142230A6D4B8BD5003100320033",   
  13.             "0891683108401105F0040D91683105706027F500009001728033652304D4E2940A",   
  14.             "0891683108401105F0040D91683105706027F50000900172907074230928D58612D9505429",   
  15.          };   
  16.         for (int i = 0; i < pdus.Length; i++)   
  17.          {   
  18.             string pdu = pdus[i];   
  19.             string number, message;   
  20.              DateTime timestamp;   
  21.              ParseReceivedSms(pdu, out number, out timestamp, out message);   
  22.              Console.WriteLine("TEST.NO.{0}", i + 1);   
  23.              Console.WriteLine(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值