Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SNMP Trap senden mit Indy ? (https://www.delphipraxis.net/140568-snmp-trap-senden-mit-indy.html)

moelski 21. Sep 2009 09:30


SNMP Trap senden mit Indy ?
 
Moin !

Ich versuche gerade mittels SNMP einen Trap zu senden.
Leider klappt das nicht wirklich.

Als Trap Receiver nutze ich den hier:
http://www.net-snmp.org/

snmptrapd -f -Lo -c SNMPAuto.txt
wobei SNMPAuto.txt so aussieht:
Zitat:

disableAuthorization yes
Als Code nutze ich das hier:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var trap : Integer;
begin
    IdSNMP1.Trap.Host := '192.168.30.105';
    IdSNMP1.Trap.Community := 'public';
    IdSNMP1.Trap.PDUType := $a4;
    IdSNMP1.Trap.GenTrap := 2;
    IdSNMP1.Trap.SpecTrap := 0;
    IdSNMP1.Trap.MIBValue.Add('Testtrap');
    IdSNMP1.Trap.MIBOID.Add('1.3.6.1.2.1.1.1');
    IdSNMP1.Trap.Port := 162;

    Trap := IdSNMP1.SendTrap;
end;
Aber leider bekomme ich als Antwort:
Zitat:

Bad PDU type received: 0x24
Und auch wenn ich einen anderen Trap Receiver nutze kommt nix an.

Hat jemand ein funktionierendes Trap Beispiel, was man mal nachvollziehen kann?
Oder sieht hier jemand einen Fehler im Code !?

Klaus01 21. Sep 2009 09:34

Re: SNMP Trap senden mit Indy ?
 
Guten Morgen,

bist Du dir sicher den PDUType für Traps auf $a4 zu setzen
und nicht nur auf $04?

Delphi-Quellcode:
IdSNMP1.Trap.PDUType := $a4;
Ich weiß, das im SNMP Packet $a4 steht aber laut
RFC ist der Type für Traps $04.

Vielleicht bastelt Indy ja aus den $04 ein $a4.

Grüße
Klaus

moelski 21. Sep 2009 09:37

Re: SNMP Trap senden mit Indy ?
 
Moin Klaus,

Zitat:

bist Du dir sicher den PDUType für Traps auf $a4 zu setzen
und nicht nur auf $04?
Nuja, in idsnmp.pas ist folgendes deklariert:
Delphi-Quellcode:
const
  //PDU type
  PDUGetRequest    = $a0;
  PDUGetNextRequest = $a1;
  PDUGetResponse   = $a2;
  PDUSetRequest    = $a3;
  PDUTrap          = $a4;
Aber auch wenn ich
Delphi-Quellcode:
    IdSNMP1.Trap.PDUType := $04;
verwende klappt das nicht wirklich. :gruebel:

Klaus01 21. Sep 2009 09:51

Re: SNMP Trap senden mit Indy ?
 
.. hast Du schon mal den Traffic mit Wireshark mitprotokolliert
und Dir das Trap (SNMP) Packet angeschaut?

Grüße
Klaus

Klaus01 21. Sep 2009 10:21

Re: SNMP Trap senden mit Indy ?
 
Hallo Dominik,

ich habe Deinen Code mal bei mir probiert (Indy 10 mit TDE)
und ich bekomme keine Fehlermeldung bzgl. eines nicht korrekten PDUTypes:

Das ist was auf der Linuxbox angekommen ist:
Zitat:

# snmptrapd -f -Lo -d -c autho.txt
Code:
Received 56 bytes from UDP: [192.168.242.1]:3407
0000: 30 36 02 01  00 04 06 70  75 62 6C 69  63 A4 29 06    06.....public.).
0016: 01 00 40 04  00 00 00 00  02 01 02 02  01 00 43 01    ..@...........C.
0032: 00 30 15 30  13 06 07 2B 06 01 02 01  01 01 04 08    .0.0...+........
0048: 54 65 73 74  74 72 61 70                              Testtrap
2009-09-21 11:18:02 0.0.0.0(via UDP: [192.168.242.1]:3407) TRAP, SNMP v1, community public
SNMPv2-SMI::zeroDotZero Link Down Trap (0) Uptime: 0:00:00.00
SNMPv2-MIB::sysDescr = STRING: Testtrap

Grüße
Klaus

moelski 21. Sep 2009 11:11

Re: SNMP Trap senden mit Indy ?
 
Moin Klaus,

das ist schon komisch.

Zitat:

Received 56 bytes from UDP: [0.0.0.0]->[192.168.30.105]:4858
0000: 30 36 02 01 00 04 06 70 75 62 6C 69 63 24 29 06 06.....public$).
0016: 01 00 40 04 41 3F 1E 69 02 01 02 02 01 00 43 01 ..@.A?.i......C.
0032: 00 30 15 30 13 06 07 2B 06 01 02 01 01 01 04 08 .0.0...+........
0048: 54 65 73 74 74 72 61 70 Testtrap

