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.