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

下載本文檔

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

文檔簡(jiǎn)介

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

2、理解串口通信、AT指令、短信編碼、解碼,這也是本文討論的重點(diǎn)。3、 利用一些網(wǎng)站來(lái)實(shí)現(xiàn),方式簡(jiǎn)單,不過(guò)對(duì)網(wǎng)站依賴性太高,對(duì)網(wǎng)絡(luò)的要求也比較高,非常不適于進(jìn)行項(xiàng)目開(kāi)發(fā)閱讀導(dǎo)航 終端短信連接示意圖 原理篇短信編碼AT指令串口通訊實(shí)踐篇常見(jiàn)問(wèn)題下載本文源代碼編碼測(cè)試文件終端短信連接示意圖原理篇短信編碼在收發(fā)短信方面,按時(shí)間產(chǎn)生先后,共產(chǎn)生了三種模式:Block Mode、基于AT指令的Text Mode、基于AT指令的PDU Modem, Text Mode比較簡(jiǎn)單,多款諾基亞手機(jī)均支持該模式。西門子的手機(jī)大多只支持PDU模式,PDU模式是發(fā)送或接收手機(jī)SMS信息的一種方法,短信息正文經(jīng)過(guò)十六進(jìn)制編

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

4、ello!"。在沒(méi)有發(fā)送之前,你要清楚,手機(jī)SIM卡所在地的短信中心號(hào),并不是你現(xiàn)在所在地方的短信中心號(hào),像我在深圳,深圳的短信中心號(hào)是:8613800755000,即使我現(xiàn)在到外地,短信中心號(hào)仍是深圳。從上面我們得到了下面的信息:接收的手機(jī)號(hào)信中心號(hào):8613800755000短信內(nèi)容:你好,Hello!在實(shí)際使用中,上面這些信息并不為手機(jī)所執(zhí)行,要進(jìn)行編碼手機(jī)才會(huì)執(zhí)行,先不管,看看編碼后的信息:0891683108705500F011000D91683117352446F2000800124F60597DFF0C00480065006C006C006F0

5、021看不懂吧,我來(lái)解釋一下:08 - 指的是短信中心號(hào)的長(zhǎng)度,也就是指(91)+( 683108705500F0)的長(zhǎng)度91 - 指的是短信息中心號(hào)碼類型。91是TON/NPI遵守International/E.164標(biāo)準(zhǔn),指在號(hào)碼前需加'+'號(hào);此外還有其它數(shù)值,但91最常用。683108705500F0 - 短信息中心號(hào)碼。由于位置上略有處理,實(shí)際號(hào)碼應(yīng)為:8613800731500(字母F是指長(zhǎng)度減1)。這需要根據(jù)不同的地域作相應(yīng)的修改。前面的(08)+(91)+( 683108705500F0)實(shí)際上就構(gòu)成了整個(gè)短信的一部份,通稱短消息中心地址(Address of

6、the SMSC)。11 - 文件頭字節(jié)00 - 信息類型(TP-Message-Reference)0D - 被叫號(hào)碼長(zhǎng)度91 - 被叫號(hào)碼類型其實(shí)在實(shí)際處理中,我們通常把11000D91寫死在程序中,因?yàn)樵趪?guó)內(nèi),這些數(shù)據(jù)都是不會(huì)改變的。683117352446F2 -被叫號(hào)碼,經(jīng)過(guò)了位移處理,實(shí)際號(hào)碼為"8613715342642"。上面的(00)+(0D)+(91)+( 683117352446F2),構(gòu)成了整個(gè)短信的第二部份目的地址(TP-Destination-Address)。00 - 協(xié)議標(biāo)識(shí)TP-PID,這里一般為0008 - 數(shù)據(jù)編碼方案TP-DCS(TP

7、-Data-Coding-Scheme),采用前面說(shuō)的USC2(16bit)數(shù)據(jù)編碼00 - 有效期TP-VP(TP-Valid-Period)12-長(zhǎng)度TP-UDL(TP-User-Data-Length),也就是4F60597DFF0C00480065006C006C的長(zhǎng)度 36 / 2 = 18 的十六進(jìn) 124F60597DFF0C00480065006C006C 006F0021- 這里就是短信內(nèi)容了,實(shí)際內(nèi)容為:"你好,Hello!"程序?qū)崿F(xiàn),請(qǐng)參考本文章所帶源程序的PDUdecoding.cs。AT指令說(shuō)到AT指令可多了,有厚厚的一本書(shū),不屬于我們今天討論的范

