簡介
沒發過短信的年輕人肯定是屬於那種受保護的稀有動物,通訊發達的今天短信已經成為人們交流的重要手段,其中也蘊含著巨大的市場和經濟利益,掌握短信技術的人才也受到各大公司的追捧是目前職場上耀眼的明星。本文介紹了短信的原理和實現方法,重點說明了短信的編碼方式、AT指令以及用C#實現串口通訊的方法。
前言
目前,主有三種發送短信的方式:
1、 網關方式:就是向當地的電信部門申請,不需要額外的設備,適用於大型的通信公司,像華為、傲天、中興、亞信等。
2、 終端方式:就是借助像GSM MODEM之類的設置(支持AT指令的手機也行),通過數據線連接電腦,來發送短信,用這種方法比較適用於小型及個人。要實現這種方式必須理解串口通信、AT指令、短信編碼、解碼,這也是本文討論的重點。
3、 利用一些網站來實現,方式簡單,不過對網站依賴性太高,對網絡的要求也比較高,非常不適於進行項目開發
終端短信連接示意圖
原理篇
短信編碼
在收發短信方面,按時間產生先後,共產生了三種模式: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。
本文示例代碼或素材下載