摘 要: 介紹了SerialPort類常用的屬性和方法,對操作無線通信模塊M1206的主要AT命令格式及功能進行了描述,針對短信傳輸采用的PDU數(shù)據(jù)格式單元及編碼方式進行了闡述,重點論述了在C#語言中,使用SerialPort類發(fā)送短信的程序設(shè)計思想和實現(xiàn)方法。在網(wǎng)絡(luò)應(yīng)用程序開發(fā)中,使用短信收發(fā)功能完成信息發(fā)布,具有極高的應(yīng)用價值。
關(guān)鍵詞:SerialPort類;串口通信;無線通信模塊;短信
基于GSM短信業(yè)務(wù)已經(jīng)滲透于生活的各個領(lǐng)域,為每個人所熟知和使用。本文介紹了使用.NET中提供的SerialPort類的屬性和方法驅(qū)動無線通信模塊,使用AT命令實現(xiàn)短信收發(fā)。在學生學分預(yù)警網(wǎng)絡(luò)軟件開發(fā)中,設(shè)計學分預(yù)警短信發(fā)送功能,當學生每學期的學分集低于教學計劃規(guī)定學分時,程序立即啟動短信發(fā)送功能,提醒學生注意修訂后續(xù)的學習計劃,避免影響學生如期畢業(yè),達到了預(yù)期的目的。
1 SerialPort類介紹
基于無線通信模塊的短信收發(fā)的核心技術(shù)是實現(xiàn)串口通信。.NET Framework4.0類庫中System.IO.Ports命名空間,包含了控制串口通信的SerialPort類,該類提供了同步I/O和事件驅(qū)動I/O、對中斷狀態(tài)的訪問以及對串口驅(qū)動程序?qū)傩缘脑L問,使用該類可方便地實現(xiàn)所需要串口通信的多種功能[1]。
1.1 SerialPort類常用的屬性
SerialPort類提供串行通信端口號,波特率、數(shù)據(jù)位、停止位、校驗位等屬性的設(shè)置,其中:
PortName:設(shè)置通信端口,如COM1、COM2等。
BaudRate:設(shè)置通信格式中的波特率(即串口通信的速率),因進行串口通信的雙方其波特率需要相同。如果用PC機連接其他非PC系統(tǒng),波特率則決定于非PC系統(tǒng)。本軟件使用無線通信模塊的波特率是2 400 b/s。
Parity:設(shè)置奇偶校驗位,其數(shù)據(jù)結(jié)構(gòu)為枚舉類型。枚舉元素為:Odd、Even、Mark、None、Space。
DataBits:數(shù)據(jù)位長度,取值為5、7、8。
StopBits:停止位,其數(shù)據(jù)結(jié)構(gòu)為枚舉類型。枚舉元素為:None、One、OnePointFive、Two。
對于兩個進行串行通信的端口,這些參數(shù)必須匹配。
1.2 SerialPort類的常用方法
1.2.1 串口的打開和關(guān)閉
SerialPort類提供Open()和Close()方法來實現(xiàn)串口的打開或關(guān)閉。
1.2.2 數(shù)據(jù)的發(fā)送和接收
SerialPort類提供Write()和WriteLine()方法發(fā)送數(shù)據(jù),其中:Write()方法用于發(fā)送字節(jié)數(shù)組、字符數(shù)據(jù)或字符。WriteLine()方法可發(fā)送字符串,當發(fā)送完數(shù)據(jù)后,會將換行符作為數(shù)據(jù)也發(fā)送給對方。
SerialPort類提供Read()和ReadLine()方法接收數(shù)據(jù),其中:Read()方法接收數(shù)據(jù)時,需要定義一個字節(jié)或數(shù)組變量來保存讀取的數(shù)據(jù),結(jié)果返回實際讀取的字節(jié)或字符數(shù)。ReadLine()方法接收數(shù)據(jù)時,讀取數(shù)據(jù)直至遇到一個換行符,然后返回一個字符串代表一行信息接收完成。
2 SerialPort類的應(yīng)用
2.1無線通信模塊
WaveCom公司推出的GSM/GPRS的無線通信模塊M1206,它支持GSM07.05短信協(xié)議和GSM07.07接口協(xié)議標準,支持移動、聯(lián)通以及小靈通用戶收發(fā)短信,適用于各行各業(yè)各個領(lǐng)域作為無線數(shù)據(jù)通信、短信息通告和短信查詢等應(yīng)用。
2.1.1 操作無線通信模塊M1206的主要AT命令集及功能描述
無線通信模塊與計算機之間的通信協(xié)議是一些AT指令集,每個指令以AT+開頭,以回車結(jié)尾。每個命令執(zhí)行成功與否都有相應(yīng)的返回[2]。在短信收發(fā)軟件中常用的AT指令如下:
ATE0:檢測無線通信模塊M1206,關(guān)閉命令回顯。返回OK,說明GSM工作正常。
AT+CMGF=0:設(shè)置發(fā)送和接收短消息方式命令。當值為“0”時為PDU模式,短信息正文經(jīng)過USC2編碼轉(zhuǎn)換為16 bit的Unicode碼后被傳送,最多70個字符;當值為“1”時為TEXT模式,此時只可傳送140個字符,由于短信息的內(nèi)容均為8 bit表示的ASCII碼,實現(xiàn)方法比PDU方式簡單。
AT+CMGS=<PDU的十進制長度>:發(fā)送短消息命令,模塊M1206收到此命令后,若響應(yīng)正常,則返回“>”提示符,這時便可發(fā)送數(shù)據(jù)信息,并以Ctrl/Z(ASCII=0x1A)結(jié)束。
AT+CSMP=<fo>,<vp>,<pid>,<dcs>:用于設(shè)置文本模式參數(shù),其中:<fo>設(shè)置使用短信提交,<vp>設(shè)置短信息的有效周期,<pid>為協(xié)議標識符,<dcs>設(shè)置短信息的編碼方案。
AT+CNMI=1,1,0,0,1:設(shè)置新消息指示方式命令。此命令使M1206收到短信時返回的命令為"+CMTI: "SM",短信息索引號"。
AT+CMGR=<index>:接收短消息命令,index為最新收到的短信息索引號。
發(fā)送短信息時使用的控制符:結(jié)束符(<CR>)十六進制的0x0D;發(fā)送符(<Ctrl/Z>)十六進制的0x1A。
2.1.2 無線通信模塊的硬件連接
PC機通過RS232串口與無線通信模塊M1206連接,將SIM卡插入無線通信模塊的插卡槽,最后接通無線通信模塊外接電源。觀察指示燈,若指示燈開始閃爍,證明無線通信模塊連接正確,可以使用;若指示燈不亮,則需要檢查無線通信模塊的連接是否正確,或者無線通信模塊是否完好。
2.2 短信傳輸數(shù)據(jù)單元格式的解析及編碼
短信發(fā)送的常用編碼格式有兩種:Text模式和PDU(Protocol Description Unit)模式。Text模式收發(fā)短信代碼簡單,實現(xiàn)起來比較容易,但不支持中文短信;PDU 模式既支持英文,又支持中文。目前,PDU模式應(yī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ù)中心號碼、目標號碼、回復(fù)號碼、編碼方式和服務(wù)時間等[3]。PDU數(shù)據(jù)包格式有:SCA、PDU-type、MR、DA、PID、DCS、VP、UDL、UD。分別描述如下:
SCA(Service Center Address)短消息服務(wù)中心地址,包含三個部分:①Length是服務(wù)中心地址長度,取值為00時,表示使用SIM卡上設(shè)置的短信中心號碼。②Type是短信中心地址的類型,取值為81時為國內(nèi)號碼;取值為91時為國際號碼。③服務(wù)中心地址。
PDU-type:設(shè)置PDU類型。取值為51時,代表有報頭短信;取值為11時,代表普通短信。
MR:是消息參考。在實際應(yīng)用時,用于設(shè)置目的地址號碼長度。值為0x0D時,表示目的地址號碼長度為13。 DA:目的地址。取值為91時,表示目標號碼是國際號碼(帶+號);如果為81時,則表示是本地號碼。
PID:協(xié)議標識。值為00時,表示普通GSM類型,點到點方式。
DCS:數(shù)據(jù)編碼方案。用于設(shè)置短消息內(nèi)容的編碼方式。取值為08時,是UCS2編碼,用于漢字;取值為00時,用于英文字符;取值為04時,用于圖片等數(shù)據(jù)。
VP:短信有效期。取值為00時,表示短信有效期為5 min。
UDL:用戶數(shù)據(jù)長度。使用UCS2編碼方式時,則表示后面用戶數(shù)據(jù)段的長度(即UD的字節(jié)數(shù))。
UD:用戶數(shù)據(jù),即傳輸數(shù)據(jù)內(nèi)容Unicode編碼。
2.2.2 發(fā)送消息內(nèi)容的編碼方式
發(fā)送的消息內(nèi)容要進行正確的編碼才可以發(fā)送到串口,否則接收到的將會是亂碼。其編碼遵循USC2編碼的規(guī)則進行編碼,即將每個字符(1~2 B)轉(zhuǎn)換為16 bit的Unicode碼。
信息中心發(fā)送SIM卡號碼,接收方SIM卡號碼的編碼方式是:將每兩位數(shù)據(jù)位置互換,余下最后單個位的補F。
編碼后的消息組成=089168+發(fā)送SIM卡地址編碼+11000D9168+接收手機號碼編碼+000800+短信息內(nèi)容編碼后的字節(jié)數(shù)+短信息內(nèi)容編碼+Ctrl/Z。其中,“+”為字符串連接符,不發(fā)送。
2.3 短信發(fā)送程序的設(shè)計思想與實現(xiàn)方法
在使用SerialPort類進行串口通信時,一般的程序流程是設(shè)置串行通信端口號、波特率、數(shù)據(jù)位數(shù)、停止位和校驗位,再打開串口連接,發(fā)送數(shù)據(jù),最后關(guān)閉串口連接。C#語言中調(diào)用SerialPort類時首先要添加引用語句:using System.IO.Ports[4],定義SerialPort類實例,并直接初始化,設(shè)置串行通信端口以及波特率(與無線通信模塊波特率一致)等參數(shù)。
發(fā)送消息內(nèi)容編碼的實現(xiàn)通過.NET Framework提供的Encoding類實現(xiàn)Unicode編碼。在C#中調(diào)用此類需引用名稱空間System.Text;使用for語句完成發(fā)送和接收SIM卡號碼的編碼轉(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="同學你好!學分集欠缺!";
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平臺上使用C#語言開發(fā)網(wǎng)絡(luò)應(yīng)用軟件,引用SerialPort類,實現(xiàn)與無線通信模塊WaveCom M1206通信;使用AT命令發(fā)送、接收短信。在網(wǎng)絡(luò)應(yīng)用程序開發(fā)中,使用SerialPort類實現(xiàn)短信收發(fā)功能,完成信息發(fā)布有極高的應(yīng)用價值,如在健身房會員管理軟件中設(shè)計會員短信通知功能,將健身房的優(yōu)惠信息、會員卡有效期預(yù)警等信息,通過短信隨時發(fā)送給各位會員,使會員能夠合理安排健身計劃。本文方法在實際應(yīng)用中取得了很好的效果。
參考文獻
[1] WEIMENG L.C#與VB .NET網(wǎng)絡(luò)通信開發(fā)實戰(zhàn)[M].田國法,吳蘭陟,譯.北京:人民郵電出版社,2008.
[2] GSM 07.07:Digital cellular telecommunications system (Phase 2+); AT command set for GSM mobile equipment 2004.
[3] 王國軍.GSM長短信PDU編碼分析[J].電腦與信息技術(shù)2011,19(2):48-50.
[4] 鄒建峰.ASP.NET動態(tài)網(wǎng)站設(shè)計教程[M].北京:清華大學出版社,2011.