SNMP4J的样例代码里已经有了一个写好的模拟器,把
SNMP4J-Agent
的代码下来后,
org\snmp4j\agent\example
目录下的SampleAgent.jav
a就是一个模拟器,带上参数:
udp:127.0.0.1/161 运行它,会在处理tls-version的地方出现空指针,反正我们也不要什么TLS来进行安全通讯,直接注释掉它就行了。用MIB Browser直接连本机的161端口就可以看到内容了。
这个模拟器的数据是从SampleAgentConfig.properties里读出来的。这个文件的格式可以到
http://www.snmp4j.org/agent/doc/index.html上看PropertyMOInput类的注释,非常详尽。不过这是SNMP4J Agent自己的格式,跟MIB Browser walk出来的内容有很大区别。这些内容通过MOServerPersistence.loadData解析出来 (具体的解析步骤在PropertyMOInputreadSequence中),然后保存在DefaultMOServer中。详细步骤是
1. 通过
DefaultMOServer的register函数把有定义的MIB 对象注册进去。可以是标量,或者表格。
2.在
MOServerPersistence.loadData里从DefaultMOServer里吧所有注册过的对象取取来,放到一个LinkedHashMap<OID, SerializableManagedObject>里。
3. 关键代码在
MOServerPersistence的readData函数里,首先调用
PropertyMOInput的readSequence读取
SampleAgentConfig.properties
里的所有的OID。这些OID包含了所有的标量和所有的表格(不包含表格里的每行定义)。
4.对每个oid,调用
PropertyMOInput的readManagedObject来获取这个OID对应的MIB定义。接着从已经定义好的MIB对象列表中根据OID取出对应的对象,然后调用MIB对象的load函数 从配置文件中把值取出来,放到MIB对象里。需要注意的是readSequence会被不停调用,但是我们每次都通过
readManagedObject修改了当前OID的值,所以
readSequence的每次调用处理的都是
SampleAgentConfig.properties
里不同的行。
为了能解析MIB Browser walk出来的结果,我们需要作的是:
1. 把我们自己的MIB对象通过注册到DefaultMOServer中。
2. 自己实现一下MOInput这个接口。所以只需要修改SampleAgent构造函数里的这一段:
MOInputFactory configurationFactory = new MOInputFactory() {
public MOInput createMOInput() {
return new
PropertyMOInput(props, SampleAgent.this);
}
};
返回我们自定义的***
MOInput
即可。