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

当网络snmp get返回响应事件时,为什么snmp代理不接受snmp4j get上的重新请求

钦英发
2023-03-14

我正在尝试编写我的第一个snmp4j客户端。我有一个代理在192.168.60.105上运行。使用网络snmp,我可以查询OID并获得结果。使用smnp4j,snmp get的响应事件返回空响应和空错误。我想信息是超时了,但我不知道为什么。

我使用net-snmp得到一个结果

jgaer@ljgaer2_~: snmpget 192.168.60.105 .1.3.6.1.4.1.27675.20.5.2.0
CW-NET-STG-SVR-MIB::cwNetStgSvrProvisioningEnable.0 = Hex-STRING: 00 00 00 00 

我尝试过使用更长的超时时间和更多的重试次数,返回时间也更长。这就是为什么我认为我要退出。我只是不明白为什么。我还预计,如果在超时时返回responseEvent,则错误将表明这一点。我试过使用verions1。使用版本3需要作用域PDU。

public static void main(String[] args) throws IOException {
        String address = ("udp:192.168.60.105/161");
        TransportMapping transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);
        transport.listen();
        PDU pdu = new PDU();
        pdu.setType(PDU.GET);
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.27675.20.5.2.0")));
        Address targetAddress = GenericAddress.parse(address);
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c);
        ResponseEvent response = snmp.send(pdu,target);
        System.out.println(response);
        System.out.println(response.getResponse());
        System.out.println(response.getError());

    }

运行上述代码的结果

org.snmp4j.event.ResponseEvent[source=org.snmp4j.Snmp@3f91beef]
null
null

我希望错误或响应都是非空的。我使用的是java版本java版本“1.8.0\u 191”和snmp4j版本2.5.0。代理正在运行2.5.3

我使用wireshark跟踪了数据包,可以确认我从未收到来自使用snmp4j的代理的响应。我对协议的理解还不够,无法逐个字节进行比较,但网络snmp调用的info列与snmp4j调用看起来非常不同。

net-snmp

 length       info           
 106          get-request                      : sent from client to agent
 159          report 1.3.6.1.6.3.15.1.1.4.0    : sent from agent to client
 192          encryptedPDI : privKey unknown   : sent from client to agent
 196          encryptedPDI : privKey unknown   : sent from agent to client

snmp4j-response从未收到来自客户端到代理的三条消息

 89          get-request 1.3.6.1.4.1.27675.20.5.2.0 sent from client to agent

查看字节的文本编码版本,我看到字符串“public”

共有1个答案

薛烨
2023-03-14

问题是代理是SNMPv3,要求我使用带有一些授权信息的ScopedPDU。用户和密码短语是从~/. snmp/snmp.conf文件中获得的。我现在正在连接到代理并收到代理的响应。代码如下所示。我没有得到正确的值,而是我发出了多少个get的计数器。但这是另一个问题。

第二个问题是对authProtocol和privProtocol使用了错误的值。经验教训除了检查errorResponse之外,还要检查响应的pdu类型。报告的响应类型表示故障,报告的OID是故障原因的关键。

public static void main(String[] args) throws Exception {
        TransportMapping transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);

        OctetString localEngineId = new OctetString(MPv3.createLocalEngineID());
        USM usm = new USM(SecurityProtocols.getInstance(), localEngineId, 0);
        SecurityModels.getInstance().addSecurityModel(usm);

        OctetString securityName = new OctetString("masked");
        OID authProtocol = AuthMD5.ID;
        OID privProtocol = PrivDES.ID;
        OctetString authPassphrase = new OctetString("masked");
        OctetString privPassphrase = new OctetString("masked");

        snmp.getUSM().addUser(securityName, new UsmUser(securityName, authProtocol, authPassphrase, privProtocol, privPassphrase));


        UserTarget target = new UserTarget();
        target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
        target.setSecurityName(securityName);

        target.setAddress(GenericAddress.parse(String.format("udp:%s/%s", "192.168.60.105", "161")));
        target.setVersion(SnmpConstants.version3);
        target.setRetries(2);
        target.setTimeout(60000);
        transport.listen();

        PDU pdu = new ScopedPDU();
        pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.27675.20.10.1.2.0")));
        pdu.setType(PDU.GET);
        ResponseEvent event = snmp.send(pdu, target);
        if (event != null) {
            PDU pdu2 = event.getResponse();
            System.out.println(pdu2.get(0).getVariable().toString());
            if (pdu2.getErrorStatus() == PDU.noError) {
                System.out.println("SNMPv3 GET Successful!");
            } else {
                System.out.println("SNMPv3 GET Unsuccessful.");
            }
        } else {
            System.out.println("SNMP get unsuccessful.");
        }

}
 类似资料:
  • 大家好。 受影响的0行 当我看到这个结果时,我想‘有语法错误吗?’但是,没有。更新查询工作正常。Numtable的数据从(1,2)更改为(3,4)。 我还发现了这个。我删除了“开始事务;”和'COMMIT'语句。并再次执行updateNum SP。结果是...

  • 我是SpringBoot的新手,正在寻找一种在endpoint超过3秒才能返回响应时超时的方法。我尝试添加属性“server.servlet.session.timeout”,但仍然没有运气。如何做到这一点?谢谢。 Application.properties

  • 我需要编写一个 rest 服务,它接受 XML/JSON 作为输入(POST 方法)和 XML/JSON 作为输出(基于输入格式)。我尝试了以下方法来实现这一目标,但没有帮助。终结点方法同时接受 XML/JSON,但在响应时,它始终根据 @RequestMapping -produces 中指定的顺序提供 JSON 或 XML。任何帮助将不胜感激。 我的endpoint方法: POJO班:学生.j

  • 我需要从单个客户端/管理器进程向多个snmp代理发送get请求/接收响应。我已经基于以下URL实现了客户端/代理:http://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/http://www.jitendrazaa.com/blog/java/snmp/creating-snmp-agent

  • IntelliJ中的什么功能作为服务器来接受传入连接? 当第一次运行Intellij2017.1.1时,我会得到一个对话框,要求允许传入网络连接。 您希望应用程序“Java”接受传入的网络连接吗? null 这个问题不是关于消息的来源。源码是Apple macOS应用程序级防火墙。您可以允许或阻止应用程序侦听传入的网络连接。允许这样做是一个安全风险。 IntelliJ要求被添加到允许监听传入消息的

  • 我正在使用Mac的OSX 10.9.2并尝试使用NetBeans 7.2.1和Maven 3.1.1创建一个Maven项目 在NetBeans中,我在“首选项”中正确设置了代理设置- 在usr/local/apache-maven-3.1.1/conf/settings中。我正确设置了代理设置。 它在CLI中工作,当我下载存储库时,例如: 但是,如果我尝试在NetBeans中创建项目,它不起作用,