APP下载

浦煤网络检测与报警程序的实现

2014-07-01上海浦东煤气制气有限公司冯德强

上海煤气 2014年1期
关键词:网管网络设备实例

上海浦东煤气制气有限公司 冯德强

浦煤网络检测与报警程序的实现

上海浦东煤气制气有限公司 冯德强

上海浦东煤气制气有限公司为了确保公司各项业务数据安全传输,开发设计了Win Form应用程序,对网络设备实施连续(周期)检测。实际运行后,证实此检测方法安全可靠,且能帮助网管人员快速判断和解决事故,工作效率得以显著提高。

网络管理 报警程序 程序设计

0 前言

2013年的春天,对于上海浦东煤气制气有限公司(简称浦煤公司)的信息管理来说是一个非常重要的时间节点。伴随浦煤公司的成功转型,我们的计算机网络走出了围墙,延伸到了公司新开设的各个站点,承担起传输浦煤公司各项业务数据的重任,成为那些走出围墙的服务板块的员工们不可或缺的工作帮手。如何管好这张沉甸甸的城域网,使之更好、更安全地为浦煤公司发展服务,成为公司网络管理人员的一项急需解决的课题。

1 浦煤城域网简介

浦煤城域网网络拓扑结构见图1。

图1 浦煤城域网网络拓扑结构示意

浦煤各个站点与公司本部通过东方有线的MSTP、MPLS-VPN专线互联,共同组成浦煤城域网。同时,站点根据授权访问相应销售公司的业务网络,网络授权则由网络平台提供方——东方有线与相应销售公司通过路由配置实现。

2 需求分析

公司目前开展的安检、抄表业务对我们的网络管理提出较高要求。城域网上任何一台网络设备发生故障都可能影响到部分乃至全体服务板块同仁的工作。因此,“及时发现故障,尽快排除故障”成为对公司网管人员日常工作的基本要求。

曾经发生过这样一个案例:有一段时间,正是高桥花山路抄表员们最繁忙的时刻,以至于晚上还要加班加点地干。可就在那个时候,网络莫名其妙地出了问题;一连几天,同样的时间,同样的问题反复出现。

他们把这个问题反映到计算机中心,我们立即对城域网进行测试,得出的结论是一切正常。问题是,一切正常的网络偏偏在我们下班无人职守的那段时间发生了问题。等到第二天我们再上班的时候,一切又归于正常。晚上究竟发生了什么?我们迫切需要弄明白。那么,如何才能发现这个网络故障呢?如果我们能设计一款应用程序,让它自动检测网络上的路由器、交换机、服务器等核心设备,一旦发现设备连通异常,立即报警,并将检测结果记录在案,那么,高桥花山路站点碰到的问题就可迎刃而解了。

首先,让我们了解一下浦煤网管通常采用的网络设备测试方法。

图2 浦煤网络设备测试流程示意

对图2作如下说明:

第1步:确定需要检测的主机的IP地址,并向该主机发送不大于32 kb的ICMP数据报;

第2步:接收该主机的回送ICMP报文;

第3步:对回送报文进行分析,确定目标主机的连线状态;

第4步:如果得到的结果为异常,则采取措施查清故障原因并修复。

在实际应用中,我们或许有这样的体验,即多台网络设备连通问题。此时,我们通常的做法就是同时测试足够多的设备,根据网络拓扑结构,通过分析测试结果,定位故障设备。

这是一个被动检测方法,因为只有当有人向我们报告网络故障时,我们才启动这个检测流程,定位故障点。其实,在现有技术条件下,我们完全可以化被动为主动,让这个过程自动化、程序化、定期化,对网络设备主动实施连续(周期)检测,发现问题,即刻报警。因此,从某种程度上说,图2可以视作我们这个解决方案的核心原理示意。

3 程序框架类库设计

根据上述需求分析,我们认为要做的就是用代码实现图2所示的测试流程。让程序在某一个特定的时间范围内对核心设备检测一遍。如发现故障,就立即报警,为网管人员提供故障设备信息。要实现这个目标,需实现下列功能模块:

3.1 数据存储与查询

网络设备信息、网管人员E-Mail信箱及检测结果等都需要数据库来存储。按公司传统,我们使用MS SQL Server作后台数据库,而数据存储与访问则采用LINQ TO SQL技术。

LINQ TO SQL是包含在.NET Framework 3.5版中的一种O/RM组件(对象关系映射),O/RM允许使用.NET的类来对关系数据库进行建模。它可以使用LINQ对数据库中的数据进行查询、更新、添加、删除。LINQ TO SQL提供了对事务、视图、存储过程的完全支持。它同样为集成数据校验和业务层逻辑到你的数据模型中提供了一种简单的实现方式。在LINQ TO SQL中,关系数据库的数据模型映射到用开发人员所用的编程语言表示的对象模型。

