您的位置:首页 > 运维架构

监控系统中发送手机短信的实现

2007-02-07 22:29 519 查看
      摘要越来越多的监控系统采用自动发送手机短信的方式通知值班人员。利用Visual C++,采用串口与GSM modem通讯,可以方便的实现这一功能。针对于常见两类设备,一类采用特定的通信规约格式,一类采用AT命令,给出了具体的实现过程。
      关键词  Visual C++, 手机短信, 串口编程,监控系统
[align=left] [/align]
 
   
1 引言
      随着手机的普及,手机短信的使用也越来越多。于是很多具有监控报警功能的系统都选择了手机短信的模式,在第一时间将所发生的情况通知给值班人员和有关人员,以便尽早的发现处理问题,同时也可以实现无人值班。也有通过手机短信来传递数据[1][2][3]。手机的短信实现目前有三种方法:
       (1) 通过移动网关发送短信,使用该方法不需要附加的硬件,但是需要到电信部门申请网关,比较适用于一些大型的网络通讯公司开发,目前华为,中兴等公司就做的这方面的工作,并且还有相应的开发包供开发人员使用。
      (2) 在计算机上通过串口向手机发送中文短信,这是目前比较适合于小项目开发的一种方法,所需硬件包括一款手机或者专用设备,以及相应的数据线。该方法编码简单,并能够自动发送短信。
      (3) 通过一些网站上提供的短信发送功能来实现,比如新浪网、网易、搜狐等都提供这方面的服务,这种方法是这三种方法中实现起来最简单,所需资源最少的,但是对于网站的依赖性太强,对网络的依赖同样无法避免,不太适用于项目开发。
      对于监控系统来说,方法(2)无疑是最好的选择,开发简单,投资也比较少,本文结合作者的实践,给出具体的实现过程。
2 Visual C++ 串口数据读写
      在windows(包括windows 2000、windows XP、windows 2003)操作环境下,串口设备可以看作是一种特殊的文件,使用Visual C++中有两种方法可以进行串口通讯。一种是利用微软公司提供的ActiveX控件 Microsoft Communications Control;另一种是直接用Visual C++访问串口。
2.1使用ActiveX控件读写串口
      使用Visual C++提供的MSComm控件进行串行通信,比较非常简单,这里只作简要的叙述,具体可参考文献[4]。
#define MLENGTH 128  // 收发数据长度
CMSComm comm;                // 定义串口对象
VARIANT InBuffer;             // 读取数据缓存
VARIANT OutBuffer;          // 输出数据缓存
comm.SetCommPort(1);        // 设置串口1
if (!comm.GetPortOpen())   // 打开串口
{
comm.SetSettings("9600,N,8,1"); // 设置串口波特率9600,无校验数据位8位,停止位1.5
comm SetPortOpen(true);
comm.SetInBufferCount(0);
InBuffer.bstrVal=new unsigned short [MLENGTH];
OutBuffer.bstrVal=new unsigned short[MLENGTH];
OutBuffer.vt=VT_BSTR;
InBuffer= comm.GetInput();      // 读取数据
comm.SetOutput(OutBuffer);    // 发送数据
}
2.2直接用Visual C++访问串口
      使用Visiual C++直接调用标准函数CreateFile()打开端口,再使用ReadFile()和WriteFile()读写数据。通常实现串口通信的步骤如下:
  (1) 按协议的设置初始化并打开串行口,这样做就是通知Windows本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。
