天天看點

手機 SMS PDU 格式參考手冊

http://www.delphibbs.com/keylife/iblog_show.asp?xid=21416

作者 : happycyp

标題 : 手機 SMS PDU 格式參考手冊

關鍵字: SMS,PDU

分類 : 個人專區

密級 : 公開

(評分: , 回複: 0, 閱讀: 1406) »»

原位址: http://borland.mblogger.cn/shuixin13/posts/10087.aspx

開發者指南

SMS with the SMS PDU-mode

翻譯整理: 犬犬(心帆)

E-Mail: [email protected]

最後修定日期: 2004-10-18

SMS with the SMS PDU-mode. 1

編者序... 3

版本變動曆史... 4

1、緒論... 5

2、縮寫詞... 6

3、設定指令... 7

3.1 服務中心号碼    (+CSCA) 7

3.2 選擇消息服務    (+CSMS) 7

3.3 選擇消息格式    (+CMGF) 8

4、SMS文本模式... 9

5、SMS PDU模式... 9

5.1 發送方SMS-Submit (Mobile Originated) 9

5.1.1 向SIM卡存儲區寫入一條SMS    (+CMGW) 9

5.1.2 發送SIM卡存儲區中的一條SMS    (+CMSS) 10

5.1.3 直接從終端設定發送SMS    (+CMGS) 11

5.2 接收方 SMS-DELIVER (Mobile Terminated) 12

5.2.1 列取消息   (+CMGL) 12

5.2.2 讀取消息   (+CMGR) 12

5.2.3 删除消息   (+CMGD) 13

6、SMS PDU 基本組成元素... 13

6.1 發送方PDU格式SMS-SUBMIT-PDU (Mobile Originated) 14

6.2 接受方PDU格式 SMS-DELIVER-PDU (Mobile Terminated) 14

6.3 SCA 短消息服務中心位址格式... 15

6.4 PDU Type(第一個八位位組)... 16

6.5 MR 資訊參考 (Message Reference) 17

6.6 DA/OA 接收方位址與發送方位址... 17

6.7 PID 協定辨別 (Protocol-Identifier) 18

6.8 DCS 資料編碼方案 (DataCoding-Scheme) 18

6.9 VP 資訊有效期(Validity Period)... 19

6.10 SCTS 服務中心時間戳(Service Center TimeStamp)... 19

6.11 UDL 使用者資料長度 (User-Data-Length (Amount of Characters)) 19

7、常用 AT 指令... 20

8、PDU操作執行個體... 20

8.1 準備工作... 20

8.2 連接配接手機... 21

8.3 發送PDU SMS. 21

9、SMS 編碼方案與程式設計實作... 24

附... 26

Message service error 26

error codes: 26

預設的字元表... 28

2004-10-19 0:56:40

于蘇州

版本變動曆史

2003-08-20     第一版

2004-10-18     修訂第二版

                     修正6.6 DA/OA 接收方位址與發送方位址 協定格式翻譯錯誤

                     增加AT指令介紹

                     增加8、PDU操作執行個體

1、緒論

SMS提供了在GSM移動站台(MS)與一個短消息實體(SME)之間通過服務中心(SC)傳送短消息的方法

。SC提供了在MS與SME之間消息傳送的互相聯系和轉播的功能。

SMS采用存儲轉發模式,短消息被發送出去之後,不是直接地發送給接收方,而是先存儲在SMS(

短消息服務中心),然後再由SMC将其轉發給接收方。如果接收方當時關機或不在服務區内,SMC

會自動儲存該短消息,排隊并嘗試再次發送給接收方。

點到點短消息服務包含兩個基本服務:

              Þ SM MT(點到點短消息移動接收)

              Þ SM MO(點到點短消息移動發送)

通過 SM MT 或 SM MO 方法傳送的文本消息包含 140 個八位位組(最大 160 個拉丁字母字元、

70個雙位元組字元)。

本文僅僅給出了簡單地一些AT指令及SMS PDU模式的描述。更多的詳細資料,請參看下列标準:

GSM 03.04

GSM 03.38

GSM 03.41

GSM 07.05

GSM 07.07

2、縮寫詞

縮寫            全稱                        說明

MS:       Mobile-Station         移動站台

                                負責系統交換管理,控制來自或發往其他電話或資料系統的

通信

SME:    Short-Message-Entity     短消息實體

                                 負責接收和發送短消息。可以位于固話系統、移動基站或

其他服務中心内

SMSC: Short Message Service Center 短消息服務中心

                                 負責在移動基站和SME之間中繼、存儲或轉發短消息

PDUs:    Protocol Data Units         協定資料單元

PDU Type:   Protocol Data Unit Type   協定資料單元類型

MR:          Message Reference        消息參考

OA:        Originator Adress         發送方位址

DA:         Destination Adress       接收方位址

PID:      Protocol Identifier       協定辨別

DCS:      Data Coding Scheme        資料編碼方案

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

VP:      Validity Period            消息有效期

UDL:      User Data Length          使用者資料長度

UD:          User Data             使用者資料

RP:        Reply Path              應答路徑

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

SRI: Status Report Indication     狀态報告訓示

SRR:  Status Report Request      請示狀态報告

VPF:  Validity Period Format      有效期格式

MMS:  More Messages to Send      有更多的資訊需要發送

RD:       Reject Duplicate             拒絕複本

MTI:  Message Type Indicator 消息類型訓示

ME:  Mobile Equipment 移動裝置

TE:  Terminal Equipment 終端裝置

SIM: Subscriber Identity Modul

SC:  Service-Center 服務中心

SCA: Service Center Address 服務中心位址

SM MT: Short Message Mobile Terminated Point-to-Point 點到點短消息移動接收

SM MO: Short Message Mobile Originaed Point-to-Point  點到點短消息移動發送

3、設定指令

3.1 服務中心号碼       (+CSCA)

服務中心(SC)負責轉播和存儲轉發SME和MS之間的短消息。如果MS支援SMS-MO(短消息服務移動

發送),為了使用SMS,必須在MS中設定SMSC(短消息服務中心,SCA)。

使用指令 “AT+CSCA?” 可以檢視存儲在SIM卡中的目前服務中心位址。

使用AT指令 “AT+CSCA=<SCA>[,<TOSCA>]” 加入短消息服務号碼。

句法:

輸入                   執行                        注釋

AT+CSCA?               <CR>           查詢目前服務中心位址(SCA)設定(從SIM卡中讀取)

響應

+CSCA:  “<SCA>”

OK

AT+CSCA=“<SCA>”       <CR>         定義服務中心位址(SCA) (存儲到SIM卡)

參數:

<SCA>     服務中心位址(字元型)

<TOSCA>  服務中心位址的類型設定(編碼方式)

示例:

AT+CSCA=“+8613800250500”   <CR>    以國際号格式定義服務中心位址(SCA)

AT+CSCA=“+13800250500”   <CR>    以國内号格式定義服務中心位址(SCA)

注意:

&THORN; 為了避免漫遊時出現問題,推薦國際号碼格式存儲所有位址(以“+”和國家代碼開頭

)。

&THORN; 向你本地的網絡提供商詢問正确的短消息服務中心号碼

&THORN; SC位址是SMS的一部分!當任何一個SMS被存儲到SIM卡上時,SC位址也同時該SMS中。

3.2 選擇消息服務       (+CSMS)

這個指令用于選擇消息服務。

句法:

輸入                    執行             注釋

AT+CSMS?              <CR>             傳回目前的服務類型及ME支援的資訊

AT+CSMS=?            <CR>              傳回所有支援的服務類型

AT+CSMS=<SERVICE>     <CR>             選擇消息服務

響應

+ CSMS:  <SERVICE>,<MT>,<MO>,<BM>

OK

參數:

<SERVICE>    消息服務

<MT>    接收短消息

<MO>    發送短消息

<BM>   接收小區廣播消息

示例:

讀取指令

輸入                    執行                   注釋

AT+CSMS?               <CR>               傳回目前的服務類型及ME支援的資訊

響應

+ CSMS:  0,1,1,1

OK

 指令傳回目前的消息服務和移動裝置支援的服務選項

設定指令

輸入                        執行                      注釋

AT+CSMS=1                  <CR>                   設定支援的消息類型

響應

+ CSMS:  0,1,1,1

OK

 傳回移動裝置支援的服務選項

參數:

參數                    值                             描述

<SERVICE>               0                   SMS AT 指令的句法相容 GSM Phase 2

                        1                   SMS AT 指令的句法相容 GSM Phase 2+

                     2...127                保留

                       128                 廠商自定義

<MT>,<MO>,<BM>          0                  不支援

                        1                 支援

3.3 選擇消息格式       (+CMGF)

這個指令用于選擇短消息格式。它的參數訓示發送、列取、讀取和寫入的消息所使用的格式。

句法:

輸入                       執行                           注釋

AT+CMGF?                   <CR>                        傳回目前的SMS格式

AT+CMGF =?                 <CR>                        傳回所有支援的SMS格式

AT+CMGF=<MODE>             <CR>                        選擇SMS格式

響應

OK

支援的值:

<MODE>     含義

 0      PDU模式(預設的)

1        Text模式

示例:

讀取指令

輸入

 執行

 注釋

AT+CMGF?

 <CR>

 傳回目前的SMS格式

響應

+ CMGF: 0

OK

 傳回目前的SMS格式

設定指令

輸入

 執行

 注釋

AT+CMGF=1

 <CR>

 設定SMS類型為Text

4、SMS文本模式

5、SMS PDU模式

一個完整的SMS消息所包含的所有報頭資訊被以二進制字元串格式傳送。這個二進制串由十六進

制格式的IA5 字元組合而成。

使用AT指令”AT+CMGF=0”切換到協定資料模式,之後所有的SMS輸入與顯示将以PDU格式執行。

5.1 發送方SMS-Submit (Mobile Originated)

SMS-SUBMIT的意思就是GSM-Molbile傳送一條SMS到服務中心。

5.1.1 向SIM卡存儲區寫入一條SMS  (+CMGW)

執行指令”AT+CMGW”用于存儲一條消息在SIM卡的存儲區中。指令傳回消息被存儲的索引号。

句法:

輸入

 執行

 注釋

AT+CMGW=<LENGTH>[,<STAT>]

 <CR>

> <PDU>

*)

 <CTRL-Z>/<ESC>

**)

響應

+CMGW: <INDEX>

OK

 如果指令正确執行,傳回消息存儲位置的索引号

參數:

<LENGTH>

 給定的TP層資料單元的八位位組代碼數目(不包含服務中心位址的八位位組數目)

<STAT>

 除存儲未發送的狀态之外的狀态值

在PDU模式下該值為整型(預設值為0)

在文本模式下該值為字元型(預設值為”REC UNREAD”)

<PDU>

 PDU資料

<INDEX>

 存儲位置

支援的值:

<STAT>

 含義

0 “REC UNREAD”

 已接收未讀的消息(例如新消息)

1 “REC READ”

 已接收已讀的消息

2 “STO UNSENT”

 已存儲未發送的消息

3 “STO SENT”

 已存儲已發送的消息

4 “ALL”

 所有的消息(僅适用于 +CMGL指令)

注:

*)    符号”>”是的移動終端設定傳回而産生的

**)  <CTRL>+<Z>執行指令;<ESC>不儲存/發送、直接退出執行

5.1.2 發送SIM卡存儲區中的一條SMS     (+CMSS)

AT指令”AT+CMSS=<INDEX>[,<DA>[,<TODA>]]”将SIM卡消息存儲區中<INDEX>索引位置的消息發

送到網絡中(SMS-SUBMIT)。如果指定新的接收位址<DA>,它将代替原消息中存儲的接收位址。

如果消息傳送成功,消息參考值<MR>将傳回到終端裝置(TE)。通常(當+CSMS<SERVICE>值為1

,并且網絡支援時),同時傳回服務中心時間戳<SCTS>。

句法:

輸入

 執行

 注釋

AT+CMSS=<INDEX>

 <CR>

響應

+CMSS: <MR>[,<SCTS>]

OK

參數:

<INDEX>

 SIM卡記憶體位置索引

<MR>

 消息參考

<SCTS>

 服務中心時間戳

示例:

輸入

 執行

 注釋

AT+CMSS=1

 <CR>

 SIM卡中存儲位置1的消息将被發送到服務中心

響應

+CMSS: 255

OK

 SMS被發送到服務中心,消息參考為255

5.1.3 直接從終端設定發送SMS    (+CMGS)

這個指令用于從一個終端向網絡中發送消息(SMS-SUBMIT),而不會在SIM卡中儲存所發送的SMS

消息。

如果消息傳送成功,消息參考值<MR>将傳回到終端裝置(TE)。通常(當+CSMS<SERVICE>值為1

,并且網絡支援時),同時傳回服務中心時間戳<SCTS>。

句法:

輸入

 執行

 注釋

AT+CMGS=<LENGTH>

 <CR>

 轉換SMS輸入模式,SMS将會被以“未發送”狀态儲存。指令後所跟的PDU字串的長度必須在這個

指令中指定。

> <PDU>

*)

 <CTRL-Z>/<ESC>

