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

Get all oid of network printer with snmp4j

我正在尝试获取知道 IP 地址的特定设备的所有 oid 信息,在本例中是 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;
    }    
}

问题是我得到的响应是空的,似乎这个方法需要我传递一个特定的 OID 来获取值,但我想要的是从那个 IP 获取所有的 OID 就像snmpwalk 命令。

RESPONSE[requestID=1285053186, errorStatus=Success(0), errorIndex=0, VBS[]]

在此先感谢您的帮助。

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

我一直在做一些测试,我发现脚本确实适用于另一台打印机 Kyocera 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, target);

您需要使用:List<TreeEvent> events = treeUtils.getSubtree(target, new OID(tableOid)); 允许 fecth 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;
}