admin管理员组

文章数量:1567302

2024年7月26日发(作者:)

电脑编程技巧与维护 

利用C#实现GSM模块的短信群发功能 

王羽中 

(山东科技大学现代教育中心,青岛266510) 

摘要:通过GSM模块实现手机短信的自动发送是现今信息管理系统的重要功能,要实现中文短信的发送需要了 

解PDU格式的定义与SMS的工作步骤。利用C#语言通过对AT指令的调用讲述如何实现短信群发功能,给出了短 

信发送的主要步骤和核心代码。 

关键词:GSM模块;PDU;AT指令;C# 

Emplement of Group se她Message with GSM Module in C|;} 

WAN(;Chq 

(the Center of Modem Education in the shandong university of science and etchnology,Qingdao 266510) 

Abstract:It is one of the characteristic functions in all informatin manager systems that group sending message automati— 

cally wiht GSM module.We need to learn the definition of PDU and the workflow of SMS to send Sh0n Messages in Chinese. 

In this page we will learn how to grouply send messages with AT orders in C择.The primary Steps and the Core Code for 

sending message will been shown in this page. 

Key words:GSM Module;PDU;ATOrder;C# 

l 引言 

否则函数返回假。 

信息时候的来临,传统媒体在很大程度上已经被网络、 

表1短信发送步骤分析 

手机等新的传播方式所取代。尤其是手机短信,以其简便的 

发送 响应 发送16进制表示 响应l6进制表示 注释 

操作,即时的通信,以及低廉的成本,几乎包含了每个人生 

(cRLF>0K‘ 

AT<CR> 41 54 0D 0DOA 4F 4B 0D0^ 

CRLF ̄ 

活中方方面面的内容。随着企业信息化步伐的加快,也有越 

A1 MGF=0 ̄ 《CRLF>0K< 41 54 2B 43 4D 47 

CR) CR 46 3D 3O0D 

0D 0A 4F 4B OD 0A 设置为PDU格式 

来越多的信息管理系统加入了手机短信收发功能。如果能使 

AT+CMGS: 41 54 2B 43 4D 47 

0D 0A 3E 20 de ̄gth>=18 

l8(CIt> 53 3D 31 38 0D 

自己的软件具有短信群发功能,不仅能提高产品的市场竞争 

00I1O00B813 ’CMGS:146 3O 30 3l 3I 30 30 

力,同时也能赢得客户与企业的认可。 

t39460342F4 0K 30 42 3I 33 3l 

O008nⅥ952 

 

{CDS:26 

2 GSM模块与短信群发 

E76D8(略) 

33 39 34 36 30” 

34 33 46 34 30 3O 略 发送PDU编码数 

据 

Cht2 30 38 46 46 30 34 

般GSM模块都提供一个DB9接头或扩展通信接口实现 

39 35 32 45 37 36 

RS232通信,该DB9接头可以直接和PC的串口相连,PC机 

44 38lA 

通过AT指令对其编程,实现短信收发It]。SMS是由Etsi所制 

private bool ExecuteCmd(string cmd,string expectAnswer, 

定的一个规范(GSM03.4O和GSM03.38)。其中16一bit信息 

bool isContent,int waitTime) 

(最多70个字符)用来显示Unicode(UCS2)文本信息。 

{byte【】Ct=cmdTranslate(cmd); 

GSM模块支持两种方式来发送和接收SMS信息。文本模 

byte[】command=new byte[ct.eLngth+l】;bool re- 

suit=false; 

式只能发送普通的Ascill字符,要发送图片、铃声、其他编码 

的字符(如中文)就必须采用PDU模式。PC机通过串口向 

System.Array.Copy(ct,command,ct.Length); 

if(isContent) {command【ct.Length】=0xlA;】 else 

GSM模块发送AT指令,GSM模块根据不同的AT指令完成操 

{command[ct.eLngth】=OxOD;} 

作,并返回相应结果,发送短信的主要步骤如表1所示。 

if(SendCMD(command)) {PhoneCom.MySleep 

3信发送功能 

(waitTime); 

GSM模块选用西门子TC35i模块。程序中使用的串口对象 

string slain;salni=Conve ̄.ToString(mscom.niput); 

if(salin!=””) {if(strln.IndexOf(expectAnswer) 

(mscom对象)实例化自mscomm组件中提供的axMSComm类。 

>=0) {result=true;} 

3.1串口通信函数Executecmd 0 

else{lastlnfo=salni;result=flase;l】retum result;l】 

主要实现与TC35i通信,传人的参数包括命令字cmd,期 

3.2短信发送函数SendMsg 0 

望的正确值expectAnswer,是否包括结束符(OxlA)isCon— 

通过ExecuteCmd函数,可以轻松地定义SetAT,SetCMGF、 

tent,以及应答等待时间waitTime。如果TC35i模块返回的结 

SetCMGS等函数,来实现AT指令的发送。当SetCMGS操作 

果中包括expectAnswer值,则说明操作正常,函数返回真, 

成功后,TC35i模块返回符号“>”,则程序可以调用SendMsg 

本文收稿日期:2010—02—16 

0函数完成PDU数据的发送。 

86一 

NET 0RK AND C0MMUNICA Ⅱ0N 

其中包含的编码函数FmtMsg 0主要完成发送内容的U— 

nicode编码实现。 

pfivam string FmtMsg(string Msg) 

{string coding=””;for(int i=0;i<Msg.Length;i++) 

网络与通信 

20O条。 

参考文献 

[1】王珂.GSM模块简介. 

[2】http://www.developershome.com/sms/operatingMode.asp. 

{ 

byte【】 bytes=System.Text.Encoding.Unicode.Get_ 

[3]董新科.基于手机模块上的短信服务系统的研究与探讨 

[J】.电脑知识与技术,2008,4:763. 

Bytes(Msg.Substring(j,1)); 

string lowCode=System.Convea.ToString(bytes[0】,16); 

if(1owCode.Length=1) {lowCode=”0”+lowCode;} 

string hightCode=System.Convea.ToString(bytes[1】,16); 

[4】刘涛.基于手机模块TC35的单片机短消息收发系统[J]. 

电子技术,2003,3:36. 

f(ihightCode.Length==1) {hightCode=”0”+hight- 

Code;} 

[5】苗雨.基于GSM模块实现短信发送【J】.电脑知识与技术. 

电脑知识与技术,2008,18:1741. 

基金项目 

coding+=(hightCode+lowCode);}//力Ⅱ入到字符串中 

return Conve ̄.ToByte(tap.rLengtlV2).ToString(”X2”)+co(1_ 

ing;} 

4结语 

以上较为具体地介绍了通过GSM模块实现手机短信发送 

的步骤,并讲述了完成单条信息发送的核心代码。如果要想 

实现短信群发,只需要让用户提前定义好用户列表,便可遍 

开放式实验室的自动化管理及安全监测的研究,编号: 

qx0801 137 

作者简介 

王种,男(1980一),山东科技大学现代教育中心助工,硕士, 

主要从事系统开发与数据库维护。 

历实现,一般的GSM模块一个小时的最大短信发送量约为 

(上接第85页) 

if.(checksum!--0)∥校验错误! 

{ 

_

行了校验,解释编码并且提取出了所需的堆功率信息,并将 

有用数据以TXT文件格式保存。 

(4)初始化串口 

strEditReceiveMsg=”接受数据校验错误”; 

UpdateData(FALSE); 

) 

CString s ̄,data,Filename=”powerdata.txt”; 

利用ClassWizardr生成OnlnitialUpdate 0函数,并在Se— 

rialPort.h文件中说明在程序中要用到的全局变量。 

unsigned char temp=(unsined gchar*)buf; 

or(fint i_l0;i<26;i++) 

{ 

s仃.Format(”%c”, 

_

至此,功率显示系统程序的开发基本完成。 

3结语 

随着设备数字化程度的不断提高,计算机与外设的通信 

问题也变得越来越普遍。利用串行编程技术,可以解决很多 

ufl+j)); 

strEditReceiveMsg+=str; 

l 

data=ms ̄EditReceiveMsg; 

_

科研或者工程中的实际问题。所采用CserialPort类可以高效地 

开发多线程、非阻塞的高质量的串行通信程序。实践证明, 

采用该技术开发的程序运行稳定,执行效率较高。 

CreateDirectory(”c:\ ̄comdata”,NULL); 

CFilem

rFile; 

_

LPCSTR lpszPath=”c:\Xcomdata”: 

SetCurrentDirectory(1pszPath); 

rFile.Oven(Filename,CFile::modeCreate l 

_

参考文献 

[11李现勇.Vi]sual c十+串口通讯技术与工程实践[M】.人民 

邮电出版社,2002. 

CFile::modeWrite); 

_

rFile.Write( (LPCTSTR) m_strEditReceiveMsg, 

strEditReceiveMsg.GetLength()); 

_

【2】王伟,王敏.多线程技术在串121通信中的应用及实现[J]. 

计算机应用与软件,2004,(2). 

[3】潘爱民.C0M原理与应用.北京:清华大学出版社,1999. 

_

rFile.Hush 0; 

rFile.Close 0; 

UpdateData(FALSE); 

_

} 

if(count>26) 

count=0; 

[4】龚建伟,熊光明.Visual C++/Turbo C串口通信编程实践 

fM】.电子工业出版社,2004. 

作者简介 

} 

return 0: 

白宁,男(1982一),硕士,助理研究员,研究方向:核科学 

与工程、自控系统。 

金华晋,(1941_),研究员。 

} 

此函数实现了对信号源(核测量系统输出的RS485信号) 

协议的解释功能,完成了对数据包的实时接收,对数据包进 

87— 

本文标签: 发送模块实现短信系统