SNMP getbulk

时间:2016-12-09 04:37:51

标签: delphi snmp indy

是否可以在Delphi中使用GetBulk实现TIdSNMP个请求?

IdSNMP1.Query.Version:=1;    
IdSNMP1.Query.PDUType := PDUGetNextRequest;
IdSNMP1.Query.MIBAdd(OID,'',2);
while IdSNMP1.SendQuery do
begin
  if Copy (IdSNMP1.Reply.MIBOID [0], 1, Length (OID)) <> OID then break;
  Memo1.Lines.Append('Replies: ' + IdSNMP1.Reply.ValueOID [0] + '  ' + IdSNMP1.Reply.Value[0]);
  IdSNMP1.Query.MIBDelete(0);
  IdSNMP1.Query.MIBAdd(IdSNMP1.Reply.ValueOID [0], '');
  IdSNMP1.Query.PDUType := PDUGetNextRequest;
end

结果,我收到了get-response,我想知道完整GetBulk

1 个答案:

答案 0 :(得分:0)

您没有考虑到响应可能包含多个OID值。您只查看每个回复的第一个OID。 Reply属性具有ValueCount属性,您应循环遍历所有值,然后使用提供的最后一个OID发送下一个请求,例如:

IdSNMP1.Query.Version := 1;    
IdSNMP1.Query.PDUType := PDUGetNextRequest;
IdSNMP1.Query.MIBAdd(OID, '', ASN1_INT);
while IdSNMP1.SendQuery do
begin
  if IdSNMP1.Reply.ValueCount = 0 then Break;
  Stop := False;
  for I := 0 to IdSNMP1.Reply.ValueCount then
  begin
    Stop := (IdSNMP1.Reply.ValueOID[I] <> OID) and (not TextStartsWith(IdSNMP1.Reply.ValueOID[I], OID+'.'));
    if Stop then Break;
    Memo1.Lines.Append('Replies: ' + IdSNMP1.Reply.ValueOID[I] + '  ' + IdSNMP1.Reply.Value[I]);
  end;
  if Stop then Break;
  IdSNMP1.Query.MIBDelete(0);
  IdSNMP1.Query.MIBAdd(IdSNMP1.Reply.ValueOID[IdSNMP1.Reply.ValueCount-1], '');
end

话虽如此,TIdSNMP主要仅实现SNMP v1,但GETBULK中引入了SNMP v2。有workitem更新TIdSNMP以支持更新的SNMP版本。与此同时,SNMP v2c消息(与v2p或v2u相反)与SNMP v1消息有点兼容,因此可能能够执行以下操作:< / p>

const
  PDUGetBulkRequest = $a5;

IdSNMP1.Query.Version := 1;
IdSNMP1.Query.PDUType := PDUGetBulkRequest;
IdSNMP1.Query.ID := ...; // desired request-id value
IdSNMP1.Query.ErrorStatus := ...; // desired non-repeaters value
IdSNMP1.Query.ErrorIndex := ...; // desired max-repetitions value
IdSNMP1.Query.MIBAdd(OID, '', ASN1_INT);
while IdSNMP1.SendQuery do
begin
  if IdSNMP1.Reply.ValueCount = 0 then Break;
  Stop := False;
  for I := 0 to IdSNMP1.Reply.ValueCount then
  begin
    Stop := (IdSNMP1.Reply.ValueOID[I] <> OID) and (not TextStartsWith(IdSNMP1.Reply.ValueOID[I], OID+'.'));
    if Stop then Break;
    Memo1.Lines.Append('Replies: ' + IdSNMP1.Reply.ValueOID[I] + '  ' + IdSNMP1.Reply.Value[I]);
  end;
  if Stop then Break;
  IdSNMP1.Query.MIBDelete(0);
  IdSNMP1.Query.MIBAdd(IdSNMP1.Reply.ValueOID[IdSNMP1.Reply.ValueCount-1], '');
end