AT指令短信接收

 

1、接收中文短信

    以接收13752141860 号码发送来的你好,信息中心号码为:+8613800220500为例,手机接收到字符串为:

+CMT: ,24

0891683108200205F0240D91683157121468F0000860800331220000044F60597D

其中+CMT表示新短信指示代码格式为收到短消息立即显示;若+CMTI则指示收到短消息存储到存储器里;是否直接显示是通过CNMI设置的;

24表示PDU数据中短信中心号码后面的字符串长度/2,即240D91683157121468F0000860800331220000044F60597D的长度除以2

下面分析一下接收到的PDU数据:

108 //信息中心号码的长度,91+683108200205F0的长度除2,格式化成2位的16进制字符串所得

291 //短信中心号码类型

3683108200205F0 //短信中心号码,转换方法前面有提到

424 //TPDU头字节

50D //发送源号码长度,8613752141860的长度格式化为216进制所得

691 //发送源号码类型

7683157121468F0 //发送源号码

800 //协议标识 TPPID

908 //数据编码方案,08:中文编码,00为英文或数字,Bit No.7Bit No.6

10608003312200 //日期时间,奇偶互换:06-08-30 13:22:00,有论坛上写接收到的是026080……就是前面有’02’,表示2006-08…但是我用不同的手机发送短信过来接收到的都是06,无法取得2006,不知道是发送方手机设置的问题还是哪里的问题,还在研究中.

1100 //时区

1204 //用户数据长度TP-UDLTP-User-Data-Length,4F60597D的长度除2格式化为216进制数所得

(13) 4F60597D //”你好”的UNICODE码,同样提供一个DELPHI下的解码函数:


2、接收纯英文或数字

上面例子中接收到的是中文短信“你好”,那么当接收到的短信是纯中文或者数字的时候又如何解码呢?

例如接收到13752141860发送的英文短信“hello,手机接收到的字符串为:

+CMT: ,24

0891683108200205F0240D91683157121468F00000608003416270000461F1980C

前面编码的意义和中文信息相同,这里不再重复,只从红色的00说起:

先前提到了这两位表示数据编码方案,08为中文编码,00为英文或数字,当手机发送普通的ASCII字符即使用7bit编码方式,说明我们接收到的短信是英文或者数字格式的,而不是中文UNICODE码;

04仍然是用户数据(61F1980C)长度除2格式化为210进制数所得,61F1980C就是发送方发送过来的短信息,根据前面的00我们知道这是一段7-bit码,而不再是UNICODE码,7-bit的解码过程很复杂,大体过程是:

将源数据每7个字节分为一组,解码成8个字符。基本自然是:将第n个字节左移n位,再加上前一字节的剩余数据,即第(n-1)个字节右移(8-n)位的数值,屏幕最高位,即得到一目标字符数据,n=0…6。第7个字节右移1位就得到解码后的第8个字符数据。

 

你可能感兴趣的:(c,存储,手机,Delphi)