HANDLE hComm
hComm = CreateFile( "COM1",GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
 hComm为文件句柄。GENERIC_READ | GENERIC_WRITE指定可以对串口进行读写操作。第三个参数0表示串口为独占打开。OPEN_EXISTING表示当指定串口不存在时,程序将返回失败。 FILE_ATTRIBUTE_NORMAL表示文件属性。
  (2) 配置这个串行口。
  DCB:DCB结构主要用于串口参数设置。该结构太庞大,这里就不一一讲述了,有兴趣者可查看MSDN关于DCB的描述。其中下面两个是比较重要的属性。BaudRate:串口的通讯速度。ByteSize:字节位数,一般设置为8。
//设置事件驱动的类型
SetCommMask(hComm,EV_RXCHAR|EV_TXEMPTY);
//设置输入、输出缓冲区的大小
SetupComm(hComm, 1024, 1024) ;
//清输入、输出缓冲区
PurgeComm(hComm,PURGE_TXABORT|PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );
 
// 定义数据控制块结构
DCB dcb ;
//读串口原来的参数设置
GetCommState(hComm, &dcb ) ;
//串口参数配置 波特率9600 8位数据,无校验,1位停止位dcb.BaudRate =9600; dcb.ByteSize =8;
dcb.Parity = NOPARITY;dcb.StopBits = ONESTOPBIT ;
SetCommState(hComm, &dcb ) ;
  (3) 在串口上往返地传输数据,并在传输过程中进行校验。
[align=left]       DWORD dwErrorFlags;[/align]
[align=left]         COMSTAT ComStat ;[/align]
[align=left]         DWORD sByteCount = 0;[/align]
[align=left]         ClearCommError(hComm, &dwErrorFlags, &ComStat );[/align]
[align=left]if ( ComStat.cbInQue ) // 读缓冲区有数据[/align]
[align=left]ReadFile(hComm, data, ComStat.cbInQue, &sByteCount, NULL);[/align]
[align=left]         ClearCommError(hComm, &dwErrorFlags, &ComStat );[/align]
[align=left]         if (!ComStat.cbOutQue) //发送缓冲区无数据可以发送[/align]
[align=left]          WriteFile(hComm, data, count, &sByteCount, NULL);[/align]
      (4) 不需要此串口时,关闭串口,即释放串口以供其它应用程序使用。串行口是非共享资源,所以打开串口后,一定要关闭串口。
CloseHandle(hComm);
3 发送手机短信的两种不同的模式
      发送短信是由于采用的具体设备不同,发送的过程也略有区别。主要有两类设备,一类是采用特定的通信规约格式,将短信的内容通过串口发到手机上,另一类直接采用AT命令,将短信的内容通过串口发到手机上,然后通过手机将短信发送到指定的手机上。
3.1 采用专门的协议进行短信发送
      以南京傲屹AYG-52D GSM Modem(GSM Global System for Mobile Communication 全球移动通信系统 Modem 调制解调器)为代表的一类设备,在该类设备中除了GSM 引擎(GSM Cellular Engine)还增加了单片机系统(MCS51),使得发送短信可以采用自己制定的信息格式[5](软件接口协议),开发过程较为简单。
3.1.1 短信中心的设置
      发送手机短信要首先设置短信中心,可以利用手机先在SIM卡上设置好,也可以通过协议进行设置。短信中心号设置后,保存在SIM 卡上,只需设置一次。使用协议设置短信中心的格式为AA 09 短信中心号码(采用ASCII编码)以济南移动为例,短信中心号码为008613800531500 (采用ASCII码为30 30 38 36 31 33 38 30 30 35 33 31 35 30 30)信息格式为:AA 09 30 30 38 36 31 33 38 30 30 35 33 31 35 30 30如果设置成功,AYG-52D GSM Modem 应答AA 09 30 30 38 36 31 33 38 30 30 35 33 31 35 30 30,如果设置不成功,AYG-52D GSM Modem 应答AA 09 45 52 52 4F 52 52。(ERROR)
3.1.2 配置端口数据传输速率
       设备默认的数据传输速率为9600BPS,如果需要设置数据传输速率,可以按照以下的格式:
AA 20 校验字节 波特率字节
其中:校验字节格式:0—无校验;1—偶校验;2—奇校验。波特率字节:0—9600bps;1—4800bps;2—2400bps;3—1200bps。
例如设置为无校验的4800发送的信息为:
AA 20 00 01
3.1.3 短信发送
      格式为: AA 02 +11Bytes手机号+数据。需要说明的是数据长度不超过140Byte,为了手机能够正确显示需经UNICODE 编码,因此每帧最多70个字符。手机号码采用ASCII编码,例如,”1”的ASCII编码为31,13595313404的ASCII编码为31 33 35 39 35 33 31 33 34 30 34。
      以向手机13595313404发送“你好”为例,UNICODE编码为:4F60(你)597D(好)发送的信息为:AA 02 31 33 35 39 35 33 31 33 34 30 34 4F 60 59 7D 。在Windows 系统中可调用MultiByteToWideChar() 将字符串转换成UNICODE编码的格式。
[align=left]     采用这种设备发送短信实现起来比较简单,需要注意的一点就是,发送短信不能太频繁,成功发送一条短信后需要等待2-3秒在发下一条,否则可能造成设备的死机。一旦设备死机,需要将设备断电重启一下。[/align]
[align=left]3.2 采用AT命令进行短信发送[/align]
      更为常见的一类设备,提供了GSM Modem,直接利用AT命令进行短信发送。九十年代初,AT命令仅被用于modem操作。由于没有控制移动电话文本消息的先例,因此开发了一种叫SMS Block Mode的协议,通过终端设备(TE)或电脑来完全控制SMS(Short Message Service 短信服务)。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT命令,其中包含对短信的控制。AT命令在此基础上演化并被加入GSM 07.05[9]标准,以及之后的GSM 07.07[10]标准。目前对短信的控制共有三种实现途径:最初的Block Mode;基于AT命令的Text Mode;基于AT命令的PDU Mode。到现在,PDU已取代Block Mode,采用text模式比较简单,但是只能发送ASCII码,不能发送中文,而PDU模式开发起来相对复杂一些,但功能比较强大,对于中文采用UNICODE编码进行发送。
[align=left]3.2.1 AT 命令简介[/align]
[align=left]      AT 即Attention,AT 命令是一组是从TE (Terminal Equipment 终端设备) 或DTE (Data Terminal Equipment 数据终端设备) 向TA (Terminal Adapter 终端适配器)或DCE (Data Circuit Terminating Equipment 数据电路终端设备)发送的控制MS (Mobile Station 移动基站)的功能与GSM 网络业务进行交互的一组命令集合。用户可以通过AT 命令来完成呼叫短信、电话本、数据业务、补充业务、传真等方面的控制[6]。[/align]
[align=left]       AT 标准是一个面向行的命令语言。在我们的这个应用中TE (终端设备状态),可以是任何大小的计算机, TA(终端适配器),指的是GSM调制解调器。该命令行由一串字母数字的字符组成,它发送到调制解调器来指示执行由字符指定的命令。与SMS有关的GSM AT指令[9]如表1所示:[/align]
[align=left] [/align]
[align=left]                                           表 1:相关的GSM AT指令[/align]
AT 指令
功 能
AT+CMGC
Send an SMS command(发出一条短信命令)
AT+CMGD
Delete SMS message(删除SIM卡内存的短信)
AT+CMGF
Select SMS message format(选择短信信息格式:0-PDU;1-文本)
AT+CMGL
List SMS message from preferred store(列出SIM卡中的短信PDU/text: 0/"REC UNREAD"-未读,1/"REC READ"-已读,2/"STO UNSENT"-待发,3/"STO SENT"-已发,4/"ALL"-全部的)
AT+CMGR
Read SMS message(读短信)
AT+CMGS
[align=center]Send SMS message(发送短信)[/align]
AT+CMGW
Write SMS message to memory(向SIM内存中写入待发的短信)
AT+CMSS
Send SMS message from storage(从SIN|M内存中发送短信)
AT+CNMI
New SMS message indications(显示新收到的短信)
AT+CPMS
Preferred SMS message storage(选择短信内存)
AT+CSCA
SMS service center address(短信中心地址)
AT+CSCB
Select cell broadcast messages(选择蜂窝广播消息)
AT+CSMP
Set SMS text mode parameters(设置短信文本模式参数)
AT+CSMS
Select Message Service(选择短信服务)
 
  
[align=left]       设备之间通信的波特率默认的是 9.6 kbit/s,可以由AT+IPR 命令来设置波特率,一般支持的通信速率包括:1200、2400、4800、9600、19200、38400、57600、115200、230400、46800。[/align]
      以实例来说明这些指令的使用方法:
  用手机数据线将手机连接到电脑串口,并将串口的波特率设置为9600。
      (1) 首先测试你的连接及手机是否支持AT指令,请在你的串口调试程序中输入:
AT<回车>
 屏幕上返回"OK"表明计算机与手机连接正常,那样我们就可以进行其它的AT指令测试了
[align=left]      (2)设置短信中心(以13800531500为例)[/align]
[align=left]AT+CSCA=+8613800531500<回车>[/align]
[align=left]      (3)关闭回显[/align]
[align=left]ATE0<回车>[/align]
[align=left]3.2.2 TEXT 模式发送短信[/align]
[align=left]     (1)使用命令将短信模式设置为TEXT模式[/align]
[align=left]AT+CMGF=1 <回车>[/align]
     (2) 发送短信,以向手机13595313404发送“HELLO”为例
AT+CMGS=13595313404<回车>
      如果返回">",输入“HELLO”,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。短信就发出去了。
3.2.3 PDU 简介
      PDU(Protocol Data Unit),协议数据单位。用PDU 模式发送短信可以使用三种编码: 7-bit 编码、8-bit 编码和UCS2 编码[7][ 8]。7-bit 编码用于发送普通的ASCII 字符,8-bit 编码通常用于发送数据消息,UCS2 编码用于发送Unicode 字符。由于要实现中文短信的发送,所以选择用UCS2 编码,即中文Unicode 码。例如向手机13595313404发送“你好”PDU编码为:08 91 68 31 08 50 13 05 F0 11 00 0D 91 68 31 95 35 31 04 F4 00 08 00 04 4F 60 59 7D
      具体的解释为:
      (1) 08短信中心长度
      (2) 91短信中心有国家编码
      (3) 68 31 08 50 13 05 F0短信中心+8613800531500(将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F,将奇数位和偶数位交换,86我国的国家编码)
(1)(2)(3)合称SMSC(短信中心地址)。 如果地址信息的长度 00表示采用手机上设置短信中心号码,PDU 串的“SMSC 址格式”段和“SMSC 地址”段将省去。
      (4)11文件头字节
      (5)00消息基准值(TP-MR)
      (6)0D目标号码的长度14位
      (7)91目标号码有国家编码
      (8)68 31 36 32 64 49 F0 目标号码 +8613595313404
(6)(7)(8)构成了整个短信的第二部分,目的地址(TP-Destination-Address)
     (9)00 协议标识(TP-PID) 是普通GSM 类型,点到点方式
     (10) 08数据编码方案TP-DCS ( TP-Data-Coding -Scheme ), 采用前面说的USC2(16bit)数据编码
    (11)00有效期(TP-VP)
    (12)04 正文4字节
    (13)4F 60 59 7D 你好   短信内容
[align=left]3.2.3 PDU 模式发送短信[/align]
[align=left]     (1)使用命令将短信模式设置为PDU模式[/align]
[align=left]AT+CMGF=0 <回车>[/align]
     (2) 发送短信,以向手机13595313404发送“你好”为例
AT+CMGS=019<回车>
   如果返回">",输入08 91 68 31 08 50 13 05 F0 11 00 0D 91 68 31 95 35 31 04 F4 00 08 00 04 4F 60 59 7D,并以CTRL+Z结尾,稍等一下,你就可以看到返回OK啦。短信就发出去了。
     019短信长度,除去短信中心后PDU的字节数。
3.2.4 设备的选择
    支持AT命令的具有GSM Modem 的设备比较多,可以选择具有该功能的手机,目前市场上销售的手机大多具有此项功能,也可以选择移动通信 GSM 模块。作者分别通过采用爱立信T39手机和Sony Ericsson GR 47 模块成功发送短信。通常来说,专用的设备模块具有更好的可靠性,可以适应比较恶劣的环境。
 
4 结语
      利用Visual C++采用串口通信实现自动发送手机短信,比较简单,运行起来也比较可靠,适用于在监控系统中将发生的报警信息和运行情况及时通知值班员及相关人员。基于该技术的电网调度自动化电子值班系统,已在很多供电局运行,取得了较好的效果。
 
参考文献:
[1] 赵婧懿. 基于短信网关WAP推送的实现[J]. 计算机与信息技术, 2005.8
[2] 罗海天,杨跃武,雷晓平. 基于GSM技术的遥测监控应用系统.计算机应用研究[J].计算机应用研究,2004,21(11):215- 216
[3] 周鹿扬,苗开超,徐建鹏.基于GSM模块的短信平台开发[J]. 气息与减灾. 2005.5
[4] 龚建伟.在基于单文档(SDI)程序中应用MSCOMM串口通讯控件(附源程序) http://www.gjwtech.com/scomm/sc2sdimscommdemo.htm [5] 南京傲屹电子有限公司AYG-52D GSM Modem用户手册 http://www.51smsmodem.com/gprs52.htm [6]Sony Ericsson公司,GR47-48 AT Commands Manual,2004年
[7] GSM 03.38 (Version 4.0.1 Release 1994): European digital cellular telecommunications system (Phase 2); Alphabets and language-specific information
[8] GSM03.40 (Version 5.3.0 Release 1996):European digital cellular telecommunications system (Phase +2);Technical realization of the Short Message Service Point to Point.
[9] GSM 07.05 (GSM 07.05 version 7.0.1 Release 1998) Digital cellular telecommunications system (Phase 2+); Use of Data Terminal Equipment-Data Circuit Terminating;Equipment (DTE-DCE) Interface for Short Message Service (SMS) and Cell Broadcast Service (CBS)
[10] GSM 07.07 (version 7.4.0 Release 1998) Digital cellular telecommunications system (Phase 2+); AT command set for GSM Mobile Equipment (ME)
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息