DataContext是LINQ TO SQL框架的主入口点,用来连接数据库、从数据库检索数据以及将更改提交回数据库。简而言之,DataContext其实就是先将实体类转换成相应的SQL语句,并将其发送数据库执行,然后将返回的执行结果汇编成实体对象,供应用程序调用。

在实际应用场景中,我们先定义了继承DataContext类自clsDataContext的子类。在子类clsDataContext中定义了三个Table类型的对象即Computer、TestResult和EMailList。这三个Table对象分别指向我们事先定义的实体类clsComputer、TResult、TEmailList类。而在这些实体类中,我们将数据库中的表、字段分别与其类名、实行进行绑定映射。值得注意的是,为实现这些实体类,需要引用System、System.Data、System. Data.Linq、System.Linq、System.Data.Linq.Mapping及System.ComponentModel等命名空间。

如此设定之后,我们通过实例化子类clsDataContext,就能对数据库进行查询、更新、添加、删除等操作。

3.2 自动检测网络设备运行状态的类

这是程序的核心类,前面所介绍的系统原理的核心部分,是在这个类中实现的。需要特别指出的是,这个类中用到了ICMP协议。

ICMP是“Internet Control Message Protocol”(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

我们在网络中经常会使用到ICMP协议,只不过我们觉察不到而已。比如我们经常使用的检查网络通不通的Ping命令,这个“Ping”的过程实际上就是ICMP协议工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP协议的。

微软在.NET.Framework中提供了一个ICMP协议的Ping类,在System.Net.NetworkInformationmin命名空间内,我们用这个类实现检测网络设备连通状态。

Ping类中有一个Send方法。这个方法将数据缓冲区里的ICMP回送消息发送到指定IpAddress或名称的目标计算机。目标计算机接收到这个ICMP数据报后,就会向对方回送一个ICMP格式的应答数据报,微软把该数据报封装成PingReply对象。PingReply对象中有一个Status属性。这个属性是一个IpStatus枚举类型(IpStatus枚举了诸如Timeout、Success等多种状态)。由于我们的程序只关心网络设备是否在线,因此在代码中我们仅分析这个Status属性。通过它判断被测试主机是否在线。通常交换机、路由器在进行安全配置时至少(或全部)允许部分ICMP报通过,因此,这个连通状态就成为我们判断设备运是否在线的重要依据。

具体实现步骤如下:

第1步:实例化子类clsDataContext,获得需要检测的设备列表;

第2步:实例化Ping类;

第3步:调用Encoding.ASCII.GetBytes生成二进制缓冲数组;

第4步:实例化PingOptions类;

第5步:声明Timeout参数并赋值即设定超时值;

第6步:遍历设备列表,用上述3、4、5参数及设备IpAddress调用Ping 的实例方法Send,测试设备的连通状态;

第7步:将返回结果中的PingReply.Status记录到TestResult表;

第8步:测试结束,将新增数据提交到数据库,关闭数据连接,销毁clsDataContext和Ping 的实例对象。

3.3 语音报警

在一定的时钟周期里,程序自动轮询TestResult表,检查表中是否有运行状态异常信息,如果有就触发语音报警。显然,这个功能要用到语音合成技术。

语音合成又称文语转换(Text to Speech)技术,能将任意文字信息实时转化为标准流畅的语音朗读出来,它涉及声学、语言学、数字信号处理、计算机科学等多个学科技术是中文信息处理领域的一项前沿技术。目前,许多学习软件都使用了TTS技术。利用TTS可以实现真人发音、控制音量速率等功能。

.NET Framework 3.0中增加了System.Speech命名空间,使用这个空间的类和方法可以开发具有语音合成与识别功能的软件。位于System.Speech. Synthesis命名空间里的SpeechSynthesizer类是实现TTS技术的核心类。

这个类中有一个方法Speak,它的功能就是在内存中将输入的文本文字转换成语音并立即调用主机的语音设备进行播报。

具体实现步骤如下:

第1步:实例化SqlConnecion类,打开数据连接;

第2步:用SqlConnection的实例初始化子类clsDataContext的实例;

第3步:查询TestResult表,看有无设备运行状态异常记录;

第4步:如果没有异常记录,则执行最后一步;

第5步:否则,实例化SpeechSynthesizer类,即:SpeechSynthesizer synth

= new SpeechSynthesizer();

第6步:遍历异常结果集,逐条生成报警字符串;

第7步:同时,调用SpeechSynthesizer类实例的方法Speak,将生成的字符串转换成语音并输出到声卡,交由声卡播报,即:synth.Speak(报警字符串);

第8步:关闭数据连接,销毁SqlConnecion、clsDataContext和SpeechSynthesizer的实例对象。

3.4 E-Mail报警

E-Mail报警的触发原理与语音报警一样,只不过在触发报警之后,系统除了生成报警内容之外,还要从表EMailList取出管理人员的E-Mail地址,然后向他们发送信息。实现这个功能的关键问题是如何发送E-Mail邮件。而要实现发送邮件的功能,首先应该对SMTP协议有一个了解。

SMTP是一种提供可靠且有效电子邮件传输的协议。它是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。

在.NET Framework中,SMTP协议被封装在System.Net.Mail命名空间。

在设计中,主要用到下列几个类:

(1)SmtpClient类,允许应用程序使用简单邮件传输协议(SMTP)来发送电子邮件;

(2)MailAddress类,表示电子邮件发件人或收件人的地址;

(3)MaiMessage类,表示可以使用SmtpClient类发送的电子邮件。

(4)Attachment类,表示电子邮件的附件。

具体实现方法如下:

第1步:实例化SqlConnection类,打开数据连接;

第2步:用SqlConnection的实例初始化子类clsDataContext的实例;

第3步:先查询TestResult表,看有无设备运行状态异常记录;

第4步:如有,则遍历结果集,生成E-Mail的Body;

第5步:否则,执行最后一步;

第6步:实例化MailAddress类,生成发件人地址,即:MailAddress aFrom = new MailAddress (from,null, Encoding.UTF8);

第7步:从数据库取出并遍历网管人员的信箱列表,循环执行接下来的8~10步,发送报警邮件;

第8步:实例化MailAddress类,生成收件人地址,即:MailAddress aTo = new MailAddress(to,null, Encoding.UTF8);

第9步:实例化MaiMessage类,生成电子邮件,如:

MailMessage mail = new MailMessage(aFrom,aTo);

mail.Body = body;

mail.Subject = subject;

mail.BodyEncoding = Encoding.UTF8;

mail.SubjectEncoding = Encoding.UTF8;

mail.IsBodyHtml = true;

第10步:实例化SmtpClient类,设置SmtpClient类实例的各项参数,执行SmtpClient类实例的Send方法,将邮件发送到指定的邮箱上,如:

SmtpClient client = new SmtpClient();

client.Host = ServerName;

client.Port = Port;

client.DeliveryMethod

= SmtpDeliveryMethod.Network;

client.Credentials = new NetworkCredential

(UserName,Password);

client.Send(mail);client.Dispose();第11步:关闭数据连接,销毁SqlConnection、clsDataContext等的实例对象。

4 UI设计

4.1 Windows服务程序的设计

Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序,一般没有用户交互界面。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。

由于Windows服务程序的特点非常适合我们对这个应用的要求,因此,我们将设备自动检测、语音报警、E-Mail报警等功能设计成独立的Windows服务程序。根据需要部署在不同的计算机上。它们随操作系统自动启动,自动完成各自的任务。分工协作,互不影响。

图3为系统发出的故障报警E-Mail截图。通过分析这个E-Mail,我们立刻知道哪台设备发生了故障。从而启动应急预案,查找故障原因,修复故障设备。

图3 系统发出的故障报警E-Mail截屏

4.2 Win Form应用程序的设计

为便于系统维护和统计分析,我们设计了一个Win Form应用程序。这个程序除集成设备自动检测、语音报警、E-Mail报警外,我们还增加了设备信息维护、网管人员(E-Mail信箱)维护、维护结果查询与分析(追溯故障发生时间及具体设备)等模块。图4为网络测试日志查询实际运行截图。从此图提供的信息,我们就可以追溯设备发生故障的具体时间,查出类似前文提到的案例的故障原因。

5 结语

如果合理安排检测频次和所发数据报的大小,就不会对网络形成ICMP攻击。理由是我们所发的数据报不大于32 kb,且所发消息类型为Reply(0)。而防火墙一般都会对出站的ICMP Echo Request、出站的ICMP Source Quench、进站的TTL Exceeded和进站的ICMP Destination Unreachable放行。这就是说我们通过这个方法得到的结果,能反映被测试主机的在线状态。因此,完全可以认为,上述检测方法是安全可靠的。

此程序的成功开发与上线应用为浦煤网管人员开辟了一条实时掌控公司网络设备运行状态的路径,而且当网络发生故障时,它所提供的信息能够帮助网管人员快速定位故障点,快速查找故障原因,进而快速修复故障设备,工作效率显著提高。

目前,我们的程序功能比较单一,界面比较简陋,有许多需要改进的地方。比如,如果增加短信报警功能,效果可能会更好。这些都有待于我们在今后的实践中逐步完善。

Introduction of Network Detection and Alarm Program

Shanghai Pudong Gas Manufacturing Co., Ltd. Feng Deqiang

This paper describes the design objective, principle and implementation method of network detection and alarm program of Pudong Gas Manufacturing Company, and puts forward the solution as well.

network detection, alarm program, program design

猜你喜欢

网管网络设备实例
网络设备的安装与调试课程思政整体设计
一种基于C# 的网络设备自动化登录工具的研制
给水网管的优化布置研究
“五制配套”加强网管
完形填空Ⅱ
完形填空Ⅰ
基于列车监测网络设备的射频功放模块设计
基于三层交换技术架构数字化校园网络设备的配置与管理
网管支撑系统运行质量管控的研究与实现
从网管系统到网管云:论网管集约化的建设思路