2010-06-21 170 views
2

按照标题,我想创建一个snmp设备代理模拟器。现在,在我的手中,我有一个包含一堆oid和它的值的文本文件(通过snmp walk)。如何使用snmp4j代理创建自己的snmp模拟器?

我想将所有这些作为静态oids添加到模拟器中。我确实创建了一个简单的函数来测试它是否注册了这个oid(我认为它是正确的)。但到目前为止,我无法得到我想要的结果。

我复制并粘贴TestAgent代码。

公共类AgentUtil扩展BaseAgent {

static { 
    LogFactory.setLogFactory(new Log4jLogFactory()); 
} 

private String address; 
public static boolean STOP=false; 
private Hashtable oid_values = new Hashtable(); 

public AgentUtil(String address,Hashtable oid_values) throws IOException { 

    super(new File("conf.agent"), new File("bootCounter.agent"), 
      new CommandProcessor(new OctetString(MPv3.createLocalEngineID()))); 
    this.address = address; 
    this.oid_values = oid_values; 
    agent.setWorkerPool(ThreadPool.create("RequestPool", 4));   
}  

@Override 
protected void registerManagedObjects() { 

} 

public void registerManagedObject(ManagedObject mo) { 
    try { 
     server.register(mo, null); 

    } catch (DuplicateRegistrationException ex) { 
     throw new RuntimeException(ex); 
    } 
} 


public void registerCustomMO() { 

//  String key = ""; 

     try {  
//    Iterator iterator = oid_values.keySet().iterator(); 
//    while(iterator.hasNext()) { 
//     key = (String) iterator.next();  
       server.register(createManagedObject(),null);      
//    }  

     } catch (DuplicateRegistrationException e) { 
      e.printStackTrace(); 
     }  
} 

private ManagedObject createManagedObject() { 


    VariableBinding vb = new VariableBinding(new OID("0"),new OctetString("WinsXP")); 
    StaticMOGroup group = new StaticMOGroup(new OID("1.2.3.4.5.6.7"),new  VariableBinding[]{vb}); 
    return group; 
} 

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

/* 
* Empty implementation 
*/ 
@Override 
protected void addNotificationTargets(SnmpTargetMIB targetMIB, 
     SnmpNotificationMIB notificationMIB) { 

     targetMIB.addDefaultTDomains(); 
} 

/** 
* Minimal View based Access Control 
* 
* http://www.faqs.org/rfcs/rfc2575.html 
*/ 
@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); 
} 

/** 
* User based Security Model, only applicable to 
* SNMP v.3 
* 
*/ 
protected void addUsmUser(USM usm) { 
} 

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(); 
    loadConfig(ImportModes.REPLACE_CREATE); 
    addShutdownHook(); 
    getServer().addContext(new OctetString("public")); 
    finishInit(); 
    registerCustomMO();   
    run(); 
    sendColdStartNotification(); 

} 


protected void unregisterManagedObjects() { 
    // here we should unregister those objects previously registered... 
} 

/** 
* The table of community strings configured in the SNMP 
* engine's Local Configuration Datastore (LCD). 
* 
* We only configure one, "public". 
*/ 
protected void addCommunities(SnmpCommunityMIB communityMIB) { 
    Variable[] com2sec = new Variable[] { 
      new OctetString("public"), // community name 
      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(row); 
} 

public void runAgent() throws IOException, InterruptedException { 
    while(!STOP) { 
     System.out.println("Agent running..."); 
     Thread.sleep(5000); 
    } 
}  

} 

这里是我的SNMP测试仪的打印输出

[客户]目标地址:UDP:127.0.0.1/162 [客户]发送PDU: GET [的requestId = 1075357385,的ErrorStatus =成功(0),errorIndex = 0, VBS [1.2.3.4.5.6.7 = NULL]] [客户端] RESPONSE从127.0.0.1/162: noSuchObject

这里的代理端

一些打印警告:org.snmp4j.agent.io.MOServerPersistence - 上下文“公众”是 不再代理信息支持:org.snmp4j.agent.DefaultMOServer - 注册的MO StaticMOGroup [root = 1.2.3.4.5.6.7,vbs = {}]默认 上下文范围为 org.snmp4j.agent.DefaultMOScope [lowerBound = 1.2.3.4.5.6.7,lowerIncluded = true,upperBound = 1.2.3.4.5.6.8,upperIncluded = false] INFO:org.snmp4j.agent.mo.snmp.NotificationOriginatorImpl - 通知1.3.6.1.6.3.1.1.5.1以[]为上下文报告
代理正在运行。 .. 代理运行... 代理运行... 代理运行... 代理运行... 代理运行...

我是不是做正确吗?哦,顺便说一下,我使用的是snmp4j-Agent库。让我知道你是否需要额外的信息。

问候, 西蒙

+1

在更近的例子是说,该行“loadConfig(ImportModes。 REPLACE_CREATE);”是问题的来源,它被注释掉了...... – Fildor 2012-05-08 14:14:39

回答