使用SnmpSharpNet获取SNMP表表头(列名)的C#实现方法咨询
要实现这个需求,核心是将SNMP表列的OID映射到对应的MIB列名——SnmpSharpNet本身不自带MIB解析能力,所以得从两个方向入手:
方法一:手动映射OID与列名(适合固定MIB场景)
如果你的业务只针对特定MIB(比如IF-MIB、IP-MIB),直接手动维护OID前缀到列名的映射表最省事。
以IF-MIB的ifTable为例,代码示例如下:
// 定义OID前缀到列名的映射表 var columnMap = new Dictionary<string, string> { { ".1.3.6.1.2.1.2.2.1.1", "ifIndex" }, { ".1.3.6.1.2.1.2.2.1.2", "ifDescr" }, { ".1.3.6.1.2.1.2.2.1.3", "ifType" }, { ".1.3.6.1.2.1.2.2.1.4", "ifMtu" }, { ".1.3.6.1.2.1.2.2.1.5", "ifSpeed" } }; // 假设你已通过SnmpSharpNet获取到表数据,存储在tableRows中 var columnNames = new List<string>(); foreach (var row in tableRows) { foreach (var oidStr in row.Keys) { // 匹配列OID前缀(表项OID是列前缀+索引,比如.1.3.6.1.2.1.2.2.1.2.1) var matchedPrefix = columnMap.Keys.FirstOrDefault(prefix => oidStr.StartsWith(prefix)); if (matchedPrefix != null && !columnNames.Contains(columnMap[matchedPrefix])) { columnNames.Add(columnMap[matchedPrefix]); } } break; // 从第一行提取所有列名即可 } // 输出表头列名 foreach (var name in columnNames) { Console.WriteLine(name); }
方法二:结合MIB解析库实现通用列名获取
如果需要支持任意MIB,就得用专门的MIB解析库加载MIB文件,解析出表列的OID与名称映射。推荐用SharpSnmpLib的MIB解析模块(MIT许可的.NET库,和SnmpSharpNet兼容)。
步骤与代码示例:
- 安装NuGet包:
Install-Package SharpSnmpLib - 加载MIB文件并解析表列:
using Lextm.SharpSnmpLib.Mib; // 加载目标MIB文件(替换为你的MIB文件路径) var loader = new MibLoader(); var mibModule = loader.Load(@"C:\MIBs\IF-MIB.txt"); // 指定目标表的OID(比如ifTable的OID是.1.3.6.1.2.1.2.2) var tableOid = new ObjectIdentifier(".1.3.6.1.2.1.2.2"); var table = mibModule.FindNode(tableOid) as TableType; if (table != null) { // 提取所有列名 var columnNames = table.Columns.Select(col => col.Name).ToList(); // 输出表头 foreach (var name in columnNames) { Console.WriteLine(name); } }
注意事项
- 确保MIB文件是标准SMI格式,可从IANA或设备厂商官网下载对应MIB。
- 关联SnmpSharpNet返回的表项时,通过判断OID前缀匹配即可将表项值对应到列名。
内容的提问来源于stack exchange,提问作者Jota
相关产品推荐
相关产品推荐

