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

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

編輯: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指令

  我現在以實例來說明這些指令的使用方法:

  先用手機數據線將手機連接到電腦串口,並將串口的波特率設置為19200,可以開始了。

  1、首先測試你的連接及手機是否支持AT指令,請在你的串口調試程序中輸入:

  AT<回車>

  屏幕上返回"OK"表明計算機與手機連接正常,那樣我們就可以進行其它的AT指令測試了

  2、設置短信發送格式

  AT+CMGF=1<回車>

  屏幕上返回"OK"表明現在短信的發送方式為PDU方式,如果是設置為TEXT方式,則,AT+CMGF=0<回車>

  3、 發送短信

  發送內容及手要號仍舊同上面在編碼中的一樣,編碼後,得到要發送的數據如下

0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

  我們用如下指令來發送

  AT+CMGS=33<回車>

  如果返回">",就把上面編碼數據輸入,並以CTRL+Z結尾,稍等一下,你就可以看到返回OK啦。

  說明一下,為什麼AT+CMGS=33呢,是這樣得來的:

11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021

  這一段字符串的長度除以2得到的結果,上面的字符串,短信中心號加上短信內容得到的,怎麼得到的,請回顧一下解碼部份

  在我們前面的討論中,一條完整的短信發送,只要執行三條AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由於篇幅,我只能在這裡提到這麼多,大家要是想了解更多,可以向各手機廠商索取AT指令白皮書,裡面很詳細的。

  上面講到的,只能為我們實際中作准備,我們還必須要一個發送途徑,根據我們的需要,我們選擇投資最少,實現比較方便的串口通信。注意,串口通過數據線跟手機相連,用AT指令來實現發送短信,在我們

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved