我正在端口161上写一个snmp服务器,它只显示五颗星,我可以通过snmpget命令行获取星号,也可以通过snmpset设置它们。当我收到字符串中的请求包时,我无法将其编码为可读。 snmp数据包格式以版本的整数开头,然后是八位字符串,依此类推......
public class MyServer {
public static void main(String[] args) throws Exception
{ DatagramSocket socket = new DatagramSocket(161);
byte[] buffer = new byte[64];
DatagramPacket packet = new DatagramPacket(buffer,buffer.length);
while(true)
{
socket.receive(packet);
byte[] data = packet.getData();
String s=new String(data,"UTF-8");
System.out.println(s+"\t"+packet.getAddress()+"\t"+packet.getPort());
输出有点像这样但是陌生人!!!
0'&公共LT; \
答案 0 :(得分:0)
SNMP并不像其他协议那么简单。实际上,这是实现和使用最复杂的协议之一。
构建SNMP消息需要了解 ASN.1 指定的数据类型。 ASN.1原始数据类型包括Integer,Octet(字节,字符)String,Null,Boolean和Object Identifier。对象标识符类型是SNMP消息的核心,因为对象标识符类型的字段包含用于寻址SNMP代理中的参数的OID。为了扩展程序员组织数据的能力,ASN.1允许将原始数据类型组合成复杂的数据类型。
ASN.1提供了构建SNMP消息所需的几种复杂数据类型。一种复杂的数据类型是序列。 Sequence只是一个数据字段列表。序列中的每个字段可以具有不同的数据类型。 ASN.1还定义了SNMP PDU(协议数据单元)数据类型,这些数据类型是SNMP特有的复杂数据类型。 PDU字段包含SNMP消息的主体。可用的两种PDU数据类型是GetRequest和SetRequest,它们分别包含获取和设置参数所需的所有数据。最终,SNMP消息是完全由ASN.1数据类型的字段构建的结构。但是,指定正确的数据类型是不够的。如果SNMP消息是具有不同数据类型的字段序列,则接收方如何知道一个字段的结束位置和另一个字段的开始位置,或每个字段的数据类型?通过符合基本编码规则(BER)来避免这些问题。 最基本的规则规定每个字段分为三部分:类型,长度和值(TLV)。 Type使用单个字节标识符指定字段的数据类型。 Length指定以下Value部分的长度(以字节为单位),Value是传达的实际值(数字,字符串,OID等)。
所以请不要重新发明轮子,因为有几个写得很好的库完全按照标准实现SNMPv1,SNMPv2C和SNMPv3。这些是 NET-SNMP , SNMP4J 以及其他一些。使用它们。