[SNMP4J] Device sending Trap with Inform

John Money john.money at gmail.com
Sat Sep 20 00:10:48 CEST 2014


Hi Frank,

No need to respond to my last email. I answered both questions. There was a
port forwarding rule on my linux server that was blocking inform messages
but not traps and I found some sample code in your SnmpRequest class so I
will use that as an example for responding to an Inform request.

Thanks,
John Money

On Fri, Sep 19, 2014 at 12:12 PM, John Money <john.money at gmail.com> wrote:

> Hi Frank,
>
> I am using snmp4j to listen for traps from multiple devices and it works
> great! Recently, I started receiving traps from a device that is expecting
> an Inform response to know that the trap has been received. Right now, the
> device just continues to resend the traps and I receive all of them but I
> only need each trap once.
>
> I have been doing a lot of googling and I haven't found an example of how
> to setup snmp4j to respond to the Trap/Inform so that the device will know
> that the trap was received. Right now I have a CommandResponder
> implementation that receives the Trap PDUs, but it is not receiving the
> Inform PDUs that are being sent on the same port. If I configure my linux
> server snmptrapd it receives the Traps and Inform messages, so it does not
> appear to be an issue with the network. I am not sure why my snmp4j
> configuration can receive the Traps but not the Informs.
>
> Questions:
>
> 1. Any idea why I am receiving Traps by not Informs?
> 2. Do you have an example for how to use snmp4j to acknowledge Traps sent
> be a device that is expecting a response?
>
> Here is my code:
>
> public void start() {
> try {
> String address = LOCALHOST + port;
> logger.info("startSnmpServer at " + address);
> Address _listenAddress = GenericAddress.parse(address);
>
> if (!_listenAddress.isValid()) {
> throw new IllegalArgumentException();
> }
>
> MessageDispatcher mDispathcher = new MessageDispatcherImpl();
> DefaultUdpTransportMapping transport = new
> DefaultUdpTransportMapping((UdpAddress) _listenAddress);
> snmp = new Snmp(mDispathcher, transport);
>
> //Add SNMP v1 and v2c support
> snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
> snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
>
> // Create Specific USM for local SNMP Event Trap Receiver (Create
> // Local Engine ID should only be used once)
> OctetString os = new OctetString(MPv3.createLocalEngineID());
> usm = new USM(SecurityProtocols.getInstance(), os, 0);
>
> // Bind specific USM (v3) to Snmp message processing model
> snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm));
>
> snmp.addCommandResponder(commandResponder);
>  snmp.listen();
>
> logger.info("snmpServer started... [" + address);
> } catch (Exception e) {
> logger.error("Error while trying to start the SNMP Server", e);
> }
> }
>
> I am thinking about using the following code in my CommandResponder
> implementation to respond to the Informs:
>
>     public void processPdu(CommandResponderEvent event) {
>         try {
>         callback.doWork(event);
>
>                 //Respond to Inform
> PDU pdu = event.getPDU();
> if (pdu != null && pdu.getType() == PDU.INFORM) {
> pdu.setErrorIndex(0);
> pdu.setErrorStatus(0);
> pdu.setType(PDU.RESPONSE);
>
> try {
> event.getMessageDispatcher().returnResponsePdu(
> event.getMessageProcessingModel(),
> event.getSecurityModel(), event.getSecurityName(),
> event.getSecurityLevel(), pdu,
> event.getMaxSizeResponsePDU(),
> event.getStateReference(), new StatusInformation());
> logger.info("PDU INFORM response sent.");
> } catch (Exception e) {
> logger.error("Error while sending INFORM response", e);
> }
> }
>         } catch (Exception e) {
>         logger.error("Error while processing the PDU", e);
>         }
>     }
>
> Thank you for your time!
>
> Thanks,
> John Money
>



More information about the SNMP4J mailing list