Java 使用snmp4j获取网络打印机的所有oid

Java 使用snmp4j获取网络打印机的所有oid,java,snmp,snmp4j,Java,Snmp,Snmp4j,我试图获取特定设备的所有oid信息,知道ip地址,在本例中是HP LaserJet Pro M404dw网络打印机,类似于我运行此snmpwalk命令得到的信息:snmpwalk-v 2c-c public ipaddress 这就是我尝试过的: public static PDU MensajeSNMP(String ip) throws IOException { String address = "udp:" + ip + "/161&quo

我试图获取特定设备的所有oid信息,知道ip地址,在本例中是HP LaserJet Pro M404dw网络打印机,类似于我运行此snmpwalk命令得到的信息:
snmpwalk-v 2c-c public ipaddress

这就是我尝试过的:

public static PDU MensajeSNMP(String ip) throws IOException {
        String address = "udp:" + ip + "/161";
        String community = "public";
        DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
        Snmp snmp = new Snmp(transport);
        transport.listen();
        CommunityTarget target = new CommunityTarget();
        target.setAddress(GenericAddress.parse(address));
        target.setCommunity(new OctetString(community));
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c);
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(new OID("")));      
        pdu.setType(PDU.GETBULK);
        pdu.setMaxRepetitions(200);
        pdu.setNonRepeaters(0);
        ResponseEvent responseEvent = snmp.send(pdu, target);
        PDU response = responseEvent.getResponse();
            
        return response;
    }    
}
问题是我得到的响应为null,似乎这个方法需要我传递一个特定的OID来获取值,但我想要的是像snmpwalk命令一样从该IP获取所有OID

RESPONSE[requestID=1285053186, errorStatus=Success(0), errorIndex=0, VBS[]]
提前感谢你的帮助

------------------更新-------------------------------

我一直在做一些测试,我发现该脚本确实与另一台打印机,京瓷ECOSYS M2035dn一起工作。以下是回应:

