程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#開發終端式短信的原理和方法(2)

C#開發終端式短信的原理和方法(2)

編輯:關於C語言

原理篇

短信編碼

在收發短信方面,按時間產生先後,共產生了三種模式:Block Mode、基於AT指令的Text Mode、基於AT指令的PDU Modem, Text Mode比較簡單,多款諾基亞手機均支持該模式。西門子的手機大多只支持PDU模式,PDU模式是發送或接收手機SMS信息的一種方法,短信息正文經過十六進制編碼後被傳送。目前,PDU已取代Block Mode,因我們主要探討PDU模式的發送。以西門子3508手機為例。

SMS是由Etsi所制定的一個規范(GSM 03.40 和 GSM 03.38)。當使用7-bits編碼時,它可以發送最多160個字符;但用8-bit編碼,最多可以發送140個字符,通常無法直接通過手機顯示;還有用16-bit編碼時,最多70個字符,被用來顯示Unicode(UCS2)文本信息,可以被大多數的手機所顯示。我們今天討論的是UCS2編碼,也就是說,最多只能發送70個字符,不管英文還是中文。

現例如我們現在要發送如下信息,向我的手機13715342642發送"你好,Hello!"。在沒有發送之前,你要清楚,手機SIM卡所在地的短信中心號,並不是你現在所在地方的短信中心號,像我在深圳,深圳的短信中心號是:8613800755000,即使我現在到外地,短信中心號仍是深圳。從上面我們得到了下面的信息:

接收的手機號:13715342642

短信中心號:8613800755000

短信內容:你好,Hello!

在實際使用中,上面這些信息並不為手機所執行,要進行編碼手機才會執行,先不管,看看編碼後的信息:

0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0021

看不懂吧,我來解釋一下:

08 - 指的是短信中心號的長度,也就是指(91)+( 683108705500F0)的長度

91 - 指的是短信息中心號碼類型。91是TON/NPI遵守International/E.164標准,指在號碼前需加'+'號;此外還有其它數值,但91最常用。

683108705500F0 - 短信息中心號碼。由於位置上略有處理,實際號碼應為:8613800731500(字母F是指長度減1)。這需要根據不同的地域作相應的修改。前面的(08)+(91)+( 683108705500F0)實際上就構成了整個短信的一部份,通稱短消息中心地址(Address of the SMSC)。

11 - 文件頭字節

00 - 信息類型(TP-Message-Reference)

0D - 被叫號碼長度

91 - 被叫號碼類型

其實在實際處理中,我們通常把11000D91寫死在程序中,因為在國內,這些數據都是不會改變的。

683117352446F2 -被叫號碼,經過了位移處理,實際號碼為"8613715342642"。上面的(00)+(0D)+(91)+( 683117352446F2),構成了整個短信的第二部份目的地址(TP-Destination-Address)。

00 - 協議標識TP-PID,這裡一般為00

08 - 數據編碼方案TP-DCS(TP-Data-Coding-Scheme),采用前面說的USC2(16bit)數據編碼

00 - 有效期TP-VP(TP-Valid-Period)

12-長度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的長度 36 / 2 = 18 的十六進 12

4F60597DFF0C00480065006C006C 006F0021- 這裡就是短信內容了,實際內容為:"你好,Hello!"程序實現,請參考本文章所帶源程序的PDUdecoding.cs。

AT指令

說到AT指令可多了,有厚厚的一本書,不屬於我們今天討論的范圍,在這裡我僅討論在發送短信中必須要用的幾個AT指令。

與SMS有關的GSM AT指令(from GSM07.05)如表1所示:

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(選擇短消息服務)表一:相關的GSM AT指令
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved