《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > .NET中SerialPort類在短信收發(fā)軟件中的應(yīng)用
.NET中SerialPort類在短信收發(fā)軟件中的應(yīng)用
來源:微型機(jī)與應(yīng)用2012年第21期
李麗萍,魏權(quán)利
(青島科技大學(xué) 信息學(xué)院,山東 青島 266061)
摘要: 介紹了SerialPort類常用的屬性和方法,對(duì)操作無線通信模塊M1206的主要AT命令格式及功能進(jìn)行了描述,針對(duì)短信傳輸采用的PDU數(shù)據(jù)格式單元及編碼方式進(jìn)行了闡述,重點(diǎn)論述了在C#語言中,使用SerialPort類發(fā)送短信的程序設(shè)計(jì)思想和實(shí)現(xiàn)方法。在網(wǎng)絡(luò)應(yīng)用程序開發(fā)中,使用短信收發(fā)功能完成信息發(fā)布,具有極高的應(yīng)用價(jià)值。
Abstract:
Key words :

摘  要: 介紹了SerialPort類常用的屬性和方法,對(duì)操作無線通信模塊M1206的主要AT命令格式及功能進(jìn)行了描述,針對(duì)短信傳輸采用的PDU數(shù)據(jù)格式單元及編碼方式進(jìn)行了闡述,重點(diǎn)論述了在C#語言中,使用SerialPort類發(fā)送短信的程序設(shè)計(jì)思想和實(shí)現(xiàn)方法。在網(wǎng)絡(luò)應(yīng)用程序開發(fā)中,使用短信收發(fā)功能完成信息發(fā)布,具有極高的應(yīng)用價(jià)值。
關(guān)鍵詞:SerialPort類;串口通信;無線通信模塊;短信

 基于GSM短信業(yè)務(wù)已經(jīng)滲透于生活的各個(gè)領(lǐng)域,為每個(gè)人所熟知和使用。本文介紹了使用.NET中提供的SerialPort類的屬性和方法驅(qū)動(dòng)無線通信模塊,使用AT命令實(shí)現(xiàn)短信收發(fā)。在學(xué)生學(xué)分預(yù)警網(wǎng)絡(luò)軟件開發(fā)中,設(shè)計(jì)學(xué)分預(yù)警短信發(fā)送功能,當(dāng)學(xué)生每學(xué)期的學(xué)分集低于教學(xué)計(jì)劃規(guī)定學(xué)分時(shí),程序立即啟動(dòng)短信發(fā)送功能,提醒學(xué)生注意修訂后續(xù)的學(xué)習(xí)計(jì)劃,避免影響學(xué)生如期畢業(yè),達(dá)到了預(yù)期的目的。
1 SerialPort類介紹
 基于無線通信模塊的短信收發(fā)的核心技術(shù)是實(shí)現(xiàn)串口通信。.NET Framework4.0類庫中System.IO.Ports命名空間,包含了控制串口通信的SerialPort類,該類提供了同步I/O和事件驅(qū)動(dòng)I/O、對(duì)中斷狀態(tài)的訪問以及對(duì)串口驅(qū)動(dòng)程序?qū)傩缘脑L問,使用該類可方便地實(shí)現(xiàn)所需要串口通信的多種功能[1]。
1.1 SerialPort類常用的屬性
 SerialPort類提供串行通信端口號(hào),波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等屬性的設(shè)置,其中:
PortName:設(shè)置通信端口,如COM1、COM2等。
 BaudRate:設(shè)置通信格式中的波特率(即串口通信的速率),因進(jìn)行串口通信的雙方其波特率需要相同。如果用PC機(jī)連接其他非PC系統(tǒng),波特率則決定于非PC系統(tǒng)。本軟件使用無線通信模塊的波特率是2 400 b/s。
 Parity:設(shè)置奇偶校驗(yàn)位,其數(shù)據(jù)結(jié)構(gòu)為枚舉類型。枚舉元素為:Odd、Even、Mark、None、Space。
 DataBits:數(shù)據(jù)位長(zhǎng)度,取值為5、7、8。
 StopBits:停止位,其數(shù)據(jù)結(jié)構(gòu)為枚舉類型。枚舉元素為:None、One、OnePointFive、Two。
對(duì)于兩個(gè)進(jìn)行串行通信的端口,這些參數(shù)必須匹配。
1.2 SerialPort類的常用方法
1.2.1 串口的打開和關(guān)閉

 SerialPort類提供Open()和Close()方法來實(shí)現(xiàn)串口的打開或關(guān)閉。
