2013-10-22 27 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