Home » Enterprise Java » SNMP4J » SNMP Walk Example using SNMP4J

About Joel Patrick Llosa

Joel Patrick Llosa
I graduated from Silliman University in Dumaguete City with a degree in Bachelor of Science in Business Computer Application. I have contributed to many Java related projects at University of Southampton (iSolutions), Predictive Technologies, LLC., Confluence Service, North Concepts, Inc., NEC Telecom Software Philippines, Inc., and NEC Technologies Philippines, Inc. You can also find me in Upwork freelancing as a Java Developer.

SNMP Walk Example using SNMP4J

This article is pretty straightforward. It’s an SNMP walk example using SNMP4J. SNMP is used in managing and monitoring network devices. It is an Internet standard protocol for managing devices on IP networks.

1. Tools and Prerequisites

  1. SNMP4J library
  2. Mars Eclipse

2. Create the Project

You may skip this process because this is a fairly simple example which can be made using a text editor. We’ll just do a quick Java project creation through Eclipse. Click on File -> New -> Java Project to create the project. Then create the com.javacodegeeks.example package. Next, create an empty SnmpWalk class. We’re not done yet. We have to add the SNMP4J library. Right-click on the project and go to Build Path -> Configure Build Path, then Libraries Tab -> Add External Jars… and add snmp4j-2.5.6.jar (latest version as of this writing).

3. Java Code and Code Walkthrough

The Java code below shows an SNMP walk on the ifTable of the interfaces a certain device. It starts out by creating the CommunityTarget object. This contains the community string, the target IP and port, the number of retries, the timeout value, and the SNMP version being used.
The doWalk method accepts the ifTable OID and the CommunityTarget object as parameters. A more detailed explanation of this method is described below. Lastly, the result is then printed to the console.

SnmpWalk.java

package com.javacodegeeks.example;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.snmp4j.CommunityTarget;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.SnmpConstants;
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;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TreeEvent;
import org.snmp4j.util.TreeUtils;

public class SnmpWalk {

	public static void main(String[] args) throws Exception {
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(GenericAddress.parse("udp:x.x.x.x/161")); // supply your own IP and port
		target.setRetries(2);
		target.setTimeout(1500);
		target.setVersion(SnmpConstants.version2c);
		
		Map<String, String> result = doWalk(".1.3.6.1.2.1.2.2", target); // ifTable, mib-2 interfaces

		for (Map.Entry<String, String> entry : result.entrySet()) {
			if (entry.getKey().startsWith(".1.3.6.1.2.1.2.2.1.2.")) {
				System.out.println("ifDescr" + entry.getKey().replace(".1.3.6.1.2.1.2.2.1.2", "") + ": " + entry.getValue());
			}
			if (entry.getKey().startsWith(".1.3.6.1.2.1.2.2.1.3.")) {
				System.out.println("ifType" + entry.getKey().replace(".1.3.6.1.2.1.2.2.1.3", "") + ": " + entry.getValue());
			}
		}
	}

	public static Map<String, String> doWalk(String tableOid, Target target) throws IOException {
		Map<String, String> result = new TreeMap<>();
		TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping();
		Snmp snmp = new Snmp(transport);
		transport.listen();

		TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory());
		List events = treeUtils.getSubtree(target, new OID(tableOid));
		if (events == null || events.size() == 0) {
			System.out.println("Error: Unable to read table...");
			return result;
		}

		for (TreeEvent event : events) {
			if (event == null) {
				continue;
			}
			if (event.isError()) {
				System.out.println("Error: table OID [" + tableOid + "] " + event.getErrorMessage());
				continue;
			}

			VariableBinding[] varBindings = event.getVariableBindings();
			if (varBindings == null || varBindings.length == 0) {
				continue;
			}
			for (VariableBinding varBinding : varBindings) {
				if (varBinding == null) {
					continue;
				}
				
				result.put("." + varBinding.getOid().toString(), varBinding.getVariable().toString());
			}

		}
		snmp.close();

