1

我正在编写一个从多个服务器检索一些信息的 java 代码。一切正常,除了 ifInOctets 和 ifOutOctets 返回“noSuchInstance”而不是它们的值。我可以使用 iReasoning MIB 浏览器检索同一服务器的 ifInOctets 和 ifOutOctets。

public Map<String, Object> getStatus() throws IOException{
    Snmp snmp4j = new Snmp(new DefaultUdpTransportMapping());
    snmp4j.listen();
    CommunityTarget target = new CommunityTarget();
    Map<String, Object> result = new HashMap<>();
    List<Map<String, Object>> servers = new LinkedList<>();
    for(SnmpServer snmpServer : snmpServers){
        Map<String, Object> server = new HashMap<>();
        server.put("name", snmpServer.getName());
        List<Map<String, Object>> parameters = new LinkedList<>();
        target.setAddress(new UdpAddress(snmpServer.getAddress()));
        target.setTimeout(500);
        target.setRetries(3);
        target.setCommunity(new OctetString("public"));
        target.setVersion(SnmpConstants.version2c);
        List<String> keys = new ArrayList<>();
        PDU request = new PDU();
        request.setType(PDU.GET);
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.2.2.1.10")));
        keys.add("ifInOctets");
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.2.2.1.16")));
        keys.add("ifOutOctets");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.9.1")));
        keys.add("diskPercentage");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.4.6.0")));
        keys.add("usedMemory");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.4.5.0")));
        keys.add("totalMemory");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.11.11.0")));
        keys.add("idleCpuPercentage");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.6.1")));
        keys.add("totalDisk");
        request.add(new VariableBinding(new OID(".1.3.6.1.4.1.2021.9.1.8.1")));
        keys.add("usedDisk");
        request.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3.0")));
        keys.add("systemUpTime");
        ResponseEvent responseEvent;
        responseEvent = snmp4j.send(request, target);
        PDU responsePDU = responseEvent.getResponse();
        try{
            Vector<VariableBinding> variableBindings = responsePDU.getVariableBindings();
            for(int j = 0; j < variableBindings.size(); j++){
                Map<String, Object> parameter = new HashMap<>();
                parameter.put("name", keys.get(j));
                parameter.put("value", variableBindings.get(j).getVariable().toString());
                parameters.add(parameter);
            }
            server.put("parameters", parameters);
        }catch(NullPointerException e){
            server.put("offline", true);
        }
        servers.add(server);
    }
    result.put("servers", servers);
    return result;
}

那么关于可能是什么问题的任何想法?

4

1 回答 1

2

您需要在.1.3.6.1.2.1.2.2.1.10和之后指定接口索引.1.3.6.1.2.1.2.2.1.16。(例如,如果索引为 17,则追加.17到两个 OID。)否则,目标服务器不知道您要返回哪个接口的流量计数器值。

服务器和路由器可以有多个接口,它们分别计算每个接口上的流量。我不能告诉你正确的接口索引应该是什么;您必须自己在服务器/路由器上查找。或者,如果您只想返回索引最低的接口上的流量,您可以使用 GETNEXT 请求而不是 GET。但是,这可能不一定是正确的界面。

于 2014-05-10T09:28:11.117 回答