SharpSnmpLib를 사용하여 SNMP GET을 통해 다양한 응용 프로그램 속성을 노출하는 C# 응용 프로그램 중 하나의 에이전트를 작성하고 있습니다.이 도구는 과거에는 트랩을 성공적으로 보내고 GET을 가져 왔습니다. 단일 속성을 노출 할 수 있지만 응용 프로그램에서 테이블을 정의하는 방법을 파악하는 데 문제가 있습니다.GET을위한 테이블 정의 방법
이 테이블은 내 응용 프로그램 내에서 스트림 개념의 각 인스턴스에 대해 한 번씩 GET 매개 변수 세트를 표시해야합니다 (시작시 스트림 수가 고정됨). 각 스트림은 테이블의 행으로 표시되어야합니다.
MIB에서이를 정의하기는 쉽지만 과거에는 C++ 라이브러리를 사용하여 이러한 테이블을 성공적으로 정의하고 구현 했으므로 가능하다는 것을 알고 있습니다.
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 정의의 다음
내가 MIB의 응용 프로그램 버전의 간단한 GET을 정의하는 방법 작성 :
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와 함께 반환되는 테이블에 이들을 어떻게 연관 시키는가?
나는 ObjectStore에 여러 StreamEntry
개체를 추가하려고했습니다 :이
foreach(Stream s in Streams)
{
os.Add(new StreamEntry(s.ID, s.Name, s.HostName, s.Type));
}
이 난 단지 (개별 가져 사용하거나 MIB 브라우저에 dtStreamEntry에서 도보로) 첫 번째에 대한 데이터를 검색 할 수 있습니다 .
당신이 혼자서 그것을 발견했기 때문에 기쁩니다. 또한 https://blog.lextudio.com/2013/03/tritonmate-words-iftable-implementation/이 샘플 프로젝트에서 구체적인 예를 찾는 위치를 알 수 있습니다. –
링크를 제공해 주셔서 감사합니다. 나는 실제로 SysORTable 예제를 찾은 후에 그것을 알아 냈다. ObjectStore가 자체적으로 OID를 정렬 할 수없는 이유가 있습니까? – Chris
snmpd 에이전트는 샘플로 설계되었으므로 많은 기능이 취소되었습니다. 코드베이스가 MIT에 있기 때문에 자유롭게 수정할 수 있습니다. –