• CDMA SMS pdu解码


    
    

          这个是之前解决一个Andorid上短信发送报告错误的BUG时在别人的blog里学到的,描写的很细致,仔细读了就能自己解CDMA的短信PDU格式了,而且原作者还用颜色给字节做了区分,很伟大啊

     【粘过来没颜色了,杯具,原文链接:http://blog.lytsing.org/archives/180.html


    CDMA的pdu格式与GSM的相差很多,不能直接用肉眼看出来。第一条内容比较长,就拿第二条pdu串来分析吧。
    1.首先将PDU串打成PDU包
    将PDU串相邻的两个ascii字符拼凑成一个8bit数据

    如下:
    00 00 02 10 02 02 07 02 c5 4c e2 25 a8 a8 06 01 4c 08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

    消息传送类型: 0×00 point to point message(表示点对点消息)

    下面的内容为短消息的各个字段 每个字段分为三个部分: 字段类型(ID)(8bit)、字段长度(Length)(8bit)和字段内容.

    第一个字段: 00 02 10 02
    0×00, 表示uTeleserviceID字段
    0×02, 字段长度,该长度必须为2,否则为错误的pdu信息

    字段内容为:0×1002,十进制是4098,

    第二个字段: 02 07 02 c5 4c e2 25 a8 a8
    0×02, SMS_TL_ORIG_ADDR 表示 (短信发送地址)
    0×07, 字段长度为7
    字段内容: 02 c5 4c e2 25 a8 a8
    只看前面几个 02 c5 4c e2的:
    0000 0010 1100 0101 0100 1100 1110 0010 0010
    取第一个bit 0 表示 RIL_CDMA_SMS_DIGIT_MODE_4_BIT 是4bit压缩
    第二个bit 0 表示 RIL_CDMA_SMS_NUMBER_MODE_NOT_DATA_NETWORK
    下来8个bit 是 00 0010 11 = 11,表示号码长度 为11
    由于是4bit压缩 ,后面44个bit(4*11)表示号码,解析出来是15338896020

    第三个字段: 06 01 4c
    表示SMS_TL_BEARER_RPLY_OPT

    第四个字段:08 4d 00 03 10 01 f8 01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8 03 06 08 12 29 19 26 16

    0×08, 表示SMS_TL_BEARER_DATA字段(短信内容)
    0x4d,字段长度为77

    这个字段也分成各个子字段:

    第一子字段: 00 03 10 01 f8
    0×00 Mesage Id
    0×03 内容长度
    10 01 f8  === 0001 0000 0000 0001 1111 1000
    0001 表示 DELIVER 短信
    0000 0000 0001 1111表示 message id.
    紧接后面的 1, 表示HEADER_IND

    第二个子字段:01 3e 20 f0 01 90 01 78 01 90 01 62 df ca 70 04 b1 ac b1 ab b4 23 96 14 c6 70 01 62 96 3b 2b 12 b9 82 7a e3 10 c0 01 72 9f 54 4c 0b 10 8b b4 23 91 8a 75 d0 01 63 31 7a 70 02 9f 52 e0 7c f0 f8
    0×01, 字段类型
    0x3e(62),字段长度
    20 f0 01 === 0010 0000 1111 0000 0000 0001
    0×20 的前5个bit为00100, 为0×04, 表示短信编码方式为RIL_CDMA_SMS_ENCODING_UNICODE (UNICODE)
    0×20 的后3个bit, 0xf0的前5个bit,为 000 1111 0, 即0x1e (30),表示有30个UNICODE 字符。0xf0的后3个bit,0×01的8个bit,再加上0×90的前5个bit,

    0000 0000 0011 0010 拼成一个16位数是 0×0032 表示字符 :2,在vim下了解一个字符的16进制码很简单,光标在该字符,按ga,底端显示结果如下:

    <2>  50,  Hex 32,  Octal 062                                  2,1           All

    依次下去,内容就是上面运行./test_pdu_decode 的结果: 2/2,对一阵阵的狂风,勇敢地作战.只要我的爱人,是一只小鸟

    第三个子字段: 03 06 08 12 29 19 26 16

    这是一个时间戳字段: 08年12月29号19时26分16秒(短消息发送时间)

    字符串分析结束。当然,还有很多可选项在这条短信没有加上,更完整的SMS格式,请参考CDMA SMS standard on 3GPP2 website.

    实际编码时,一个while循环遍历,再加上switch简单的状态机即可。

    长短信何在?

    用的这个模组,不支持长短信,厂家回答“作了预处理,把User Data Header去掉了,因为客户一般不愿意自行处理这个User Data Header,他们只要内容、号码等其它信息。所以,模块送出的PDU中不含有User Data Header。”

    为实现长短信的拆分和组合功能,终端应支持 IS637C 协议中关于长短消息处理的参数 HEADER_IND,以及在短消息数据中增加对 User Data Subparameter 参数增加用户数据消息头(User Data Header)和短信拆分、组合的处理。HEADER_IND 为消息头标识位,用于指示 User Data Header 是否包含消息头, 若包含消息头则 HEADER_IND 设置为’1’,否则设置为’0’。具体的拆分与组合,请参考IS637C,或 《中国电信CDMA终端需求规范-SMS分册-V1.0》。需要说明的是,对长短信的处理,有的CDMA模组厂家为了让用户省事,帮你处理了用户数据头,正如前面所看到的,自动加上(1/2), (2/2)等,若想自己手动解析,务必跟模组厂家沟通确认好。

  • 相关阅读:
    Bit Manipulation
    218. The Skyline Problem
    Template : Two Pointers & Hash -> String process
    239. Sliding Window Maximum
    159. Longest Substring with At Most Two Distinct Characters
    3. Longest Substring Without Repeating Characters
    137. Single Number II
    142. Linked List Cycle II
    41. First Missing Positive
    260. Single Number III
  • 原文地址:https://www.cnblogs.com/flyme/p/2092793.html
Copyright © 2020-2023  润新知