Я пытаюсь использовать SNMP4J (v2.6.2) для запроса (snmpget) двух разных целей
машины сразу. Я пробовал два подхода, и это всегда только
получает ответ для первой цели. Какой бы я ни спросил
второй никогда не получает ответ. (Я могу запросить обе машины из
Командная строка просто отлично, в том числе отдельно и одновременно.) Один
Подход, который я пробовал, использует один Snmp
, один Transport
и два UserTarget
s.
Другой подход использует два Snmp
с, два Transport
с и два
UserTarget
s. Они оба ведут себя одинаково. Я тоже получаю такой же эффект
если я отправлю один запрос, подождите, пока он не закончится, а затем отправьте
второй.
Я написал минимальный пример и вставил его ниже. Возможно кто-то
может дать мне подсказку о том, что я делаю неправильно. Спасибо!
package snmpclienttext;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.TSM;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class SNMPClientTest {
static class MySNMP {
TransportMapping<? extends Address> transport;
Snmp snmp;
OctetString securityName;
static String password = "temppassword";
UserTarget target;
void setup(String ip) throws IOException {
DefaultUdpTransportMapping d = new DefaultUdpTransportMapping();
d.setReceiveBufferSize(65536);
transport = d;
System.out.println("Listen address: " +
transport.getListenAddress());
transport.listen();
snmp = new Snmp(transport);
OctetString localEngineId = new
OctetString(MPv3.createLocalEngineID());
USM usm = new USM(SecurityProtocols.getInstance(),
localEngineId, 0);
SecurityModels.getInstance().addSecurityModel(usm);
securityName = new OctetString("SHA");
OID authProtocol = AuthSHA.ID;
OID privProtocol = org.snmp4j.security.PrivAES128.ID;
System.out.println("snmpv3password: " + password);
OctetString authPassphrase = new OctetString(password);
OctetString privPassphrase = new OctetString(password);
snmp.getUSM().addUser(securityName, new
UsmUser(securityName, authProtocol, authPassphrase, privProtocol,
privPassphrase));
SecurityModels.getInstance().addSecurityModel(new
TSM(localEngineId, false));
target = new UserTarget();
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
target.setSecurityName(securityName);
target.setAddress(GenericAddress.parse(String.format("udp:%s/%s",
ip, "161")));
target.setVersion(SnmpConstants.version3);
target.setRetries(0);
target.setTimeout(60000);
}
public void readRequest(String oid) throws IOException {
PDU pdu = new ScopedPDU();
pdu.add(new VariableBinding(new OID(oid)));
pdu.setType(PDU.GET);
try {
System.out.println("snmp get for " + target.getAddress());
snmp.get(pdu, target, null, listener);
} catch (IOException ex) {
System.out.println("SNMP Fail");
return;
}
}
}
static ResponseListener listener = new ResponseListener() {
@Override
public void onResponse(ResponseEvent event) {
if (event != null) {
Address addr = event.getPeerAddress();
if (addr == null) {
System.out.println("Null address");
return;
}
System.out.println("Peer Address = " + addr);
PDU rpdu = event.getResponse();
if (rpdu != null) {
if (rpdu.getErrorStatus() == PDU.noError) {
for (VariableBinding vb : rpdu.getVariableBindings()) {
OID oid = vb.getOid();
org.snmp4j.smi.Variable var = vb.getVariable();
String val = var.toString();
if (var.isException()) val = "";
System.out.println("Binding for " + oid +
" has " + vb.toString().length() + " characters, var has " +
val.length() + " characters");
}
} else {
System.out.println("Snmp Get Unsuccessful.");
}
} else {
System.out.println("Snmp response is null.");
}
} else {
System.out.println("SNMP event null.");
}
}
};
public static void main(String[] args) throws IOException,
InterruptedException {
MySNMP a = new MySNMP();
MySNMP b = new MySNMP();
a.setup("10.1.2.78");
b.setup("10.1.2.135");
a.readRequest("1.3.6.1.4.1.6713.1.3.1.2.1.1.50");
Thread.sleep(10000);
b.readRequest("1.3.6.1.4.1.6713.1.3.1.2.1.1.50");
Thread.sleep(10000);
}
}