Отправка OID в заголовке SNMP Trap

#java #header #snmp #snmp4j #snmp-trap

#java #заголовок #snmp #snmp4j #snmp-ловушка

Вопрос:

У меня есть Java-приложение, которое отправляет SNMP-ловушки с использованием SNMP4J. Проблема в том, что OID отправляется в теле ловушки. Все данные, которые я настраиваю, успешно отправлены, но в теле ловушки. Я хочу, чтобы Oid отправлялся в заголовке ловушки.

Как я могу отправить Oid в заголовке ловушки?

     UdpAddress managerUdpAddress = new UdpAddress("address");

    CommunityTarget ctarget = new CommunityTarget();
    ctarget.setAddress(managerUdpAddress);
    ctarget.setRetries(retryCount);
    ctarget.setCommunity(new OctetString(community));
    ctarget.setTimeout(timeout);
    ctarget.setVersion(SnmpConstants.version2c);

    PDU trap = new PDU();

    OID oid = new OID(myOid);
    trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
    trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000)));                
    trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString(
        "System Description")));
    trap.add(new VariableBinding(oid, new OctetString(message)));

    DefaultUdpTransportMapping  transport = new DefaultUdpTransportMapping();

    Snmp snmp = new Snmp(transport);

    snmp.notify(trap, ctarget);
  

Когда UPS отправляет SNMP trap, OID отображается в заголовке SNMP trap. Вот примеры:

Ловушка от ИБП:

Пн, 18 марта, 04:13:18 2019 . 1.3.6.1.4.1.935.0.49 Обычное «СОБЫТИЕ SNMP» x.x.x.x — UPS_212_bypass_ac_normal SNMP TRAP: обычный обход переменного тока

Ловушка из JAVA:

Пн. 18 марта 05:25:36 2019 .0.00 Критическое «СОБЫТИЕ SNMP» x.x.x.x — ошибки snmp моего приложения: Общая ошибка описания системы. Размер =2″

Комментарии:

1. Вы не можете нарушать сам стандарт SNMP, поэтому то, что вы просили, невозможно.

2. @LexLi UPS также отправляет SNMP-ловушки, но в этом случае OID заполняется в заголовке SNMP-ловушки. В чем разница? Как UPS может отправлять OID в заголовке?

Ответ №1:

Формат SNMP TRAP имеет фиксированную структуру, определенную в RFC 1157 или RFC 3412 (в случае SNMPv3). Эта структура состоит из заголовка и PDU (блока пакетных данных). PDU в основном представляет собой набор так называемых привязок переменных. Каждая привязка имеет OID, синтаксис и значение. Таким образом, вы можете изменить только часть PDU. Структура заголовка не может быть изменена.

Комментарии:

1. UPS также отправляет SNMP-ловушки, но в этом случае OID заполняется в заголовке SNMP-ловушки. В чем разница? Как UPS может отправлять OID в заголовке?

2. Существует так называемый Trap OID и переменные trap. Oid trap, на который ссылается его собственный OID snmpcconstants.snmpTrapOID, также является частью PDU. Это первая привязка переменной. Таким образом, получатель Trap обрабатывает его как идентификатор TRAP. Остальные переменные в PDU можно рассматривать как дополнительную информацию. Я пытаюсь вам сказать, что если тип PDU — TRAP, то первые две привязки переменных обязательны. Первый — это OID ловушки, а второй — время безотказной работы системы. Остальное — пользовательские данные.

3. Спасибо за объяснение, теперь я понимаю, почему изменение типа PDU на trap решило мою проблему.

Ответ №2:

Я сделал это, добавив этот код:

 trap.setType(PDU.TRAP);
trap.add(new VariableBinding(oid));
  

Теперь SNMP trap, отправляемый с Java, выглядит следующим образом:

Чт, март 21 15:16:51 2019 .1.3.6.1.6.3.1.1.7.1.6 Критическое «СОБЫТИЕ SNMP» x.x.x.x — ошибки snmp моего приложения: Общая ошибка системного описания. Размер =2″