SNMP4J: не удается заставить SNMPv3 работать с несколькими целями - PullRequest
1 голос
/ 24 апреля 2019

Я пытаюсь использовать SNMP4J (v2.6.2) для запроса (snmpget) двух разных целей машины сразу. Я пробовал два подхода, и это всегда только получает ответ для первой цели. Какой бы я ни спросил второй никогда не получает ответ. (Я могу запросить обе машины из Командная строка просто отлично, в том числе отдельно и одновременно.) Один Подход, который я пробовал, использует один Snmp, один Transport и два UserTarget s. Другой подход использует два Snmp с, два Transport с и два UserTarget s. Они оба ведут себя одинаково. Я тоже получаю такой же эффект если я отправлю один запрос, подождите, пока он не закончится, а затем отправьте второй.

Я написал минимальный пример и вставил его ниже. Возможно кто-то может дать мне подсказку о том, что я делаю неправильно. Спасибо!

package snmpclienttext;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.TSM;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;


public class SNMPClientTest {
    static class MySNMP {
        TransportMapping<? extends Address> transport;
        Snmp snmp;
        OctetString securityName;
        static String password = "temppassword";
        UserTarget target;

        void setup(String ip) throws IOException {
            DefaultUdpTransportMapping d = new DefaultUdpTransportMapping();
            d.setReceiveBufferSize(65536);
            transport = d;
            System.out.println("Listen address: " +
transport.getListenAddress());
            transport.listen();

            snmp = new Snmp(transport);

            OctetString localEngineId = new
OctetString(MPv3.createLocalEngineID());
            USM usm = new USM(SecurityProtocols.getInstance(),
localEngineId, 0);
            SecurityModels.getInstance().addSecurityModel(usm);

            securityName = new OctetString("SHA");
            OID authProtocol = AuthSHA.ID;
            OID privProtocol = org.snmp4j.security.PrivAES128.ID;
            System.out.println("snmpv3password: " + password);
            OctetString authPassphrase = new OctetString(password);
            OctetString privPassphrase = new OctetString(password);

            snmp.getUSM().addUser(securityName, new
UsmUser(securityName, authProtocol, authPassphrase, privProtocol,
privPassphrase));
            SecurityModels.getInstance().addSecurityModel(new
TSM(localEngineId, false));

            target = new UserTarget();
            target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
            target.setSecurityName(securityName);

            target.setAddress(GenericAddress.parse(String.format("udp:%s/%s",
ip, "161")));
            target.setVersion(SnmpConstants.version3);
            target.setRetries(0);
            target.setTimeout(60000);
        }

        public void readRequest(String oid) throws IOException {
            PDU pdu = new ScopedPDU();
            pdu.add(new VariableBinding(new OID(oid)));
            pdu.setType(PDU.GET);
            try {
                System.out.println("snmp get for " + target.getAddress());
                snmp.get(pdu, target, null, listener);
            } catch (IOException ex) {
                System.out.println("SNMP Fail");
                return;
            }
        }
    }

    static ResponseListener listener = new ResponseListener() {
        @Override
        public void onResponse(ResponseEvent event) {
            if (event != null) {
                Address addr = event.getPeerAddress();
                if (addr == null) {
                    System.out.println("Null address");
                    return;
                }
                System.out.println("Peer Address = " + addr);
                PDU rpdu = event.getResponse();
                if (rpdu != null) {
                    if (rpdu.getErrorStatus() == PDU.noError) {
                        for (VariableBinding vb : rpdu.getVariableBindings()) {
                            OID oid = vb.getOid();
                            org.snmp4j.smi.Variable var = vb.getVariable();
                            String val = var.toString();
                            if (var.isException()) val = "";
                            System.out.println("Binding for " + oid +
" has " + vb.toString().length() + " characters, var has " +
val.length() + " characters");
                        }
                    } else {
                        System.out.println("Snmp Get Unsuccessful.");
                    }
                } else {
                    System.out.println("Snmp response is null.");
                }
            } else {
                System.out.println("SNMP event null.");
            }
        }
    };

    public static void main(String[] args) throws IOException,
InterruptedException {
        MySNMP a = new MySNMP();
        MySNMP b = new MySNMP();
        a.setup("10.1.2.78");
        b.setup("10.1.2.135");

        a.readRequest("1.3.6.1.4.1.6713.1.3.1.2.1.1.50");
        Thread.sleep(10000);

        b.readRequest("1.3.6.1.4.1.6713.1.3.1.2.1.1.50");
        Thread.sleep(10000);
    }
}
...