1、接收中文短信
以接收13752141860 号码发送来的“你好”,信息中心号码为:+8613800220500为例,手机接收到字符串为:
+CMT: ,24
0891683108200205F0240D91683157121468F0000860800331220000044F60597D
其中+CMT表示新短信指示代码格式为收到短消息立即显示;若+CMTI则指示收到短消息存储到存储器里;是否直接显示是通过CNMI设置的;
24表示PDU数据中短信中心号码后面的字符串长度/2,即240D91683157121468F0000860800331220000044F60597D的长度除以2;
下面分析一下接收到的PDU数据:
(1)08 //信息中心号码的长度,将91+683108200205F0的长度除2,格式化成2位的16进制字符串所得
(2)91 //短信中心号码类型
(3)683108200205F0 //短信中心号码,转换方法前面有提到
(4)24 //TPDU头字节
(5)0D //发送源号码长度,8613752141860的长度格式化为2位16进制所得
(6)91 //发送源号码类型
(7)683157121468F0 //发送源号码
(8)00 //协议标识 TP—PID
(9)08 //数据编码方案,08:中文编码,00为英文或数字,Bit No.7与Bit No.6
(10)608003312200 //日期时间,奇偶互换:06-08-30 13:22:00,有论坛上写接收到的是026080……就是前面有’02’,表示2006-08…但是我用不同的手机发送短信过来接收到的都是06,无法取得2006,不知道是发送方手机设置的问题还是哪里的问题,还在研究中.
(11)00 //时区
(12)04 //用户数据长度TP-UDL(TP-User-Data-Length),4F60597D的长度除2格式化为2位16进制数所得
(13) 4F60597D //”你好”的UNICODE码,同样提供一个DELPHI下的解码函数:
2、接收纯英文或数字
上面例子中接收到的是中文短信“你好”,那么当接收到的短信是纯中文或者数字的时候又如何解码呢?
例如接收到13752141860发送的英文短信“hello”,手机接收到的字符串为:
+CMT: ,24
0891683108200205F0240D91683157121468F00000608003416270000461F1980C
前面编码的意义和中文信息相同,这里不再重复,只从红色的00说起:
先前提到了这两位表示数据编码方案,08为中文编码,00为英文或数字,当手机发送普通的ASCII字符即使用7-bit编码方式,说明我们接收到的短信是英文或者数字格式的,而不是中文UNICODE码;
04仍然是用户数据(61F1980C)长度除2格式化为2位10进制数所得,61F1980C就是发送方发送过来的短信息,根据前面的00我们知道这是一段7-bit码,而不再是UNICODE码,7-bit的解码过程很复杂,大体过程是:
将源数据每7个字节分为一组,解码成8个字符。基本自然是:将第n个字节左移n位,再加上前一字节的剩余数据,即第(n-1)个字节右移(8-n)位的数值,屏幕最高位,即得到一目标字符数据,n=0…6。第7个字节右移1位就得到解码后的第8个字符数据。