2

我编写了一个程序来解码 CDMA 3GPP2 点对点 SMS 消息。我在网上找到的几个 CDMA PDU 十六进制字符串上对其进行了测试,效果很好。但是,当我尝试在 Android 平台上的所有传入短信上实现它时,它总是失败。

我查看了传入的 PDU,它似乎没有遵循我习惯看到的相同模式。谁能解释这个 PDU 是什么格式,或者我缺少什么来正确解码这个 PDU?是否有我没有考虑的其他标题或字段?

从我手机上的传入短信中提取的 PDU 示例:

000000000000100200000000000000000A36373839313031363734000000000000000000001B000310864D000306120624205611010B104C2CF9F3F5EBD73E7000

我发现并测试了我的解析器的所有 CDMA pdus 看起来更像:

00000210020207028CE95DCC65800601FC08150003168D3001061024183060800306101004044847

运营商:Verizon 电话:Samsung Galaxy S Fascinate跑步Android 2.3.3

4

1 回答 1

3

请参阅 $SDK/sources/android-16/com/android/internal/telephony/cdma/SmsMessage 中的 javadoc:

/**
 * Creates byte array (pseudo pdu) from SMS object.
 * Note: Do not call this method more than once per object!
 */

...所以它没有遵循任何特定的 CDMA 标准。但是,您可以对其进行解码;所以在精美的 ASCII 艺术中:-

000000000000100200000000000000000A36373839313031363734000000000000000000001B000310864D000306120624205611010B104C2CF9F3F5EBD73E7000
--------messageType     --digitMode                   --------bearerReply   ------------------------------------------------------bearer data
        --------teleService --ton --------------------src     --replySeqNo  --messageID --msts          --userdata
                --------serviceCategory                         --errorClass  --len   --XX--len           --len
                          --numberMode                            --causeCode   ------      ------------2012/06/24 20:56:11
                              --npi                                 --------bearerDataLength                ----------------------userdata
                                --len                                           

请注意,我认为您在消息中犯了剪切/粘贴错误 - 我认为标记为“XX”的 00 字节不应该存在 - 幸运的是,很容易发现日期并向后工作。所以这是来自 6789101674 的带有用户数据的消息:

104C2CF9F3F5EBD73E7000,前五位表示它是7位编码的(0x02)。将用户数据的剩余部分向左移动了 5 位,我们得到了:

09859f3e7ebd7ae7ce00
--len(septets) 9 septets == 63 bits, so we expect 8 bytes of body
  ----------------7bit-body

所以你解码的 7 位体是“Bggguuugg”。

于 2012-07-09T19:05:36.863 回答