天天看點

CDMA SMS pdu解碼 http://blog.lytsing.org/archives/category/cdma/  原帖位址 

http://blog.lytsing.org/archives/category/cdma/  原帖位址 

去年玩過via cdma模組,剛開始對cdma sms pdu真是一臉茫然,意識到我也可能不會長時間做這個,網上這類文章少之又少,體會初學者的辛苦,重新翻屍體,記錄下來。

收到兩條短信,現在用AT把它們讀取出來。

at+cmgr=5

+CMGR:5,”REC UNREAD”,”15338896020″,”UNKNOWN NUMBER”,”N/A”,176

“0000021002020702c54ce225a8a80601c0089d00031001e801

8e2230018801780193108b09fb087b317b012b6a080162e38c8e6

3b422e07b65980162b942e872e4b3b4246f7a70500162e54bbf9a7

053f67c7e3801729f544c0b108bb423918a75d00163317a70033b0

ae07ce3e00162b943108bb4236b54158a71680162ff5a7283b423

71c33b2b71c29dd80173108b09fb087b317c1a933cb80162b943659

b6a0bb4227122e5c00306081229192611″

at+cmgr=21

+CMGR:21,”REC UNREAD”,”15338896020″,”UNKNOWN NUMBER”,”N/A”,96

“0000021002020702c54ce225a8a806014c084d00031001f8013

e20f00190017801900162dfca7004b1acb1abb4239614c67001629

63b2b12b9827ae310c001729f544c0b108bb423918a75d00163317

a70029f52e07cf0f80306081229192616”

[[email protected] example]$ ./test_pdu_decode

0000021002020702c54ce225a8a80601c0089d00031001e8018e22

30018801780193108b09fb087b317b012b6a080162e38c8e63b422

e07b65980162b942e872e4b3b4246f7a70500162e54bbf9a7053f67

c7e3801729f544c0b108bb423918a75d00163317a70033b0ae07ce3

e00162b943108bb4236b54158a71680162ff5a7283b42371c33b2b7

1c29dd80173108b09fb087b317c1a933cb80162b943659b6a0bb422

7122e5c00306081229192611

sms context == 1/2我願意是急流,山裡的小河,在崎岖的路上,岩石上經過.隻要我的夫妻,是一條小魚,在我的浪花中,快樂的遊來遊去.我願意是荒林,在河流的兩岸

SM_ENCODING == 4

TPA == 15338896020

SCTS == 19:26:11 12/29/08

[[email protected] example]$ ./test_pdu_decode

0000021002020702c54ce225a8a806014c084d00031001f8013e20f

00190017801900162dfca7004b1acb1abb4239614c6700162963b2

b12b9827ae310c001729f544c0b108bb423918a75d00163317a700

29f52e07cf0f80306081229192616

sms context == 2/2,對一陣陣的狂風,勇敢地作戰.隻要我的夫妻,是一隻小鳥

SM_ENCODING == 4

TPA == 15338896020

SCTS == 19:26:16 12/29/08

PDU串解析

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

消息傳送類型: 0x00 point to point message(表示點對點消息)

下面的内容為短消息的各個字段 每個字段分為三個部分: 字段類型(ID)(8bit)、字段長度(Length)(8bit)和字段内容.

第一個字段: 00 02 10 02

0x00, 表示uTeleserviceID字段

0x02, 字段長度,該長度必須為2,否則為錯誤的pdu資訊

字段内容為:0x1002,十進制是4098,

第二個字段: 02 07 02 c5 4c e2 25 a8 a8

0x02, SMS_TL_ORIG_ADDR 表示 (短信發送位址)

0x07, 字段長度為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

0x08, 表示SMS_TL_BEARER_DATA字段(短信内容)

0x4d,字段長度為77

這個字段也分成各個子字段:

第一子字段: 00 03 10 01 f8

0x00 Mesage Id    message identifier

0x03 内容長度

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

0x01, 字段類型   user data

0x3e(62),字段長度

20 f0 01 === 0010 0000 1111 0000 0000 0001

0x20 的前5個bit為00100, 為0x04, 表示短信編碼方式為RIL_CDMA_SMS_ENCODING_UNICODE (UNICODE)

0x20 的後3個bit, 0xf0的前5個bit,為 000 1111 0, 即0x1e (30),表示有30個UNICODE 字元。0xf0的後3個bit,0x01的8個bit,再加上0x90的前5個bit,

0000 0000 0011 0010 拼成一個16位數是 0x0032 表示字元 :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)等,若想自己手動解析,務必跟模組廠家溝通确認好。

If you enjoyed this post, make sure you subscribe to my RSS feed! This entry was posted in  CDMA and tagged  CDMA,  SMS on  June 28, 2010.