1. 程式人生 > >手機簡訊的PDU編碼和解碼 (轉)

手機簡訊的PDU編碼和解碼 (轉)

 共有三種方式來發送和接收SMS資訊:Block Mode, Text Mode和PDU Mode。其中PDU Mode被所有手機支援,可以使用任何字符集,這也是手機預設的編碼方式。

傳送短訊息常用Text和PDU(Protocol Data Unit,協議資料單元)模式。使用Text模式收發簡訊程式碼簡單,實現起來十分容易,但最大的缺點是不能收發中文簡訊;而PDU模式不僅支援中文簡訊,也能傳送英文簡訊。PDU模式收發簡訊可以使用3種編碼:7-bit、8-bit和UCS2編碼。7-bit編碼用於傳送普通的ASCII字元,它將一串7-bit的字元(最高位為0)編碼成8-bit的資料,每8個字元可“壓縮”成7個;8-bit編碼通常用於傳送資料訊息,比如圖片和鈴聲等;而UCS2編碼用於傳送Unicode字元。在這三種編碼方式下,PDU串的使用者資訊(TP-UD)段最大容量(可以傳送的短訊息的最大字元數)分別是160、140和70。這裡,將一個英文字母、一個漢字和一個數據位元組都視為一個字元。
PDU串的使用者資訊長度(TP-UDL),在各種編碼方式下意義有所不同。7-bit編碼時,指原始短訊息的字元個數,而不是編碼後的位元組數。8-bit編碼時,就是位元組數。UCS2編碼時,也是位元組數,等於原始短訊息的字元數的兩倍。如果使用者資訊(TP-UD)中存在一個頭(基本引數的TP-UDHI為1),在所有編碼方式下,使用者資訊長度(TP-UDL)都等於頭長度與編碼後位元組數之和。如果採用GSM 03.42所建議的壓縮演算法(TP-DCS的高3位為001),則該長度也是壓縮編碼後位元組數或頭長度與壓縮編碼後位元組數之和。 

PDU相當於一個數據包,它由構成訊息(SMS)的資訊組成。作為一種資料單元,它必須包含源/目的地址、保護(有效)時間、資料格式、協議型別和正文,正文長度可達140位元組,它們都以十六進位制表示。PDU結構根據短訊息由移動終端發起或以移動終端為目的而不同。每條訊息可以傳送140個位元組,由於本系統中最長的資料串沒有超過140個位元組,因此資料均可以用一條訊息來發送。
一般的PDU編碼由A B C D E F G H I J K L M十三項組成。
A:簡訊息中心地址長度,2位十六進位制數(1位元組)。
B:簡訊息中心號碼型別,2位十六進位制數。
C:簡訊息中心號碼,B+C的長度將由A中的資料決定。
D:檔案頭位元組,2位十六進位制數。
E:資訊型別,2位十六進位制數。
F:被叫號碼長度,2位十六進位制數。
G:被叫號碼型別,2位十六進位制數,取值同B。
H:被叫號碼,長度由F中的資料決定。
I:協議標識,2位十六進位制數。
J:資料編碼方案,2位十六進位制數。
K:有效期,2位十六進位制數。
L:使用者資料長度,2位十六進位制數。
M:使用者資料,其長度由L中的資料決定。J中設定採用UCS2編碼,這裡是中英文的Unicode字元。
PDU編碼協議簡單說明

例1 傳送:SMSC號碼是+8613800250500,對方號碼是13693092030,訊息內容是“Hello!”。從手機發出的PDU串可以是
08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 96 03 29 30 F0 00 00 00 06 C8 32 9B FD 0E 01
對照規範,具體分析:
分段 含義 說明
08 SMSC地址資訊的長度 共8個八位位元組(包括91)
91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
11 基本引數(TP-MTI/VFP) 傳送,TP-VP用相對格式
00 訊息基準值(TP-MR) 0
0D
 目標地址數字個數 共13個十進位制數(不包括91和‘F’)