RESPONSE[requestID=1201694585, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.1.0 = KYOCERA Document Solutions Printing System; 1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.1347.41; 1.3.6.1.2.1.1.3.0 = 1 day, 23:15:38.96; 1.3.6.1.2.1.1.4.0 = ; 1.3.6.1.2.1.1.5.0 = ; 1.3.6.1.2.1.1.6.0 = Summan Tecnicos; 1.3.6.1.2.1.1.7.0 = 12; 1.3.6.1.2.1.2.1.0 = 1; 1.3.6.1.2.1.2.2.1.1.1 = 1; 1.3.6.1.2.1.2.2.1.2.1 = eth0; 1.3.6.1.2.1.2.2.1.3.1 = 6; 1.3.6.1.2.1.2.2.1.4.1 = 1500; 1.3.6.1.2.1.2.2.1.5.1 = 1000000000; 1.3.6.1.2.1.2.2.1.6.1 = 00:17:c8:23:16:c0; 1.3.6.1.2.1.2.2.1.7.1 = 1; 1.3.6.1.2.1.2.2.1.8.1 = 1; 1.3.6.1.2.1.2.2.1.9.1 = 0:00:00.00; 1.3.6.1.2.1.2.2.1.10.1 = 63665566; 1.3.6.1.2.1.2.2.1.11.1 = 746441; 1.3.6.1.2.1.2.2.1.12.1 = 0; 1.3.6.1.2.1.2.2.1.13.1 = 0; 1.3.6.1.2.1.2.2.1.14.1 = 0; 1.3.6.1.2.1.2.2.1.15.1 = 0; 1.3.6.1.2.1.2.2.1.16.1 = 41207085; 1.3.6.1.2.1.2.2.1.17.1 = 168517; 1.3.6.1.2.1.2.2.1.18.1 = 0; 1.3.6.1.2.1.2.2.1.19.1 = 0; 1.3.6.1.2.1.2.2.1.20.1 = 0; 1.3.6.1.2.1.2.2.1.21.1 = 0; 1.3.6.1.2.1.2.2.1.22.1 = 0.0; 1.3.6.1.2.1.3.1.1.1.1.1.172.23.254.1 = 1; 1.3.6.1.2.1.3.1.1.1.1.1.172.23.254.170 = 1; 1.3.6.1.2.1.3.1.1.2.1.1.172.23.254.1 = f4:ce:46:a6:05:ab; 1.3.6.1.2.1.3.1.1.2.1.1.172.23.254.170 = 5c:e0:c5:0d:ea:30; 1.3.6.1.2.1.3.1.1.3.1.1.172.23.254.1 = 172.23.254.1; 1.3.6.1.2.1.3.1.1.3.1.1.172.23.254.170 = 172.23.254.170; 1.3.6.1.2.1.4.1.0 = 2; 1.3.6.1.2.1.4.2.0 = 64; 1.3.6.1.2.1.4.3.0 = 173835; 1.3.6.1.2.1.4.4.0 = 0; 1.3.6.1.2.1.4.5.0 = 0; 1.3.6.1.2.1.4.6.0 = 0; 1.3.6.1.2.1.4.7.0 = 0; 1.3.6.1.2.1.4.8.0 = 0; 1.3.6.1.2.1.4.9.0 = 171711; 1.3.6.1.2.1.4.10.0 = 159125; 1.3.6.1.2.1.4.11.0 = 0; 1.3.6.1.2.1.4.12.0 = 0; 1.3.6.1.2.1.4.13.0 = 0; 1.3.6.1.2.1.4.14.0 = 16; 1.3.6.1.2.1.4.15.0 = 8; 1.3.6.1.2.1.4.16.0 = 0; 1.3.6.1.2.1.4.17.0 = 20; 1.3.6.1.2.1.4.18.0 = 0; 1.3.6.1.2.1.4.19.0 = 41; 1.3.6.1.2.1.4.20.1.1.172.23.254.194 = 172.23.254.194; 1.3.6.1.2.1.4.20.1.2.172.23.254.194 = 1; 1.3.6.1.2.1.4.20.1.3.172.23.254.194 = 255.255.255.0; 1.3.6.1.2.1.4.20.1.4.172.23.254.194 = 1; 1.3.6.1.2.1.4.20.1.5.172.23.254.194 = -1; 1.3.6.1.2.1.4.21.1.1.0.0.0.0 = 0.0.0.0; 1.3.6.1.2.1.4.21.1.1.172.23.254.0 = 172.23.254.0; 1.3.6.1.2.1.4.21.1.2.0.0.0.0 = 1; 1.3.6.1.2.1.4.21.1.2.172.23.254.0 = 1; 1.3.6.1.2.1.4.21.1.3.0.0.0.0 = 1; 1.3.6.1.2.1.4.21.1.3.172.23.254.0 = 0; 1.3.6.1.2.1.4.21.1.4.0.0.0.0 = -1; 1.3.6.1.2.1.4.21.1.4.172.23.254.0 = -1; 1.3.6.1.2.1.4.21.1.5.0.0.0.0 = -1; 1.3.6.1.2.1.4.21.1.5.172.23.254.0 = -1; 1.3.6.1.2.1.4.21.1.6.0.0.0.0 = -1; 1.3.6.1.2.1.4.21.1.6.172.23.254.0 = -1; 1.3.6.1.2.1.4.21.1.7.0.0.0.0 = 172.23.254.1; 1.3.6.1.2.1.4.21.1.7.172.23.254.0 = 0.0.0.0; 1.3.6.1.2.1.4.21.1.8.0.0.0.0 = 4; 1.3.6.1.2.1.4.21.1.8.172.23.254.0 = 3; 1.3.6.1.2.1.4.21.1.9.0.0.0.0 = 2; 1.3.6.1.2.1.4.21.1.9.172.23.254.0 = 2; 1.3.6.1.2.1.4.21.1.10.0.0.0.0 = 0; 1.3.6.1.2.1.4.21.1.10.172.23.254.0 = 0; 1.3.6.1.2.1.4.21.1.11.0.0.0.0 = 0.0.0.0; 1.3.6.1.2.1.4.21.1.11.172.23.254.0 = 255.255.255.0; 1.3.6.1.2.1.4.21.1.12.0.0.0.0 = -1; 1.3.6.1.2.1.4.21.1.12.172.23.254.0 = -1; 1.3.6.1.2.1.4.21.1.13.0.0.0.0 = 0.0; 1.3.6.1.2.1.4.21.1.13.172.23.254.0 = 0.0; 1.3.6.1.2.1.4.22.1.1.1.172.23.254.1 = 1; 1.3.6.1.2.1.4.22.1.1.1.172.23.254.170 = 1; 1.3.6.1.2.1.4.22.1.2.1.172.23.254.1 = f4:ce:46:a6:05:ab; 1.3.6.1.2.1.4.22.1.2.1.172.23.254.170 = 5c:e0:c5:0d:ea:30; 1.3.6.1.2.1.4.22.1.3.1.172.23.254.1 = 172.23.254.1; 1.3.6.1.2.1.4.22.1.3.1.172.23.254.170 = 172.23.254.170; 1.3.6.1.2.1.4.22.1.4.1.172.23.254.1 = 3; 1.3.6.1.2.1.4.22.1.4.1.172.23.254.170 = 3; 1.3.6.1.2.1.4.23.0 = 0; 1.3.6.1.2.1.5.1.0 = 0; 1.3.6.1.2.1.5.2.0 = 0; 1.3.6.1.2.1.5.3.0 = 0; 1.3.6.1.2.1.5.4.0 = 0; 1.3.6.1.2.1.5.5.0 = 0]]

