![]() |
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: ![]() snmptrapd -f -Lo -c SNMPAuto.txt wobei SNMPAuto.txt so aussieht: Zitat:
Delphi-Quellcode:
Aber leider bekomme ich als Antwort:
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; Zitat:
Hat jemand ein funktionierendes Trap Beispiel, was man mal nachvollziehen kann? Oder sieht hier jemand einen Fehler im Code !? |
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:
Ich weiß, das im SNMP Packet $a4 steht aber laut
IdSNMP1.Trap.PDUType := $a4;
RFC ist der Type für Traps $04. Vielleicht bastelt Indy ja aus den $04 ein $a4. Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Moin Klaus,
Zitat:
Delphi-Quellcode:
Aber auch wenn ich
const
//PDU type PDUGetRequest = $a0; PDUGetNextRequest = $a1; PDUGetResponse = $a2; PDUSetRequest = $a3; PDUTrap = $a4;
Delphi-Quellcode:
verwende klappt das nicht wirklich. :gruebel:
IdSNMP1.Trap.PDUType := $04;
|
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 |
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:
Klaus |
Re: SNMP Trap senden mit Indy ?
Moin Klaus,
das ist schon komisch. Zitat:
Man kann gut sehen das der PDUTyp falsch ist. Frage ist nur warum ... Kann des evtl. an Delphi 2009 / UniCode liegen ? |
Re: SNMP Trap senden mit Indy ?
Zitat:
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:
Grüße
//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; Klaus |
Re: SNMP Trap senden mit Indy ?
Moin !
Es liegt an dieser Funktion:
Delphi-Quellcode:
Zu finden in IdGlobal.
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; 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:
Und das wiederum von
function ToBytes(const AValue: string; const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
{$IFDEF USEINLINE}inline;{$ENDIF} begin Result := ToBytes(AValue, -1, 1, AEncoding); end;
Delphi-Quellcode:
Tja nu steht man(-n) im Wald. Das Indy Buch schweigt sich dazu auch ganz brilliant aus :x
procedure TIdUDPBase.Send(const AHost: string; const APort: TIdPort; const AData: string);
begin SendBuffer(AHost, APort, ToBytes(AData)); end; Any idea ? |
Re: SNMP Trap senden mit Indy ?
.. nun wenn ich das in der Hilfe lese, verstehe ich nicht mehr:
Zitat:
Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Moin !
Zitat:
svn://svn.atozed.com/indy/indy10 Ist der momentan offline ? |
Re: SNMP Trap senden mit Indy ?
Zitat:
Aber Du kannst es ja ![]() Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Jo hab ich dann auch gemacht.
Das löst aber immer noch nicht das SNMP Problem. Denn beim Aufruf wird kein Encoding übergeben und ich kann auch keins angeben. :pale: |
Re: SNMP Trap senden mit Indy ?
Moin !
Hmm selbst wenn ich das Encoding mit angebe:
Delphi-Quellcode:
funktioniert das noch nicht.
function TIdSNMP.SendTrap: integer;
begin Trap.PDUType := PDUTrap; Trap.EncodeTrap; Send(Trap.Host, Trap.Port, Trap.Buffer, en8Bit); Result := 1; end; Evtl. noch jemand ne Idee wie ich das nun hinbiegen kann? |
Re: SNMP Trap senden mit Indy ?
.. und Du bist Dir sicher mit der neuen zu arbeiten?
Was gibt denn idsnmp1.version für eine Versionsbezeichnung aus?
Delphi-Quellcode:
Grüße
// aus tIdGlobal.pas
function ToBytes( const AValue: string; const AEncoding: TIdEncoding = enANSI ): TIdBytes; overload; begin EIdException.IfTrue(AEncoding = enDefault, 'No encoding specified.'); {do not localize} {$IFDEF DotNet} case AEncoding of enANSI: Result := System.Text.Encoding.ASCII.GetBytes(AValue); enUTF8: Result := System.Text.Encoding.UTF8.GetBytes(AValue); end; {$ELSE} // For now we just ignore encodings in VCL SetLength(Result, Length(AValue)); if AValue <> '' then begin Move(AValue[1], Result[0], Length(AValue)); end; {$ENDIF} end; Klaus |
Re: SNMP Trap senden mit Indy ?
Moin !
So, nachdem ich dann nochmal alles kontrolliert habe (da waren noch ein paar alte DCUs :angel2: ) geht es nun wenn ich folgendes mache:
Delphi-Quellcode:
Das ist nun aber in der IdSNMP.pas geändert was mir nicht wirklich gefällt.
function TIdSNMP.SendTrap: integer;
begin Trap.PDUType := PDUTrap; Trap.EncodeTrap; Send(Trap.Host, Trap.Port, Trap.Buffer, en8Bit); Result := 1; end; Im Prinzip könnte man es ja auch anders aufrufen wenn denn Buffer nicht protected wäre ... Muss ich jetzt wirklich die Klasse ableiten und SendTrap überschreiben !? |
Re: SNMP Trap senden mit Indy ?
Hallo Dominik,
hast Du dir die Indy10 oder IndyTiburon gezogen? Du solltest besser die Tiburon verwenden. ![]() Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Moin !
Jo ich habe das Tiburon ZIP genommen. Das andere hatte auch nicht alle Units dabei. Was mir aber immer noch nicht klar ist ... was ist nun der einfachste weg um einen Trap 8Bit codiert zu versenden? Die Original Units patchen ist sicher der schlechteste Weg ..... |
Re: SNMP Trap senden mit Indy ?
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend Dominik,
ich hege den stillen Verdacht, dass Du immer noch mit den "alten" Indys arbeitest. Hast Du die Bibliothekspfade angepasst? Anbei findest Du alle toBytes Funktionen aus idGlobal. Deren default Einstellungen für das Encoding ist nil. Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Moin !
Hmm aber .version zeigt mit 10.5.7. Zitat:
|
Re: SNMP Trap senden mit Indy ?
ach, das wird ja immer rätselhafter.
Mit der 10.1.5 (welche ja älter ist als die Deine) habe ich es ja heute früh getestet und es lief - aus welchen Gründen auch immer. Ich weiß da langsam keinen Rat mehr. Grüße Klaus |
Re: SNMP Trap senden mit Indy ?
Moin Klaus,
ich werde mir einfach die SNMP Unit kopieren und nach meinen Anforderungen anpassen. Danke jedenfalls für deine Hilfe ! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz