Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Telnet mit IdTelnet - Cursortasten senden (https://www.delphipraxis.net/78120-telnet-mit-idtelnet-cursortasten-senden.html)

c.wuensch 30. Sep 2006 15:26

Re: Telnet mit IdTelnet - Cursortasten senden
 
Nach einigem Ausprobieren bin ich zu folgendem Code gekommen:

Delphi-Quellcode:
  try
    IdTelnet1.Connect();
  finally
    If IdTelnet1.Connected Then
      Memo1.Lines.Add('Verbindung zu 192.168.1.1 hergestellt!')
  end;

  IdTelnet1.SendCmd('*******'); // Passworteingabe, zensiert fürs Forum ;-)
  IdTelnet1.SendCh('1');        // erster Menüeintrag
  idtelnet1.SendCh(#13);

  IdTelnet1.SendCh('2');        // zweiter Menüeintrag
  idtelnet1.SendCh(#13);

  // hier muss irgendwie gewartet werden, bis fertig
  // vielleicht ist das auch das Problem (?)

  idtelnet1.SendCh(#27);
  idtelnet1.SendCh('[');
  idtelnet1.SendCh('3');
  idtelnet1.SendCh('B'); // damit sollte der Cursor 3 Zeilen nach unten bewegt werden

//  idtelnet1.SendCmd(#27+'[3B'); // alternative Möglichkeit, k.A. welche besser ist

  // hier noch die alte IP speichern, wird dann aus der Ausgabe extrahiert
  idtelnet1.SendCmd('192.168.178.2'); // Eingabe der neuen IP
  idtelnet1.SendCh(#13);              // verlassen des Menüs

  IdTelnet1.SendCh('0');              // zurück zum Hauptmenü
  idtelnet1.SendCh(#13);

  IdTelnet1.SendCh('e');              // Menü verlassen (muss noch in try-Block)
  idtelnet1.SendCh(#13);

  // hier muss irgendwie noch das Disconnect hin, aber wenn ich es einfüge,
  // dann wird die Verbindung schon beendet, bevor nur die erste Ausgabe erfolgt ist ;-((
Die Probleme des Codes habe ich als Kommentare eingefügt. Wo genau der / die Fehler liegen, kann ich nicht wirklich sagen, nur hinterher steht immernoch das alte Gateway drin ;-(

Hast du da vielleicht ein paar Tipps, was ich noch testen könnte / sollte?

Cu, Chris

marabu 30. Sep 2006 17:08

Re: Telnet mit IdTelnet - Cursortasten senden
 
Telnet arbeitet zwar Vollduplex, aber wenn der Server eine formatierte Seite aufbaut, dann kann er mit dem GA (Go-Ahead) Kommando signalisieren, dass er bereit für Benutzereingaben ist. Teste doch mal mit dem MS Telnet Client, ob die sofortige Betätigung der Cursor-Tasten nach Eingabe des Passwords vom Server (Router) gepuffert wird oder ob er diese Eingaben verwirft und erst nach dem Seitenaufbau wieder auf Eingaben wartet.

Außerdem vermute ich, dass dein Telnet-Client das Password als Text übermitteln muss. Wenn es im MS Client nicht zu sehen ist, dann sicher weil der Server dem Client Ersatzzeichen oder garnichts als Echo zurückgibt - SendCmd() verstehe ich eher als Methode zur Übermittlung von Protokollbefehlen.

Grüße, marabu

c.wuensch 30. Sep 2006 17:37

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Teste doch mal mit dem MS Telnet Client, ob die sofortige Betätigung der Cursor-Tasten nach Eingabe des Passwords vom Server (Router) gepuffert wird oder ob er diese Eingaben verwirft und erst nach dem Seitenaufbau wieder auf Eingaben wartet.
Hab´s versucht. Leider (oder eher glücklicherweise) geht der Seitenaufbau jedoch so schnell, dass ich mit dem Tippen nicht hinterherkomme. Mit Delphi kann ich das ja auch nicht wirklich testen, da ich dann ja wieder bei dem ursprünglichen Problem bin ;-)

Zitat:

dann kann er mit dem GA (Go-Ahead) Kommando signalisieren, dass er bereit für Benutzereingaben ist
Super! Kann ich das in Delphi irgendwie abfragen?

-> Vielleicht ist es auch nicht gerade die Methode der Wahl, die Ausgabe über das OnDataAvailable-Ereignis zu realisieren? Aber falls nicht, gibt es denn eine andere Möglichkeit?

Zitat:

Außerdem vermute ich, dass dein Telnet-Client das Password als Text übermitteln muss.
Ich dachte, der Unterschied zwischen SendCmd und SendCh bestünde nur darin, dass bei SendCmd ein #13 am Ende übergeben wird. Das mit dem Passwort funktioniert auf jeden Fall so auch, aber ich probiere das gerne auch noch mit SendCh.

Hier noch ein Ausschnitt aus meiner aktuellen Memo-Ausgabe (besonders interessante Zeilen habe ich mit Sternchen hervorgehoben):
Delphi-Quellcode:
[1;8H** WAN Port Setup **

[5;8H  1. Sevice Type  = [Regular Service]


[6;8H  2. Regular Service Setup


[7;8H  3. PPPoE Service Setup



[10;8H  0. Back To Last Menu

*** [14;8HEnter your choice ->[3B
1



[2J
[1;8H** WAN Port Setup **
[5;8H  1. Sevice Type  = [Regular Service]


[6;8H  2. Regular Service Setup



[7;8H  3. PPPoE Service Setup



[10;8H  0. Back To Last Menu
*** [14;8HEnter your choice ->92
*** .1


[2J
[1;8H** WAN Port Setup **
[5;8H  1. Sevice Type  = [Regular Service]


[6;8H  2. Regular Service Setup


[7;8H  3. PPPoE Service Setup


[10;8H  0. Back To Last Menu
*** [14;8HEnter your choice ->68.1


[2J
[1;8H** WAN Port Setup **
[5;8H  1. Sevice Type  = [Regular Service]


[6;8H  2. Regular Service Setup


[7;8H  3. PPPoE Service Setup


[10;8H  0. Back To Last Menu
*** [14;8HEnter your choice ->78.2
Wie man sieht, wird meine Escape-Sequenz zum Cursor-Bewegen anscheinend im Klartext angezeigt (kann das richtig sein?).
Außerdem sieht man, dass die IP, die ich sende, anscheinend an der Choice-Stelle eingegeben wird (bin mir aber nicht sicher, ob das vielleicht auch an der Memo-Ausgabe liegt).
Vielleicht kannst du ja daran den Fehler erkennen?

Cu, Chris

marabu 30. Sep 2006 19:44

Re: Telnet mit IdTelnet - Cursortasten senden
 
Es sieht so aus, als ob deine Eingaben nicht gepuffert werden, sondern sofort und damit zum falschen Zeitpunkt verarbeitet werden. Der Menü-Wechsel scheint ja garnicht zu funktionieren.

Der Unterschied zwischen SendCmd() und SendCh() ist in der Unit IdTelnet nachlesbar: SendCh() übermittelt einfach ein Zeichen. SendCmd() verschickt eine Zeile inklusive CR/LF - und wartet auf einen handshake. TNC_GA findest du übrigens auch in dieser Unit.

Grüße, marabu

c.wuensch 30. Sep 2006 20:45

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Es sieht so aus, als ob deine Eingaben nicht gepuffert werden, sondern sofort und damit zum falschen Zeitpunkt verarbeitet werden. Der Menü-Wechsel scheint ja garnicht zu funktionieren.
Wie gesagt, das könnte auch an der Ausgabe liegen, da das Programm selbst ja in den Telnet-Client sendet, die Ausgaben aber durch eine separate Ereignisbehandlung ins Memo geschrieben werden, also möglicherweise zeitversetzt.
Weißt du da eine andere Möglichkeit der Ausgabe (es gibt Readln, aber ich kann leider nicht ermitteln, wie viele Zeilen vorhanden sind).

Ein Menüwechsel sollte in diesem kurzen Ausschnitt auch nicht erfolgen. Hier hat er nur jedesmal nach Eingabe von 3 Zeichen (nämlich aus der IP, die ja fälschlicherweise an dieser Stelle eingetragen wurde) das Menü neu aufgebaut.

c.wuensch 30. Sep 2006 23:55

Re: Telnet mit IdTelnet - Cursortasten senden
 
Ich habe eine Lösung gefunden!!!
Man bekommt den Cursor in die nächste Zeile durch eingeben einer IP-Nummer und anschließendes Enter. Also lese ich zuerst die eingestellten IPs aus der Ausgabe aus, und trage diese dann nochmal ein, bis ich zum gewünschten Feld komme...

Bleibt nur noch die Frage nach der Ausgabe:
Die Version über OnDataAvailable gibt die Daten immer verspätet aus (habe ich jetzt durch manuelles Eingeben der Telnet-Kommandos über ein Edit-Feld herausgefunden).
Hat denn irgendjemand eine Idee, wie ich das über die vielen Methoden von TIdTelnet bewerkstelligen könnte (z.B. gibt es Readln oder Readbuffer, damit komme ich aber nicht zurecht, da ich nicht weiß, wie viele Zeilen / Zeichen vorhanden sind).

Zitat:

TNC_GA findest du übrigens auch in dieser Unit.
Jep, habe ich gefunden. Allerdings ist das bloß als Konstante deklariert und wird nirgends verwendet, oder? Oder wie kann ich darauf zugreifen?

Cu, Chris

Nachtrag: Das mit den Escape-Sequenzen konnte schon deshalb nicht funktionieren, da die Escape-Taste als Signal zum Zurückkehren zum übergeordneten Menü betrachtet wird!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr.
Seite 3 von 3     123   

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