snmp4j problema ao recuperar os objetos via GET e GETNEXT

2 respostas
guisantogui

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:
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;
    }
}
GETNEXT
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;
    }
}
Interface: (botão de evento)
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());
         } 
        
    }

PS.: nao estou preocupado com o GetBulk ou o Set mesmo que possam aparecer código para tratamento dos mesmos.

2 Respostas

J

Olá, estou começando a usar SNMP também, e na verdade gostaria de saber como consigo capturar
os dados de status da Impressora …

Você poderia me ajudar ?

P

Posta o Resultado, se conseguiu ou não, pois estou com o mesmo problema.

Flw

Criado 21 de novembro de 2011
Ultima resposta 6 de out. de 2012
Respostas 2
Participantes 3