1.2.2 數(shù)據(jù)的發(fā)送和接收
 SerialPort類提供Write()和WriteLine()方法發(fā)送數(shù)據(jù),其中:Write()方法用于發(fā)送字節(jié)數(shù)組、字符數(shù)據(jù)或字符。WriteLine()方法可發(fā)送字符串,當(dāng)發(fā)送完數(shù)據(jù)后,會(huì)將換行符作為數(shù)據(jù)也發(fā)送給對(duì)方。
SerialPort類提供Read()和ReadLine()方法接收數(shù)據(jù),其中:Read()方法接收數(shù)據(jù)時(shí),需要定義一個(gè)字節(jié)或數(shù)組變量來保存讀取的數(shù)據(jù),結(jié)果返回實(shí)際讀取的字節(jié)或字符數(shù)。ReadLine()方法接收數(shù)據(jù)時(shí),讀取數(shù)據(jù)直至遇到一個(gè)換行符,然后返回一個(gè)字符串代表一行信息接收完成。
2 SerialPort類的應(yīng)用
2.1無線通信模塊

 WaveCom公司推出的GSM/GPRS的無線通信模塊M1206,它支持GSM07.05短信協(xié)議和GSM07.07接口協(xié)議標(biāo)準(zhǔn),支持移動(dòng)、聯(lián)通以及小靈通用戶收發(fā)短信,適用于各行各業(yè)各個(gè)領(lǐng)域作為無線數(shù)據(jù)通信、短信息通告和短信查詢等應(yīng)用。
2.1.1 操作無線通信模塊M1206的主要AT命令集及功能描述
 無線通信模塊與計(jì)算機(jī)之間的通信協(xié)議是一些AT指令集,每個(gè)指令以AT+開頭,以回車結(jié)尾。每個(gè)命令執(zhí)行成功與否都有相應(yīng)的返回[2]。在短信收發(fā)軟件中常用的AT指令如下:
 ATE0:檢測(cè)無線通信模塊M1206,關(guān)閉命令回顯。返回OK,說明GSM工作正常。
 AT+CMGF=0:設(shè)置發(fā)送和接收短消息方式命令。當(dāng)值為“0”時(shí)為PDU模式,短信息正文經(jīng)過USC2編碼轉(zhuǎn)換為16 bit的Unicode碼后被傳送,最多70個(gè)字符;當(dāng)值為“1”時(shí)為TEXT模式,此時(shí)只可傳送140個(gè)字符,由于短信息的內(nèi)容均為8 bit表示的ASCII碼,實(shí)現(xiàn)方法比PDU方式簡(jiǎn)單。
 AT+CMGS=<PDU的十進(jìn)制長(zhǎng)度>:發(fā)送短消息命令,模塊M1206收到此命令后,若響應(yīng)正常,則返回“>”提示符,這時(shí)便可發(fā)送數(shù)據(jù)信息,并以Ctrl/Z(ASCII=0x1A)結(jié)束。
 AT+CSMP=<fo>,<vp>,<pid>,<dcs>:用于設(shè)置文本模式參數(shù),其中:<fo>設(shè)置使用短信提交,<vp>設(shè)置短信息的有效周期,<pid>為協(xié)議標(biāo)識(shí)符,<dcs>設(shè)置短信息的編碼方案。
AT+CNMI=1,1,0,0,1:設(shè)置新消息指示方式命令。此命令使M1206收到短信時(shí)返回的命令為"+CMTI:   "SM",短信息索引號(hào)"。
 AT+CMGR=<index>:接收短消息命令,index為最新收到的短信息索引號(hào)。
發(fā)送短信息時(shí)使用的控制符:結(jié)束符(<CR>)十六進(jìn)制的0x0D;發(fā)送符(<Ctrl/Z>)十六進(jìn)制的0x1A。
2.1.2 無線通信模塊的硬件連接
 PC機(jī)通過RS232串口與無線通信模塊M1206連接,將SIM卡插入無線通信模塊的插卡槽,最后接通無線通信模塊外接電源。觀察指示燈,若指示燈開始閃爍,證明無線通信模塊連接正確,可以使用;若指示燈不亮,則需要檢查無線通信模塊的連接是否正確,或者無線通信模塊是否完好。
2.2 短信傳輸數(shù)據(jù)單元格式的解析及編碼
 短信發(fā)送的常用編碼格式有兩種:Text模式和PDU(Protocol Description Unit)模式。Text模式收發(fā)短信代碼簡(jiǎn)單,實(shí)現(xiàn)起來比較容易,但不支持中文短信;PDU 模式既支持英文,又支持中文。目前,PDU模式應(yīng)用最為廣泛,中國移動(dòng)和中國聯(lián)通都提供支持PDU模式的短消息業(yè)務(wù)。PDU模式收發(fā)短信可以使用3種編碼:7 bit、8 bit和UCS2編碼。7 bit編碼用于發(fā)送普通的ASCII字符,8 bit編碼通常用于發(fā)送數(shù)據(jù)消息,UCS2編碼用于發(fā)送Unicode字符。本文收發(fā)短信軟件采用PDU模式的UCS2編碼方式。
2.2.1 PDU數(shù)據(jù)單元格式解析
 PDU數(shù)據(jù)單元不僅包含可傳輸?shù)南⒈旧?,還包括其他很多信息。如:SMS服務(wù)中心號(hào)碼、目標(biāo)號(hào)碼、回復(fù)號(hào)碼、編碼方式和服務(wù)時(shí)間等[3]。PDU數(shù)據(jù)包格式有:SCA、PDU-type、MR、DA、PID、DCS、VP、UDL、UD。分別描述如下:
 SCA(Service Center Address)短消息服務(wù)中心地址,包含三個(gè)部分:①Length是服務(wù)中心地址長(zhǎng)度,取值為00時(shí),表示使用SIM卡上設(shè)置的短信中心號(hào)碼。②Type是短信中心地址的類型,取值為81時(shí)為國內(nèi)號(hào)碼;取值為91時(shí)為國際號(hào)碼。③服務(wù)中心地址。
 PDU-type:設(shè)置PDU類型。取值為51時(shí),代表有報(bào)頭短信;取值為11時(shí),代表普通短信。
MR:是消息參考。在實(shí)際應(yīng)用時(shí),用于設(shè)置目的地址號(hào)碼長(zhǎng)度。值為0x0D時(shí),表示目的地址號(hào)碼長(zhǎng)度為13。    DA:目的地址。取值為91時(shí),表示目標(biāo)號(hào)碼是國際號(hào)碼(帶+號(hào));如果為81時(shí),則表示是本地號(hào)碼。
 PID:協(xié)議標(biāo)識(shí)。值為00時(shí),表示普通GSM類型,點(diǎn)到點(diǎn)方式。
 DCS:數(shù)據(jù)編碼方案。用于設(shè)置短消息內(nèi)容的編碼方式。取值為08時(shí),是UCS2編碼,用于漢字;取值為00時(shí),用于英文字符;取值為04時(shí),用于圖片等數(shù)據(jù)。
 VP:短信有效期。取值為00時(shí),表示短信有效期為5 min。
UDL:用戶數(shù)據(jù)長(zhǎng)度。使用UCS2編碼方式時(shí),則表示后面用戶數(shù)據(jù)段的長(zhǎng)度(即UD的字節(jié)數(shù))。
UD:用戶數(shù)據(jù),即傳輸數(shù)據(jù)內(nèi)容Unicode編碼。
2.2.2 發(fā)送消息內(nèi)容的編碼方式
 發(fā)送的消息內(nèi)容要進(jìn)行正確的編碼才可以發(fā)送到串口,否則接收到的將會(huì)是亂碼。其編碼遵循USC2編碼的規(guī)則進(jìn)行編碼,即將每個(gè)字符(1~2 B)轉(zhuǎn)換為16 bit的Unicode碼。
信息中心發(fā)送SIM卡號(hào)碼,接收方SIM卡號(hào)碼的編碼方式是:將每?jī)晌粩?shù)據(jù)位置互換,余下最后單個(gè)位的補(bǔ)F。
 編碼后的消息組成=089168+發(fā)送SIM卡地址編碼+11000D9168+接收手機(jī)號(hào)碼編碼+000800+短信息內(nèi)容編碼后的字節(jié)數(shù)+短信息內(nèi)容編碼+Ctrl/Z。其中,“+”為字符串連接符,不發(fā)送。
2.3 短信發(fā)送程序的設(shè)計(jì)思想與實(shí)現(xiàn)方法
 在使用SerialPort類進(jìn)行串口通信時(shí),一般的程序流程是設(shè)置串行通信端口號(hào)、波特率、數(shù)據(jù)位數(shù)、停止位和校驗(yàn)位,再打開串口連接,發(fā)送數(shù)據(jù),最后關(guān)閉串口連接。C#語言中調(diào)用SerialPort類時(shí)首先要添加引用語句:using System.IO.Ports[4],定義SerialPort類實(shí)例,并直接初始化,設(shè)置串行通信端口以及波特率(與無線通信模塊波特率一致)等參數(shù)。
 發(fā)送消息內(nèi)容編碼的實(shí)現(xiàn)通過.NET Framework提供的Encoding類實(shí)現(xiàn)Unicode編碼。在C#中調(diào)用此類需引用名稱空間System.Text;使用for語句完成發(fā)送和接收SIM卡號(hào)碼的編碼轉(zhuǎn)換。
使用SerialPort類的Write()方法發(fā)送AT指令及PDU數(shù)據(jù)包,即完成短信的發(fā)送。
關(guān)鍵程序代碼如下:
/*端口初始化*/
SerialPort my_send=new SerialPort("com1",2400,Parity.None, 8,StopBits.One);
  string Send_No="13800532112";          
  string RecieveNo=13005321618;
  string Note="同學(xué)你好!學(xué)分集欠缺!";
  string message="089168";    
  /*發(fā)送地址編碼*/
char[]Pdumcenter=(Send_No+"F").ToCharArray();
 for (int i=0;i<Pdumcenter.Length;i+=2)
  {
    message+=Pdumcenter[i+1].ToString();
    message+=Pdumcenter[i].ToString();
  }
    message+="11000D9168";
  /*接收目的地址編碼*/
char[]PduRecieveNo=(RecieveNo+"F").ToCharArray();
  for (int i=0;i<RecieveNo.Length;i+=2)
      {
  message+=PduRecieveNo[i + 1].ToString();
  message+=PduRecieveNo[i].ToString();
        }
  message+="000800";
   /*消息內(nèi)容編碼*/
 byte[] Unote=Encoding.Unicode.GetBytes(note);
  message+=Unote.Length.ToString("X2");
  for (int i=0;i<Unote.Length; i+=2)  
 {
     message+=Unote[i+1].ToString("X2");
     message+=Unote[i].ToString("X2");
 }
   int PduLength=(message.Length-18)/2;
 /*發(fā)送信息*/
  Try
{
my_send.Open();
my_send.Write("AT+CMGF=0\r");             
my_send.Write("AT+CSMP=17,167,0,240\r");   
my_send.Write("AT+CMGS="+PduLength+ "\r");
my_send.Write(message);
my_send.Write(Encoding.ASCII.GetBytes("\x1A"),0,
Encoding.ASCII.GetBytes("\x1A").Length);
my_send.Close();
 }
   catch
   {Response.Write("發(fā)送失?。?quot;);}

 


 在VS.NET2010平臺(tái)上使用C#語言開發(fā)網(wǎng)絡(luò)應(yīng)用軟件,引用SerialPort類,實(shí)現(xiàn)與無線通信模塊WaveCom M1206通信;使用AT命令發(fā)送、接收短信。在網(wǎng)絡(luò)應(yīng)用程序開發(fā)中,使用SerialPort類實(shí)現(xiàn)短信收發(fā)功能,完成信息發(fā)布有極高的應(yīng)用價(jià)值,如在健身房會(huì)員管理軟件中設(shè)計(jì)會(huì)員短信通知功能,將健身房的優(yōu)惠信息、會(huì)員卡有效期預(yù)警等信息,通過短信隨時(shí)發(fā)送給各位會(huì)員,使會(huì)員能夠合理安排健身計(jì)劃。本文方法在實(shí)際應(yīng)用中取得了很好的效果。
參考文獻(xiàn)
[1] WEIMENG L.C#與VB .NET網(wǎng)絡(luò)通信開發(fā)實(shí)戰(zhàn)[M].田國法,吳蘭陟,譯.北京:人民郵電出版社,2008.
[2] GSM 07.07:Digital cellular telecommunications system (Phase 2+); AT command set for GSM mobile equipment 2004.
[3] 王國軍.GSM長(zhǎng)短信PDU編碼分析[J].電腦與信息技術(shù)2011,19(2):48-50.
[4] 鄒建峰.ASP.NET動(dòng)態(tài)網(wǎng)站設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2011.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。