**)

 直接從終端中發送一條SMS,而不将其儲存到SIM卡。

響應

+CMGS: <MR>[,<SCTS>]

OK

   如果發送成功将傳回消息參考

參數:

<LENGTH>    給定的TP層資料單元的八位位組代碼數目(不包含服務中心位址的八位位組數目)

<PDU>   PDU資料

<MR>   消息參考

<SCTS>    服務中心時間戳

注:

*)    符号”>”是的移動終端裝置傳回而産生的

**)  <CTRL>+<Z>執行指令;<ESC>不儲存/發送、直接退出執行

5.2 接收方 SMS-DELIVER (Mobile Terminated)

SMS-DELIVER意味着終端設定從服務中心接收到一條SMS消息。

5.2.1 列取消息       (+CMGL)

句法:

輸入                    執行            注釋

AT+CMGL=<INDEX>        <CR>          列取記憶體中指定類型的SMS

響應

+CMGL: <index><stat>[,<alpha>],<length>

      <pdu>

[+CMGL: <index><stat>[,<alpha>],<length>

<pdu>

[...]

]

AT+CMGL=?               <CR>           檢視裝置支援的<stat>類型

參數:

參數                描述

<STAT>             在PDU模式下該值為整型(預設值為0)

                  在文本模式下該值為字元型(預設值為”REC UNREAD”)

                  訓示記憶體中消息的狀态

定義的值:

0 “REC UNREAD”           已接收未讀的消息(例如新消息)

1 “REC READ”            已接收已讀的消息

2 “STO UNSENT”          已存儲未發送的消息

3 “STO SENT”           已存儲已發送的消息

4 “ALL”               所有類型的消息

5.2.2 讀取消息       (+CMGR)

句法:

輸入                  執行                 注釋

AT+CMGR=<INDEX>       <CR>              讀取記憶體中指定索引位置的SMS

響應

+CMGR: <STAT>[,<ALPHA>],<LENGTH>

<PDU>

OK

參數:

參數               描述  

<STAT>            在PDU模式下該值為整型(預設值為0)

                 在文本模式下該值為字元型(預設值為”REC UNREAD”)

                 訓示記憶體中消息的狀态

定義的值

0 “REC UNREAD”

 已接收未讀的消息(例如新消息)

1 “REC READ”

 已接收已讀的消息

2 “STO UNSENT”

 已存儲未發送的消息

3 “STO SENT”

 已存儲已發送的消息

<ALPHA>

 以字元型的數字文字表示的,在SIM電話薄中找到的相應<OA>條目

<LENGTH>

 給定的TP層資料單元的八位位組代碼數目(不包含服務中心位址的八位位組)

<PDU>

 PDU資料

注意:

&THORN; 切不可直接送出一個DELIVER-SMS!因為它的PDU資料中頭資訊是與用于送出的PDU不一

樣的!

&THORN;在記憶體(SIM)中至少有最後一個空閑空間,以保證能接收到新的SMS!

5.2.3 删除消息       (+CMGD)

句法:

輸入

 執行

 注釋

AT+CMGD=<INDEX>

 <CR>

 删除在SIM卡中索引<INDEX>位置的SMS

響應

OK

6、SMS PDU 基本組成元素

下列元素是用于SMS-SUBMIT和SMS-DELIVER中的部分。

元素                 名稱               長度           描述

SCA        Service Center Adress          1-12         服務中心的電話号碼

PDU-Type   Protocol Data Unit Type         1         協定資料單元類型

MR         Message Reference               1         所有成功的SMS-SUBMIT參考數目

(0..255)

OA           Originator Adress           2-12         發送方SME的位址

DA           Destination Adress          2-12         接收方SME的位址

PID          Protocol Identifier          1         參數顯示SMSC以何種方式處理SM (比

如FAX,、Voice等)

DCS          Data Coding Scheme          1          參數表示使用者資料(UD)采用什麼編碼

方案

SCTS      Service Center Time Stamp      7         參數表示SMSC接收到消息時的時間戳

VP           Validity Period          0,1,7        參數表示消息在SMSC中不再有效的時

UDL         User Data Length            1         使用者資料段長度

UD            User Data              0-140          SM資料

6.1 發送方PDU格式SMS-SUBMIT-PDU (Mobile Originated)

SCA      PDUType   MR   DA   PID   DCS    VP     UDL    UD

1-12     1         1   2-12   1    1   0,1,7      1   0-140

示例:

  向13851724908發送一條SMS,消息内容為:“Test”

0031000D91683158714209F80000A704D4F29C0E

  向13851724908發送一條SMS,消息内容為:“測試”

0031000B813158714209F80008A7046D4B8BD5

SCA     PDUType    MR      DA               PID    DCS     VP     UDL    UD

1-12    1          1      2-12              1      1     0,1,7     1     0-140

00     31          00   0D91683158714209F8  00    00      A7      04   D4F29C0E

00     31         00    0B813158714209F8    00   18       A7      04    6D4B8BD5

6.2 接受方PDU格式 SMS-DELIVER-PDU (Mobile Terminated)

SCA    PDUType   OA    PID     DCS    SCTS    UDL     UD   

1-12    1       2-12    1       1      7      1  0-140

示例:

   從13851724908接收到一條SMS,消息内容為:“Test”

0891683108200505F0240D91683158714209F800004001528035350004D4F29C0E

    從13851724908接收到一條SMS,消息内容為:“測試”

0891683108200505F0240D91683158714209F8000840015280452400046D4B8BD5

SCA

 PDUType

 OA

 PID

 DCS

 SCTS

 UDL

 UD

1-12

 1

 2-12

 1

 1

 7

 1

 0-140

0891683108200505F0

 24

 0D91683158714209F8

 00

 00

 40015280353500

 04

 D4F29C0E

0891683108200505F0

 24

 0D91683158714209F8

 00

 08

 40015280452400

 04

 6D4B8BD5

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

服務中心位址包含三個部分:

SCA組成:1-12個八位位組

例:0891683108200505F0

1 Octet

 0-1 Octet

 0-10 Octets

Len

 Type

 Addr

SCA長度

 SCA類型

 SCA位址

08

 91

 683108200505F0

Len:短消息中心位址長度。指(91)+(68 31 08 20 05 05 F0)的八位位組數目。如果Len被

設定為00&h,并不提供後面的部分,那麼終端裝置将讀取SIM中設定的SCA填充到SMS-PUD中,通

過“AT+CSCA=xxxxx”指令可以設定SIM卡中存儲的SCA值。

Type:短消息中心位址的類型,是國際的号碼還是國内的号碼(81&h表示國内,91&h表示國際的

)。91&h是TON/NPI遵守International/E.164标準,指在号碼前需加‘+’号;此外還有其它數

