如何使用 SNMP4J 在 OID / Managed Object 上注册侦听器以处理 set 或 get 代理收到的请求?

How to register a listener on a OID / Managed Object using SNMP4J to act on set or get requests the agent receives?

我需要在我的应用程序中实现一个基本的 snmp 代理。该代理应该能够自己 OID's 回答来自 snmp 浏览器的获取和设置请求。由于 snmp4j 的大多数示例都相当陈旧,并且使用“扩展 org.snmp4j.agent.BaseAgent.classapproach",所以用处不大。

因此试图理解并剥离snmp4j-agent-3.2.1.jar中的org.snmp4j.agent.example.SampleAgentincluded。我设法得到一个仅使用强制性 MIB 的示例(我至少认为它们是必需的,因为 AgentConfigManager 的来源在评论中声明它们是强制性的 snmpv2MIB、snmpMpdMib、targetMIB、communityMIB, notificationMIB, frameworkMIB, usmMIB, vacmMIB, tlsTmMib ) 由示例配置文件提供。

我添加了自定义 OID 以使用以下代码查询代理


    MOServer server = new DefaultMOServer();
    MOServer[] moServers = new MOServer[]{server};
    ...
    AgentConfigManager agent = new AgentConfigManager(new OctetString(MPv3.createLocalEngineID()),
                    messageDispatcher,
                    null,
                    moServers,
                    ThreadPool.create("SampleAgent", 3),
                    configurationFactory, 
                    new DefaultMOPersistenceProvider(moServers, configFile),
                    new EngineBootsCounterFile(bootCounterFile), null, dhKickstartParameters);
    ...
    agent.initialize();
    ...

    server.register(new MOScalar(new OID("1.someIODshere.0"), MOAccessImpl.ACCESS_READ_ONLY, new OctetString("object 1")), null);

现在我缺少一种方法来拦截来自 snmp 管理器/浏览器的获取或设置请求到 return 动态值或根据请求更改程序行为。

我有点希望能够将一种事件侦听器绑定到此 OID 以获得有关请求/更改的通知。

如何观看 OID

我找到了。我看错地方了。我以为必须向代理添加一个侦听器,但我必须将侦听器添加到服务器。

server.addLookupListener(new MOServerLookupListener() {
    @Override
    public void lookupEvent(MOServerLookupEvent event) {
        System.out.println();
        ((MOScalar)event.getLookupResult()).setValue(new OctetString(new Date().toString()));
    }
    @Override
    public void queryEvent(MOServerLookupEvent event) {
        System.out.println();
    }
},moScalar);

我现在可以对请求做出反应。耶!