问题
你得到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。 –