按照标题,我想创建一个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库。让我知道你是否需要额外的信息。
问候, 西蒙
在更近的例子是说,该行“loadConfig(ImportModes。 REPLACE_CREATE);”是问题的来源,它被注释掉了...... – Fildor 2012-05-08 14:14:39