值,但91&h最常用。

                     例:91 &h = 1001 0001 &b

Bit No.

 7

 6

 5

 4

 3

 2

 1

  1

 資料類型

 号碼鑒别

                     第7位永遠置為1

                     數值類型(Type of Number):

000—未知,001—國際(以 + 開始的位址),010—國内,111—留作擴充;

号碼鑒别(Numbering plan identification):

0000—未知,0001—ISDN/電話号碼(E.164/E.163),1111—留作擴充;

Add:依照ISDN編号方式的短消息中心位址。

示例:

服務中心号碼

 PDU格式編碼

+8613800250500

 08 91 86 31 08 20 05 05 F0

13800512500

 07 81 31 08 50 21 05 F0

123456

 04 81 21 43 65

注:

指令AT+CMGW和AT+CMGS的參數<length>是從PDUType部分開始計算PDU的長度,不包括SCA的長度

。是以:

輸入:

AT+CMGS=19<cr>

輸出:

AT+CMGS=19<cr><cr><lf>>

輸入:

0891863108200505F031000D91683158714209F80000A704D4F29C0E<ctrl+z>

輸出:

0891863108200505F031000D91683158714209F80000A704D4F29C0E<ctrl+z><cr><lf>+CMGS:

111<cr><lf><cr><lf>OK<cr><lf>

SCA = 0891863108200505F0

輸入:

AT+CMGS=19<cr>

輸出:

AT+CMGS=19<cr><cr><lf>>

輸入:

0031000D91683158714209F80008A7046D4B8BD5<ctrl+z>

輸出:

0031000D91683158714209F80008A7046D4B8BD5<ctrl+z><cr><lf>+CMGS:

112<cr><lf><cr><lf>OK<cr><lf>

SCA = 00

<cr> = 0D&h

<lf> = 0A&h

<ctrl+z> = 1A&h

6.4 PDU Type(第一個八位位組)

PDUType是SMS-SUBMIT、SMS-DELIVER的第一個八位位組。它分别由下面幾個部分組成:

PDUType組成:1個八位位組

       發送方:SMS-SUBMIT

例:31&h = 0011 0001&b

Bit No.

 7

 6

 5

 4

 3

 2

 1

  RP

 UDHI

 SRR

 VPF

 RD

 MTI

 1

 1

 1

接收方:SMS-DELIVER

例:04&h = 0000 0100&b

Bit No.

 7

 6

 5

 4

 3

 2

 1

  RP

 UDHI

 SRI

     MMS

 MTI

 1

       RP:      應答路徑(Reply Paht),

0 – 未設定;

1 – 設定

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

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

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

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

0 – 不需要報告;

1 – 需要報告

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

(SMSC)設定

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

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

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

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

                     01 – 保留,

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

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

       RD:      拒絕複本(Reject Duplicate),

                     0 – 通知 短消息服務中心(SMSC)接受一個SMS-SUBMIT,即使該消息

是先前已送出過的,并還存在于SMSC中未發送出去。MS重複的條件是:消息參考(MR)、接收方地

址(DA)及發送方位址(OA)相同

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

       MMS:   有更多的資訊需要發送(More Messages to Send),此值僅被 SMSC 設定

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

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

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

                     00 – SMS-DELIVER(SMSCèMS)

                     00 – SMS-DELIVER REPORT(MS è SMSC)

當手機接收到 SMS-DELIVER 時自動産生

                     01 – SMS-SUBMIT(MS è SMSC)

                     01 – SMS- SUBMIT REPORT(SMSC è MS)

                     10 – SMS-STATUS REPORT (SMSC è MS)

                     10 – SMS-COMMAND(MS è SMSC)

                     11 – 保留

              注:(粗體代表手機支援的類型,并不是所有的 PDU 類型均被服務中心支援)

注意:

PDUType是PDU的第一個八位位組,而并不是服務中心号碼後的第一個位元組!

6.5 MR 資訊參考 (Message Reference)

       設為 00 即可

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

OA與DA格式是一樣的,如下所示:

DA組成:2-12個八位位組

例:0D91683158714209F8

1 Octet

 0-1 Octet

 0-10 Octets

Len

 Type

 Addr

長度

 類型

 位址

0D

 91

 683158714209F8

Len:位址長度。指8613851724908 的長度。這與SCA中的定義不一樣!

Type:短消息中心位址的類型,是國際的号碼還是國内的号碼(81&h表示國内,91&h表示國際的

)。

Add:依照ISDN編号方式的短消息中心位址。

示例:

電話号碼

 PDU格式編碼

+8613851724908

 0D 91 86 31 58 71 42 09 F8

13851724908

 0B 81 31 58 71 42 09 F8

106051268812345 *)

 0F A1 01 06 15 62 88 21 43 F5

123456

 06 81 21 43 65

       *) 小靈通号碼

6.7 PID 協定辨別 (Protocol-Identifier)

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

6.8 DCS 資料編碼方案 (DataCoding-Scheme)

Bit No.

 7

 6

 5

 4

 3

 2

 1

 描述

示例:

 = 00&h  7 bit 資料編碼 預設字元集

  1

 1

 1

 1

 1

 1

 = F6&h  8 bit 資料編碼 Class 1

 1

 = 08&h  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 – 預設的字母表,每個字元占用 7 比特位,此時最大可以傳送 160 字元

01 – 8bit,此時最大隻能傳送 140 個字元

10 – USC2(16bit), 傳送雙位元組字元集

11 – 預留;

       Bit No.1與Bit No.0:

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

01 – Class 1,

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

11 – Class 3。

       示例:

DSC

 字元集

 資訊 Class

00

 default (7-bit)

 No Class

F0

 default (7-bit)

 Class 0 (immediate display)

F1

 default (7-bit)

 Class 1 (Mobile Equipment- specific)

F2

 default (7-bit)

 Class 2 (SIM specific message)

F3

 default (7-bit)

 Class 3 (Class3 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 (Class3 Terminate Equipment- specific)

08

 16-bit

 No Class

18

 16-bit

 Class 0 (immediate display)

6.9 VP 資訊有效期(Validity Period)

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

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

 月

 日

 時

 分

 秒

 時區

30

 80

 02

 90

 54

 33

 20

                     表示 03-08-20 09:45:33

       VP 段以整型或半個8位組(semi-octet)形式提供。

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

從 SMS-SUBMIT 被 SMSC 接受開始計算。

第二種情況,VP為七個8位組,給定有效期終止的絕對時間。

       在第一種情況下,有效期表示格式如下所示:

VP

 相應的有效期

00 – 8F

 (VF+1)*5 分鐘  從 5 分鐘間隔到 12 個小時

90 – A7

 12 小時 + (VF – 143)*30 分鐘

A8 – C4

  (VP – 166) * 1 天

C5 – FF

  (VP – 192) * 1 周

第二種情況下的時間形式與 SCTS(Service Center TimeStamp)形式一緻。

6.10 SCTS 服務中心時間戳(Service Center TimeStamp)

       占用七個8位組,格式如 VP 的第二種情況所示

6.11 UDL 使用者資料長度 (User-Data-Length (Amount of Characters))

UDL 以整型形式提供,表示後面使用者資料段的資料長度。

資料格式有3種: 7bit,8bit,16bit。

其中7bit采用GSM字元集,8bit采用ASCII字元集,16bit采用Unicode字元集。

1 octet

 0 .. 140 octets

UDL

 UD

05

 E8 32 9B FD 06

如:7bit資料 "Test"

        UDL = 04, UD = D4 F2 9C 0E

    又如:16bit資料 "Test"

        UDL = 08, UD = 00 54 00 65 00 73 00 74

使用者資料(UD)的編碼方式請參考第9章SMS編碼方案與程式設計實作

7、常用 AT 指令

AT 指令

 功                     能

AT+CMGC

 Send an SMS command(發出一條短消息指令)

AT+CMGD

 Delete SMS message(删除SIM卡記憶體的短消息)

AT+CMGF

 Select SMS message formate(選擇短消息資訊格式:0-PDU;1-文本)

AT+CMGL

 List SMS message from preferred store

(列出SIM卡中的短消息PDU/text

0/“REC UNREAD”   -未讀

1/“REC READ”        -已讀

2/“STO UNSENT”   -待發

3/“STO SENT”               -已發

4/“ALL”                  -全部的

AT+CMGR

 Read SMS message(讀短消息)

AT+CMGS

 Send SMS message(發送短消息)

AT+CMGW

 Write SMS message to memory(向SIM記憶體中寫入待發的短消息)

AT+CMSS

 Send SMS message from storage(從SIN|M記憶體中發送短消息)

AT+CNMI

 New SMS message indications(顯示新收到的短消息)

AT+CPMS

 Preferred SMS message storage(選擇短消息記憶體)

AT+CSCA

 SMS service center address(短消息中心位址)

AT+CSCB

 Select cell broadcast messages(選擇蜂窩廣播消息)

AT+CSMP

 Set SMS text mode parameters(設定短消息文本模式參數)

AT+CSMS

 Select Message Service(選擇短消息服務)

8、PDU操作執行個體

8.1 準備工作

一台支援AT操作的手機或手機子產品,建議使用SIEMENS的,我使用的是西門子2118。

一根序列槽資料線。

序列槽調試軟體:

       序列槽調試助手V2.2

              RoaringWindStudio 嘯峰工作室

              http://www.gjwtech.com/

              用于通過序列槽發送和接收資料。

       Portmon

              Mark Russinovich

              http://www.sysinternals.com/

              用于監聽系統中正在使用中的序列槽或并口目前傳送的資料。

       西門子手機工作室

              通過上面的監聽程式分析它的動作,你可以學到很多。

8.2 連接配接手機

将資料線插在主機的COM1上,然後運作序列槽調試助手V2.2,設定序列槽為COM1,波特率為19200,

校驗位為NONE,資料位為8,停止位為1。然後輸入AT再加一個回車,之後點發送按鈕,如果手機

應答 AT<cr><cr><cl>OK<cr><cl>,則說明電腦已與手機正常連接配接!如下圖所示:

8.3 發送PDU SMS

如前面所述,向号碼為 +8613851724908手機發送一條内容為“Test”的SMS,PDU串是

0031000D91683158714209F80000A704D4F29C0E,它的長度是20個八位位組,而最左方的 00 位組

是PDU串中的短消息服務中心字段,AT+CMGS=<length>指令的<length>不将其計算在内,是以首

先應該發送AT+CMGS=19<cr>:

如上圖所示,手機傳回了

AT+CMGS=19

>

這是要盡快輸入PDU串:0031000D91683158714209F80000A704D4F29C0E

正确輸入了PDU串後,還需要輸入一個控制字元<ctrl+z> 1A &h通過手機立即将它發送出去,或

輸入<esc> 1B &h通過終端裝置放棄。

手機傳回

+CMGS: 111

OK

說明短消息發送成功!傳回的消息參考是111,表示這是發送成功的第111條消息(服務中心不保

證該值絕對準确)。

9、SMS 編碼方案與程式設計實作

a. 英文編碼

參見表,設短資訊内容為“Hello World!”。預設的GSM 字元集為7位編碼,可以簡單地了解為

ASCII碼(ASCII值小于80Hex,是以,Bit8被忽略),依次将下一7位編碼的後幾位逐次移至前面

,形成新的8位編碼,參見表2箭頭訓示。GSM并非支援所有的ASCII字元顯示。

下面是實作英文編碼的部分Delphi 5代碼:

function Encode1(var s: String): String;

var

  i, j, len: Integer;

  cur: Integer;

  t: String;

begin

  Result := '';

  len := Length(s);

  //j 用于移位計數

  i := 1;

  j := 0;

  while i <= len do

  begin

    if i < len then

      //資料變換

      cur := (Ord(s[i]) shr j) or ((Ord(s[i+1]) shl (7-j)) and $ff)

    else

      cur := (Ord(s[i]) shr j) and $7f;

    FmtStr(t, '%2.2X', [cur]);

    Result := Result+t;

    inc(i);

    //移位計數達到7位的特别處理

    j := (j+1) mod 7;

    if j = 0 then

      inc(i);

  end;

end;

       b. 中文編碼

通過Delphi的WideString類型轉換,可以巧妙地實作GB2312到Unicode的編碼轉換(注意代碼頁

和作業系統相關聯)。下面是實作中文編碼的部分

編号

 字元

 GB2312編碼

 GB2312 編碼 BIN

 Unicode 編碼 BIN 代碼頁CP936

1

 中

 D6

 1101 0110

 0100 1110

D0

 1101 0000

 0010 1101

2

 文

 CE

 1100 1110

 0110 0101

C4

 1100 0100

 1000 0111

Delphi 5代碼:

function Encode2(var s: WideString): String;

var

  i, len: Integer;

  cur: Integer;

  t: String;

begin

  Result := '';

  len := Length(s);

  i := 1;

  while i <= len do

  begin

    cur := Ord(s[i]);

    //BCD轉換

    FmtStr(t, '%4.4X', [cur]);

    Result := Result+t;

    inc(i);

  end;

end;

Message service error

These are the error codes for +CMS ERROR.

0-127      GSM 04.11 Annex E-2 values

128-255 GSM 03.40 section 9.2.3.22 values

300         Phone failure

301        SMS service of phone reserved

302        Operation not allowed

303        Operation not supported

304        Invalid PDU mode parameter

305        Invalid text mode parameter

310        SIM not inserted

311        SIM PIN necessary

312        PH-SIM PIN necessary

313        SIM failure

314        SIM busy

315        SIM wrong

320        Memory failure

321        Invalid memory index

322        Memory full

330        SMSC (message service center) address unknown

331        No network service

332        Network timeout

500        Unknown error

512        Manufacturer specific

error codes:

0           phone failure

1           no connection to phone

2           Phone-adaptor link reserved

3           operation not allowed

4           operation not supported

5           PH-SIM PIN necessary

10         SIM not inserted

11         SIM PIN required

12         SIM PUK required

13         SIM failure

14         SIM busy

15         SIM wrong

16         incorrect password

20         memory full

21         invalid index

22         not found

23         memory failure

24         text string too long (+CPBW)

25         invalid characters in text string

26         dial string to long

27         invalid characters in dial string

30         no network service

31         network timeout

100       unknown

265       PUK for theft protection necessary

266       PUK2 for SIM necessary

267        PIN2 for SIM necessary

2006-4-13 11:11:21   

 發表評語&raquo;&raquo;&raquo;    

 2006-4-13 11:43:50    http://hesicong.cnblogs.com/archive/2006/02/26/207044.html

SMS,EMS PDU Code Decoder 短信PDU格式解碼器 

 2006-5-27 13:15:40    一、短消息收發的實作模式

計算機序列槽上連接配接GSM MODEM,用它向手機發送短消息,要求對AT 指令集和序列槽程式設計比較熟悉。

這種方法收發短消息又分三種模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK 模式現在用的

很少了; TEXT 模式則隻能發送ASCII 碼,它不能發送中文的UNICODE碼——确切地講,從技術上

來說是可以用于發送中文短消息的,但是國内的手機基本上不支援;而PDU 模式開發起來則較為

複雜,它需要編寫專門的函數來将文本轉換為PDU 格式,但PDU 模式被所有手機支援,可以使用任

何字元集,它也是手機預設的編碼方式。筆者在開發中正是選用的PDU 模式。

二、PDU 模式

用PDU 模式收發短消息可以使用三種編碼: 7-bit 編碼、8-bit 編碼和UCS2 編碼。7-bit

編碼用于發送普通的ASCII 字元;8-bit 編碼通常用于發送資料消息,如圖檔或鈴聲等;UCS2

編碼用于發送Unicode 字元。由于筆者在系統中要實作中文短消息的發送,是以選擇用UCS2

編碼,即中文Unicode 碼。

(一)UCS2 編碼原理

所謂UCS2 編碼,是将單個的字元(1-2 個位元組)按ISO/IEC10646 的規定,轉變為16 位

的Unicode 寬字元。即将單個的字元轉換為由四位的‘0’-‘9’、‘A’-‘F’的數字和字

母組成的字元串。待發送的消息以UCS2 碼的形式進行發送。

(二)發送PDU 串的編制分析

通過UCS2 編碼我們得到中文Unicode 碼,接着就可以進行發送PDU 串的編制了。從表

面上看,PDU 串是ASCII 碼串,同樣由‘0’-‘9’、‘A’-‘F’這些數字和字母組成。它

們是8 位位元組的十六進制數,或者BCD 碼十進制數。PDU 串除了包含所發送的消息本身外,還包

含很多其它參數資訊,如服務中心号碼、目标号碼和編碼方式等。現用一個執行個體說明發送PDU 串

的結構和編排方式。

例:08 91 683108100005F0 31 00 0D 91 683119109991F2 00 08 C2 06 60A8597DFF01

參照規範,具體分析:

分段含義解釋說明

08 SMSC 位址資訊的長度共8 個八位位元組(包括91)

91 SMSC 位址格式(TON/NPI) 用國際格式号碼(在前面加‘+’)

68 31 08 10 00 05 F0 SMSC 位址8613800100500,補‘F’湊成偶數個

31 基本參數(TP-MTI/VFP) 要求發送回複

00 消息基準值(TP-MR) 0

0D 目标位址數字個數共13 個十進制數

91 目标位址格式(TON/NPI)

A1:國内格式

91:國際格式

81:未知,+86 可帶可不帶。

683119109991F2  目标位址(TP-DA) 8613910199192,補‘F’湊成偶數個

00 協定辨別(TP-PID) 是普通GSM 類型,點到點方式

08

使用者資訊編碼方式

(TP-DCS)

00:表示7-bit 編碼, 08:表示UCS2 編碼,

04:表示8-bit 編碼。

C2 有效期(TP-VP) 5 分鐘

06 使用者資訊長度(TP-UDL) 實際長度6 個位元組

60 A8 59 7D FF 01 使用者資訊(TP-UD) “您好!”

這裡需要注意的幾點:

①.比較SMSC 位址分段:68 31 08 10 00 05 F0 與真實SMSC 位址8613800100500F(為

了湊足14 位,在末尾補F),不難發現隻需将前者奇偶位對調即可得到後者。同樣,目标地

址分段683119109991F2 與實際目标位址13910199192F 之間的關系也是如此。

②.若“SMSC 位址資訊的長度”分段的值為00,則意味着SMSC 位址字元串的長度為零,

PDU 串的“SMSC 位址格式”段和“SMSC 位址”段将省去。且将使用SIM 卡設定的SMSC 位址。

上例中的PDU 串變為:

00 31 00 0D 91 683119109991F2 00 08 C2 06 60A8597DFF01

③. 對于使用者資訊長度,可通過VB 中的Len 函數求得,如“您好!”,用Len(“您好!”)

得到是3,那麼3*2=6 即為使用者資訊長度06(這裡要轉換為16 進制,并且是兩位)。

④.使用者資訊(TP-UD)段最大容量是140 位元組,是以在UCS2 編碼方式下,可發送短消息

的最大字元數是70 個。

(三)UCS2 解碼

在接收消息時,可能不僅收到UCS2 格式編碼的PDU 串,也可能是7bit 編碼格式

(TP-DCS 為00)或8bit 編碼格式(TP-DCS 為04)的PDU 串。對這兩種情況,筆者也編了相應

的解碼算法,且它們的算法要相對簡單,由于着重介紹UCS2 解碼,7bit 與8bit 解碼就不再多

介紹了。

(四)接收PDU 串的編制分析

接收PDU 串和發送PDU 串結構是不完全相同的。通過一個執行個體來分析,假定收到的短消

息其PDU 串為:

08 91 68 31 08 10 00 05 F0 04 0D 91 68 31 19 10 99 91 F2 00 08 40 40 60 31 35 30

23 06 60 A8 59 7D FF 01

參照規範,具體分析:

分段含義解釋說明

08 SMSC 位址資訊的長度共8 個八位位元組(包括91)

91 SMSC 位址格式(TON/NPI) 用國際格式号碼(在前面加‘+’)

68 31 08 10 00 05 F0 SMSC 位址8613800100500,補‘F’湊成偶數個

84 基本參數(TP-MTI/MMS/RP) 接收,無更多消息,有回複位址

0D 回複位址數字個數共13 個十進制數(不包括91 和‘F’)

91 回複位址格式(TON/NPI) 國際格式

68 31 19 10 99 91 F2 回複位址(TP-RA) 8613910199192,補‘F’湊成偶數個

00 協定辨別(TP-PID) 是普通GSM 類型,點到點方式

08 使用者資訊編碼方式(TP-DCS) UCS2 編碼

40 90 10 31 35 30 23 服務時間戳(TP-SCTS) 2004-09-01 13:53:03

06 使用者資訊長度(TP-UDL) 實際長度6 個位元組

60 A8 59 7D FF 01 使用者資訊(TP-UD) “您好!”

通過分析,我們可以擷取其中的有用資訊。如:短信服務中心号碼是+8613800100500,

發送方号碼是13910199192,發來的消息内容是“您好!”,以及發送時間是:2004-09-01

13:53:03。

 2006-9-2 14:58:24    簡單的短信源碼簡單的短信源碼,使用了MSCOMM控件,代碼寫得

比較爛,但是發短信已經完全沒有問題,供各位有興趣的朋友參考。

簡單的短信源碼

Q 用序列槽連接配接GSM手機發送和接收短消息,在應用程式中如何程式設計實作?

Q 我們打算開發一個基于GSM短消息方式的GPS系統,如何利用SMS進行資料通信?

A 首先,我們要對由ESTI制訂的SMS規範有所了解。與我們讨論的短消息收發有關的規範主要包

括GSM 03.38、GSM 03.40和GSM 07.05。前二者着重描述SMS的技術實作(含編碼方式),後者則規

定了SMS的DTE-DCE接口标準(AT指令集)。

一共有三種方式來發送和接收SMS資訊:Block Mode, Text Mode和PDU Mode。Block Mode已是昔

日黃花,目前很少用了。Text Mode是純文字方式,可使用不同的字元集,從技術上說也可用于

發送中文短消息,但國内手機基本上不支援,主要用于歐美地區。PDU Mode被所有手機支援,可

以使用任何字元集,這也是手機預設的編碼方式。Text Mode比較簡單,而且不适合做自定義數

據傳輸,我們就不讨論了。下面介紹的内容,是在PDU Mode下發送和接收短消息的實作方法。

PDU串表面上是一串ASCII碼,由‘0’-‘9’、 ‘A’-‘F’這些數字和字母組成。它們是8位字

節的十六進制數,或者BCD碼十進制數。PDU串不僅包含可顯示的消息本身,還包含很多其它資訊

,如 SMS服務中心号碼、目标号碼、回複号碼、編碼方式和服務時間等。發送和接收的PDU串,

結構是不完全相同的。我們先用兩個實際的例子說明PDU串的結構和編排方式。

例1 發送:SMSC号碼是+8613800250500,對方号碼是13851872468,消息内容是“Hello!”。從

手機發出的PDU串可以是

08 91 68 31 08 20 05 05 F0 11 00 0D 91 68 31 58 81 27 64 F8 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 58 81 27 64 F8  目标位址(TP-DA)  8613851872468,補‘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,對方号碼是13851872468,消息内容是“你好!”。手機

接收到的PDU串可以是

08 91 68 31 08 20 05 05 F0 84 0D 91 68 31 58 81 27 64 F8 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 58 81 27 64 F8  回複位址(TP-RA)  8613851872468,補‘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)  “你好!”

若基本參數的最高位(TP-RP)為0,則沒有回複位址的三個段。從Internet上發出的短消息常常是

這種情形。

注意号碼和時間的表示方法,不是按正常順序順着來的,而且要以‘F’将奇數補成偶數。

Q 上面兩例中已經出現了7-bit和UCS2編碼,請詳細介紹一下這些編碼方式?

A 在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 編碼

時,也是位元組數,等于原始短消息的字元數的兩倍。如果使用者資訊(TP-UD)中存在一個頭(基本參

數的TP-UDHI為1),在所有編碼方式下,使用者資訊長度(TP-UDL)都等于頭長度與編碼後位元組數之

和。如果采用GSM 03.42所建議的壓縮算法(TP-DCS的高3位為001),則該長度也是壓縮編碼後字

節數或頭長度與壓縮編碼後位元組數之和。

下面以一個具體的例子說明7-bit編碼的過程。我們對英文短信“Hello!”進行編碼:

7-bit解碼

将源串每8個字元分為一組(這個例子中不滿8個)進行編碼,在組内字元間壓縮,但每組之間是沒

有什麼聯系的。

用C實作7-bit編碼和解碼的算法如下:

// 7-bit編碼

// pSrc: 源字元串指針

// pDst: 目标編碼串指針

// nSrcLength: 源字元串長度

// 傳回: 目标編碼串長度

int gsmEncode7bit(const char* pSrc, unsigned char* pDst, int nSrcLength)

{

    int nSrc;        // 源字元串的計數值

    int nDst;        // 目标編碼串的計數值

    int nChar;       // 目前正在處理的組内字元位元組的序号,範圍是0-7

    unsigned char nLeft;    // 上一位元組殘餘的資料

    // 計數值初始化

    nSrc = 0;

    nDst = 0;

    // 将源串每8個位元組分為一組,壓縮成7個位元組

    // 循環該處理過程,直至源串被處理完

    // 如果分組不到8位元組,也能正确處理

    while(nSrc<nSrcLength)

    {

        // 取源字元串的計數值的最低3位

        nChar = nSrc & 7;

        // 處理源串的每個位元組

        if(nChar == 0)

        {

            // 組内第一個位元組,隻是儲存起來,待處理下一個位元組時使用

            nLeft = *pSrc;

        }

        else

        {

            // 組内其它位元組,将其右邊部分與殘餘資料相加,得到一個目标編碼位元組

            *pDst = (*pSrc << (8-nChar)) | nLeft;

            // 将該位元組剩下的左邊部分,作為殘餘資料儲存起來

            nLeft = *pSrc >> nChar;

            // 修改目标串的指針和計數值 pDst++;

            nDst++;

        }

        // 修改源串的指針和計數值

        pSrc++; nSrc++;

    }

    // 傳回目标串長度

    return nDst;

}

// 7-bit解碼

// pSrc: 源編碼串指針

// pDst: 目标字元串指針

// nSrcLength: 源編碼串長度

// 傳回: 目标字元串長度

int gsmDecode7bit(const unsigned char* pSrc, char* pDst, int nSrcLength)

{

    int nSrc;        // 源字元串的計數值

    int nDst;        // 目标解碼串的計數值

    int nByte;       // 目前正在處理的組内位元組的序号,範圍是0-6

    unsigned char nLeft;    // 上一位元組殘餘的資料

    // 計數值初始化

    nSrc = 0;

    nDst = 0;

    // 組内位元組序号和殘餘資料初始化

    nByte = 0;

    nLeft = 0;

    // 将源資料每7個位元組分為一組,解壓縮成8個位元組

    // 循環該處理過程,直至源資料被處理完

    // 如果分組不到7位元組,也能正确處理

    while(nSrc<nSrcLength)

    {

        // 将源位元組右邊部分與殘餘資料相加,去掉最高位,得到一個目标解碼位元組

        *pDst = ((*pSrc << nByte) | nLeft) & 0x7f;

        // 将該位元組剩下的左邊部分,作為殘餘資料儲存起來

        nLeft = *pSrc >> (7-nByte);

        // 修改目标串的指針和計數值

        pDst++;

        nDst++;

        // 修改位元組計數值

        nByte++;

        // 到了一組的最後一個位元組

        if(nByte == 7)

        {

            // 額外得到一個目标解碼位元組

            *pDst = nLeft;

            // 修改目标串的指針和計數值

            pDst++;

            nDst++;

            // 組内位元組序号和殘餘資料初始化

            nByte = 0;

            nLeft = 0;

        }

        // 修改源串的指針和計數值

        pSrc++;

        nSrc++;

    }

    *pDst = 0;

    // 傳回目标串長度

    return nDst;

}

需要指出的是,7-bit的字元集與ANSI标準字元集不完全一緻,在0x20以下也排布了一些可列印

字元,但英文字母、阿拉伯數字和常用符号的位置兩者是一樣的。用上面介紹的算法收發純英文

短消息,一般情況應該是夠用了。如果是法語、德語、西班牙語等,含有 “?”、 “é”這一類

字元,則要按上面編碼的輸出去查表,請參閱GSM 03.38的規定。

8-bit編碼其實沒有規定什麼具體的算法,不需要介紹.

UCS2編碼是将每個字元(1-2個位元組)按照ISO/IEC10646的規定,轉變為16位的Unicode寬字元。在

Windows系統中,特别是在2000/XP中,可以簡單地調用API 函數實作編碼和解碼。如果沒有系統

的支援,比如用單片機控制手機子產品收發短消息,隻好用查表法解決了。

Windows環境下,用C實作UCS2編碼和解碼的算法如下:

// UCS2編碼

// pSrc: 源字元串指針

// pDst: 目标編碼串指針

// nSrcLength: 源字元串長度

// 傳回: 目标編碼串長度

int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)

