定义MIB并在.net下发送SNMP陷阱

时间:2012-01-27 22:11:54

标签: .net snmp mib sharp-snmp snmp-trap

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

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

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

该项目是在c#的.net 4下开发的。我发现这个图书馆看起来很有希望:http://sharpsnmplib.codeplex.com/ 它有一些关于发送SNMP陷阱的示例。

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

感谢任何帮助!

谢谢!

6 个答案:

答案 0 :(得分:3)

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

我使用过你之前提到的这个codeplex库,发现它非常好。以下是您通过http://sharpsnmplib.codeplex.com/的一些提示。

  • 据我所知,当您需要执行snmpget和snmpset时,需要MIB文件
    • 您可以通知服务器和服务器回到您的客户端询问更多详细信息,如果您需要有关应用程序的大量信息,可能需要
  • 如果你需要的只是陷阱,你可以这样做
    • 运行snmpd.exe,它将像snmp服务器一样接收从您的应用程序发送的陷阱。
    • 编写类似snmptrapd.exe的程序并发送陷阱。

链接http://www.net-snmp.org/wiki/index.php/TUT:snmptrap非常适合获得基本理解并获取更多图书馆信息。

编辑:错过了一点。如果你使用get并设置为snmp,你将需要MIB文件。如果你所拥有的只是陷阱,你可能不需要它。

答案 1 :(得分:1)

在SNMP V2 MIB中,陷阱被描述为NOTIFICATION。在这里查看这样一个MIB的完整示例: http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-EPM-NOTIFICATION-MIB

答案 2 :(得分:1)

由于显然您正在使用Windows操作系统来使用SNMP,因此您需要创建自定义SNMP扩展代理,以便将自定义SNMP OID和相应的陷阱添加到您的系统中。每个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

以下是使用该库的示例代码:

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
        }
...

另外,您可以在technet上阅读有关在Windows操作系统中使用SNMP的文章:link。本文不是新的,但可以帮助您了解如何在Windows中使用SNMP。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分: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

答案 5 :(得分:0)

您还可以尝试使用snmpsharpnet,这对于在.NET上使用SNMP非常有帮助吗?

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