当前位置: 首页 > 知识库问答 >
问题:

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

弓磊
2023-03-14

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

这是我正在使用的代码。

http://shivasoft.in/blog/java/snmp/creating-snmp-agent-server-in-java-using-snmp4j/

'list oidList=impl.getOidList();//从数据库获取数据

for(Oid Oid:oidList){

   agent.registerManagedObject(MOScalarFactory.createReadOnly(new OID(
                oid.getOid()), oid.getValue()));

    }'

我正在尝试用db中的数据注册托管对象。这是正确的吗?虽然id是唯一的,但我在第二行收到重复注册异常。

`.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很大怎么办?非常感谢您的帮助/提示。

共有2个答案

赵炯
2023-03-14

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

其次,请阅读SNMP4J-Agent-Instrumentation-Guide.pdf文档,其中详细描述了如何为MIB检测代理。您获得了重复注册异常,因为您将标量注册为子树。标量OID必须以“.0”实例后缀结尾。

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

施锋
2023-03-14

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

写下你自己的MOScalar。边界更小。您应该覆盖getLowerBound、getUpperBound、isLowerIncluded和isUpperIncluded,以获得对象的单独上下文范围。

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

编写自己的MOServer。21点和其他。。。大多数情况下,您可以简单地复制粘贴代码

private SortedMap<MOScope, ManagedObject> registry;

应该是这样的

private SortedMap<MOScope, Set<ManagedObject>> registry;

它会影响注册、注销和其他逻辑。DefaultMOServer-678行,包括注释。事实上,您应该修复几个类:

查询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=查找(新的DefaultMOQuery(contextScope));

Set<ManagedObject> other = lookup(new DefaultMOQuery(contextScope), false);

等等

使用表行。您可以添加表和附加行。

您将能够访问单元格作为

<tableEntryOID>.<columnSubID>.<rowIndexOID>

您可以将此问题用作教程

让您使用不同的上下文范围。

解决方案4.1添加尾随零

    agent.registerManagedObject(
            MOScalarFactory.createReadOnly(
                    new OID(oid.getOid()).successor(),
                    oid.getValue()
            )
    );

这将把.0附加到同级属性。

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

此外,任何MIB浏览器都会将.0附加到MIB文件中定义的每个标量类。您可以使用iReasning作为最流行的浏览器进行检查。甚至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以获取单独的上下文范围。

您可以尝试阅读SNMP4J代理检测指南。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>
 类似资料:
  • 我正在尝试使用Apache Spark,以便将具有多个连接和子选择的(大型)SQL查询的结果加载到来自Spark的DataFrame中,如从SQL查询创建Spark Dataframe中所述。 不幸的是,我这样做的尝试导致了拼花错误: 线程“main”组织中出现异常。阿帕奇。火花sql。AnalysisException:无法推断拼花地板的架构。必须手动指定。 我从谷歌看到的信息表明,当数据帧为空

  • 问题内容: 我的代码有问题。 像这样的情况: 我有一个下拉列表,如果选择“个人”,则会出现新的下拉列表,其中包含从数据库查询中检索到的数据;如果选择“公开”,则该下拉列表将消失。 这样的HTML代码: 查询如下: 像这样的JavaScript代码: 我不知道如何将值/结果发送到javascript代码(选择选项中的值和名称)。 问题答案: 在javascript中,您必须对您的php文件进行操作:

  • 本节将学习如何从SQL Server数据库查询数据。从一个简单的查询开始,查询语句用于从单个或多个表中检索数据。 SQL是一种特殊目的的编程语言,它是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,SQL查询语句就是一个典型的例子,无论是高级查询还是低级查询,SQL查询语

  • 我确信这是一个简单的SQLContext问题,但我在Spark docs或Stackoverflow中找不到任何答案 我想从MySQL上的SQL查询创建一个Spark数据框 例如,我有一个复杂的MySQL查询,如 我想要一个带有X、Y和Z列的数据帧 我想出了如何将整个表加载到Spark中,然后可以将它们全部加载,然后在那里进行连接和选择。然而,这是非常低效的。我只想加载SQL查询生成的表。 这是我

  • 我已使用snmp4j api在SNMP代理上创建,但SNMP表注册存在问题 一旦我注册了表和表中的行。然后,如果我在表中设置值,所有行都会设置相同的值。我已经从JSON创建了snmp表 如果我设置了值,请在下表中 .1.3.6.1.4.1.1.201.6.2。它为下表中注册的所有行设置值。是否有人知道如何使用snmmpj代理正确注册和设置值。

  • 这是获得SQL结果集的一个非常常见的方法,因为一对多的关系······对于一个相当简单的结构执行冗余查询似乎是不必要的(而且可能是低效的)。是否有一种已建立的简单的方法将其解析为java对象?也就是说,我不想迭代ResultSet类并为每一行创建和设置一个新对象,而是要迭代集合并为每一个父行创建一个新对象,为每一个子行创建一个新对象。 例如,一种方法是按父主键对查询进行排序,然后仅当父id更改时才