Я пытаюсь создать небольшое приложение для управления устройствами snmp, а для начала хочу получить информацию о системе.
Я использую snmp4j версии 2.7.0, java 1.8, а устройство использует snmpv3.Для начала я хочу получить данные синхронно.Я пытаюсь сделать это двумя способами, но я получаю время ожидания
вот мой код
//Normal request
public class SynchronouslySnmp
{
protected String PORT="/161";
protected String PROTOCOL="udp:";
protected SnmpData snmpData;
protected Snmp snmp;
public SynchronouslySnmp(SnmpData snmpData)
{
this.snmpData=snmpData;
}
public void start()
{
createSNMPsession();
addSnmpUser();
sendSnmp();
}
private void sendSnmp()
{
// send the PDU
ResponseEvent response;
try
{
response = snmp.send(getPDU(), getTarget());
// extract the response PDU (could be null if timed out)
PDU responsePDU = response.getResponse();
// extract the address used by the agent to send the response:
if(responsePDU == null)
{
System.out.println("ERROR: table OID [" + SnmpContants.system + "] time out" );
}
else
{
Address peerAddress = response.getPeerAddress();
System.out.println("pdu: "+responsePDU.toString());
System.out.println("Address: "+peerAddress.toString());
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
snmp.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
protected void createSNMPsession()
{
TransportMapping<? extends Address> transport;
try
{
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
transport.listen();
//snmp.listen();
}
catch (IOException e)
{
e.printStackTrace();
}
}
protected void addSnmpUser()
{
// add user to the USM
snmp.getUSM().addUser(new OctetString(snmpData.getUsmUser()),
new UsmUser(new OctetString(snmpData.getUsmUser()),
snmpData.getAuthProtocol(),
new OctetString(snmpData.getAuthPassword()),
snmpData.getPrivProtocol(),
new OctetString(snmpData.getPrivPassword())));
}
protected Target getTarget()
{
// create the target
UserTarget target = new UserTarget();
Address targetAddress = GenericAddress.parse(PROTOCOL+snmpData.getIpAddress()+PORT);
target.setAddress(targetAddress);
target.setRetries(snmpData.getRetryTimes());
target.setTimeout(snmpData.getTimeout());
target.setVersion(snmpData.getSnmpVersion());
target.setSecurityLevel(snmpData.getSecurityLevel());
target.setSecurityName(new OctetString(snmpData.getUsmUser()));
return target;
}
protected PDU getPDU()
{
// create the PDU
PDU pdu = new ScopedPDU();
pdu.add(new VariableBinding(SnmpConstants.system));
pdu.setType(PDU.GETBULK);
return pdu;
}
}
Я пытаюсь использовать treeUtil, но получаю ту же ошибку, что и в обычном запросеследуйте мой код
public class SynchronouslySnmpUsingTree extends SynchronouslySnmp
{
private OID tableOid;
private LinkedHashMap<String, List<VariableBinding>> resultMap;
public SynchronouslySnmpUsingTree(SnmpData snmpData)
{
super(snmpData);
resultMap = new LinkedHashMap<String, List<VariableBinding>>();
tableOid=new OID(".1.3.6.1.2.1.1");
createSNMPsession();
addSnmpUser();
sendSnmp();
}
private void sendSnmp()
{
try
{
TreeUtils treeUtils = new TreeUtils(snmp, new PDUFactory()
{
@Override
public PDU createPDU(MessageProcessingModel arg0) {
return getPDU();
}
@Override
public PDU createPDU(Target arg0) {
return getPDU();
}
});
List<TreeEvent> events = treeUtils.getSubtree(getTarget(), tableOid);
if (events == null || events.size() == 0)
{
System.out.println("Error: Unable to read table...");
return;
}
for (TreeEvent event : events)
{
if (event != null && !event.isError())
{
VariableBinding[] varBindings = event.getVariableBindings();
if (varBindings != null && varBindings.length != 0)
{
for (VariableBinding varBinding : varBindings)
{
if (varBinding != null)
{
OID oid = varBinding.getOid();
List<VariableBinding> binds = resultMap.get(oid.toString());
if( binds == null)
{
binds = new ArrayList<VariableBinding>();
resultMap.put(oid.toString(), binds);
}
binds.add(varBinding);
}
}
}
}
else
{
System.out.println("Error: table OID [" + tableOid + "] " + event.getErrorMessage());
continue;
}
}
}
catch(Throwable t)
{
System.out.println("Failed operation: getMibTableWithNext");
t.printStackTrace();
}
finally
{
try
{
snmp.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
основная функция
public static void main(String[] args){
SynchronouslySnmp synchronouslySnmp =new SynchronouslySnmp (new SnmpData());
synchronouslySnmp.start();
SynchronouslySnmpUsingTree synchronouslySnmpUsingTree = new SynchronouslySnmpUsingTree(new SnmpData());
}
Результат запуска программы
Error: table OID [1.3.6.1.2.1.1] time out); <---nurmal
Error: table OID [1.3.6.1.2.1.1] Request time out); <---tree
Я смотрю в https://www.snmp4j.org/html/faq.html
Почему я всегда получаю тайм-аут (ответ == ноль) при отправке запроса?
Возможно, вы забыли вызвать метод listen () объекта TransportMapping (один раз) иликласс Snmp перед отправкой запроса.
но я делаю это в методе createSNMPsession (), так что я делаю не так?Благодарю.:)