收發短消息又分爲三種模式:Block模式、Text模式和PDU模式。使用Block機生產廠家提供驅動支持,這種方法現在很少用了。Text Mode是純文本方式,可使用不同的字符集,從技術上說也可用於發送中文短消息,但國內手機基本上不支持,主要用於歐美地區,也不在本文討論範圍之列。PDU串表面上是一串ASCII碼,由‘0’-‘9’、 ‘A’-‘F’這些數字和字母組成。它們是8位字節的十六進制數,或者BCD碼十進制數。PDU串不僅包含可顯示的消息本身,還包含很多其它信息,如SMS服務中心號碼、目標號碼、回覆號碼、編碼方式和服務時間等。
1.PDU編碼解碼
在PDU Mode中,可以採用三種編碼方式來對發送的內容進行編碼,它們是7-bit、8-bit和UCS2編碼。7-bit編碼用於發送普通的ASCII字符,它將一串7-bit的字符(最高位爲0)編碼成8-bit的數據,每8個字符可“壓縮”成7個;8-bit編碼通常用於發送數據消息,比如圖片和鈴聲等;而UCS2編碼用於發送Unicode字符。PDU串的用戶信息(TP-UD)段最大容量是140字節,所以在這三種編碼方式下,可以發送的短消息的最大字符數分別是160、140和70。這裏,將一個英文字母、一個漢字和一個數據字節都視爲一個字符。
需要注意的是,PDU串的用戶信息長度(TP-UDL),在各種編碼方式下意義有所不同。7-bit編碼時,指原始短消息的字符個數,而不是編碼後的字節數。8-bit編碼時,就是字節數。UCS2編碼時,也是字節數,等於原始短消息的字符數的兩倍。
下面介紹的內容,是在PDU Mode下發送和接收短消息的實現方法。發送和接收的PDU串,結構是不完全相同的。我們先用實際的例子說明PDU串的結構和編排方式。
(1) 發送信息的PDU串
中文:向手機13600554267發送中文“歡迎”兩字,格式如下: 0011000B913106504562f7000810046B228FCE英文:向手機13600554267發送英文“hellohello”十字符,格式如下:
0011000B913106504562f70000AA0AE8329BFD4697D9EC37
對以上的PDU串分析如下表:
分段 |
含義 |
說明 |
00 |
SMSC地址信息的長度 |
8613800250500,補‘F’湊成偶數個 |
11 |
基本參數(TP-MTI/VFP) |
發送,TP-VP用相對格式 |
00 |
消息基準值(TP-MR) |
0 |
0B |
目標地址數字個數 |
共13個十進制數(不包括91和‘F’) |
91 |
目標地址格式(TON/NPI) |
用國際格式號碼(在前面加‘+’) |
3106504562f7 |
目標地址(TP-DA) |
8613851872468,補‘F’湊成偶數個 |
00 |
協議標識(TP-PID) |
是普通GSM類型,點到點方式 |
08 |
用戶信息編碼方式(TP-DCS) |
UCS2編碼(00:7-bit編碼) |
10 |
有效期(TP-VP) |
短信的有效時間 |
04 |
用戶信息長度(TP-UDL) |
實際長度4個字節 |
6B228FCE |
用戶信息(TP-UD) |
“歡迎” |
以上內容是對中文信息的表示,需要注意的是“歡迎“兩字,在實際長度計算的時候是4,而非2。因爲UCS2編碼時計算長度爲原始短消息的字符數的兩倍。而發送的”hellohello“英文短信,與其區別在於編碼方式不同,以及長度計算有點差別,請自行分析。
(2)接受信息的PDU串
讀取以上發送出來的短信,可以收到如下信息,接受到來自13600554267的“歡迎“PDU串爲:0891683108503705F0040D91683106504562F7000830507001021500046B228FCE 。而接受到的“hellohello“PDU串爲:
0891683108503705F0040D91683106504562F70000305070010201000AE8329BFD4697D9EC37。對以上的PDU串分析如下表:
段 |
含義 |
說明 |
08 |
SMSC地址信息的長度 |
共8個八位字節(包括91) |
91 |
SMSC地址格式(TON/NPI) |
用國際格式號碼(在前面加‘+’) |
683108503705F0 |
SMSC地址 |
8613800573500,補‘F’湊成偶數個 |
04 |
基本參數(TP-MTI/MMS/RP) |
接收,無更多消息,有回覆地址 |
0D |
回覆地址數字個數 |
共13個十進制數(不包括91和‘F’) |
91 |
回覆地址格式(TON/NPI) |
用國際格式號碼(在前面加‘+’) |
683106504562F7 |
回覆地址(TP-RA) |
8613600554267,補‘F’湊成偶數個 |
00 |
協議標識(TP-PID) |
是普通GSM類型,點到點方式 |
08 |
用戶信息編碼方式(TP-DCS) |
UCS2編碼(即中文) |
30507001021500 |
時間戳(TP-SCTS) |
2003-3-12 08:36:45 +8時區 |
04 |
用戶信息長度(TP-UDL) |
實際長度4個字節 |
6B228FCE |
用戶信息(TP-UD) |
“歡迎!” |
2.PDU的編碼與解碼
(1)英文編碼與解碼
缺省的GSM字符集爲7位編碼,ASCII碼爲8位編碼,編碼就是將8位ASCII編碼轉換爲7位編碼。例如:1234 編碼後得到31D98C06。將“1234”用二進制表示後,轉爲7位編碼如下:
8位編碼 00110001 00110010 00110011 00110100
7位編碼 00110001 11011001 10001100 00000110
通過例子可以看出,將ascii8位編碼的Bit8去掉,依次將下7位編碼的後幾位逐次移到前面,形成新的8位編碼。解碼是上面的逆向過程,就是將7位字符編碼轉換爲8爲字符編碼。
(2)中文編碼與解碼
中文編碼較爲簡單,就是將GB2312的中文編碼轉換爲Unicode編碼即可。解碼就是將Unicode編碼轉換爲GB2312的中文編碼即可。
在日常短信收發中,中文短信居多,而且,英文短信也可以作爲中文短信來收發,如果,程序要求不高,所有短信均可使用中文編碼。