我用C#为.net下的一家公司开发了一个特殊的应用程序,并且已经使用了多年。现在它已经开发完毕,我必须实现的主要新功能之一是通过在某些警报情况下向其发送 SNMP 陷阱来将其与另一个软件集成。
我是一名经验丰富的开发人员,但我从未使用过 SNMP。我用谷歌搜索了一整天,但对这个话题越来越困惑。我没有一个明确的“起点”。我了解 SNMP 的基础知识,但我不知道从哪里以及如何开始实施。
我有应该通过 SNMP 陷阱发送的数据,它有大约 10 个属性、一些日期、数字和字符串。我应该在此属性上创建 MIB 定义。稍后我应该在我的应用程序中实现一个基于此 MIB 发送 SNMP 陷阱的功能。
该项目是在.net 4下用c#开发的。我发现这个库看起来很有前途:https://sharpsnmp.com/ 它有一些关于发送 SNMP 陷阱的示例。
我的问题是:从哪里开始?如何定义 MIB 文件?我知道它们是一些必须编译的文本文件,但没有找到任何 MIB 编辑器和有关此主题的帮助。
如有任何帮助,我们将不胜感激!
谢谢!
我不是专家,但有和你处于同一位置的经验,并最终找到了足够适合我的项目的东西。
我使用了你之前提到的这个 codeplex 库,发现非常好。这里有一些指导您浏览 http://sharpsnmplib.codeplex.com/。
链接 http://www.net-snmp.org/wiki/index.php/TUT:snmptrap 是获得基本了解和获取更多库信息的好链接。
编辑:刚刚错过了一点。如果您对 snmp 使用 get 和 set,则需要 MIB 文件。如果你只有陷阱,你可能不需要它。
在 SNMP V2 MIB 中,陷阱被描述为 NOTIFICATION。请在此处查看此类 MIB 的完整示例: http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-EPM-NOTIFICATION-MIB
由于显然您正在使用 Windows 操作系统来处理 SNMP,因此您需要创建自定义 SNMP 扩展代理,以便将自定义 SNMP OID 和相应的陷阱添加到您的系统中。每个 OID 都会直接呈现一个变量,您可以在其中存储信息。 这是此类 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 浏览器。
这是使用该库的示例代码:
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。
如果您只需要发送陷阱,则不必定义MIB。 MIB是供其他方理解其中变量的含义的。您可以使用其他格式(例如文本文件)记录它。
要发送陷阱,您可以使用 C# SNMP 库,或者直接调用 snmptrap 程序。 Net-snmp 提供免费的命令行工具来发送陷阱。 (http://net-snmp.sf.net)。它的用法非常简单。
要验证陷阱是否已成功发送,您可以使用免费的 ireasoning MIB 浏览器( http://ireasoning.com/mibbrowser.shtml )来接收陷阱。如果能收到,一般说明你的陷阱没问题。
所以来自 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
您还可以尝试使用 snmpsharpnet,这对于在 .NET 之上使用 SNMP 非常有帮助?
作为 MIB 编辑器,我使用 MG-SOFT MIB Browser,专业版与 Visual MIB Builder for Windows 一起出售。