2012-01-27 302 views
6

我已经为C#下的.net开发了一个特殊的应用程序,它已使用多年。现在它已经开发出来了,我必须实现的主要新功能之一就是在某些警报情况下通过发送SNMP陷阱将其与其他软件集成。定义MIB并发送SNMP陷阱.net

我是一名经验丰富的开发人员,但我从未使用过SNMP。我搜索了一整天,但对这个话题越来越困惑。我没有一个清晰的“起点”。我了解SNMP的基础知识,但我不知道在哪里以及如何开始实施。

我有我应该通过SNMP陷阱发送的数据,它有大约10个属性,一些日期,数字和字符串。我应该在这个属性上创建MIB定义。稍后,我应该在我的应用程序中实现一个功能,该功能根据此MIB发送SNMP陷阱。

该项目是在c#中.net 4下开发的。我发现这个库似乎很有前途:http://sharpsnmplib.codeplex.com/ 它有一些关于发送SNMP陷阱的示例。

我的问题是:从哪里开始?我如何定义MIB文件?我知道它们是一些必须编译的文本文件,但是没有找到任何MIB编辑器和帮助。

任何帮助表示赞赏!

谢谢!

回答

3

我不是专家,但有经验与你在同一个地方,并最终找到了足够的项目。

我以前使用过这个codeplex库,发现它相当不错。这里有一些指导你通过http://sharpsnmplib.codeplex.com/

  • 至于我的理解去的MIB文件是必需的,当你需要做的snmpget和snmpset
    • 这是那种你通知服务器和回来到您的客户端服务器请求更详细信息,并可以,如果你需要大量的信息关于您的应用程序
  • 要共享如果你需要的仅仅是陷阱需要,你可以做到这一点
    • 运行,这将像在SNMP的snmpd.exe服务器接收g应用程序发送的陷阱。
    • 编写一个类似snmptrapd.exe的程序并发送你的陷阱。

链接http://www.net-snmp.org/wiki/index.php/TUT:snmptrap是一个很好的为得到一个基本的了解,并获得更多的信息库。

编辑:只错过了一点。如果使用get和snmp设置,则需要MIB文件。如果你只有陷阱,你可能不需要它。

+1

如果是这样,那么如何定义SNMP陷阱的格式('数据字段')? – Tom 2012-02-08 15:12:30

0

你也可以试试snmpsharpnet这对于在.NET上玩SNMP有很大的帮助吗?

作为MIB编辑器我使用MG-SOFT MIB Browser,专业版与Visual MIB Builder for Windows一起销售。

1

因为显然你正在使用Windows操作系统与SNMP的工作,那么你需要为了在添加自定义SNMP的OID和相应的陷阱,来创建自定义SNMP扩展代理您的系统。每个OID都会提供一个可以存储信息的变量。 Here is an example of such DLL。据我所知,MIB文件仅在Windows中用作SNMP代理的参考,不能用于在不创建自定义SNMP代理的情况下添加新的OID。

当您拥有自定义SNMP代理DLL时,需要将其指向注册表中。可以这样做(例如):

[HKEY_LOCAL_MACHINE\SOFTWARE\Symbol\MyAgent\CurrentVersion] 
"Pathname"="C:\\MyCustomAgent\\MyAgent.dll" 

;Add number of agent to the list (max num registered + 1) 
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ExtensionAgents] 
"10"="SOFTWARE\\Symbol\\MyAgent\\CurrentVersion" 

之后,您将需要重新启动您的SNMP服务。如果一切正常,您可以使用新的自定义OID设置\获取一些数据。

为了读取\写入您的SNMP变量,您需要使用SNMP管理器。我通常使用Sharpsnmplib来这样做。还有一些GUI管理器在调试过程中非常有用,例如:iReasoning MIB Browser

下面是示例代码使用LIB:

using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
// SNMP Lib references 
using Lextm.SharpSnmpLib; 
using Mono.Options; 
using Lextm.SharpSnmpLib.Messaging; 
using Lextm.SharpSnmpLib.Security; 
... 
List vList = new List(); 
ISnmpData data; 
data = new OctetString("test"); // variable to add in to string OID 
Variable test = new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.6.0"), data); // OID 
vList.Add(test); 
VersionCode versionH = VersionCode.V2; // SNMP protocol version to use 
IPAddress ipH; 
IPAddress.TryParse("127.0.0.1", out ipH); 
IPEndPoint receiverH = new IPEndPoint(ipH, 161); 
foreach (Variable variable in 
     Messenger.Set(versionH, receiverH, new OctetString("private"), vList, 10))// set variable 
     // Arguments: (ver of SNMP, IP, group, iList containing OID and variable, timeoout) 
     { 
      // output variable 
     } 
... 

你也可以阅读文章关于Windows操作系统与SNMP工作TechNet上:link。本文不是新的,但可以帮助您了解如何在Windows中使用SNMP。

+0

“您需要创建自定义SNMP扩展代理”。这在15年前(我上次做过任何SNMP编程时)是真实的,但现在您可以使用新的WinSNMP API中的SnmpSendMsg发送陷阱(尽管这已经超过十年了)。示例:http://stackoverflow.com/questions/4498618/problem-sending-snmp-trap-and-manager-recognizing-it – arx 2012-02-07 19:32:41

1

如果您只需发送陷阱,则无需定义MIB。 MIB用于其他方面了解变量的含义。您可以使用其他格式(如文本文件)对其进行记录。

要发送陷阱,您可以使用C#SNMP库,或直接调用snmptrap程序。 Net-snmp提供免费的命令行工具来发送陷阱。 (http://net-snmp.sf.net)。它的使用非常简单。

要验证陷阱是否已成功发出,您可以使用免费的irireasoning MIB浏览器(http://ireasoning.com/mibbrowser.shtml)来接收它们。如果可以收到,通常意味着您的陷阱没有问题。

1

所以从http://www.net-snmp.org/tutorial/tutorial-5/commands/snmptrap.html

了对SNMPv2通知

的SNMPv2的通知的格式有所不同。 MIB文件中的定义如下

NOTIFICATION-TEST-MIB DEFINITIONS ::= BEGIN 
     IMPORTS ucdavis FROM UCD-SNMP-MIB; 

demonotifs OBJECT IDENTIFIER ::= { ucdavis 991 } 

demo-notif NOTIFICATION-TYPE 
    STATUS current 
     OBJECTS { sysLocation } 
    DESCRIPTION "Just a test notification" 
     ::= { demonotifs 17 } 

END