我正在为我们的一个C#应用程序编写一个代理,该应用程序通过SNMP使用SharpSnmpLib公开各种应用程序属性,过去我已经成功地发送了陷阱并检索了GET。我能够公开单个属性,但是我很难在我的应用程序中定义一个表。
这个表应该为我的应用程序中的流概念的每个实例公开一组GET参数(流的数量在启动时是固定的),每个流应该表示为表中的一行。
在MIB中很容易定义这一点,过去我已经用C++库成功地定义和实现了这样的表,所以我知道这是可能的。
下面是我如何在MIB中定义应用程序版本的简单获取:
dtStream OBJECT IDENTIFIER ::= {dtApps 3}
dtVersion OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"The version number of the application"
::= {dtStream 1}在代码中:
public class StringVar : ScalarObject
{
private ISnmpData _data;
private string _value;
public StringVar(ObjectIdentifier oid, string value) : base(oid)
{
Value = value;
}
public override ISnmpData Data
{
get { return _data; }
set { throw new AccessFailureException(); }
}
public string Value
{
set { _data = new OctetString(_value = value); }
get { return _value; }
}
}
...
ObjectStore os = new ObjectStore();
os.Add(Version = new StringVar(OID_STREAM_VERSION, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()));下面是我要创建的表的MIB定义示例:
dtStreamTable OBJECT-TYPE
SYNTAX SEQUENCE OF DtStreamEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Statistics on the status and performance of the streams"
::= {dtStream 5}
DtStreamEntry OBJECT-TYPE
SYNTAX DtStreamEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Status of a particular stream."
INDEX {dtStreamID}
::= {dtStreamTable 1}
DtStreamEntry ::= SEQUENCE {
dtmStreamID Integer32,
dtStreamName DisplayString
dtStreamHost DisplayString
dtStreamType Integer32
}
dtStreamID OBJECT-TYPE
SYNTAX Integer32 (0..255)
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"Index of the stream entry in the table."
::= {DtStreamEntry 1}
dtStreamName OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Name of the stream."
::= {DtStreamEntry 2}
dtStreamHost OBJECT-TYPE
SYNTAX DisplayString
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Hostname that the stream is connected to."
::= {DtStreamEntry 3}
dtStreamType OBJECT-TYPE
SYNTAX Integer32(1..2)
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Type of stream"
::= {DtStreamEntry 4}在iReasoning MIB浏览器中如下所示:

我已经把“行”定义为从TableObject派生出来的类
class StreamEntry : TableObject
{
private readonly IList<ScalarObject> _elements = new List<ScalarObject>();
public StreamEntry(int id, string name, string host, int type)
: base()
{
_elements.Add(StreamId = new IntVar(OID_STREAM_ID, id));
_elements.Add(Name = new StringVar(OID_STREAM_NAME, name));
_elements.Add(Host = new StringVar(OID_STREAM_HOST, host));
_elements.Add(Type = new IntVar(OID_STREAM_TYPE, type));
}
public IntVar StreamId { get; private set; }
public StringVar Name { get; private set; }
public StringVar Host { get; private set; }
public IntVar Type { get; private set; }
protected override IEnumerable<ScalarObject> Objects
{
get { return _elements; }
}
}在这之后,我想我的问题是,如何将这些信息关联到表或条目的OID返回的表中?
我尝试将多个StreamEntry对象添加到ObjectStore中:
foreach(Stream s in Streams)
{
os.Add(new StreamEntry(s.ID, s.Name, s.HostName, s.Type));
}这样,我只能检索第一个数据(使用单个GET,或者在MIB浏览器中在dtStreamEntry上行走)。
发布于 2014-10-15 12:25:28
好吧,我想出来了。所有ScalarObjects都需要按OID顺序添加到ObjectStore中,否则一切都会中断。
因此,我需要在从StreamEntry派生的封闭StreamTable对象中创建多个StreamTable对象(不再将TableObject作为基类),并且需要从每个StreamEntry中提取ScalarObjects,然后按OID对它们进行排序,然后将它们作为对象集合覆盖返回。
我现在有一个工作的SNMP表。:)
https://stackoverflow.com/questions/26365304
复制相似问题