当net-snmp get返回响应事件时,为什么snmp代理不接受对snmp4j get的resquest

问题描述 投票:0回答:1

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

我使用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

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

我使用wireshark跟踪数据包并且可以确认我从未使用snmp4j从代理获得响应。我真的不了解protocal进行逐字节比较,但net-snmp调用的信息列看起来与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 - 响应从未收到客户端到代理的三条消息

 89          get-request 1.3.6.1.4.1.27675.20.5.2.0 sent from client to agent

看看字节的文本编码版本,我看到字符串'public'

java snmp net-snmp snmp4j
1个回答
0
投票

问题是代理是SNMPv3要求我使用带有一些授权信息的ScopedPDU。用户和密码短语是从〜/ .snmp / snmp.conf文件中获取的。我现在正联系并得到代理商的回复。代码如下所示。我没有得到正确的价值,而是反映了我发行了多少。但这是另一个问题。

第二个问题是使用了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.");
        }

}
© www.soinside.com 2019 - 2024. All rights reserved.