设置请求不工作SNMP4j

设置请求不工作SNMP4j,snmp,net-snmp,snmp4j,Snmp,Net Snmp,Snmp4j,我到处都找遍了,但还没有找到解决问题的办法。我已经尝试了所有涉及更改社区名称、某些不同集合类的解决方案,但仍然无法使集合在SNMP4j中工作。代码执行良好,可以从iReasoning MIB浏览器访问,但在执行集合后不会更改OID的值。下面是SNMP类和测试仪类 SNMPManager代码: public class SNMPManager { Snmp snmp = null; String address = null; /** * Constructor * * @param

我到处都找遍了,但还没有找到解决问题的办法。我已经尝试了所有涉及更改社区名称、某些不同集合类的解决方案,但仍然无法使集合在SNMP4j中工作。代码执行良好,可以从iReasoning MIB浏览器访问,但在执行集合后不会更改OID的值。下面是SNMP类和测试仪类

SNMPManager代码:

public class SNMPManager {

Snmp snmp = null;
String address = null;

/**
 * Constructor
 * 
 * @param add
 */
public SNMPManager(String add) {
    address = add;
}

public static void main(String[] args) throws IOException {
    /**
     * Port 161 is used for Read and Other operations Port 162 is used for the trap
     * generation
     */
    SNMPManager client = new SNMPManager("udp:127.0.0.1/161");
    client.start();
    /**
     * OID - .1.3.6.1.2.1.1.1.0 => SysDec OID - .1.3.6.1.2.1.1.5.0 => SysName => MIB
     * explorer will be usefull here, as discussed in previous article
     */
    String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0"));
    System.out.println(sysDescr);
}

/**
 * Start the Snmp session. If you forget the listen() method you will not get
 * any answers because the communication is asynchronous and the listen() method
 * listens for answers.
 * 
 * @throws IOException
 */
public void start() throws IOException {
    TransportMapping<?> transport = new DefaultUdpTransportMapping();
    snmp = new Snmp(transport);
    // Do not forget this line!
    transport.listen();
}

/**
 * Method which takes a single OID and returns the response from the agent as a
 * String.
 * 
 * @param oid
 * @return
 * @throws IOException
 */
public String getAsString(OID oid) throws IOException {
    ResponseEvent event = get(new OID[] { oid });
    return event.getResponse().get(0).getVariable().toString();
}

/**
 * This method is capable of handling multiple OIDs
 * 
 * @param oids
 * @return
 * @throws IOException
 */
public ResponseEvent get(OID oids[]) throws IOException {
    PDU pdu = new PDU();
    for (OID oid : oids) {
        pdu.add(new VariableBinding(oid));
    }
    pdu.setType(PDU.GET);
    ResponseEvent event = snmp.send(pdu, getTarget(), null);
    if (event != null) {
        return event;
    }
    throw new RuntimeException("GET timed out");
}

public ResponseEvent set(OID oid, String val) throws IOException {
    PDU pdu = new PDU();
    VariableBinding varBind = new VariableBinding(oid, new OctetString(val));
    pdu.add(varBind);
    pdu.setType(PDU.SET);
    //pdu.setRequestID(new Integer32(1));
    Target target = getTarget();

    ResponseEvent event = snmp.set(pdu, target);
    if (event != null) {
        System.out.println("\nResponse:\nGot Snmp Set Response from Agent");
        System.out.println("Snmp Set Request = " + event.getRequest().getVariableBindings());
        PDU responsePDU = event.getResponse();
        System.out.println("\nresponsePDU = " + responsePDU);
        if (responsePDU != null) {
            int errorStatus = responsePDU.getErrorStatus();
            int errorIndex = responsePDU.getErrorIndex();
            String errorStatusText = responsePDU.getErrorStatusText();
            System.out.println("\nresponsePDU = " + responsePDU);
            if (errorStatus == PDU.noError) {
                System.out.println("Snmp Set Response = " + responsePDU.getVariableBindings());
            } else {
                System.out.println("errorStatus = " + responsePDU);
                System.out.println("Error: Request Failed");
                System.out.println("Error Status = " + errorStatus);
                System.out.println("Error Index = " + errorIndex);
                System.out.println("Error Status Text = " + errorStatusText);
            }
        }

        return event;
    }
    throw new RuntimeException("SET timed out");
}

/**
 * This method returns a Target, which contains information about where the data
 * should be fetched and how.
 * 
 * @return
 */
private Target getTarget() {
    Address targetAddress = GenericAddress.parse(address);
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString("public"));
    target.setAddress(targetAddress);
    target.setRetries(2);
    target.setTimeout(1500);
    target.setVersion(SnmpConstants.version2c);
    return target;
}
}

