2013-10-22 23 views
0

我是snmp的新手,使用snmp4j創建snmp代理。我的java應用程序需要監聽snmp請求並根據傳入的oid查詢數據庫併發迴響應。我有一個snmp代理的src代碼。但代理如何根據傳入的oid來查詢數據庫?我是否需要將代理中的所有oid註冊爲代理中的託管對象,以便代理可以在請求到達時執行查找?換句話說,我如何指向代理中的數據存儲/數據庫?從snmp代理查詢我的sql數據庫

這是我正在使用的代碼。

http://shivasoft.in/blog/java/snmp/creating-snmp-agent-server-in-java-using-snmp4j/

`列表oidList = impl.getOidList(); //從數據庫

數據(OID OID:oidList){

agent.registerManagedObject(MOScalarFactory.createReadOnly(new OID(
       oid.getOid()), oid.getValue())); 

    }' 

我想註冊與DB數據管理對象。它是否正確? 雖然oid是唯一的,但我在第二行發現重複註冊異常。

`.1.3.6.1.4.1.1166.1.6.1.2.2.1.3.1.1

.1.3.6.1.4.1.1166.1.6.1.2.2.1.3.1.2`

我不認爲這是正確的方式,因爲如果數據庫是巨大的? 任何幫助/提示,​​不勝感激。

+0

我發現周圍的工作。我正在使用命令處理器來攔截傳入的獲取請求,並希望我可以有一個自定義方法來從數據庫填充數據並將其發送迴響應中。我仍然在努力。 –

+0

需要幫助!! ..我成功地使用snmp4j libraray創建SNMP代理這裏是參考代碼(http://www.jitendrazaa.com/blog/java/snmp/creating-snmp-agent-server-in-java-using -snmp4j /)。 我的查詢是如何讓這個代理運行總是從經理收聽所有傳入的OID。 –

回答

1

首先,OID確實從一個數字開始 - 而不是一個點。您使用的語法來自NET-SNMP,並且是非標準的。

其次,請閱讀SNMP4J-Agent-Instrumentation-Guide.pdf文檔,其中詳細描述瞭如何爲MIB配置代理。你得到了重複的註冊異常,因爲你將一個標量註冊爲一個子樹。標量OID必須以「.0」實例後綴結尾。

使用CommandResponder接口有點重塑車輪。當您從頭開始時,您很可能永遠無法實施安全且標準的SNMP代理。使用SNMP4J-Agent及其儀表掛鉤將爲您節省大量工作和麻煩。

2

問題

你得到org.snmp4j.agent.DuplicateRegistrationException,因爲可以有隻有一個ContextScope ManagedObject。每個註冊將ManagedObject值分配給MOContextScope。第二次註冊嘗試將第二個對象設置爲contextScope。範圍已經填滿,因此引發異常。 Althow每個標量值應該以.0結尾。您可以檢查iReasoning之類的任何MIB瀏覽器並選擇任何值。如果這個值是標量 - 儘管事實上它沒有在MIB文件中提到,但尾隨零自動追加。所以最「正確」的方法是使用4.1解決方案。

解決方案1 ​​ - 自己MOScalar

寫自己的MOScalar。隨着更小的界限。 您應該覆蓋getLowerBound,getUpperBound,isLowerIncluded,isUpperIncluded獲取您的對象的單獨的contextScopes。

我建議每次都返回標量OID幷包含兩個邊界。 較高和較低的邊界會更好地返回您已解決的相同OID。

解決方案2 - 自己的MOServer

寫你自己的MOServer。二十一點和其他... 晴,你可以儘管這樣一個

private SortedMap<MOScope, ManagedObject> registry; 

簡單copypaste代碼應該是這樣的

private SortedMap<MOScope, Set<ManagedObject>> registry; 

而且它會影響註冊,註銷和其他邏輯。 DefaultMOServer - 678行incl。註釋。事實上,你應該可以解決幾類:

query.matchesQuery(對象)

private boolean matchesQuery(MOQuery query, ManagedObject object) { 
    if ((query.matchesQuery(object)) && object.getScope().isOverlapping(query.getScope())) 
     if (object instanceof MOScalar) { 
      MOScalar moScalar = (MOScalar) object; 
      return query.getLowerBound().compareTo(moScalar.getID()) <= 0 && 
        query.getUpperBound().compareTo(moScalar.getID()) >= 0; 
     } else { 
      return true; 
     } 

    return false; 
} 

保護無效火...事件(ManagedObject對象,MOQuery查詢){

protected void fire...Event(Set<ManagedObject> objects, MOQuery query) { 
     if (lookupListener != null) { 
      for (ManagedObject mo : objects) { 

ManagedObject other = loo kup(new DefaultMOQuery(contextScope));

Set<ManagedObject> other = lookup(new DefaultMOQuery(contextScope), false); 

等等......

解決方案3 - 表

使用錶行。 您可以添加一個表並追加行。

您將能夠訪問細胞作爲

<tableEntryOID>.<columnSubID>.<rowIndexOID> 

您可以使用this question作爲教程。

解決方案4 - OID的修正

讓你OID的使用不同的contextScopes。

解4.1 添加尾隨零

agent.registerManagedObject(
      MOScalarFactory.createReadOnly(
        new OID(oid.getOid()).successor(), 
        oid.getValue() 
      ) 
    ); 

這將追加0.0到相同的電平的特性。

SNMPGET -v2c -c公共本地主機:2001 oid.getOid()0

而且任何的MibBrowser將追加0.0到在MIB文件中定義的每個標量的oid。您可以使用iReasoning將其作爲最流行的瀏覽器進行檢查。即使hrSystemUptime(.1.3.6.1.2.1.25.1.1 - 見左下角)也被要求作爲頂部的hrSystemUptime.0(.1.3.6.1.2.1.25.1.1.0)。

解決方案4。2 在基地單獨的OID。

static final OID sysDescr1 = new OID("1.3.6.1.4.1.5.6.1.8.9"), 
     sysDescr2 = new OID("1.3.6.1.4.1.5.6.2.2.5"); 

修復數據庫OID以獲得單獨的contextScopes。

另外

您可以嘗試閱讀SNMP4J-Agent-Instrumentation-Guide.pdf。這並沒有幫助我順便說一句。
您可以將源附加到您的IDE以閱讀有關零預告片和其他細微差別。這幫助我獲得了關於DefaultMOServer的更多信息。

正確的pom.xml進口,以獲得最新版本

<repositories> 
     <repository> 
      <id>SNMP4J</id> 
      <url>https://oosnmp.net/dist/release/</url> 
     </repository> 
    </repositories> 
    <dependencies> 
     <dependency> 
      <groupId>org.snmp4j</groupId> 
      <artifactId>snmp4j-agent</artifactId> 
      <version>2.3.2</version> 
     </dependency> 
    </dependencies> 
+0

至於我最好的解決方案是重寫BaseAgent和MOServer。 – Globber

+0

[SNMP4J-Agent-Instrumentation-Guide.pdf](http://www.snmp4j.org/SNMP4J-Agent-1.4-InstrumentationGuide.pdf)根本沒有幫助我。 – Globber

+0

Snmp4j資源可以在[這裏]找到(http://www.snmp4j.org/html/download.html)。 – Globber