我不知道我在这里遗漏了什么,但真的很奇怪,它与某些设备兼容,而与其他设备不兼容。

我找到了一种方法来获取我需要的所有oid

而不是使用以下命令发送snmp请求:
ResponseEvent ResponseEvent=snmp.send(pdu,目标)

您需要使用:
List events=treeUtils.getSubtree(target,newOID(tableOid))允许生成OID子树

这是我最后使用的代码示例:

public static Map<String, String> doWalk(String tableOid, Target target) throws IOException {

    String address = "udp:" + ip + "/161";
    String community = "public";        

    CommunityTarget target = new CommunityTarget();
    target.setAddress(GenericAddress.parse(address));
    target.setCommunity(new OctetString(community));
    target.setRetries(2);
    target.setTimeout(1500);
    target.setVersion(SnmpConstants.version2c);

    Map<String, String> result = new TreeMap<>();
    TransportMapping transport = new DefaultUdpTransportMapping();
    Snmp snmp = new Snmp(transport);
    transport.listen();

    TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory());
    List<TreeEvent> events = treeUtils.getSubtree(target, new OID(tableOid));
    if (events == null || events.size() == 0) {
        System.out.println("Error: Unable to read table...");
        return result;
    }

    for (TreeEvent event : events) {
        if (event == null) {
            continue;
        }
        if (event.isError()) {
            System.out.println("Error: table OID [" + tableOid + "] " + event.getErrorMessage());
            continue;
        }

        VariableBinding[] varBindings = event.getVariableBindings();
        if (varBindings == null || varBindings.length == 0) {
            continue;
        }
        for (VariableBinding varBinding : varBindings) {
            if (varBinding == null) {
                continue;
            }
             
            result.put("." + varBinding.getOid().toString(), varBinding.getVariable().toString());
        }

    }
    snmp.close();

    return result;
}
publicstaticmap-doWalk(stringtableoid,Target-Target)抛出IOException{
String address=“udp:+ip+”/161”;
String community=“public”;
CommunityTarget=新的CommunityTarget();
target.setAddress(GenericAddress.parse(address));
setCommunity(新的八位字符串(community));
目标。设置重试次数(2次);
target.setTimeout(1500);
setVersion(SnmpConstants.version2c);
映射结果=新树映射();
TransportMapping transport=新的defaultUDPTTransportMapping();
Snmp=新的Snmp(传输);
运输。听();
TreeUtils TreeUtils=新树(snmp,new DefaultPDUFactory());
列表事件=treeUtils.getSubtree(目标,新OID(tableOid));
if(events==null | | events.size()==0){
System.out.println(“错误:无法读取表…”);
返回结果;
}
for(TreeEvent事件:事件){
如果(事件==null){
继续;
}
if(event.isError()){
System.out.println(“错误:表OID[“+tableOid+”]“+event.getErrorMessage());
继续;
}
VariableBinding[]varBindings=event.getVariableBindings();
if(varBindings==null | | varBindings.length==0){
继续;
}
for(VariableBinding-varBinding:varBindings){
if(varBinding==null){
继续;
}
结果.put(“.”+varBinding.getOid().toString(),varBinding.getVariable().toString());
}
}
snmp.close();
返回结果;
}

使用Wireshark等工具为snmpwalk和您自己的代码捕获SNMP数据包。比较时,您可以很容易地分辨出差异。