問題
你得到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>
我發現周圍的工作。我正在使用命令處理器來攔截傳入的獲取請求,並希望我可以有一個自定義方法來從數據庫填充數據並將其發送迴響應中。我仍然在努力。 –
需要幫助!! ..我成功地使用snmp4j libraray創建SNMP代理這裏是參考代碼(http://www.jitendrazaa.com/blog/java/snmp/creating-snmp-agent-server-in-java-using -snmp4j /)。 我的查詢是如何讓這個代理運行總是從經理收聽所有傳入的OID。 –