(SNMP)如何设置Object的值?

时间:2014-04-11 10:32:55

标签: delphi snmp

我使用delphi xe3编写一个程序,可以读取对象的价值,但不知道如何更改它?

单击“保存”按钮以设置新的功率级别值

符号率是只读的

enter image description here

1 个答案:

答案 0 :(得分:2)

QuickSend()仅用于检索值。设置值没有等效QuickSend()。您必须直接使用SendQuery(),例如:

procedure TForm1.BtnEnterClick(Sender: TObject);
var
  SNMP: TIdSNMP;
  dn, PLevel, SRate: string;
  p: Extended;
begin
  SNMP := TIdSNMP.Create(nil);
  try
    SNMP.Host := Trim(HostIP.Text);
    SNMP.Community := Trim(ComString.Text);
    if SNMP.Host = '' then begin
      MessageDlg('Chưa nhập IP của thiết bị!', mtError, [mbOK], 0);
      Exit;
    end;
    if SNMP.Community = '' then begin
      MessageDlg('Chưa nhập SNMP read community string', mtError, [mbOK], 0);
      Exit;
    end;
    PowerLevelValue.Clear;
    SymbolRateValue.Clear;
    SNMP.ReceiveTimeout := 1000;
    if SNMP.QuickSend('1.3.6.1.2.1.1.1.0', SNMP.Community, SNMP.Host, dn) then
      DeviceName.Caption := dn;
    if SNMP.QuickSend('1.3.6.1.4.1.6247.24.1.2.2.10.0', SNMP.Community, SNMP.Host, PLevel) then
    begin
      p := Abs(StrToFloat(Plevel))/10;
      Plevel := FloatToStr(p);
      PowerLevelValue.Text := Plevel;
    end;
    if SNMP.QuickSend('1.3.6.1.4.1.6247.24.1.2.2.12.0', SNMP.Community, SNMP.Host, SRate) then
      SymbolRateValue.Text := SRate;
  finally
    SNMP.Free;
  end;
end;

procedure TForm1.BtnSaveClick(Sender: TObject);
var
  SNMP: TIdSNMP;
  PLevel: string;
  p: Extended;
begin
  Plevel := PowerLevelValue.Text;
  p := StrToFloat(Plevel);
  PLevel := FloatToStr(Abs(p*10));

  SNMP := TIdSNMP.Create(nil);
  try
    SNMP.Host := Trim(HostIP.Text);
    SNMP.Community := Trim(ComString.Text);
    if SNMP.Host = '' then begin
      MessageDlg('Chưa nhập IP của thiết bị!', mtError, [mbOK], 0);
      Exit;
    end;
    if SNMP.Community = '' then begin
      MessageDlg('Chưa nhập SNMP read community string', mtError, [mbOK], 0);
      Exit;
    end;
    SNMP.ReceiveTimeout := 1000;
    SNMP.Query.Clear;
    SNMP.Query.PDUType := PDUSetRequest;
    SNMP.Query.MIBAdd('1.3.6.1.2.1.1.1.0', DeviceName.Caption);
    SNMP.Query.MIBAdd('1.3.6.1.4.1.6247.24.1.2.2.10.0', PLevel);
    SNMP.Query.MIBAdd('1.3.6.1.4.1.6247.24.1.2.2.12.0', SymbolRateValue.Text);
    SNMP.SendQuery;
  finally
    SNMP.Free;
  end;
end;

如您所见,SendQuery()支持多个OID,因此您可以将QuickSend()替换为SendQuery(),因此您只发送1个查询而不是3个查询:

procedure TForm1.BtnEnterClick(Sender: TObject);
var
  SNMP: TIdSNMP;
  PLevel: string;
  p: Extended;
begin
  SNMP := TIdSNMP.Create(nil);
  try
    SNMP.Host := Trim(HostIP.Text);
    SNMP.Community := Trim(ComString.Text);
    if SNMP.Host = '' then begin
      MessageDlg('Chưa nhập IP của thiết bị!', mtError, [mbOK], 0);
      Exit;
    end;
    if SNMP.Community = '' then begin
      MessageDlg('Chưa nhập SNMP read community string', mtError, [mbOK], 0);
      Exit;
    end;
    PowerLevelValue.Clear;
    SymbolRateValue.Clear;
    SNMP.ReceiveTimeout := 1000;
    SNMP.Query.Clear;
    SNMP.Query.PDUType := PDUGetRequest;
    SNMP.Query.MIBAdd('1.3.6.1.2.1.1.1.0', '');
    SNMP.Query.MIBAdd('1.3.6.1.4.1.6247.24.1.2.2.10.0', '');
    SNMP.Query.MIBAdd('1.3.6.1.4.1.6247.24.1.2.2.12.0', '');
    if SNMP.SendQuery then
    begin
      DeviceName.Caption := SNMP.Reply.MIBGet('1.3.6.1.2.1.1.1.0');

      PLevel := SNMP.Reply.MIBGet('1.3.6.1.4.1.6247.24.1.2.2.10.0');
      p := Abs(StrToFloat(Plevel))/10;
      Plevel := FloatToStr(p);
      PowerLevelValue.Text := Plevel;

      SymbolRateValue.Text := SNMP.Reply.MIBGet('1.3.6.1.4.1.6247.24.1.2.2.12.0');
    end;
  finally
    SNMP.Free;
  end;
end;