是否可以在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
。
答案 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