8、圍,在這里我僅討論在發(fā)送短信中必須要用的幾個(gè)AT指令。與SMS有關(guān)的GSM AT指令(from GSM07.05)如表1所示:AT 指令功 能 AT+CMGCSend an SMS command(發(fā)出一條短消息命令)AT+CMGDDelete SMS message(刪除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/

9、"REC READ"-已讀,2/"STO UNSENT"-待發(fā),3/"STO SENT"-已發(fā),4/"ALL"-全部的)AT+CMGRRead SMS message(讀短消息)AT+CMGSSend 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(顯

10、示新收到的短消息)AT+CPMSPreferred SMS message storage(選擇短消息內(nèi)存)AT+CSCA SMS service center address(短消息中心地址)AT+CSCBSelect cell broadcast messages(選擇蜂窩廣播消息) AT+CSMPSet SMS text mode parameters(設(shè)置短消息文本模式參數(shù)) AT+CSMSSelect Message Service(選擇短消息服務(wù))表一:相關(guān)的GSM AT指令我現(xiàn)在以實(shí)例來(lái)說(shuō)明這些指令的使用方法:先用手機(jī)數(shù)據(jù)線將手機(jī)連接到電腦串口,并將串口的波特率設(shè)置為19200,

11、可以開(kāi)始了。1、首先測(cè)試你的連接及手機(jī)是否支持AT指令,請(qǐng)?jiān)谀愕拇谡{(diào)試程序中輸入:AT回車屏幕上返回"OK"表明計(jì)算機(jī)與手機(jī)連接正常,那樣我們就可以進(jìn)行其它的AT指令測(cè)試了2、設(shè)置短信發(fā)送格式AT+CMGF=1回車屏幕上返回"OK"表明現(xiàn)在短信的發(fā)送方式為PDU方式,如果是設(shè)置為TEXT方式,則,AT+CMGF=0回車3、 發(fā)送短信發(fā)送內(nèi)容及手要號(hào)仍舊同上面在編碼中的一樣,編碼后,得到要發(fā)送的數(shù)據(jù)如下0891683108705505F011000D91683117352446F2000800124F60597D002C00480065006C006C0

12、06F0021我們用如下指令來(lái)發(fā)送AT+CMGS=33回車如果返回"",就把上面編碼數(shù)據(jù)輸入,并以CTRL+Z結(jié)尾,稍等一下,你就可以看到返回OK啦。說(shuō)明一下,為什么AT+CMGS=33呢,是這樣得來(lái)的:11000D91683117352446F2000800124F60597D002C00480065006C006C006F0021這一段字符串的長(zhǎng)度除以2得到的結(jié)果,上面的字符串,短信中心號(hào)加上短信內(nèi)容得到的,怎么得到的,請(qǐng)回顧一下解碼部份在我們前面的討論中,一條完整的短信發(fā)送,只要執(zhí)行三條AT指令,AT、AT+CMGS=?、AT+CMGS=?就可以了。由于篇幅,我只能在

13、這里提到這么多,大家要是想了解更多,可以向各手機(jī)廠商索取AT指令白皮書(shū),里面很詳細(xì)的。上面講到的,只能為我們實(shí)際中作準(zhǔn)備,我們還必須要一個(gè)發(fā)送途徑,根據(jù)我們的需要,我們選擇投資最少,實(shí)現(xiàn)比較方便的串口通信。注意,串口通過(guò)數(shù)據(jù)線跟手機(jī)相連,用AT指令來(lái)實(shí)現(xiàn)發(fā)送短信,在我們選擇數(shù)據(jù)線時(shí),建議購(gòu)買原廠所配,非原廠所配,在使用過(guò)程中,經(jīng)常出現(xiàn)一些莫明其妙的問(wèn)題,比如,手機(jī)屏幕黑了,手機(jī)老是提示電池電量不足之類的。串口通信在C#中要實(shí)現(xiàn)串口通信,很多人都不知所措,在論壇上經(jīng)??梢钥吹?quot;怎么用MSCOMM實(shí)現(xiàn)串口通信"、"怎樣能過(guò)串口與設(shè)備相連"諸如此類的問(wèn)題。其實(shí)

14、國(guó)外的網(wǎng)友早就把這些列入FAQ中了。通常,在C#中實(shí)現(xiàn)串口通信,我們有四種方法:第一:通過(guò)MSCOMM控件這是最簡(jiǎn)單的,最方便的方法。可功能上很難做到控制自如,同時(shí)這個(gè)控件并不是系統(tǒng)本身所帶,所以還得注冊(cè),不在本文討論范圍??梢栽L問(wèn) ,一個(gè)國(guó)外網(wǎng)友的寫的教程,作者很熱心,我曾有發(fā)郵件給他,很快就回復(fù)了。第二:微軟在.NET新推出了一個(gè)串口控件,基于.NET的P/Invoke調(diào)用方法實(shí)現(xiàn),詳細(xì)的大家可以訪問(wèn)微軟網(wǎng)站第三:就是用第三方控件啦,可一般都要付費(fèi)的,不太合實(shí)際,不作考慮第四:自己用API寫串口通信,這樣難度高點(diǎn),但對(duì)于我們來(lái)說(shuō),可以方便實(shí)現(xiàn)自己想要的各種功能在本文,我們采用第四種方法來(lái)實(shí)

15、現(xiàn)串口通信,不過(guò)不是自己寫,用一個(gè)國(guó)外網(wǎng)友現(xiàn)成的已經(jīng)封裝好的類庫(kù),不過(guò)功能簡(jiǎn)單點(diǎn),相對(duì)我們來(lái)說(shuō)已經(jīng)夠用了。在整個(gè)終端短信的操作過(guò)程中,與串口的通信,只用到了四個(gè)功能,打開(kāi)、寫、讀、關(guān)閉串口。下面是類庫(kù)對(duì)這四個(gè)功能的定義:打開(kāi)串口:函數(shù)原型:public void Open()說(shuō)明:打開(kāi)事先設(shè)置好的端口示例:using JustinIO;static JustinIO.CommPort ss_port = new JustinIO.CommPort();ss_port.PortNum = COM1; /端口號(hào)ss_port.BaudRate = 19200; /串口通信波特率ss_port.By

16、teSize = 8; /數(shù)據(jù)位ss_port.Parity = 0; /奇偶校驗(yàn)ss_port.StopBits = 1;/停止位ss_port.ReadTimeout = 1000; /讀超時(shí)tryif (ss_port.Opened)ss_port.Close();ss_port.Open(); /打開(kāi)串口elsess_port.Open();/打開(kāi)串口return true;catch(Exception e) MessageBox.Show("錯(cuò)誤:" + e.Message);return false;寫串口:函數(shù)原型:public void Write(byt

17、e WriteBytes)WriteBytes 就是你的寫入的字節(jié),注意,字符串要轉(zhuǎn)換成字節(jié)數(shù)組才能進(jìn)行通信示例:ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMIr"); /獲取手機(jī)品牌讀串口:函數(shù)原型:public byte Read(int NumBytes)NumBytes 讀入緩存數(shù),注意讀取來(lái)的是字節(jié)數(shù)組,要實(shí)際應(yīng)用中要進(jìn)行字符轉(zhuǎn)換示例:string response = Encoding.ASCII.GetString(ss_port.Read(128); /讀取128個(gè)字節(jié)緩存關(guān)閉串口:函數(shù)原型:ss_port.Cl

18、ose()示例:ss_port.Close();由于篇幅,以及串口通信涉及內(nèi)容廣泛,我在這里只講這些。在上面我們已經(jīng)把終端短信所需的各種原始技術(shù)有所了解,是可以小試牛刀的時(shí)候了。實(shí)踐篇在整個(gè)開(kāi)始的時(shí)候,你要準(zhǔn)備以下軟硬件:硬件:西門子3508或C35系列手機(jī)一個(gè)西門子手機(jī)通信數(shù)據(jù)線一條軟件:VS.NET(C#)短信編碼類庫(kù)(PDUdecoding.cs)串口通信類庫(kù)(JustinIO.cs)當(dāng)所要求的軟硬件都準(zhǔn)備好后,我們就可以正式開(kāi)始了。下面以我自己的測(cè)試用例為大家詳細(xì)介紹。 做什么事情都應(yīng)該有計(jì)劃,雖然我們的測(cè)試用例很簡(jiǎn)單,但還是畫個(gè)簡(jiǎn)單的流程圖: 有了流程圖,還只是明白了程序怎

19、么運(yùn)行,再看看界面,會(huì)讓你更心動(dòng)的了。圖二、短信終端C#版界面圖再不開(kāi)始,就有人罵我了。下在我講的開(kāi)發(fā)環(huán)境是在VS.NET(C#)中。COME GO,GO步驟一、打開(kāi)VS.NET,新建項(xiàng)目-Visual C#項(xiàng)目-Windows應(yīng)用程序,名稱中輸入你的工程名就行啦,我的是smsForCsharp步驟二、參照上面的界面圖,設(shè)計(jì)你的程序界面,下面是我程序中各控件的主要屬性控件名稱控件Name屬性說(shuō)明TextBoxtargetNumber接收手機(jī)號(hào)碼TextBoxCenterNumber短信中心號(hào)TextBoxsmsState發(fā)送短信后,返回的信息。注意設(shè)置控件為多行TextBox smsConte

20、nt短信內(nèi)容,同樣,注意設(shè)置為多行ComboBoxConnectPort連接手機(jī)的端口,例:COM1COM2ComboBoxConnectBaudRate串口連接的波特率,在串口通信中很重要的ButtonbtnSend發(fā)送按鈕ButtonbtnConnect連接按鈕,主要用于程序的初始化ButtonbtnExit退出按鈕步驟三、將PDUdecoding.cs與JustinIO.cs拷入剛剛新建工程目錄,并打開(kāi)解決方案資源管理器,右鍵添加現(xiàn)有項(xiàng),選中兩個(gè)文件就行了,這里再打開(kāi)類視圖,里面是不是多了兩個(gè)類,JustinIO與SMS類啊,如圖三,要是沒(méi)有,那你再試。圖三,添加類后的類視圖步驟四、引用

21、命名空間,用代碼查看方式打開(kāi)Form1.cs(這里以我電腦為準(zhǔn),如果你自己更改過(guò),請(qǐng)以你電腦為準(zhǔn)),在代碼前面加上using JustinIO;using SMS;using System.IO;using System.Text;步驟五、在smsFormCsharp類中,添加兩個(gè)字段ss_port、sms,分別為JustinIO及SMS的對(duì)象,如下步驟六、添加串口初始化代碼,如下:/ summary/ 初始化串口/ /summarypublic bool InitCom(string m_port, int m_baudrate)ss_port.PortNum = m_port;/串口號(hào)ss

22、_port.BaudRate = m_baudrate;/波特率ss_port.ByteSize = 8;/數(shù)據(jù)位ss_port.Parity = 0;/ss_port.StopBits = 1;/停止位ss_port.ReadTimeout = 1000;/讀超時(shí)tryif (ss_port.Opened)ss_port.Close();ss_port.Open();elsess_port.Open();/打開(kāi)串口return true;catch(Exception e) MessageBox.Show("錯(cuò)誤:" + e.Message);return false;將

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

24、e)bool opened = InitCom(ConnectPort.SelectedItem.ToString(),Convert.ToInt32(ConnectBaudRate.SelectedItem.ToString();/打開(kāi)并初始化串口bool Connected = false;if (opened)ss_port.Write(Encoding.ASCII.GetBytes("AT+CGMIr"); /獲取手機(jī)品牌string response = Encoding.ASCII.GetString(ss_port.Read(128);if (response

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

26、ctState.Text+ " " + response.Substring(10,5) + " 連接中."Connected = true;elseConnectState.Text = "與手機(jī)連接不成功"Connected = false;ss_port.Write(Encoding.ASCII.GetBytes("AT+CSCA?r");/獲取手機(jī)短信中心號(hào)response = Encoding.ASCII.GetString(ss_port.Read(128);if(response.Length 0)C

27、enterNumber.Text = response.Substring(20,13);Connected = true;elseConnected = false;if (Connected = true)btnConnect.Enabled = false;btnSend.Enabled = true;elsebtnConnect.Enabled = true;btnSend.Enabled = false;到這里,你可以按F5,編譯調(diào)試,通過(guò),在確保你的手機(jī)與電腦連接正常下,點(diǎn)擊連接按鈕看看,是不是像我的一樣,手機(jī)型號(hào)及短信中心號(hào)者正常顯示出來(lái)了。 圖四、連接后程序界面步驟八、看到上在

28、的結(jié)果,是不是感覺(jué)到離成功發(fā)送短信很近啦,看這么長(zhǎng)的文章,費(fèi)了大家不少時(shí)間,再不亮出發(fā)短信部份,對(duì)不起大家了。雙擊發(fā)送按鈕,將下面代碼拷入程序中。/ summary/ 發(fā)送短信/ /summary/ param name="sender"/param/ param name="e"/paramprivate void btnSend_Click(object sender, System.EventArgs e)string decodedSMS = sms.smsDecodedsms(CenterNumber.Text,targetNumber.Tex

29、t,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(" ")ss_port.Write(Encoding.ASCII.GetBytes(String.Format("0x01a",decodedSMS);SendState = "發(fā)送成功!"elseSendState = "發(fā)送失敗"string Result = String.Format("0,1,2,nr",targetNumber.Text,sm

溫馨提示

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

評(píng)論

0/150

提交評(píng)論