{

    int nDstLength;        // UNICODE寬字元數目

    WCHAR wchar[128];      // UNICODE串緩沖區

    // 字元串-->UNICODE串

    nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

    // 高低位元組對調,輸出

    for(int i=0; i<nDstLength; i++)

    {

        // 先輸出高位位元組

        *pDst++ = wchar[i] >> 8;

        // 後輸出低位位元組

        *pDst++ = wchar[i] & 0xff;

    }

    // 傳回目标編碼串長度

    return nDstLength * 2;

}

// UCS2解碼

// pSrc: 源編碼串指針

// pDst: 目标字元串指針

// nSrcLength: 源編碼串長度

// 傳回: 目标字元串長度

int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)

{

    int nDstLength;        // UNICODE寬字元數目

    WCHAR wchar[128];      // UNICODE串緩沖區

    // 高低位元組對調,拼成UNICODE

    for(int i=0; i<nSrcLength/2; i++)

    {

        // 先高位位元組

        wchar[i] = *pSrc++ << 8;

        // 後低位位元組

        wchar[i] |= *pSrc++;

    }

    // UNICODE串-->字元串

    nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160,

NULL, NULL);

    // 輸出字元串加個結束符   

    pDst[nDstLength] = '/0';   

    // 傳回目标字元串長度

    return nDstLength;

}

用以上編碼和解碼子產品,還不能将短消息字元串編碼為PDU串需要的格式,也不能直接将PDU串中

的使用者資訊解碼為短消息字元串,因為還差一個在可列印字元串和位元組資料之間互相轉換的環節

。可以循環調用sscanf和sprintf函數實作這種變換。下面提供不用這些函數的算法,它們也适

用于單片機、 DSP程式設計環境。

// 可列印字元串轉換為位元組資料

// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}

// pSrc: 源字元串指針

// pDst: 目标資料指針

// nSrcLength: 源字元串長度

// 傳回: 目标資料長度

int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)

{

    for(int i=0; i<nSrcLength; i+=2)

    {

        // 輸出高4位

        if(*pSrc>='0' && *pSrc<='9')

        {

            *pDst = (*pSrc - '0') << 4;

        }

        else

        {

            *pDst = (*pSrc - 'A' + 10) << 4;

        }

        pSrc++;

        // 輸出低4位

        if(*pSrc>='0' && *pSrc<='9')

        {

            *pDst |= *pSrc - '0';

        }

        else

        {

            *pDst |= *pSrc - 'A' + 10;

        }

        pSrc++;

        pDst++;

    }

    // 傳回目标資料長度

    returnnSrcLength / 2;

}

// 位元組資料轉換為可列印字元串

// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"

// pSrc: 源資料指針

// pDst: 目标字元串指針

// nSrcLength: 源資料長度

// 傳回: 目标字元串長度

int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)

{

    const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字元查找表

    for(int i=0; i<nSrcLength; i++)

    {

        // 輸出低4位

        *pDst++ = tab[*pSrc >> 4];

        // 輸出高4位

        *pDst++ = tab[*pSrc & 0x0f];

        pSrc++;

    }

    // 輸出字元串加個結束符

    *pDst = '/0';

    // 傳回目标字元串長度

    return nSrcLength * 2;

}

關于GSM 03.42中的壓縮算法,至今還沒有發現哪裡用過,這裡我們就不讨論了。有興趣的話,

可深入研究一下。

[相關資源]

◆ ETSI官方網站:http://www.etsi.org

◆ bhw98的專欄:http://www.csdn.net/develop/author/netauthor/bhw98/ 

繼續閱讀