snmp4j를 사용하여 SNMP 에이전트를 구현했으며 SNMPv3 트랩/알림을 SNMP 관리자에게 올바르게보고하는 방법과 관련하여 약간의 문제가 있습니다. 구현은 instanceId에 의해 인덱싱 된 값의 테이블을 관리하도록 설정됩니다. 에이전트를 조회 할 때 OID 값과 연관된 특정 링크 인스턴스에 따라 ".1", ".2", ".3"등으로 접미어가 붙은 다양한 필드의 OID를받습니다. 따라서 쿼리 결과는 다음과 같습니다.SNMP 트랩에서 테이블 인덱스 보내기
-----------------------------------------
| Entity | OID | Value |
-----------------------------------------
| Link1 | linkAlias.1 | Link 1 |
| Link2 | linkAlias.2 | Link 2 |
| Link1 | linkState.1 | 1 |
| Link2 | linkState.2 | 3 |
| Link1 | linkText.1 | UP |
| Link2 | linkText.2 | INITIALIZING |
-----------------------------------------
위대한 결과를 얻었습니다. 그러나 테이블의 인덱스가 트랩과 함께 전송되도록 비슷한 방식으로 트랩을 보낼 수 있어야합니다. 그런 식으로 SNMP 쿼리에서 트리거 된 경보는 링크 상태가 변경 될 때 지워질 수 있습니다 아래 코드 블록에서 볼 수 있듯이 단순히 instanceId를 varbind로 추가하려고 시도했지만 엔티티는 항상 일반 "링크"로보고됩니다. 이 문제를 해결할 수있는 사람이 있습니까? 뭐든지 크게 평가됩니다.
public static void updateLinkStatus(int instanceId, LinkState status)
{
boolean varChanged = false;
Variable[] currentManagedObject = currentManagedObjects.get(instanceId);
if(currentManagedObject != null)
{
// If we are managing this object
if(((Integer32)currentManagedObject[1]).toInt() != status.value)
varChanged = true;
// Update the managed object Status Integer and Status Text
currentManagedObject[1] = new Integer32(status.value);
currentManagedObject[2] = new OctetString(status.getLinkStateText());
}
else
{
varChanged = true; // No previous record to check against
}
// Send trap now if not equal to previous value
if(varChanged)
{
OID trapOid = null;
int linkState = LinkState.UNKNOWN.value; // Will be overridden
String linkStateText = null;
if(status == LinkState.DOWN)
{
trapOid = oidLinkDown;
linkState = LinkState.DOWN.value;
linkStateText = LnkState.DOWN.getLinkStateText();
}
else if(status == LinkState.MISCONFIGURED)
{
trapOid = oidLinkMisconfigured;
linkState = LinkState.MISCONFIGURED.value;
linkStateText = LinkState.MISCONFIGURED.getLinkStateText();
}
else if(status == LinkState.UP)
{
trapOid = oidLinkUp;
linkState = LinkState.UP.value;
linkStateText = LinkState.UP.getLinkStateText();
}
else if(status == LinkState.INITIALIZING)
{
trapOid = oidLinkInitializing;
linkState = LinkState.INITIALIZING.value;
linkStateText = LinkState.INITIALIZING.getLinkStateText();
}
else
{
// Theoretically, should never change to LinkState.UNKNOWN - no trap available for it
linkState = LinkState.UNKNOWN.value;
linkStateText = LinkState.UNKNOWN.getLinkStateText();
}
// Create variable bindings for V3 trap
if(trapOid != null)
{
List<VariableBinding> variableBindings = new ArrayList<VariableBinding>();
variableBindings.add(new VariableBinding(oidLinkState, new Integer32(linkState)));
variableBindings.add(new VariableBinding(oidLinkText, new OctetString(linkStateText)));
variableBindings.add(new VariableBinding(oidLinkInstanceID, new Integer32(instanceId)));
//I've tried the below varbind too and it also doesn't work
//variableBindings.add(new VariableBinding(new OID(oidLinkInstanceID.toIntArray(), instanceId)));
agent.sendTrap_Version3(trapOid, variableBindings);
}
}
}
편집 :
주 : 나는 단순히 별도의 OID와 각 링크를 정의 할 수 있도록 링크가 동적으로 구성 할 수 있습니다; MIB에서 기본 OID를 정의하고 인덱스를 동적으로 추가해야합니다.