天天看點

短信貓軟體的實作(C#)<三>PDU格式短信解析

AT指令收發短信主要有兩種模式:Text模式和PDU(Protocol Data Unit,協定資料單元)模式。使用Text模式收發短信代碼簡單,很容易實作,最大缺點不支援中文短信。PDU模式不僅能發送中文短信,也能發送英文短信。PDU收發短信有三種編碼可用:7-bit、8-bit和UCS2編碼。7-bit編碼用于發送普通的ASCII字元,即英文短信,最多可發送160字元。8- bit編碼通常用于發送資料消息。UCS2編碼用于發送Unicode字元,可發送中文字元,最多發送70字元。

短信發送執行個體:

Text模式(向号碼為15050850677的手機發送“TEST”):

1:  AT                        //發送AT 傳回OK 連接配接成功      
2:        
3:  OK      
4:         
5:  AT+CMGF=1                //設定為Text模式      
6:        
7:  AT+CMGS="15050850677"    //發送指令,雙引号内改為對用手機号碼      
8:        
9:  > TEST(+^z,十六進制的1A)//傳回字元串中有OK 發送成功 >号為裝置傳回字元      

PDU模式(向号碼為15050850677的手機發送“你好”):

1:  AT                        //發送AT 傳回OK 連接配接成功      
2:        
3:  OK      
4:         
5:  AT+CMGF=0                //設定為PDU模式      
6:        
7:  AT+CMGS=19                //發送指令,更改為對應PDU編碼的長度計算方法在後面      
8:        
9:  > 0011000D91685150800576F70008C4044F60597D(+^z,十六進制的1A)//傳回字元串中有OK 發送成功      

有的“貓”用“序列槽調試器”發送總是失敗:Text模式接收到的是亂碼,PDU模式發送不出去。我用的這個就是這個樣子,給我郁悶了很多天,後來發現在序列槽調試器中我們摁下的“回車”被解析為”\r\n”,而我用的這個modem隻有在隻發送AT指令+”\r”時才能正确的發送短信。發現後發送短信都能成功,高興了好一會兒。不說廢話了,開始PDU短信編碼的解析。這是我的了解,更多詳細資料參考下列标準:

GSM 03.04    着重介紹短信發送中對字元集的控制部分

GSM 03.08

GSM 03.41

GSM 07.05    介紹 at 的一些控制指令

GSM 07.07    着重介紹 at 的短信相關指令,可以說是at的sms 規範

元素 名稱 長度 描述
SCA Service Center Address 1-12 短消息服務中心号碼
PDU-Type Protocol Data Unit 1 協定資料單元類型
MR Message Reference 1 所有成功的短信發送參考數目(0..255)
OA Originator Address 2-12 發送方位址(手機号碼)
DA Destination Address 2-12 接收方位址(手機号碼)
PID Protocol Identifer 1 參數顯示消息中心以何種方式處理消息内容(比如FAX,Voice)
DCS Data Coding Scheme 1 參數顯示使用者資料編碼方案
SCTS Service Center Time Stamp 7 消息中心收到消息時的時間戳
VP Validity Period 0,1,7 參數顯示消息有效期
UDL User Data Lenghth 1 使用者資料長度
UD User Data 0-140 使用者資料

發送方PDU格式:

SCA PDU-Type MR DA PID DCS VP UDL UD
1-12 1 1 2-12 1 1 0,1,7 1 0-140

示例:

向15050850677發送一條短信,内容“Test”

0011000D91685150800576F70000C404D4F29C0E

向15050850677發送一條短信,内容“你好”

0011000B815150800576F70008C4044F60597D

SCA PDU-Type MR DA PID DCS VP UDL UD
1-12 1 1 2-12 1 1 0,1,7 1 0-140
00 11 00 0D91685150800576F7 00 00 C4 04 D4F29C0E
00 11 00 0B815150800576F7 00 08 C4 04 4F60597D

接收方PDU格式:

SCA PDU-Type OA PID DCS SCTS UDL UD
1-12 1 2-12 1 1 7 1 0-140

示例:

從15050850677接收一條短信,内容“Test”

0891683110402505F0240BA15150800576F700000111208160302304D4F2

9C0E

從15050850677接收一條短信,内容“你好”

0891683110402505F0240BA15150800576F7000801112081600423044F60

597D

SCA PDUType OA PID DCS SCTS UDL UD
1-12 1 2-12 1 1 7 1 0-140
0891683110402505F0 24 0BA15150800576F7 00 00 01112081603023 04 D4F29C0E
0891683110402505F0 24 0BA15150800576F7 00 08 01112081600423 04 4F60597D

SCA:短消息服務中心位址格式

服務中心位址包含三個部分:1-12個8位位組 第一個位組訓示服務中心位址長度,第二個位組訓示服務中心類型,第三個位組為服務中心位址。

示例:0891683110402505F0

Lenghth Type Address
08 91 683110402505F0

Lenghth:服務中心位址長度 訓示Type+Address部分位組長度(例中:91683110402505F0中位組8個:08)

如果Lenghth部分為“00”則不提供後面部分,發送時終端将自動從SIM卡中讀取并填充SCA

Type:短信中心位址的類型(81:指國内的号碼 91:指國際的号碼  91最常用(資料裡都說是這樣,但根據後面的表格:國内應該是A1,81是未知!!))91H=10010001B 具體意義如下表:

BIT No. 7 6 5 4 3 2 1
1 類型 類型 類型 号碼鑒别 同3 同3 同3

類型:000-未知  001-國際  010-國内  111-留作擴充

号碼鑒别:0000-未知  0001-ISDN/電話号碼(E.164/E.163)  1111-留作擴充

SCA示例:

短信中心 PDU編碼
+8613010452500 0891683110402505F0
13010452500 07813110402505F0
123456 0481214365

注:AT指令中 AT+CMGS=<Len> Len不包含此段位組的長度

PDU Type:是發送和接受短信的PDU中的第一個8位位組

發送方:例 11h=00010001b

Bit No. 7 6 5 4 3 2 1
RP UDHI SRR VPF VPF RD MTI MTI
1 1

接收方:例 24h=00100100b

Bit No. 7 6 5 4 3 2 1
RP UDHI SRI MMS MTI MTI
1 1

RP:應答路徑,

0-未設定 

1-設定

UDHI:使用者資料頭辨別(User Data Header Indicator),

0-使用者資料(UD)部分不包含頭資訊 

1-使用者資料(UD)開始部分包含使用者頭資訊

SRR:請求狀态報告(Status Report Request),

0-不需要報告 

1-需要報告

SRI:狀态報告訓示(Status Report Indication),此值僅被短消息服務中心設定,

0-狀态報告将不會傳回給短消息實體(SME)

1-狀态報告将傳回給短消息實體(SME)

VPF:有效期格式(Validity Period Format),

00-VP段沒有提供(長度為0)

01-保留

10-VP段以整型形式提供(相對的)

11-VP段以8位位組的一半形式提供(絕對的)

RD:拒絕複本(Reject Duplicate)

0-通知短消息服務中心(SMSC)接受一個消息(SMS-SUBMIT),即該消息是先前已送出過的,并還存在與SMSC中未發送出去。MS重複的條件是:消息參考(MR)、接收方位址(DA)及發送方位址(OA)相同

1-通知SMSC拒絕一個重複的SMS

MMS:有更多的消息需要發送(More Message to Send),此值僅被SMSC設定

0-在SMSC中有更多的資訊等待MS

1-在SMSC中沒有更多的資訊等待MS

MTI:資訊類型訓示(Message Type Indicator)

不太了解 有待于再查資料

MR:資訊參考 不太了解 置為00即可

DA/OA:接收方與發送方位址

DA與OA編碼方式是一樣的 2-12個8位位組

例:0D91685150800576F7

Lenghth Type Address
0D 91 685150800576F7

Lenghth:位址長度 指8615050850677的長度。與SCA中不一樣!

Type:位址類型  訓示國内(81) 還是國際(91)

示例:

号碼 PDU編碼
+8615050850677 0D91685150800576F7
15050850677 0B815150800576F7
123456 0681214365

PID:協定辨別(Protocol Identifier)

對于标準情況下的MS-to-SC短消息傳送,隻需設定PID為00

DCS:資料編碼方案(DataCoding Scheme)

Bit No. 7 6 5 4 3 2 1 描述
示例: 00h 7bit資料編碼 預設字元集
1 1 1 1 1 1 F6h 8bit資料編碼 Class1
1 08h USC2(16bit)雙位元組字元集

Bit No.7與Bit No.6:

一般設定為00

Bit No.5:

0-文本未壓縮

1-文本用GSM标準壓縮算法壓縮

Bit No.4:

0-訓示Bit No.1 Bit No.0為保留位,不含資訊類型資訊

1-訓示Bit No.1 Bit No.0含資訊類型資訊

Bit No.3與Bit No.2:

00-預設的字元集,每字元占7bit,此時最大可發送160字元

01-8bit,此時最大可發送140字元

10-USC2(16bit),發送雙位元組字元集

11-預留

Bit N0.1與Bit No.0:

00-Class 0,短消息直接顯示在螢幕上

01-Class 1,

10-Class 2(SIM卡特定資訊),

11-Class 3

示例:

DCS 字元集 資訊Class
00 7-bit No Class
F0 7-bit Class 0(Immediate Display)
F1 7-bit Class 1(Mobile Equipment-specific)
F2 7-bit Class 2(SIM specific Message)
F3 7-bit Class 3(Terminate Equipment-specific)
F4 8-bit Class 0(Immediate Display)
F5 8-bit Class 1(Mobile Equipment-specific)
F6 8-bit Class 2(SIM specific Message)
F7 8-bit Class 3(Terminate Equipment-specific)
08 16-bit No Class
18 16-bit Class 0(Immediate Display)

VP:資訊有效期(Validity Period)

第一種情況(相對的):VPF=10  VP=AAH(四天)

第二種情況(絕對的):VPF=11

時區
30 80 02 90 54 33 20
           表示:03-08-20 09:45:33

VP段以整形或半個8位位組形式提供

第一種情況,VP為一個8位組,給定有效期的長度

從消息被SMSC接收開始計算

VP 相應的有效期
00-8F (VP+1)*5分鐘  從5分鐘間隔到12小時
90-A7 12小時+(VF-143)*30分鐘
A8-C4 (VP-166)*1天
C5-FF (VP-192)*1周
第二種情況,VP為七個8位組,給定有效期終止的絕對時間  時間形式與SCTS形式一緻

SCTS:服務中心時間戳(Service Center Time Stamp)

占用7個8位組,格式和VP第二種情況一緻,請參考其中的表格

UDL:使用者資料長度(User Data Lenghth)

UDL以整形形式提供,訓示後面使用者資料段的長度(UD的8位組的個數)

UD:使用者資料(User Data)

英文編碼:7bit編碼,依次将下一位的後幾位移至前面形成新的8位編碼

示例:Test

             T:01010100  e:01100101  s:01110011  t:01110100

      去最高位0,變為7位

             T:1010100  e:1100101  s:1110011  t:1110100

      後面低位移至前面形成8位編碼

             Test:11010100111100101001110000001110

             UD:D4F29C0E   UDL:04

中文編碼:取USC2編碼  高低位元組交換即可

注意:7bit編碼的UDL部分計算的是編碼前的字元串長度,而不是編碼後的8位組個數!

注:AT+CMGS=<Len><cr>中Len為出SCA外8位組的個數

參考資料:SMS with the SMS PDU-mode

轉載于:https://www.cnblogs.com/Engin/archive/2010/11/02/GSM_PDU.html