Java 使用snmp4j获取网络打印机的所有oid
我试图获取特定设备的所有oid信息,知道ip地址,在本例中是HP LaserJet Pro M404dw网络打印机,类似于我运行此snmpwalk命令得到的信息: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
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数据包。比较时,您可以很容易地分辨出差异。