SNMP-Client mit SNMP4j


Quelle : http://upload.wikimedia.org

Da soll man SNMP-Traps auffangen und verarbeiten, aber der nächste Catalyst steht meilenweit entfernt :-/ Aber die Macher von SNMP4j haben das schon glücklicherweise vorhergesehen und sogar eine Maven-Dependency ihres Projekts zur Verfügung gestellt. Damit lässt sich dann bequem ein kleiner Client bauen:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.PDUv1;
import org.snmp4j.Snmp;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.IpAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TimeTicks;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.Variable;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;

public class Start {
    
    public static void main(String[] args) throws IOException {
	// create a protocol data-unit for the snmp-trap
        PDU trap = new PDU();
        trap.setType(PDU.TRAP);
        
        // add the oid
        trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, new OID("1.2.3.4.5.6")));
	// add some nice stuff
        trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(999999)));
      
        // Specify receiver (ip 10.1.1.42, port 162)
        Address targetaddress = new UdpAddress("10.1.1.42/16200");
        CommunityTarget target = new CommunityTarget();
        target.setVersion(SnmpConstants.version2c);
        target.setAddress(targetaddress);

        // Send the trap
        Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
        snmp.send(trap, target, null, null);    
    }
}

frei nach : stackoverflow

Defaultmäßig läuft ein SNMP-Trap auf Port 162 auf. Bei Eigenimplementierungen sollte man aber in die privaten Ports ausweichen und dementsprechend den Trap-Manager, der einen Listener auf den Eingangsport von Traps laufen lässt, auf diesen privaten 16200-Port setzen. Zum Testen mit beispielsweise Wireshark, sollte man unter Windows darauf achten, dass normalerweise kein Local-Loopback aktiv ist. Und bevor man mit den Netzwerk-Einstellungen rumspielt, kann man das kleine Programm auch als excecutable-jar packen und von einem anderen Netz-Knoten aus auf den eigenen Rechner ansetzen. Dann erkennt man auch im Wireshark einen eingehenden UDP-Request auf Port 16200 und über Rechtsklick ->Decode As ->SNMP-Transport, lassen sich auch die Attribute-Value-Pairs, in diesem Fall die OID und die SysUpTime, bequem auslesen.