snmp4j Неизвестное имя безопасности

avatar
陈信虎
8 апреля 2018 в 01:58
1195
1
0

У меня проблема с snmp4j. Исключение составляет неизвестное имя безопасности. Я использую snmp4j для мониторинга устройств и запускаю его в многопоточном режиме. Мой код приведен ниже. Кто может подсказать как решить эту проблему.

public static JSONObject snmpV3Check(Integer ida, String contextName, String ip, String userName, Integer authProtocol, String authPass, Integer privProtocol, String privPass, Integer level) {
    JSONObject json = new JSONObject();
    int isSnmpConn = -1;
    UserTarget target = null;
    if (ida != null) {
        Integer snmpTimeOut = StrategyContainer.getStrategy(ida).getSnmpTimeOut();
        Integer snmpRetryCount = StrategyContainer.getStrategy(ida).getSnmpRetryCount();
        target = creatV3Default(ip, userName, level, snmpTimeOut, snmpRetryCount);
    } else {
        target = creatV3Default(ip, userName, level, DEFAULT_TIMEOUT, DEFAULT_RETRY);
    }
    ScopedPDU request = new ScopedPDU();
    request.setType(PDU.GET);
    request.setContextName(new OctetString(contextName));
    Snmp snmp = null;
    TransportMapping<?> transport = null;
    try {
        transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
        USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(), new OctetString(MPv3.createLocalEngineID()), 0);
        SecurityModels.getInstance().addSecurityModel(usm);
        //USM usm = USMFactory.getInstance();
        SecurityModels.getInstance().addSecurityModel(usm);
        transport.listen();
        snmp.getUSM().addUser(new OctetString(userName), UsmUserUtil.creatUsmUser(userName, authProtocol, authPass, privProtocol, privPass));
        ResponseEvent respEvt = snmp.send(request, target);
        if (respEvt != null && respEvt.getResponse() != null) {
            if (respEvt.getResponse().getType() == PDU.RESPONSE && respEvt.getResponse().getErrorStatus() == PDU.noError) {
                isSnmpConn = 1;
            } else {
                logger.error(">>>>>>>>>snmp(v3) Error Code About Response:{ip:{}, type:{}, ErrorStatus:{}}<<<<<<<<<", ip, respEvt.getResponse().getType(), respEvt.getResponse().getErrorStatus());
            }
        } 
    } catch (IOException e) {
        logger.error("V3snmp's Exception:’", e);

    } 

    json.put("conn", isSnmpConn);
    return json;
}
Источник
Stephen C
8 апреля 2018 в 02:18
2

Пожалуйста, включите полную трассировку стека. Пожалуйста, также переведите для нас эти китайские сообщения об ошибках.

Ответы (1)

avatar
Evgeny Kochergin
8 апреля 2018 в 02:24
0

При использовании snmp v3 вы должны предоставить имя безопасности в соответствии со спецификацией проекта.
Имя безопасности должно быть указано с помощью установщика UserTarget или предоставлено непосредственно конструктором . Пример:

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

Как добавить имя безопасности в snmp v3, подробнее см. здесь:

陈信虎
11 апреля 2018 в 03:56
0

Я заканчиваю эту задачу. Я использовал синхронизированный метод. Спасибо за вашу помощь.