提前感谢您的帮助。

我发现我在底部放置了错误的IP,但这并不能解决问题。错误是没有访问权限。我所需要的只是在snmpd.conf的底部添加rwcomunity public。我正在使用Windows。在哪里可以找到snmpd.conf?
public class SNMPAgent extends BaseAgent {

private String address;

/**
 *
 * @param address
 * @throws IOException
 */
public SNMPAgent(String address) throws IOException {

    /**
     * Creates a base agent with boot-counter, config file, and a CommandProcessor
     * for processing SNMP requests. Parameters: "bootCounterFile" - a file with
     * serialized boot-counter information (read/write). If the file does not exist
     * it is created on shutdown of the agent. "configFile" - a file with serialized
     * configuration information (read/write). If the file does not exist it is
     * created on shutdown of the agent. "commandProcessor" - the CommandProcessor
     * instance that handles the SNMP requests.
     */
    super(new File("conf.agent"), new File("bootCounter.agent"),
            new CommandProcessor(new OctetString(MPv3.createLocalEngineID())));
    this.address = address;
}

/**
 * Adds community to security name mappings needed for SNMPv1 and SNMPv2c.
 */
@Override
protected void addCommunities(SnmpCommunityMIB communityMIB) {
    Variable[] com2sec = new Variable[] { new OctetString("public"), new OctetString("cpublic"), // security name
            getAgent().getContextEngineID(), // local engine ID
            new OctetString("public"), // default context name
            new OctetString(), // transport tag
            new Integer32(StorageType.nonVolatile), // storage type
            new Integer32(RowStatus.active) // row status
    };
    MOTableRow<?> row = communityMIB.getSnmpCommunityEntry()
            .createRow(new OctetString("public2public").toSubIndex(true), com2sec);
    communityMIB.getSnmpCommunityEntry().addRow((SnmpCommunityEntryRow) row);

}

/**
 * Adds initial notification targets and filters.
 */
@Override
protected void addNotificationTargets(SnmpTargetMIB arg0, SnmpNotificationMIB arg1) {
    // TODO Auto-generated method stub

}

/**
 * Adds all the necessary initial users to the USM.
 */
@Override
protected void addUsmUser(USM arg0) {
    // TODO Auto-generated method stub

}

/**
 * Adds initial VACM configuration.
 */
@Override
protected void addViews(VacmMIB vacm) {
    vacm.addGroup(SecurityModel.SECURITY_MODEL_SNMPv2c, new OctetString("cpublic"), new OctetString("v1v2group"),
            StorageType.nonVolatile);

    vacm.addAccess(new OctetString("v1v2group"), new OctetString("public"), SecurityModel.SECURITY_MODEL_ANY,
            SecurityLevel.NOAUTH_NOPRIV, MutableVACM.VACM_MATCH_EXACT, new OctetString("fullReadView"),
            new OctetString("fullWriteView"), new OctetString("fullNotifyView"), StorageType.nonVolatile);

    vacm.addViewTreeFamily(new OctetString("fullReadView"), new OID("1.3"), new OctetString(),
            VacmMIB.vacmViewIncluded, StorageType.nonVolatile);


}

/**
 * Unregister the basic MIB modules from the agent's MOServer.
 */
@Override
protected void unregisterManagedObjects() {
    // TODO Auto-generated method stub

}

/**
 * Register additional managed objects at the agent's server.
 */
@Override
protected void registerManagedObjects() {
    // TODO Auto-generated method stub

}

@SuppressWarnings("unchecked")
protected void initTransportMappings() throws IOException {
    transportMappings = new TransportMapping[1];
    Address addr = GenericAddress.parse(address);
    TransportMapping<?> tm = TransportMappings.getInstance().createTransportMapping(addr);
    transportMappings[0] = tm;
}

/**
 * Start method invokes some initialization methods needed to start the agent
 *
 * @throws IOException
 */
public void start() throws IOException {

    init();
    // This method reads some old config from a file and causes
    // unexpected behavior.
    // loadConfig(ImportModes.REPLACE_CREATE);
    addShutdownHook();
    getServer().addContext(new OctetString("public"));
    finishInit();
    run();
    sendColdStartNotification();
}

/**
 * Clients can register the MO they need
 */
public void registerManagedObject(ManagedObject mo) {
    try {
        server.register(mo, null);
    } catch (DuplicateRegistrationException ex) {
        throw new RuntimeException(ex);
    }
}

public void unregisterManagedObject(MOGroup moGroup) {
    moGroup.unregisterMOs(server, getContext(moGroup));
}

}
public class MOCreator {
public static MOScalar<Variable> createReadOnly(OID oid,Object value ){
    return new MOScalar<Variable>(oid,
            MOAccessImpl.ACCESS_READ_WRITE,
            getVariable(value));
}

private static Variable getVariable(Object value) {
    if(value instanceof String) {
        return new OctetString((String)value);
    }
    throw new IllegalArgumentException("Unmanaged Type: " + value.getClass());
}

}
public class TestSNMPAgent {
String siteOIDNumber = "1";
String dataOIDNumber = "1";
String sensorOIDNumber = "1";
OID newOIDdata = new OID("1.3.6.1.4.1.1234.5." + siteOIDNumber + ".2." + dataOIDNumber + "." + sensorOIDNumber + ".0");
OID newOIDdata2 = new OID("1.3.6.1.4.1.1234.5.1.2.1.2.0");
OID newOIDdata3 = new OID("1.3.6.1.4.1.1234.5.1.2.1.3.0");

public static void main(String[] args) throws IOException {
    TestSNMPAgent client = new TestSNMPAgent("udp:127.0.0.1/161");
    client.init();
}

SNMPAgent agent = null;
/**
 * This is the client which we have created earlier
 */
SNMPManager client = null;

String address = null;

/**
 * Constructor
 *
 * @param add
 */
public TestSNMPAgent(String add) {
    address = add;
}

/**
 * Initiates the testing of the SNMP Agent.
 * @throws IOException
 */
private void init() throws IOException {
    /*agent = new SNMPAgent("172.21.1.103/2001");*/
    agent = new SNMPAgent("172.21.1.103/2010");
    agent.start();

    // Since BaseAgent registers some MIBs by default we need to unregister
    // one before we register our own sysDescr. Normally you would
    // override that method and register the MIBs that you need
    agent.unregisterManagedObject(agent.getSnmpv2MIB());
    //agent.registerManagedObject(MOCreator.createReadOnly(sysDescr,"This Description is set By KGrewe"));
    agent.registerManagedObject(MOCreator.createReadOnly(newOIDdata, "50"));
    agent.registerManagedObject(MOCreator.createReadOnly(newOIDdata2, "NaN"));
    agent.registerManagedObject(MOCreator.createReadOnly(newOIDdata3, "3"));
    SNMPManager client1 = new SNMPManager("udp:127.21.1.103/2010");
    client1.start();
    client1.set(newOIDdata, "30");
    //System.out.println(newOIDdata);
    // Get back Value which is set
    //System.out.println(client1.getAsString(newOIDdata));
    while(true) {

    }

}

}