一开始调研发现有几个SNMP的库,
一个是net-SNMP,这个好像是linux用的多
一个是微软自己的,这个没有例子,不太好操作
一个是,这个有些例子比较好,
利用实现读取udpindatagrams的代码如下:
要将SnmpSharpNet.dll放入Visual C# 2015的工程目录下,然后,在工程浏览器的引用里添加这个dll,方法见,引用,右键,添加引用,浏览到dll即可
1 using System; 2 using System.Net; 3 using SnmpSharpNet; 4 5 namespace snmpget 6 { 7 class Program 8 { 9 static void Main(string[] args)10 {11 // SNMP community name12 OctetString community = new OctetString("public");13 14 // Define agent parameters class15 AgentParameters param = new AgentParameters(community);16 // Set SNMP version to 1 (or 2)17 param.Version = SnmpVersion.Ver1;18 // Construct the agent address object19 // IpAddress class is easy to use here because20 // it will try to resolve constructor parameter if it doesn't21 // parse to an IP address22 IpAddress agent = new IpAddress("192.168.0.10");23 24 // Construct target25 UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1);26 27 // Pdu class used for all requests28 Pdu pdu = new Pdu(PduType.Get);29 pdu.VbList.Add("1.3.6.1.2.1.7.1.0"); //udpindatagrams30 31 // Make SNMP request32 SnmpV1Packet result = (SnmpV1Packet)target.Request(pdu, param);33 34 // If result is null then agent didn't reply or we couldn't parse the reply.35 if (result != null)36 {37 // ErrorStatus other then 0 is an error returned by 38 // the Agent - see SnmpConstants for error definitions39 if (result.Pdu.ErrorStatus != 0)40 {41 // agent reported an error with the request42 Console.WriteLine("Error in SNMP reply. Error {0} index {1}",43 result.Pdu.ErrorStatus,44 result.Pdu.ErrorIndex);45 }46 else47 {48 // Reply variables are returned in the same order as they were added49 // to the VbList50 Console.WriteLine("sysDescr({0}) ({1}): {2}",51 result.Pdu.VbList[0].Oid.ToString(),52 SnmpConstants.GetTypeName(result.Pdu.VbList[0].Value.Type),53 result.Pdu.VbList[0].Value.ToString());54 }55 }56 else57 {58 Console.WriteLine("No response received from SNMP agent.");59 }60 target.Close();61 }62 }63 }
输出结果如下:
发送和接收的包的wireshark截图:
get-request
get-response
接下来,需要看如何获取网络拓扑。。。
获取拓扑,首先需要获取本地节点的所有接口
下面读取本地节点的接口数量,发现LwIP貌似只能一个mib量一个mib量的读取。
读LwIP的两个mib量就返回toobig了,难道LwIP的snmp只支持一次读一个mib量,还需确认???
pdu.VbList.Add("1.3.6.1.2.1.7.1.0"); //udpindatagrams pdu.VbList.Add("1.3.6.1.2.1.2.1.0"); //ifnumber