我正在开发SNMP协议的Netty应用程序。该协议有3个不同的版本1,2,3
和相应的消息格式以与这些版本一起使用。我想知道根据数据包格式之间的差异来解码这些问题的最有效方法是什么。
Snmpv1邮件格式:http://www.tcpipguide.com/free/t_SNMPVersion1SNMPv1MessageFormat.htm
Snmpv2邮件格式:http://www.tcpipguide.com/free/t_SNMPVersion2SNMPv2MessageFormats-2.htm
如您所见,消息格式不同。我会发布v3,它有很多不同但我不能发布超过2个链接。
我最初的想法是制作一个基于反射的十字架,但事实证明它很麻烦。
根据这一点(取自github上的源代码):
public <T> T decode(W buf, Class<T> clazz) throws Asn1Exception {
if (typeEncoders.containsKey(clazz)) {
return clazz.cast(typeEncoders.get(clazz).decode(buf));
}
T obj;
@SuppressWarnings("unchecked")
Map<String, Object> sequence = (Map<String, Object>)annotatedTypeEncoders.get(UniversalType.SEQUENCE).decode(buf);
try {
obj = clazz.newInstance();
for (Map.Entry<String, Object> entry : sequence.entrySet()) {
entry.getKey();
Field field = clazz.getField(entry.getKey());
field.setAccessible(true);
field.set(obj, entry.getValue());
}
}
catch (Exception e) {
throw new Asn1Exception("Unable to set fields on object", e);
}
return obj;
}
使用这样的映射类(我的源代码):
public final class DefaultSnmpPdu implements SnmpCommonPdu {
@Asn1Type(type = Asn1Tag.INTEGER)
private SnmpMessageType type;
@Asn1Type(type = Asn1Tag.INTEGER)
private int requestId;
@Asn1Type(type = Asn1Tag.INTEGER)
private SnmpErrorType errorType;
@Asn1Type(type = Asn1Tag.INTEGER)
private int errorIndex;
@Asn1Type(type = Asn1Tag.SEQUENCE)
private Map<String, Object> variableBindings;
@Override
public SnmpMessageType getType() {
return type;
}
@Override
public int getRequestId() {
return requestId;
}
@Override
public SnmpErrorType getErrorType() {
return errorType;
}
@Override
public int getErrorIndex() {
return errorIndex;
}
@Override
public Map<String, Object> getVariableBindings() {
return Collections.unmodifiableMap(variableBindings);
}
}
我对所有想法持开放态度,谢谢。