2012-01-27 267 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