как получить системную информацию в snmpv3 используя snmp4j-2.7.0 - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь создать небольшое приложение для управления устройствами 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 (), так что я делаю не так?Благодарю.:)

1 Ответ

0 голосов
/ 21 мая 2019

Итак, после того, как я целый день сломал себе голову, ответ придет всем, кому нужно знать, как использовать SNMPV3 с SNMP4J.

Давай начнем с обычного запроса. проблема в том, что я использую PDU с GETBULK, но я не установил максимальное количество повторений, поэтому по умолчанию было 0, и я получил пустой VBS

чтобы исправить это просто используйте:

protected PDU getPDU() 
{
    // create the PDU
    PDU pdu = new ScopedPDU();
    pdu.add(new VariableBinding(SnmpConstants.system));
    pdu.setType(PDU.GETBULK);
    pdu.setMaxRepetitions(10);//or any number you wish
    return pdu;
}

для проблемы дерева нет необходимости определять максимальное количество повторений, это все, что нужно для getSubTree. поэтому проблема заключалась в том, что я установил timeOut в секундах как 30 вместо миллисекунды как 30000 глупых ошибок. но потом я получил большую ошибку: «Агент не возвращал привязки переменных в лексикографическом порядке». стена, чтобы исправить это я использую:

treeUtils.setIgnoreLexicographicOrder(true);
List<TreeEvent> events = treeUtils.getSubtree(getTarget(), tableOid);
if (events == null || events.size() == 0)
{
    System.out.println("Error: Unable to read table...");
    return;
}
 .
 .
 .
if( binds == null)
{
    binds = new ArrayList<VariableBinding>();
    binds.add(varBinding);
    resultMap.put(oid.toString(), binds); 
}
...