简介:
在通信行业和网络行业,往往需要对一些重要的系统进行24小时的监控,随着短信的兴起,在传统监控系统中增加短信告警就会非常实用,本文介绍了简单的分布式短信监控系统的设计与实现。
基本的设计思路如下:
1) 在一个稳定的socket通讯包中进行代码改造,在www.codeproject.com中找到一个分为client/server端的通讯程序,连接方式有tcp/udp两种方式选择,一个server可连接多个client端,client/server之间可对发数据
2) 在需要被监控的程序(这里假设为monitorprog.exe)中增加定时写数据库的功能,一般来说设为5分钟,这里是将数据库作为监控数据的一个中间存贮
3) 改造socket通讯的客户端程序,让client.exe定期读数据库中的时间,如果时间在某个阶段不变说明被监控程序不正常
4) 改造socket通讯的server端程序,接受client端的告警信息然后通过短信接口发送出去,发送短信的方式有很多,这里采用gsm modem发送短信,在vc代码中采用mscomm控件来向gsmmodem写串口数据.
补充:以上的设计思路中采用定期写入当前时间的方式进行监控,这对系统的性能或许有一定影响,这就需要在稳定性和性能两方面进行权衡.
以下为具体的实现步骤:
1) 建数据库表
| create table module_tbl_monitor ( exename varchar(5), //被监控程序名称 entertime varchar(20) //监控时间 ) insert into module_tbl_monitor values('exe1','2005-12-28 14:00:00')//插入一条记录,表示对exe1程序进行监控 |
| /*************************************************************************** *description: (全局)连接数据库 *parameters: ssection --- 配置文件section sname --- 配置项 sdefaultvalue --- 缺省值 *author: *version: 1.0 *date: 2005-3-8 17:27 *cautions: 无 **************************************************************************/ void connectdb() { if(failed(m_pconnection.createinstance("adodb.connection"))) { afxmessagebox("create instance failed!"); } try { m_pconnection->open("dsn=??;uid=sa;pwd=??","","",-1);//数据库连接串 } catch(_com_error e) { //char mybuf[10240]; //wsprintf(mybuf,"description = '%s'\n",(char*)e.description()); afxmessagebox("connect to database error!"); } } /*************************************************************************** *description: 从数据库中获取监控数据 *parameters: *author: *version: 1.0 *date: 2006-1-6 *cautions: 无 **************************************************************************/ void cclientsocketdlg::getdata() { m_precordset.createinstance(__uuidof(recordset)); m_precordset->open("select * from module_tbl_monitor", m_pconnection.getinterfaceptr(),adopendynamic,adlockoptimistic,adcmdtext); m_precordset->movefirst(); _variant_t holder; int inum = 1; cstring machinename; cstring stime = ""; while(!m_precordset->adoeof) { …….. //如果时间没变,向server发送告警信息 } |
| void cserversocketdlg::sendsms(cstring ssmstext) { if(!ionoroff) { return; } if(m_mscomm.getportopen()) //如果串口是打开的,则先关闭串口 { m_mscomm.setportopen(false); } m_mscomm.setcommport(1); //选择com1 m_mscomm.setinbuffersize(1024); //接收缓冲区 m_mscomm.setoutbuffersize(1024);//发送缓冲区 m_mscomm.setinputlen(0);//设置当前接收区数据长度为0,表示全部读取 m_mscomm.setinputmode(1);//以二进制方式读写数据 m_mscomm.setrthreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的oncomm事件 m_mscomm.setsettings("9600,n,8,1");//波特率9600无检验位,8个数据位,1个停止位 if(!m_mscomm.getportopen())//如果串口没有打开则打开 m_mscomm.setportopen(true);//打开串口 else m_mscomm.setoutbuffercount(0); //通过at指令发送sms if(m_mscomm.getportopen()) { cstring sreceiver; cstring m_strtxdata; m_strtxdata = "at+cmgf=1\r\n"; m_mscomm.setoutput(colevariant(m_strtxdata));//发送数据 for(int i = 0; i < sreceiverarr.getsize(); i++) { sreceiver = sreceiverarr[i]; m_strtxdata="at+cmgs=" + sreceiver + " \r\n"; sleep(2000); m_mscomm.setoutput(colevariant(m_strtxdata));//发送数据 m_strtxdata = ssmstext + " \x01a"; sleep(2000); m_mscomm.setoutput(colevariant(m_strtxdata));//发送数据 sleep(2000); } } } |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器