android CDMA短信pdu数据包解析

在短信发送过程中,短信内容,发送时间等信息会压缩成“数字”字符串,这个字符串就是我们的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位为电话号码:

  1. 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


关注我的技术公众号,查看更多优质技术文章推送

微信扫一扫下方二维码即可关注:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值