[SNMP4J] Problem with SNMP data downloading, please help

szikken at interia.pl szikken at interia.pl
Sat Mar 18 22:10:11 CET 2006


Hello

I'm trying to write an application with SNMP4J, but I have a small problem,
I have a special device (snmp agent) with external IP address, from which
I'm downloading data.

Problem is that I can do this in local area network, but when I'm trying to
the same from other network it doesn't work and I have always Time Out (I
checked firewalls and everything seems to be ok)

I don't have no ideas if it is problem with this agent or if this is problm
with my code.

If you don't mind I will paste my class resposible for snmp data downloading
form device (as a base for this code I use an example from SNMP4J)

I will be gratefull for any ideas.

Best regards
Marcin Kokoszka

public class DeviceGetSetData
{
    private static Vector vbs;
    private static Vector downloadedData;
    private static TransportMapping transport;
    private static Snmp snmp;

    public static boolean checkConncetionStatus()
    {
        boolean status = false;

        if(transport.isListening())
            status = true;

        return status;
    }

    public static void closeConnection()
    {
        try
        {
            transport.close();
            snmp.close();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private static void LogOff()
    {
        Logger.getRootLogger().setLevel(Level.OFF);
        try
        {
            if (System.getProperty("log4j.configuration") == null)
            {
                BasicConfigurator.configure();
            }
        }
        catch (IllegalArgumentException iaex)
        {
            System.err.print("Error: " + iaex.getMessage());
        }
    }

    private static Snmp createSnmpSession()
    {
        try
        {
            SecurityProtocols.getInstance().addDefaultProtocols();
            transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            return snmp;
        }
        catch (IOException e)
        {
            System.out.println("Error during connection: " + e);
        }
        return null;
    }

    private static Target createTarget(String communityStr)
    {
        OctetString community = new OctetString(communityStr);
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(community);
        return target;
    }

    private static PDU createPDU(Target target, int pduType)
    {
        PDUv1 v1TrapPDU = new PDUv1();
        PDU request;
        if(pduType == -92)
            request = v1TrapPDU;
        else
            request = new PDU();

        request.setType(pduType);
        return request;
    }

    private static PDU walk(Snmp snmp, PDU request, Target target)
    {
        request.setNonRepeaters(0);
        OID rootOID = request.get(0).getOid();
        PDU response = null;
        int objects = 0;
        int requests = 0;
        long startTime = System.currentTimeMillis();

        do
        {
            requests++;
            ResponseEvent responseEvent = null;
            try
            {
                responseEvent = snmp.send(request, target);
            }
            catch (IOException e)
            {}

            if(responseEvent == null)
                break;

            response = responseEvent.getResponse();
            if(response != null)
                objects += response.size();


        } while(!processWalk(response, request, rootOID));

        if(requests != objects)
            AdditionalFunc.downloadStatus = 1;

        System.out.println();
        System.out.println("Total requests sent:    " + requests);
        System.out.println("Total objects received: " + objects);
        System.out.println("Total walk time:        " +
(System.currentTimeMillis() - startTime) + " milliseconds");

        return response;
    }

    private static boolean processWalk(PDU response, PDU request, OID
rootOID)
    {
        if(response == null || response.getErrorStatus() != 0 ||
response.getType() == -88)
            return true;

        boolean finished = false;
        OID lastOID = request.get(0).getOid();

        for(int i = 0; !finished && i < response.size(); i++)
        {
            VariableBinding vb = response.get(i);
            if(vb.getOid() == null || vb.getOid().size() < rootOID.size() ||
rootOID.leftMostCompare(rootOID.size(), vb.getOid()) != 0)
            {
                finished = true;
                continue;
            }

            if(Null.isExceptionSyntax(vb.getVariable().getSyntax()))
            {
                System.out.println(vb.toString());
                finished = true;
                continue;
            }

            if(vb.getOid().compareTo(lastOID) <= 0)
            {
                System.out.println("Variable received is not lexicographic
successor of requested one:");
                System.out.println(vb.toString() + " <= " + lastOID);
                finished = true;
            }

            else
            {
             //   System.out.println(vb.toString());
                downloadedData.add(AdditionalFunc.cutDataFromResponse(vb.toString()));
                lastOID = vb.getOid();
            }
        }

        if(!finished)
        {
            VariableBinding next = response.get(response.size() - 1);
            next.setVariable(new Null());
            request.set(0, next);
            request.setRequestID(new Integer32(0));
        }

        return finished;
    }

    private static PDU send(String communityStr, String address, int
retries, long timeout, int pduType, String pduStr, int operation) //throws
IOException
    {
        Address targetaddress = new UdpAddress(address+"/161");
        long time = timeout;
        vbs = new Vector();

        vbs.add(new VariableBinding(new OID(pduStr)));

        Snmp snmp = createSnmpSession();
        Target target = createTarget(communityStr);
        target.setVersion(SnmpConstants.version2c);
        target.setAddress(targetaddress);
        target.setRetries(retries);
        target.setTimeout(time);
        try
        {
            snmp.listen();

            PDU request = createPDU(target, pduType);

            //if it is "GETBULK" operation
            //      if(request.getType() == -91)
            //      {
            //          request.setMaxRepetitions(maxRepetitions);
            //          request.setNonRepeaters(nonRepeaters);
            //      }

            for(int i = 0; i < vbs.size(); i++)
                request.add((VariableBinding)vbs.get(i));

            PDU response = null;
            if(operation == 1)
            {
                response = walk(snmp, request, target);
            }
            else
            {
                ResponseEvent responseEvent = snmp.send(request, target);
                if(responseEvent != null)
                    response = responseEvent.getResponse();
            }

            snmp.close();
            return response;
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

        return null;
    }

    private static void printReport(PDU response)
    {
      ......
    }

    private static void printVariableBindings(PDU response)
    {
        VariableBinding vb = null;

        for(int i = 0; i < response.size(); i++)
        {
            vb = response.get(i);
            System.out.println(vb.toString());
        }
    }

    public Vector agentGetSet(int pduType, int operation, final String
address, String oid)
    {
        final String community;
        long timeout = 2;
        int retries = 2;
        downloadedData = new Vector();

        if(operation == 0 || operation == 1)
        {
            if(FileOperations.CfgFileExist("config.cfg"))
            {
                timeout =
Integer.parseInt(FileOperations.ReadFromCfgFile("config.cfg").get(2).toString())*1000;
                retries =
Integer.parseInt(FileOperations.ReadFromCfgFile("config.cfg").get(3).toString());
            }
            community = AdditionalFunc.getFromShadow(address, "get");
        }
        else
        {
            timeout = operation;
            operation = 0;
            community = "public";
        }

        LogOff();
        PDU response = null;

        if(!community.equals("special"))
            response = send(community, address, retries, timeout, pduType,
oid, operation);
        else
        {
            Display.getDefault().syncExec(new Runnable()
                    {
                  public void run()
                  {
                      if(!community.equals("special"))
                          LogWindow.addMsg("[" + address + "] Problem with
authorization, check get community string...", "red");
                  }
                    });
        }

        if(pduType == -89 || pduType == -88 || pduType == -92 || pduType
== -94)
            System.out.println(PDU.getTypeString(pduType) + " sent
successfully");
        else
        if(response == null)
            System.out.println("Request timed out.");

        else
        if(response.getType() == -88)
            printReport(response);

        else
        if(operation == 0)
        {
            System.out.println("Response received with requestID=" +
response.getRequestID() + ", errorIndex=" + response.getErrorIndex() + ", "
+ "errorStatus=" + response.getErrorStatus());
            printVariableBindings(response);
            if(response.getErrorStatus()==0)
                downloadedData.add(response.toString());
        }
        else
        if(operation == 1)
        {
            System.out.println("End of walked subtree '" +
((VariableBinding)vbs.get(0)).getOid() + "' reached at:");
            printVariableBindings(response);
        }
        else
        {
            System.out.println("Received something strange: requestID=" +
response.getRequestID() + ", errorIndex=" + response.getErrorIndex() + ", "
+ "errorStatus=" + response.getErrorStatus());
            printVariableBindings(response);
        }

        return downloadedData;
    }

}




More information about the SNMP4J mailing list