		return result;
	}

}


You’ll need to provide your own SNMP agent IP address and port (highlighted). We are using SNMP version 2c. This example will walk the mib2.interfaces.ifTable. It will stop the walk when it is finished walking the ifTable tree (the VariableBinding OID does not have the same prefix). Once the walk is finished, the interface description and type are then printed out.

The TreeUtils (highlighted) API does the heavy lifting for us. TreeUtils retrieves a subtree of management values using SNMP GetNext Requests. GetNext is a request to discover available variables and their values. This process have been abstracted by this API. We are so lucky.

The results are then returned as a Map with the OID as the key and the values as type String.

4. Output

Your output should look something like the one below. You can verify it using a MIB browser.

Console Output

ifDescr.1: igb0
ifDescr.10: lo0
ifDescr.11: ovpns1
ifDescr.12: ovpnc2
ifDescr.2: igb1
ifDescr.3: igb2
ifDescr.4: igb3
ifDescr.5: igb4
ifDescr.6: igb5
ifDescr.7: pflog0
ifDescr.8: pfsync0
ifDescr.9: enc0
ifType.1: 6
ifType.10: 24
ifType.11: 23
ifType.12: 23
ifType.2: 6
ifType.3: 6
ifType.4: 6
ifType.5: 6
ifType.6: 6
ifType.7: 246
ifType.8: 247
ifType.9: 244

5. Summary of the SNMP Walk Example using SNMP4J

In this example, we learned to perform an SNMP walk using SNMP4J’s TreeUtils API. TreeUtils retrieved the subtree of management values for us. The multiple SNMP GetNext Requests have been abstracted by the API. Our programming has been made easier. A more optimized way of walking a MIB tree is to use the SNMP GetBulk Request introduced in SNMP version 2. With the GetBulk Request, the manger sends a single request for multiple iterations of the GetNext Request which is performed in the agent’s side. Whereas the SNMP walk performs multiple requests to the agent thus adding load on the network traffic.

6. Download the Source Code

This is an example of an SNMP Walk using SNMP4J.

Download
You can download the source code of this example here: snmp-walk-example-snmp4j.zip.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you our best selling eBooks for FREE!

 

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

 

and many more ....

 

Receive Java & Developer job alerts in your Area

 

11
Leave a Reply

avatar
4 Comment threads
7 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
RohitRohit kumarRohit kumarThe moonJoel Patrick Llosa Recent comment authors

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
newest oldest most voted
Notify of
Aqsa Ayub
Guest
Aqsa Ayub

why this program doesn’t retrieve port description of switch ?is there any other way of retrieving that?

The moon
Guest
The moon

Assumedly I have a method such as GetSubTree(Ipaddress, CommunityString, oid), I want to call it in Sql Server, how to do it? Please help me..thanks advance.

Rohit kumar
Guest
Rohit kumar

sir i need java snmp program getbulk agent program.

Rohit kumar
Guest
Rohit kumar

//Hello Sir this is my Snmp GetBulk Version 3 code.there is problem.when i was sending the request for server to agent.my agent can not be respond the server request.please sir help me where i am mistake in this code.here agent and server both code send. Java Snmp GetBulk Agent version 3 program. public class JavaExample implements CommandResponder { public static final OID sysDescr = new OID(“1.3.6.1.2.1.1.1.0”); private Snmp snmp; String SHADESAuthPassword; OctetString contextEngineID; OctetString contextName; public JavaExample() throws IOException { MessageDispatcher dispatcher = new MessageDispatcherImpl(); dispatcher.addMessageProcessingModel(new MPv3()); snmp = new Snmp(dispatcher, new DefaultUdpTransportMapping(new UdpAddress(“127.0.0.1/162”), true)); snmp.addCommandResponder(this); OctetString localEngineId = new… Read more »