Java 从snmp代理查询我的sql数据库
我不熟悉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很大怎么办?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){ 我正在
非常感谢您提供的任何帮助/提示。首先,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>