Reading this article is recommended if you want to use SNMP4J-Agent Manged Objects (MIB) objects like MOScalar and MOTable with multiple SNMPv3 contexts in your agent.
Background
In SNMPv3 the concept of using contexts is generally used to separate MIB data into different virtual MIBs named by the context name. As a consequence, a basic requirement for the MIB instrumentation is, that the data content is separated by the contexts. With SNMP4J-Agent you have basically three options to realize this requirement:
For each context create a separate
ManagedObject
instance and register it with the target context usingMOServer.register
.MOScalar myScalarObjAContext1 = new MyScalarObjA(..); MOScalar myScalarObjAContext2 = new MyScalarObjA(..); MOServer server = ..; server.register(myScalarObjAContext1, new OctetString("context1")); server.register(myScalarObjAContext2, new OctetString("context2"));
Use the same
ManagedObject
instance for all target contexts by callingMOServer.register
repeatedly for each context with the same instance. The single instance is then responsible to deliver and update its content (MIB data) based on the context information given in theManagedObject.get
,.next
,.prepare
,.commit
,.undo
, and.cleanup
SubRequest
parameter in theMOScope
(in fact it is then aMOContextScope
) member.OctetString context1 = new OctetString("context1"); OctetString context2 = new OctetString("context2"); MOScalar myScalarObjA = new MyScalarObjA(..) { public void get(SubRequest request) { if (request.gewtScope() instanceof MOContextScope) { MOContextScope scope = (MOContextScope)request.gewtScope(); if (context1.equals(scope.getContext()) { // return value from context1 .. } else if (context2.equals(scope.getContext()) { // return value from context2 .. } else { // cannot be reached } } } } MOServer server = ..; server.register(myScalarObjA, context1); server.register(myScalarObjA, context2));
Step-by-step guide