Bad PDU type received: 0x24

Received 35 bytes from UDP: [0.0.0.0]->[127.0.0.1]:4861
0000: 30 21 02 01 00 04 06 70 75 62 6C 69 63 A4 14 06 0!.....publicñ..
0016: 01 00 40 04 00 00 00 00 02 01 00 02 01 00 43 01 ..@...........C.
0032: 00 30 00 .0.

2009-09-21 11:46:19 pdb4984n [0.0.0.0] (via UDP: [0.0.0.0]->[127.0.0.1]:4861) TRAP, SNMP v1, community public
ccitt.0 Cold Start Trap (0) Uptime: 0:00:00.00
Das kommt bei mir. Der erste Teil ist von meinem Testprog und der zweite stammt von snmptrap.

Man kann gut sehen das der PDUTyp falsch ist. Frage ist nur warum ...
Kann des evtl. an Delphi 2009 / UniCode liegen ?

Klaus01 21. Sep 2009 11:30

Re: SNMP Trap senden mit Indy ?
 
Zitat:

Zitat von moelski
Kann des evtl. an Delphi 2009 / UniCode liegen ?

Hallo Dominik,

kann ich mir nicht vorstellen das dies ein Problem vom UniCode sein sollte.
Der PDUType ist ja auch nicht vom Typ String sondern ein Integer.

Die sendTrap Routine schaut auch nicht so aus als ob da
ein Fehler drin stecken würde:

Delphi-Quellcode:
//Aus Indy 10.1.5
(*----------------------------------------------------------------------------*
 | TIdSNMP.SendTrap                                                          |
 |                                                                            |
 | Send an SNMP trap.                                                        |
 |                                                                            |
 | The function returns 1                                                     |
 *----------------------------------------------------------------------------*)
function TIdSNMP.SendTrap: integer;
begin
  Trap.PDUType := PDUTrap;
  Trap.EncodeTrap;
  Send(Trap.Host, Trap.Port, Trap.Buffer);
  Result := 1;
end;
Grüße
Klaus

moelski 21. Sep 2009 11:45

Re: SNMP Trap senden mit Indy ?
 
Moin !

Es liegt an dieser Funktion:
Delphi-Quellcode:
function ToBytes(const AValue: string; const ALength: Integer; const AIndex: Integer = 1;
  const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
var
  LLength: Integer;
begin
  ValidEncoding(AEncoding);
  LLength := IndyLength(AValue, ALength, AIndex);
  if LLength > 0 then
  begin
    if AEncoding = enUTF8 then begin
      Result := StringToUTF8Bytes(AValue, AIndex, LLength);
    end else
    begin
      // do just a byte to byte copy with no translation. VCL uses ANSI or MBCS.
      // With MBCS we still map 1:1
      SetLength(Result, LLength);
      CopyTIdString(AValue, AIndex, Result, 0, LLength,AEncoding);
    end;
  end else begin
    SetLength(Result, 0);
  end;
end;
Zu finden in IdGlobal.

Dort wird es zu en7Bit codiert und da verliert das $A4 ein $80 und "mutiert" zum $24 ...

Nu is die Frage wie man diese Codierung vorher beeinflussen kann.

Aufgerufen wird das übrigens von:
Delphi-Quellcode:
function ToBytes(const AValue: string; const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
{$IFDEF USEINLINE}inline;{$ENDIF}
begin
  Result := ToBytes(AValue, -1, 1, AEncoding);
end;
Und das wiederum von
Delphi-Quellcode:
procedure TIdUDPBase.Send(const AHost: string; const APort: TIdPort; const AData: string);
begin
  SendBuffer(AHost, APort, ToBytes(AData));
end;
Tja nu steht man(-n) im Wald. Das Indy Buch schweigt sich dazu auch ganz brilliant aus :x

Any idea ?

Klaus01 21. Sep 2009 11:54

Re: SNMP Trap senden mit Indy ?
 
.. nun wenn ich das in der Hilfe lese, verstehe ich nicht mehr:

Zitat:

Zitat von DelphiHilfe
A TIdEncoding value is passed to to ToBytes to indicate the character set encoding required for values in the TIdBytes return value.

TIdEncoding values are used on the .Net platform. Character set encodings are ignored in the VCL.

Vielleicht doch mal das neueste Indy installieren?

Grüße
Klaus

moelski 21. Sep 2009 11:59

Re: SNMP Trap senden mit Indy ?
 
Moin !

Zitat:

Vielleicht doch mal das neueste Indy installieren?
Jo das habe ich mittlerweile auch gelesen. Nur komme ich nicht auf den SVN Server:
svn://svn.atozed.com/indy/indy10

Ist der momentan offline ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz