Java 从snmp代理查询我的sql数据库

Java 从snmp代理查询我的sql数据库,java,snmp,snmp4j,Java,Snmp,Snmp4j,我不熟悉snmp,并使用snmp4j创建snmp代理。我的java应用程序需要侦听snmp请求并根据传入oid查询数据库,然后发送响应。我有一个snmp代理的src代码。但是代理如何根据传入的oid查询db?我是否需要将数据库中的所有OID注册为代理中的托管对象,以便代理在请求到达时进行查找?或者换句话说,如何从代理指向我的datastore/db 这是我正在使用的代码 `List oidList=impl.getOidList()//从数据库获取数据 对于(Oid:oidList){ 我正在

我不熟悉snmp,并使用snmp4j创建snmp代理。我的java应用程序需要侦听snmp请求并根据传入oid查询数据库,然后发送响应。我有一个snmp代理的src代码。但是代理如何根据传入的oid查询db?我是否需要将数据库中的所有OID注册为代理中的托管对象,以便代理在请求到达时进行查找?或者换句话说,如何从代理指向我的datastore/db

这是我正在使用的代码

`List oidList=impl.getOidList()//从数据库获取数据

对于(Oid:oidList){

我正在尝试用数据库中的数据注册托管对象。是否正确? 虽然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`

我不认为这是正确的方法,因为如果db很大怎么办?
非常感谢您提供的任何帮助/提示。

首先,OID以数字开头,而不是点。您使用的语法来自NET-SNMP,是非标准的

其次,请阅读SNMP4J-Agent-Instrumentation-Guide.pdf文档,该文档详细描述了如何为MIB插入代理。由于将标量注册为子树,因此出现了重复注册异常。标量OID必须以“.0”实例后缀结尾


使用CommandResponder接口有点像是重新发明轮子。当您从头开始时,很可能永远无法实现安全且符合标准的SNMP代理。使用SNMP4J代理及其检测挂钩将为您节省大量工作和麻烦。

首先,OID确实是从数字开始的,而不是从点开始的。syn您使用的税来自网络SNMP,是非标准的

其次,请阅读SNMP4J-Agent-Instrumentation-Guide.pdf文档,该文档详细描述了如何为MIB插入代理。由于将标量注册为子树,因此出现了重复注册异常。标量OID必须以“.0”实例后缀结尾

使用CommandResponder接口有点像是重新发明轮子。从头开始时,您很可能永远无法实现安全且符合标准的SNMP代理。使用SNMP4J代理及其检测挂钩将为您节省大量工作和麻烦。

问题 您将获得org.snmp4j.agent.DuplicateRegistrationException,因为ContextScope中只能有一个ManagedObject。每个注册将值分配给。第二次注册尝试将第二个对象设置为ContextScope。该范围已填充,因此引发异常。 Althow每个标量值应以.0结尾。您可以检查任何MIB浏览器(如iReasoning)并选择任何值。如果此值是标量值,则自动追加尾随零,尽管MIB文件中未提及。因此最“正确”的方法是使用4.1解决方案。

解决方案1-自有MOScalar 写你自己的MOScalar,有更小的边界。 您应该覆盖getLowerBound、getUpperBound、isLowerIncluded和isUpperIncluded,以便为对象获取单独的ContextScope

我建议每次都返回标量OID,并包含两个边界。 上下边界最好返回您已确定的OID

解决方案2-自己的MOServer 写你自己的MOServer。与21点和其他。。。 大多数情况下,您可以简单地复制粘贴代码

private SortedMap<MOScope, ManagedObject> registry;
这将.0附加到相同级别的属性

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

此外,任何MIB浏览器都会将.0附加到MIB文件中定义的每个标量oid中。您可以使用iReasoning作为最流行的浏览器对其进行检查。甚至hrSystemUptime(.1.3.6.1.2.1.25.1.1-请参见左下角)也会作为顶部的hrSystemUptime.0(.1.3.6.1.2.1.25.1.0)进行请求

解决方案4.2 在底座上分开

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以获取单独的ContextScope

此外 您可以尝试阅读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
https://oosnmp.net/dist/release/
org.snmp4j
snmp4j试剂
2.3.2
问题 您将获得org.snmp4j.agent.DuplicateRegistrationException,因为ContextScope中只能有一个ManagedObject。每个注册将值分配给。第二次注册尝试将第二个对象设置为ContextScope。该范围已填充,因此引发异常。 Althow每个标量值应以.0结尾。您可以检查任何MIB浏览器(如iReasoning)并选择任何值。如果此值是标量值,则自动追加尾随零,尽管MIB文件中未提及。因此最“正确”的方法是使用4.1解决方案。

解决方案1-自有MOScalar 写你自己的MOScalar,有更小的边界。 您应该覆盖getLowerBound、getUpperBound、isLowerIncluded和isUpperIncluded,以便为对象获取单独的ContextScope

我建议每次都返回标量OID,并包含两个边界。 上下边界最好返回您已确定的OID

解决方案2-自己的MOServer 写你自己的MOServer。与21点和其他。。。 大多数情况下,您可以简单地复制粘贴代码

private SortedMap<MOScope, ManagedObject> registry;
这将.0附加到相同级别的属性

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

此外,任何MIB浏览器都会将.0附加到MIB文件中定义的每个标量oid。您可以使用iReasoning作为最流行的bro进行检查
protected void fire...Event(Set<ManagedObject> objects, MOQuery query) {
        if (lookupListener != null) {
            for (ManagedObject mo : objects) {
Set<ManagedObject> other = lookup(new DefaultMOQuery(contextScope), false);
<tableEntryOID>.<columnSubID>.<rowIndexOID>
    agent.registerManagedObject(
            MOScalarFactory.createReadOnly(
                    new OID(oid.getOid()).successor(),
                    oid.getValue()
            )
    );
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");
    <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>