在OLT网管项目中使用SharpSNMP库的说明
1、库的选择
实现SNMP的库有很多,net-snmp比较成熟,由于其用c语言编写,需要对dll导出的函数及类型声明作非常多的转换,才能用c#调用,比较麻烦。适合基于Unix平台的c语言开发。
SnmpSharpNet库也是C#写的,用的人比较多,但是不是很成熟。
SharpSNMP库使用C#语言编写,它的授权协议是LGPL,比较成熟,在我们的项目中调用方便,所以我们使用SharpSNMP库作为SNMP协议栈的实现。
2、SharpSNMP库的使用
我们主要用到它提供的2个DLL库:Mono.Options.dll和SharpSnmpLib.dll,已经上传到SVN服务器,主要由sharpsnmpWrapper工程用到。
sharpsnmpWrapper工程是一个类库,用来封装SharpSNMP库,生成sharpsnmpWrapper.dll,提供SNMP协议定义的基本操作,如get, getnext, getbulk, set, trap等,方便OLT网管工程(图形界面)来调用。
C#程序调用DLL提供的API的方法是,右键点击“添加引用”,然后浏览选择所需DLL。
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
3、sharpsnmpWrapper库的开发
sharpsnmpWrapper库用来封装SNMP报文的操作以及部分扩展方法库,包含了Get、GetNext、GetBulk、Set和Walk五个Snmp原始操作以及相关扩展API。这些API的是原型分别为:
///<summary>
///此函数获取oid节点的数据值
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的Variable类类型数据</returns>
publicstaticVariableSnmpGetVariable(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///此函数获取oid节点的数据值
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的字符串类型数据</returns>
publicstaticstringSnmpGet(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
/// Snmp的GetBulk操作方法原始API函数,获取oid节点数据
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的 Variable 类类型列表数据</returns>
publicstaticIList<Variable> SnmpGetBulk(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///是对SnmpGetBulk的二次封装,获取oid节点数据
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的 OidData 类类型列表数据</returns>
publicstaticIList<OidData> SnmpGetBulkOidDataList(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///是对SnmpGetBulk的二次封装,获取oid节点实例
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的 InstanceId 类类型列表数据</returns>
publicstaticIList<InstanceId> SnmpGetInstanceIdList(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///是对SnmpGetNextVariable的二次封装
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的字符串数据值</returns>
publicstaticstringSnmpGetNext(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///是Snmp的GetNext操作方法原始封装函数
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>节点对应的Variable 类类型数据值</returns>
publicstaticVariableSnmpGetNextVariable(stringipaddr, VersionCodeversion, stringoid, inttimeout);
///<summary>
///是Snmp的Set多值的操作方法封装函数
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="muldata">数据值列表</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>返回0表示成功;返回1表示失败</returns>
publicstaticintSnmpMultiSet(stringipaddr, VersionCodeversion, IList<MultiData> muldata, inttimeout);
///<summary>
///是Snmp的Set操作方法封装函数
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="dataType">数据值类型</param>
///<param name="indata">数据值</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>返回0表示成功;返回1表示失败</returns>
publicstaticintSnmpSet(stringipaddr, VersionCodeversion, stringoid, DataTypedataType, stringindata, inttimeout);
///<summary>
///此函数获取MIB库以此节点为根的子树的所有节点的Variable值
///</summary>
///<param name="ipaddr">Snmp 代理IP</param>
///<param name="version">Snmp协议版本</param>
///<param name="oid">Snmp节点Oid</param>
///<param name="timeout">Get获取超时时间</param>
///<returns>子树上所有节点的Variable类类型数据值</returns>
publicstaticIList<Variable> SnmpWalk(stringipaddr, VersionCodeversion, stringoid, inttimeout);
Variable 类的原型:
public sealed class Variable
{
public Variable(ObjectIdentifier id);
[CLSCompliant(false)]
public Variable(uint[] id);
public Variable(ObjectIdentifier id, ISnmpData data);
[CLSCompliant(false)]
public Variable(uint[] id, ISnmpData data);
public ISnmpData Data { get; }
public ObjectIdentifier Id { get; }
public override string ToString();
[CLSCompliant(false)]
public string ToString(IObjectRegistry objects);
}
VersionCode枚举的原型:
public enum VersionCode
{
V1 = 0,
V2 = 1,
[Obsolete("This version of SNMP is obsolete and replaced by v3.")]
V2U = 2,
V3 = 3,
}
OidData类的原型:
public class OidData
{
public string Oid; //Oid+实例ID
public string Data; //Oid对应的数值
}
InstanceId类的原型:
public class InstanceId
{
public string InstaceId; //实例Id
public string Data; //对应的数值
}
MultiData类的原型:
public class MultiData
{
public string MibOid; //Oid(包括实例ID)
public string OidData; //Oid对应的值
public DataType OidDataType; //数值的类型
public MultiData();
}
DataType枚举的原型:
public enum DataType
{
IntType = 1, //代表整型类型
StrType = 2, //代表字符串类型
IpAddressType = 3, //代表IP地址类型
HexStrType = 4, //代表十六进制字符串类型
}
API函数调用方法示例如下:
1、SnmpGetVariable
VariableTemp = newVariable(newObjectIdentifier("1.3.6.1.2.1"));
Temp = snmp.SnmpGetVariable("192.168.50.212", VersionCode.V2, "1.3.6.1.2.1.1.4.0", SnmpTimeOut.timeout);
2、SnmpGet
string data1 = null;
data1 = snmp.SnmpGet("192.168.50.212", VersionCode.V2, "1.3.6.1.2.1.1.4.0", SnmpTimeOut.timeout);
3、SnmpGetBulk
IList<Variable> getbulkVar = newList<Variable>();
getbulkVar = snmp.SnmpGetBulk("192.168.1.100", VersionCode.V2, "1.3.6.1.2.1.1", SnmpTimeOut.timeout);
4、SnmpGetBulkOidDataList
IList<OidData> MaxRttOid = newList<OidData>();
MaxRttOid = snmp.SnmpGetBulkOidDataList("192.168.1.100", VersionCode.V2, "1.3.6.1.2.1.1", SnmpTimeOut.timeout);
5、SnmpGetInstanceIdList
IList<InstanceId> onuIdList = null;
onuIdList = snmp.SnmpGetInstanceIdList("192.168.1.100", VersionCode.V2, "1.3.6.1.2.1.1", SnmpTimeOut.timeout);
6、SnmpGetNext
string data1 = null;
data1 = snmp.SnmpGetNext("192.168.50.212", VersionCode.V2, "1.3.6.1.2.1.1.4", SnmpTimeOut.timeout);
7、SnmpGetNextVariable
Variablevariable = newVariable(newObjectIdentifier("1.3.6.1.2.1"));
variable = snmp.SnmpGetNextVariable("192.168.1.100", VersionCode.V2, "1.3.6.1.2.1.1", SnmpTimeOut.timeout);
8、SnmpMultiSet
IList<MultiData> muldata = newList<MultiData>();
MultiDataMulMode = newMultiData();
MulMode.MibOid = MibOid.OnuCtcVlanMode + "." + variable.InstaceId;
MulMode.OidData = this.Mode;
MulMode.OidDataType = DataType.IntType;
muldata.Add(MulMode);
MultiDataMulNewTag = newMultiData();
MulNewTag.MibOid = MibOid.OnuCtcVlanNewTagID + "." + variable.InstaceId;
MulNewTag.OidData = textBoxNewTag.Text;
MulNewTag.OidDataType = DataType.IntType;
muldata.Add(MulNewTag);
intresult = -1;
result = snmp.SnmpMultiSet("192.168.1.100", VersionCode.V2, muldata, SnmpTimeOut.timeout);
9、SnmpSet
intresult = -1;
result = snmp.SnmpSet("192.168.1.100", VersionCode.V2, "1.3.6.1.2.1.1", DataType.IntType, "1", SnmpTimeOut.timeout);
10、SnmpWalk
VariableTemp = newVariable(newObjectIdentifier("1.3.6.1.2.1"));
Temp = snmp.SnmpWalk("192.168.1.100", "1.3.6.1.4.1.14590.1.300.1.1.1");