在短信发送过程中,短信内容,发送时间等信息会压缩成“数字”字符串,这个字符串就是我们的pdu包,这个过程也叫做pdu的打包。pdu包在AT命令的帮助下到达moderm,由moderm将它发送到移动基站,再然后通过基站中转到达接收方的手机,接收方在接到pdu包之后,要按照压缩的反过程进行解析,也就是pdu解包,最终到达短彩信数据库,展示给用户。
pdu压包和解包大体类似,就是正反过程,所以只需要了解其中一个过程。
下面开始就介绍一下pdu解析的过程:
cdma 短信pdu数据包解析:
短信内容:国家齐同庆,家国两团圆。
抓取的pdu数据包:
00 00 02 10 02 02 04 01 46 AA 8406 01 0C 08 2F 00 03 11 11 C0 01 1A 20 62 B7 EA DD B4 FA 82 A062 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 30 01 08 03 06 12 10 11 1538 37 08 01 40 0A 01 40
BearerData.java
while (inStream.available() > 0) {
boolean decodeSuccess = false;
int subparamId = inStream.read(8);
int subparamIdBit = 1 << subparamId;//读取1个字节,放到高8位
if ((foundSubparamMask & subparamIdBit) != 0) {
throw new CodingException("illegal duplicate subparameter (" +
subparamId + ")");
}
.......//循环读取字符串内容,Mask检查是否重复解析,短信内的所有内容在这里解析完毕
}
第一个字段:
00:得到messageType,messageId等。
private static boolean decodeMessageId(BearerData bData, BitwiseInputStream inStream)
throws BitwiseInputStream.AccessException, CodingException
{
final int EXPECTED_PARAM_SIZE = 3 * 8;
boolean decodeSuccess = false;
int paramBits = inStream.read(8) * 8;
if (paramBits >= EXPECTED_PARAM_SIZE) {
paramBits -= EXPECTED_PARAM_SIZE;
decodeSuccess = true;
bData.messageType = inStream.read(4);
bData.messageId = inStream.read(8) << 8;
bData.messageId |= inStream.read(8);
bData.hasUserDataHeader = (inStream.read(1) == 1);
inStream.skip(3);
}
if ((! decodeSuccess) || (paramBits > 0)) {
Log.d(LOG_TAG, "MESSAGE_IDENTIFIER decode " +
(decodeSuccess ? "succeeded" : "failed") +
" (extra bits = " + paramBits + ")");
}
inStream.skip(paramBits);
return decodeSuccess;
}
第二个字段:
0002 10 02:短信的teleservice,其值是:(十六进制)1002即4098.
第一个字段:
02 04 01 46 AA 84:短信发送地址。内容为:0146 AA 84
00000001 0100 0110 1010 1010 1000 0100
第一位:0:代表模式
第二位:0:代表数字模式
下面8个bit代表长度,此处为:0000 01 01 值为5,5*4=20,往后20位为电话号码:
-
1010 1010 1010 00 01)即10001.解析完毕。
第一个字段:
0601 0C:表示SMS_TL_BEARER_RPLY_OPT
第一个字段:
082F00 03 11 11 C001 1A 20 62 B7 EA DDB4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 30 01 08 03 0612 10 11 15 38 37 08 01 40 0A 01 40
08:表示短信内容
2F:字段长度。47
部分1
0003 11 11 C0:
00:MessageId
1111 C0:00010001 0001 0001 1100 0000
0001:表示DELIVER短信
00010001 0001 1100:表示messageid
0:表示HEADER_IND。
部分2
011A 20 62 B7 EA DD B4
FA82 A0 62 F4 30
01 62 DD B2 B7 EA
71 22 B7 12 B8 30
01 08
01:字段类型。
20 62 B7 EA DD B4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 3001 08
二进制表示为:
0010 0000 0110 0010 1011 0111 1110 1010 1101 1101 1011 0100 1111 1010 1000 0010 1010 0000 0110 0010 1111 0100 0011 0000
0000 0001 0110 0010 1101 1101 1011 0010 1011 0111 1110 1010
0111 0001 0010 0010 1011 0111 0001 0010 1011 1000 0011 0000
0000 0001 0000 1000
(
2062 B7 EA DD B4 FA 82 A0 62 F4 30 01 62 DD B2 B7 EA 71 22 B7 12 B8 3001 08
二进制表示为:
00100000 0110 0010 1011 0111 1110 1010 1101 1101 1011 0100 1111 1010 1000 0010 1010 0000 0110 0010 1111 0100 0011 0000
0000 0001 0110 0010 1101 1101 1011 0010 1011 0111 1110 1010
0111 0001 0010 0010 1011 0111 0001 0010 1011 1000 0011 0000
0000 0001 0000 1000
)
20:前5位为:00100即4,表示编码方式为:unicode
20:的后3位,62的前5位为:000 01100 等于10,表示有10个unicode。
62的后3个unicede,加上B7的8bit,加上EA的前5个bit得到:
0101 0110 111 1 110 1 56fd查看unicode编码可以知道是 国
0101 1011 1011 0110 5bb6查看unicode编码可以知道是 家
部分1
0306 12 10 11 15 38 37
时间戳 12年10月11日15点38分 37秒
08 01 40 0A 01 40
关注我的技术公众号,查看更多优质技术文章推送
微信扫一扫下方二维码即可关注: