C_終端式短信開發(fā)原理和方法_第1頁
C_終端式短信開發(fā)原理和方法_第2頁
C_終端式短信開發(fā)原理和方法_第3頁
C_終端式短信開發(fā)原理和方法_第4頁
C_終端式短信開發(fā)原理和方法_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C#終端式短信開發(fā)原理和方法本文介紹了短信的原理和實(shí)現(xiàn)方法,重點(diǎn)說明了短信的編碼方式、AT指令以及用C#實(shí)現(xiàn)串口通訊的方法  簡介沒發(fā)過短信的年輕人肯定是屬于那種受保護(hù)的稀有動物,通訊發(fā)達(dá)的今天短信已經(jīng)成為人們交流的重要手段,其中也蘊(yùn)含著巨大的市場和經(jīng)濟(jì)利益,掌握短信技術(shù)的人才也受到各大公司的追捧是目前職場上耀眼的明星。本文介紹了短信的原理和實(shí)現(xiàn)方法,重點(diǎn)說明了短信的編碼方式、AT指令以及用C#實(shí)現(xiàn)串口通訊的方法。前言目前,主有三種發(fā)送短信的方式:1、 網(wǎng)關(guān)方式:就是向當(dāng)?shù)氐碾娦挪块T申請,不需要額外的設(shè)備,適用于大型的通信公司,像華為、傲天、中興、亞信等。2、 終端方式:就是借助像G

2、SM MODEM之類的設(shè)置(支持AT指令的手機(jī)也行),通過數(shù)據(jù)線連接電腦,來發(fā)送短信,用這種方法比較適用于小型及個人。要實(shí)現(xiàn)這種方式必須理解串口通信、AT指令、短信編碼、解碼,這也是本文討論的重點(diǎn)。3、 利用一些網(wǎng)站來實(shí)現(xiàn),方式簡單,不過對網(wǎng)站依賴性太高,對網(wǎng)絡(luò)的要求也比較高,非常不適于進(jìn)行項(xiàng)目開發(fā) 終端短信連接示意圖  原理篇短信編碼在收發(fā)短信方面,按時間產(chǎn)生先后,共產(chǎn)生了三種模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比較簡單,多款諾基亞手機(jī)均支持該模式。西門子的手機(jī)大多只支持PDU模式,

3、PDU模式是發(fā)送或接收手機(jī)SMS信息的一種方法,短信息正文經(jīng)過十六進(jìn)制編碼后被傳送。目前,PDU已取代Block Mode,因我們主要探討PDU模式的發(fā)送。以西門子3508手機(jī)為例。SMS是由Etsi所制定的一個規(guī)范(GSM 03.40 和 GSM 03.38)。當(dāng)使用7-bits編碼時,它可以發(fā)送最多160個字符;但用8-bit編碼,最多可以發(fā)送140個字符,通常無法直接通過手機(jī)顯示;還有用16-bit編碼時,最多70個字符,被用來顯示Unicode(UCS2文本信息,可以被大多數(shù)的手機(jī)所顯示。我們今天討論的是UCS2編碼,也就是說,最多只能發(fā)送70個字符,不管英文還是中文?,F(xiàn)例如我們現(xiàn)在要

4、發(fā)送如下信息,向我的手機(jī)發(fā)送"你好,Hello!"。在沒有發(fā)送之前,你要清楚,手機(jī)SIM卡所在地的短信中心號,并不是你現(xiàn)在所在地方的短信中心號,像我在深圳,深圳的短信中心號是:,即使我現(xiàn)在到外地,短信中心號仍是深圳。從上面我們得到了下面的信息:接收的手機(jī)號:短信中心號:短信內(nèi)容:你好,Hello!在實(shí)際使用中,上面這些信息并不為手機(jī)所執(zhí)行,要進(jìn)行編碼手機(jī)才會執(zhí)行,先不管,看看編碼后的信息:看不懂吧,我來解釋一下:08 - 指的是短信中心號的長度,也就是指(91+( 683108705500F0的長度91 - 指的是短信息中心號碼類型。91是TON/NPI遵守Internat

5、ional/E.164標(biāo)準(zhǔn),指在號碼前需加'+'號;此外還有其它數(shù)值,但91最常用。683108705500F0 - 短信息中心號碼。由于位置上略有處理,實(shí)際號碼應(yīng)為:(字母F是指長度減1)。這需要根據(jù)不同的地域作相應(yīng)的修改。前面的(08+(91+( 683108705500F0實(shí)際上就構(gòu)成了整個短信的一部份,通稱短消息中心地址(Address of the SMSC)。11 - 文件頭字節(jié)00 - 信息類型(TP-Message-Reference)0D - 被叫號碼長度91 - 被叫號碼類型其實(shí)在實(shí)際處理中,我們通常把11000D91寫死在程序中,因?yàn)樵趪鴥?nèi),這些數(shù)據(jù)都是不

6、會改變的。683117352446F2 -被叫號碼,經(jīng)過了位移處理,實(shí)際號碼為。上面的(00)+(0D)+(91)+( 683117352446F2,構(gòu)成了整個短信的第二部份目的地址(TP-Destination-Address)。00 - 協(xié)議標(biāo)識TP-PID,這里一般為0008 - 數(shù)據(jù)編碼方案TP-DCS(TP-Data-Coding-Scheme),采用前面說的USC2(16bit數(shù)據(jù)編碼00 - 有效期TP-VP(TP-Valid-Period)12-長度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的長度 36

7、 / 2 = 18 的十六進(jìn) 124F60597DFF0C00480065006C006C 006F0021- 這里就是短信內(nèi)容了,實(shí)際內(nèi)容為:"你好,Hello!"程序?qū)崿F(xiàn),請參考本文章所帶源程序的PDUdecoding.cs。 AT指令說到AT指令可多了,有厚厚的一本書,不屬于我們今天討論的范圍,在這里我僅討論在發(fā)送短信中必須要用的幾個AT指令。與SMS有關(guān)的GSM AT指令(from GSM07.05)如表1所示:AT 指令功 能 AT+CMGCSend an SMS command(發(fā)出一條短消息命令)AT+CMGDDelete SMS message(刪

8、除SIM卡內(nèi)存的短消息) AT+CMGFSelect SMS message formate(選擇短消息信息格式:0-PDU;1-文本)AT+CMGLList SMS message from preferred store(列出SIM卡中的短消息PDU/text: 0/"REC UNREAD"-未讀,1/"REC READ"-已讀,2/"STO UNSENT"-待發(fā),3/"STO SENT"-已發(fā),4/"ALL"-全部的)AT+CMGRRead SMS message(讀短消息)AT+CMGS

9、Send SMS message(發(fā)送短消息) AT+CMGWWrite SMS message to memory(向SIM內(nèi)存中寫入待發(fā)的短消息)AT+CMSSSend SMS message from storage(從SIN|M內(nèi)存中發(fā)送短消息) AT+CNMINew SMS message indications(顯示新收到的短消息)AT+CPMSPreferred SMS message storage(選擇短消息內(nèi)存)AT+CSCA SMS service center address(短消息中心地址)AT+CSCBSelect cell broadcast messages(選

10、擇蜂窩廣播消息) AT+CSMPSet SMS text mode parameters(設(shè)置短消息文本模式參數(shù)) AT+CSMSSelect Message Service(選擇短消息服務(wù))串口通信在C#中要實(shí)現(xiàn)串口通信,很多人都不知所措,在論壇上經(jīng)??梢钥吹?quot;怎么用MSCOMM實(shí)現(xiàn)串口通信"、"怎樣能過串口與設(shè)備相連"諸如此類的問題。其實(shí)國外的網(wǎng)友早就把這些列入FAQ中了。通常,在C#中實(shí)現(xiàn)串口通信,我們有四種方法: using JustinIO;static JustinIO.CommPort ss_port = new JustinIO.Comm

11、Port(;ss_port.PortNum = COM1; /端口號ss_port.BaudRate = 19200; /串口通信波特率ss_port.ByteSize = 8; /數(shù)據(jù)位ss_port.Parity = 0; /奇偶校驗(yàn)ss_port.StopBits = 1;/停止位ss_port.ReadTimeout = 1000; /讀超時tryif (ss_port.Openedss_port.Close(;ss_port.Open(; /打開串口elsess_port.Open(;/打開串口return true;catch(Exception e MessageBox.Show

12、("錯誤:" + e.Message;return false;實(shí)踐篇在整個開始的時候,你要準(zhǔn)備以下軟硬件:硬件:西門子3508或C35系列手機(jī)一個西門子手機(jī)通信數(shù)據(jù)線一條軟件:VS.NET(C#)短信編碼類庫(PDUdecoding.cs)串口通信類庫(JustinIO.cs)當(dāng)所要求的軟硬件都準(zhǔn)備好后,我們就可以正式開始了。下面以我自己的測試用例為大家詳細(xì)介紹。 做什么事情都應(yīng)該有計劃,雖然我們的測試用例很簡單,但還是畫個簡單的流程圖: 有了流程圖,還只是明白了程序怎么運(yùn)行,再看看界面,會讓你更心動的了。圖二、短信終端C#版界面圖再不開始,就有人罵我了。下在我

13、講的開發(fā)環(huán)境是在VS.NET(C#中。COME GO,GO步驟一、打開VS.NET,新建項(xiàng)目-Visual C#項(xiàng)目-Windows應(yīng)用程序,名稱中輸入你的工程名就行啦,我的是smsForCsharp步驟二、參照上面的界面圖,設(shè)計你的程序界面,下面是我程序中各控件的主要屬性控件名稱控件Name屬性說明TextBoxtargetNumber接收手機(jī)號碼TextBoxCenterNumber短信中心號TextBoxsmsState發(fā)送短信后,返回的信息。注意設(shè)置控件為多行TextBox smsContent短信內(nèi)容,同樣,注意設(shè)置為多行ComboBoxConnectPort連接手機(jī)的端口,例:CO

14、M1COM2ComboBoxConnectBaudRate串口連接的波特率,在串口通信中很重要的ButtonbtnSend發(fā)送按鈕ButtonbtnConnect連接按鈕,主要用于程序的初始化ButtonbtnExit退出按鈕using JustinIO;using SMS;using System.IO;using System.Text;步驟五、在smsFormCsharp類中,添加兩個字段ss_port、sms,分別為JustinIO及SMS的對象,如下步驟六、添加串口初始化代碼,如下: / summary/ 初始化串口/ /summarypublic bool InitCom(stri

15、ng m_port, int m_baudratess_port.PortNum = m_port;/串口號ss_port.BaudRate = m_baudrate;/波特率ss_port.ByteSize = 8;/數(shù)據(jù)位ss_port.Parity = 0;/ss_port.StopBits = 1;/停止位ss_port.ReadTimeout = 1000;/讀超時tryif (ss_port.Openedss_port.Close(;ss_port.Open(;elsess_port.Open(;/打開串口return true;catch(Exception e MessageB

16、ox.Show("錯誤:" + e.Message;return false;將上述代碼直接拷入你的程序中,并確保添加在Main主函數(shù)的后面,按F5,調(diào)試應(yīng)該沒什么問題,不過上面還沒有實(shí)際任何看得見的功能,僅僅是打開了串口而以。步驟七、打開串口后,我們就應(yīng)該初始化程序,取得手機(jī)的名牌,型號,以及短信中心號,雙擊連接按鈕,并把下面代碼拷入程序中:/ summary/ 初始化代碼,并獲取手機(jī)相關(guān)信息/ /summary/ param name="sender"/param/ param name="e"/paramprivate void

17、 btnConnect_Click(object sender, System.EventArgs ebool opened = InitCom(ConnectPort.SelectedItem.ToString(,Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString(;/打開并初始化串口bool Connected = false;if (openedss_port.Write(Encoding.ASCII.GetBytes("AT+CGMIr" /獲取手機(jī)品牌string response = Encoding.AS

18、CII.GetString(ss_port.Read(128;if (response.Length 0ConnectState.Text = response.Substring(10,7;Connected = true;elseConnectState.Text = "與手機(jī)連接不成功"Connected = false;ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMMr"/獲取手機(jī)型號response = Encoding.ASCII.GetString(ss_port.Read(128;if(resp

19、onse.Length 0ConnectState.Text =ConnectState.Text+ " " + response.Substring(10,5 + " 連接中."Connected = true;elseConnectState.Text = "與手機(jī)連接不成功"Connected = false;ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?r"/獲取手機(jī)短信中心號response = Encoding.ASCII.GetString(ss_por

20、t.Read(128;if(response.Length 0CenterNumber.Text = response.Substring(20,13;Connected = true;elseConnected = false;if (Connected = truebtnConnect.Enabled = false;btnSend.Enabled = true;elsebtnConnect.Enabled = true;btnSend.Enabled = false;到這里,你可以按F5,編譯調(diào)試,通過,在確保你的手機(jī)與電腦連接正常下,點(diǎn)擊連接按鈕看看,是不是像我的一樣,手機(jī)型號及短信中

21、心號者正常顯示出來了。 圖四、連接后程序界面步驟八、看到上在的結(jié)果,是不是感覺到離成功發(fā)送短信很近啦,看這么長的文章,費(fèi)了大家不少時間,再不亮出發(fā)短信部份,對不起大家了。雙擊發(fā)送按鈕,將下面代碼拷入程序中。/ summary/ 發(fā)送短信/ /summary/ param name="sender"/param/ param name="e"/paramprivate void btnSend_Click(object sender, System.EventArgs estring decodedSMS = sms.smsDecodedsms(Cente

22、rNumber.Text,targetNumber.Text,smsContent.Text;byte buf =Encoding.ASCII.GetBytes(String.Format("AT+CMGS=0r",sms.nLength;ss_port.Write(buf;string response = Encoding.ASCII.GetString(ss_port.Read(128;string SendState = ""if( response.Length 0 && response.EndsWith(" &qu

23、ot;ss_port.Write(Encoding.ASCII.GetBytes(String.Format("0x01a",decodedSMS;SendState = "發(fā)送成功!"elseSendState = "發(fā)送失敗"string Result = String.Format("0,1,2,nr",targetNumber.Text,smsContent.Text,SendState;smsState.Text += Result;快按F5吧!神啊,快通過吧!不用求神了,已經(jīng)通過了,現(xiàn)在你就可以發(fā)短信了,請確保手機(jī)可以正常連接電腦。按連接,然后填入你要的發(fā)送的目標(biāo)手機(jī)號,并在內(nèi)容中添入你要發(fā)送的內(nèi)容,發(fā)送吧!成功了!成功了是這樣子的!看你的跟我的一樣嗎?圖五、發(fā)送成功還有一些事 不要忘了,記得添加退出代碼。雙擊退出,添加下面代碼:/ sum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論