91 目標地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 96 03 29 30 F0 目標地址(TP-DA) 8613693092030,補‘F’湊成偶數個
00 協議標識(TP-PID) 是普通GSM型別,點到點方式
00 使用者資訊編碼方式(TP-DCS) 7-bit編碼
00 有效期(TP-VP) 5分鐘
06 使用者資訊長度(TP-UDL) 實際長度6個位元組
C8 32 9B FD 0E 01 使用者資訊(TP-UD) “Hello!”
例2 接收:SMSC號碼是+8613800250500,對方號碼是13693092030,訊息內容是“你好!”。手機接收到的PDU串可以是
08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 96 03 29 30 F0 00 08 30 30 21 80 63 54 80 06 4F 60 59 7D 00 21
對照規範,具體分析:
分段 含義 說明
08 地址資訊的長度 個八位位元組(包括91)
91 SMSC地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 08 20 05 05 F0 SMSC地址 8613800250500,補‘F’湊成偶數個
84 基本引數(TP-MTI/MMS/RP) 接收,無更多訊息,有回覆地址
0D 回覆地址數字個數 共13個十進位制數(不包括91和‘F’)
91 回覆地址格式(TON/NPI) 用國際格式號碼(在前面加‘+’)
68 31 96 03 29 30 F0 回覆地址(TP-RA) 8613693092030,補‘F’湊成偶數個
00 協議標識(TP-PID) 是普通GSM型別,點到點方式
08 使用者資訊編碼方式(TP-DCS) UCS2編碼
30 30 21 80 63 54 80 時間戳(TP-SCTS) 2003-3-12 08:36:45  +8時區
06 使用者資訊長度(TP-UDL) 實際長度6個位元組
4F 60 59 7D 00 21 使用者資訊(TP-UD) “你好!”

詳細解析:
 0891683108200505F011190D91683105155694F50008FF10008FF044F60597D
   <1>簡訊中心地址欄位:0891 
    08:Address-Lengt(地址長度),簡訊息中心地址長度為8個位元組,是(91)+(683108200505F0)的長度,8個8位位元組
 91地址型別:10010001       Bit7:1。始終為1       Bits 6,5,4:Type-of-Number(號碼型別):001,代表Internation Number。也即是號碼前加“+”。注意:對某些比較特殊的號碼,例如手機與小靈通的互通時,這裡不能設定為001,而要設定成000,代表號碼前沒有“+”,否則無法接收。
下面是GSM03.40協議號碼型別的解釋:
 0 0 0   Unknown
 0 0 1   International number
 0 1 0   National number
 0 1 1   Network specific number
 1 0 0   Subscriber number
 1 0 1   Alphanumeric(coded according to TS03.38 7-bit default alphabet)
 1 1 0   Abbreviated number
 1 1 1   Reserved for extension
 ll not interpret reserved values but will store them as received.
       Bits 3,2,1,0:Numbering-plan-identification(號碼鑑別),0000—未知,0001—ISDN/電話號碼(E.164/E.163),1111—留作擴充套件;一般預設為0001,表示電話號碼型別的。下面是GSM03.40號碼鑑別的解釋:
Bits3 2 1 0
0 0 0 0    Unknown
0 0 0 1    ISDN/telephone numbering plan (E.164/E.163)
0 0 1 1    Data numbering plan (X.121)
0 1 0 0    Telex numbering plan
1 0 0 0    National numbering plan
1 0 0 1    Private numbering plan
1 0 1 0    ERMES numbering plan (ETSI DE/PS 3 01-3)
1 1 1 1    Reserved for extension
All other values are reserved.
<2>簡訊中心號碼:683108200805F0
一個位元組內反轉,8613800280500,如果長度為奇數則需要加“F”補齊。比如號碼為:+8613505165495,去掉"+"後在末尾新增F變為:8613505165495F,再將手機號碼的奇數位和偶數位的相交換為683105155694F5
<3>FirstOctet欄位:1119
     (1)11       包含TP-MTI(2bit),TP-RD(1bit),TP-VPF(2bit),TP-RP(1bit),TP-UDHI(1bit),TP-SRR(1bit)
二進位制表示形式:0 0 0 10 0 01
TP-MTI:01 TP-Message-Type-Indicator(訊息型別指示符)

     Bit1,0:00—讀出(Deliver); 01—提交(Submit)
Bit1,0:01指示為SMS-SUBMIT型別 
下面是GSM03.40的解釋:
 bit1 bit0  Message type
 0     0    SMS-DELIVER (in the direction SC to MS)
 0     0    SMS-DELIVER REPORT (in the direction MS to SC)
 1     0    SMS-STATUS-REPORT (in the direction SC to MS)
 1     0    SMS-COMMAND (in the direction MS to SC)
 0     1    SMS-SUBMIT (in the direction MS to SC)
 0     1    SMS-SUBMIT-REPORT (in the direction SC to MS)
 1    1      ReservedTP-RD:0  TP-Reject-Duplicates(是否拒絕相同重複訊息)

   Bit2:0—接受複製; 1—拒絕複製
 
 Bit2:0   指示短訊息中心接收未轉發的具有相同TP-MR的訊息。
 Bit 2:
 0    Instruct the SC to accept an SMS-SUBMIT for an SM still held in the  SC which has the same TP-MR and the same TP-DA as a previously submitted SM from the same OA.
 1    Instruct the SC to reject an SMS-SUBMIT for an SM still held in the   SC which has the same TP-MR and the same TP-DA as the  previously submitted SM from the same OA. In this case an  appropriate TP-FCS value will be returned in the SMS-SUBMIT-REPORT.
TP-VPF:10   TP-Validity-Period-Format(有效期格式)

Bit4,3::00—不提供(Not present);01—預留;  10—整型(標準),指使用相對格式;11—提供8位位元組的一半(Semi-Octet Represented) 
下面是GSM03.40的解釋:
bit4 bit3
0   0      TP-VP field not present
1   0      TP-VP field present and integer represented (relative)
0   1      Reserved
1   1      TP-VP field present and semi-octet represented (absolute)
TP-SRR:0    TP-Status-Report-Request
   Bit5:    1:需要報告,0:不需要報告。
Bit 5:
0       A status report is not requested
1       A status report is requested
TP-UDHI:0   TP-User-Data-Header-Indicator(使用者資料頭標示)   Bit6:   1:含頭資訊  0:不含頭資訊,指示這是一個SMS訊息,沒有使用者資料頭,EMS(增強訊息業務)訊息需要設定。圖片鈴聲這些都是包含頭部資訊的.文字不包含頭部資訊
Bit  6
0     The TP-UD field contains only the short message
1     The beginning of the TP-UD field contains a Header in addition to the  short message
TP-RP:0     TP-Reply-Path(回覆路徑)   Bit7:    1:設定回覆路徑,0:沒有設定回覆路徑。
下面是GSM03.40解釋:
Bit 7:
0:  TP-Reply-Path parameter is not set in this SMS-SUBMIT/DELIVER
1:  TP-Reply-Path parameter is set in this SMS-SUBMIT/DELIVER
(2)訊息參考值TP-MR (TP-Message-Reference):19如果使用"00" 值代表讓電話自己設定訊息參考值.
 
  <4> 對方號碼欄位:0D913105155694F5 
    0D:目標地址數字個數,共13個十進位制數(不包括91和‘F’)
    91:地址型別,同簡訊中心號碼設定.
   3105155694F5:目標手機號碼。

<5>上層協議標識TP-PID(TP-Protocol-Identifier):00
     一般設定為00,表示普通GSM,點對點  <6> 資料編碼設定TP-DCS(TP-Data-Coding-Scheme):08
    指示TP-UD的編碼方式。08代表Unicode方式。參照GSM03.38協議:
Bit 3,2
00    Default alphabet
01    8 bit
10    UCS2 (16bit) [10]
11    Reserved
  <7>有效期TP-VP(TP-Validity-Period):FF
    FF表示最大。
  <8> 使用者資料長度TP-UDL(TP-User-Data-Length):4
      使用者資料實際長度。注意不同編碼下使用者長度定義不同。
   <9>使用者資料 :4F60597D     "你好"的Unicode編碼
你:0x4F60;好:0x597D
  2:手機接收的PDU串
 0891683108200505F0040D91683105155694F5000850208151754500044F60597D
   <1>簡訊中心地址欄位:0891683108200505F0,即是+8613800250500
 <2>FirstOctet :04        其二進位制程式碼:00000100
    TP-MTI:00
    TP-MMS(TP-More-Message-to-Send):1 簡訊中心沒有更多的訊息傳送
    TP-SRI: 0
    TP-UDHI:0
    TP-RP:  0
 <3>傳送方號碼 :0D91683105155694F5   即+8613505165495
 <4>協議標識: 00    TP-DCS 點對點
 <5>編碼方式: 08    TP-DCS Unicode編碼
   <6>簡訊中心時間    50208151754500 
     位元組反轉05/02/18 15:57:45 最後的00代表時區,這裡為0
   <7>使用者資料長度 :4
 <8>使用者資料:4F60597D     
   中文“你好”的Unicode編碼