Olá pessoal, estou com um problemão aqui.
Estou tentando recuperar os objetos de uma MIB usando o SNMP (versão 2) e estou utilizando a API SNMP4J
Porém ao tentar pegar os objetos com a operação de GET, o retorno é de que não há objeto (No Such Object).
E ao utilizar o GetNext o retorno é incorreto, sempre é retornado o primeiro objeto da MIB o SysDescr.
Segue o código abaixo:
GET:
[code]import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class Get {
private String result;
public Get(String ip, String comunidade, String oid) {
result = "";
String address = ip + "/161";
TransportMapping transport;
Snmp snmp;
try {
transport = new DefaultUdpTransportMapping();
transport.listen();
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(comunidade));
target.setVersion(SnmpConstants.version2c);
target.setAddress(new UdpAddress(address));
target.setRetries(2);
target.setTimeout(1500);
String[] oidListStr;
oidListStr = oid.split(".");
int[] oidList = new int[oidListStr.length];
String aux;
int number;
for (int i = 0; i < oidListStr.length; i++) {
aux = oidListStr[i];
number = Integer.parseInt(aux);
oidList[i] = number;
}
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oidList)));
pdu.setType(PDU.GET);
snmp = new Snmp(transport);
result = result + "Request:\n[ Note: Enviando requesição Get para agente...";
ResponseEvent response = snmp.send(pdu, target);
if (response != null) {
PDU responsePDU = response.getResponse();
if (responsePDU != null) {
int errorStatus = responsePDU.getErrorStatus();
int errorIndex = responsePDU.getErrorIndex();
String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError) {
result = result + "Resposta Snmp Get = " + responsePDU.getVariableBindings() + "\n"
+ responsePDU;
} else {
result = "Erro: Fallha na requisição" + "\nStatus do erro = "
+ errorStatus + "\nÍndice do erro = "
+ errorIndex + "\nMensagem do erro = "+ errorStatusText;
}
} else {
result = "Erro: Resposta Get é nula";
}
} else {
result = "Erro: Tempo expirado ";
}
snmp.close();
} catch (IOException ex) {
Logger.getLogger(Snmp.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String getResult() {
return result;
}
}[/code]
GETNEXT
[code]import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class GetNext {
private String result;
public GetNext(String ip, String comunidade, String oid){
result = "";
String address = ip + "/161";
TransportMapping transport;
Snmp snmp;
try {
transport = new DefaultUdpTransportMapping();
transport.listen();
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(comunidade));
target.setVersion(SnmpConstants.version2c);
target.setAddress(new UdpAddress(address));
target.setRetries(2);
target.setTimeout(1500);
String[] oidListStr;
oidListStr = oid.split(".");
int[] oidList = new int[oidListStr.length];
String aux;
int number;
for(int i=0; i< oidListStr.length; i++){
aux = oidListStr[i];
number = Integer.parseInt(aux);
oidList[i] = number;
}
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oidList)));
pdu.setType(PDU.GETNEXT);
snmp = new Snmp(transport);
result = result + "Request:\n Enviando requesição GetNext para agente...";
ResponseEvent response = snmp.send(pdu, target);
if(response != null){
PDU responsePDU = response.getResponse();
if (responsePDU != null){
int errorStatus = responsePDU.getErrorStatus();
int errorIndex = responsePDU.getErrorIndex();
String errorStatusText = responsePDU.getErrorStatusText();
if (errorStatus == PDU.noError){
result = result +("\nResposta Snmp GetNext = "+responsePDU.getVariableBindings());
result = result + (responsePDU.toString());
}
else{
result = result +"Erro: Fallha na requisição"+"\n"+
"Status do erro = " + errorStatus +"\n"+
"Índice do erro = " + errorIndex+"\n"+
"Mensagem do erro = " + errorStatusText;
}
}
else{
result = result +("Erro: Resposta GetNext é nula");
}
}
else{
result = result +("Erro: Tempo expirado ");
}
snmp.close();
} catch (IOException ex) {
Logger.getLogger(Snmp.class.getName()).log(Level.SEVERE, null, ex);
}
}
public String getResult(){
return result;
}
}[/code]
Interface: (botão de evento)
[code]private void bOkActionPerformed(java.awt.event.ActionEvent evt) {
if(cbAcoes.getSelectedItem().equals("get")){
String ip = tfIp.getText();
String comunidade= tfComunidade.getText();
String oid = tfOid.getText();
Get g = new Get(ip, comunidade, oid);
taResult.setText(g.getResult());
}
else if(cbAcoes.getSelectedItem().equals("getBulk")){
String ip = tfIp.getText();
String comunidade= tfComunidade.getText();
String oid = tfOid.getText();
String min = tfNonr.getText();
String max = tfMaxr.getText();
if((min.equals(""))||(max.equals(""))){
JOptionPane.showMessageDialog(null, "Por favor preencha os campos com um número de buscas do GetBulk!");
}
else{
GetBulk gb = new GetBulk(ip,comunidade,oid,min,max);
taResult.setText(gb.getResult());
}
}
else if(cbAcoes.getSelectedItem().equals("getNext")){
String ip = tfIp.getText();
String comunidade= tfComunidade.getText();
String oid = tfOid.getText();
GetNext gn = new GetNext(ip, comunidade, oid);
taResult.setText(gn.getResult());
} else if(cbAcoes.getSelectedItem().equals("set")){
String ip = tfIp.getText();
String comunidade= tfComunidade.getText();
String oid = tfOid.getText();
Set s = new Set(ip, comunidade, oid);
taResult.setText(s.getResult());
}
}[/code]
PS.: nao estou preocupado com o GetBulk ou o Set mesmo que possam aparecer código para tratamento dos mesmos.