Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Чтение таблицы mac адресов посредством SNMP


Автор: GrafCharodey 19.10.2009, 15:08
Здравствуйте!
Я столкнулся с проблемой чтения mac адресов с управляемого свитча, точнее не могу полностью понять технологию работы библиотеки snmp4j.
Вот код который формирует пакет snmp, отсылает его на указанный адрес и получает ответ.

Код

public class Packadg {
    private String address;
    private String NameRead;

    public Packadg(String address, String NameRead){
        this.address = address;
        this.NameRead = NameRead;
    }

    @SuppressWarnings("static-access")
    public String Packing() throws IOException{
        UdpAddress targetAddress = new UdpAddress(address + "/161");

        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString(NameRead));
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1000);
        target.setVersion(SnmpConstants.version2c);

        Snmp snmp = null;
        snmp = new Snmp(new DefaultUdpTransportMapping());
        snmp.listen();

        command.add(new VariableBinding(new OID("1.3.6.1.2.1.17.4.3")));
        command.setType(PDU.GETNEXT);

        ResponseEvent response = null;
        response = snmp.send(command, target);

        if(response.getResponse() != null){
            return address + " : " + response.getResponse().toString();
        }
        else{
            return address + " : 0";
        }
    }
}


В принципе всё работает, но проблема в том что я получаю только первый mac адрес и всё. Никак не могу разобраться как получить остальные. 
Заранее благодарен! Помогите, очень надо!

Автор: vanishox 8.12.2009, 14:03
Я тоже пытался разобраться с этой библиотекой. У меня тоже возникала проблема - GETNEXT - ом дергал только 1-й mac. Нашел библиотеку - AdventNetSNMPAPI_4_Std. 
----------------------------------------------------------------------------------------------------------------------------------------------------------
public Snmp(String swIP) {
        SwitchIP = swIP;
        snmpTarget = new SnmpTarget();                                
        snmpTarget.setTargetHost(swIP);                                
        snmpTarget.setTargetPort(161);                                
        snmpTarget.setTimeout(1);                                    
        snmpTarget.setRetries(1);                                    
        snmpTarget.setSnmpVersion(snmpTarget.VERSION2C);            
        snmpTarget.setCommunity("public");                            
                        com.adventnet.snmp.snmp2.SnmpVarBind[][] result = null;                         // результат опроса коммутатора, выбирает все данные принятые в ответ на запрос.
    }
    public void run(){
        try{
            arrayList = new ArrayList();
            snmpTarget.setObjectID(.........OID(String)...........);
            arrayList.add(snmpTarget.snmpGetNext());
            snmpTarget.setObjectID(.........OID(String)...........);    
            arrayList.add(snmpTarget.snmpGet().substring(0));
            snmpTarget.setObjectID(.........OID(String)...........);
            arrayList.add(snmpTarget.snmpGet());
            snmpTarget.setObjectID(.........OID(String)...........;
            arrayList.add(snmpTarget.snmpGetNext());
            snmpTarget.setObjectID(.........OID(String)...........);
            arrayList.add(snmpTarget.snmpGetNext());
            snmpTarget.setObjectID(.........OID(String)...........;
            result = snmpTarget.snmpGetAllVariableBindings();                       // - получение данных!
        }catch(Exception e){
            new ErrorLog(SwitchIP+".err",SwitchIP + "<|>" + " Ошибка инициализации объекта SNMP.");
            
        }
----------------------------------------------------------------------------------------------------------------------------------------------------------
могу прислать библиотеку.

Автор: DJFractal 9.2.2010, 12:00
У меня не работает ни один из этих примеров, в чем может быть проблема, все-время возвращает значение 0

Автор: Evgin 16.2.2010, 14:45
Рабочий код. Получения нескольких полей из таблицы сетевых интерфейсов и вывод в виде таблички в конссоль.

Код

UdpAddress address = new UdpAddress("192.168.100.254/161");

        TransportMapping transportMapping = new DefaultUdpTransportMapping();

        Session snmp = new Snmp(transportMapping);
        transportMapping.listen();

        TableUtils tableUtils = new TableUtils(snmp, new DefaultPDUFactory());

        CommunityTarget target = new CommunityTarget(address, new OctetString(
                "public"));
        target.setRetries(1);
        target.setTimeout(3000L);
        target.setVersion(SnmpConstants.version2c);

        List list = tableUtils.getTable(target, new OID[] {
                new OID("1.3.6.1.2.1.2.2.1.1"), new OID("1.3.6.1.2.1.2.2.1.2"),
                new OID("1.3.6.1.2.1.2.2.1.3"), new OID("1.3.6.1.2.1.2.2.1.4"),
                new OID("1.3.6.1.2.1.2.2.1.7") }, null, null);

        for (Object obj : list) {
            TableEvent event = (TableEvent) obj;
            VariableBinding[] bindings = event.getColumns();

            if(bindings == null) continue;

            for (VariableBinding bind : bindings) 
                System.out.print(String.format("%25s", bind.getVariable()));
            
            System.out.println();
        }

        transportMapping.close();

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)