Delphi-PRAXiS

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 29. Sep 2006 11:24


Telnet mit IdTelnet - Cursortasten senden
 
Hi,

ich möchte mit der Indy Telnet-Komponente auf meinen Router zugreifen, um die Internet-Verbindung herzustellen und zu trennen.

Der Router zeigt so eine Art Menü an, in dem man (im normalen Telnet-Client) durch Cursorbewegungen navigieren kann. Wie kann ich aber in Delphi die Cursor-Nach-Oben-Taste an den Router senden?


Wär echt nett, wenn ihr mir da helfen könntet!

(Auf Grund der Bitte von Chaosben habe ich meine Fragen nun in separate Threads geschoben)

Cu, Chris

mkinzler 29. Sep 2006 11:31

Re: Telnet mit IdTelnet - Cursortasten senden
 
Den entsprechenden Steuerbefaehl an Router senden.

c.wuensch 29. Sep 2006 11:44

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Den entsprechenden Steuerbefaehl an Router senden.
Gute Zusammenfassung ;-) Genau das will ich ja machen, nur wie???

c.wuensch 29. Sep 2006 22:05

Re: Telnet mit IdTelnet - Cursortasten senden
 
Gibt es da vielleicht einen Escape-String, den ich senden muss, damit der Cursor nach oben gesetzt wird?

Oder vielleicht einen speziellen Steuerungsbefehl?

Oder weiß jemand vielleicht noch eine andere Möglichkeit, wie ich das realisieren könnte???

Cu, Chris

marabu 30. Sep 2006 07:11

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hallo Chris,

ich glaube die Aufforderung zum Aufsplitten deines ursprünglichen threads kam reflexartig, weil du dort eine Aufzählung drin hattest. Tatsächlich wäre es wohl besser gewesen den thread nicht zu spalten.

Auf eine Liste mit Steuerbefehlen für ANSI-Terminals kannst du hier zugreifen: klick

Grüße vom marabu

c.wuensch 30. Sep 2006 12:07

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hi marabu,

danke erstmal für deine (zweifache ;-)) Hilfe!

Ich habe jetzt ausgiebig mit den Escape-Sequenzen experimentiert, aber ich glaube, diese beziehen sich nur auf die Ausgabe.

Mein Problem ist jedoch, dass der Router in Telnet eine Art Menü zur Verfügung stellt, in dem man über Cursor-Navigation zu einer bestimmten Stelle gehen kann (natürlich nur ganz bestimmte Stellen, an die der Cursor dann springt) und dort z.B. eine andere IP eingeben kann. Diese Navigation muss der Router also mitkriegen.

Mit den Escape-Codes klappt das leider so nicht (oder ich wende sie falsch an).

Gibt es denn vielleicht auch Möglichkeit, wirklich die Cursor-TASTE an den Telnet-Client zu schicken?

Falls keinem so etwas einfällt, werde ich nachher noch einige Screenshots und auch meinen aktuellen Code hochladen.

Cu, Chris

mkinzler 30. Sep 2006 12:15

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Gibt es denn vielleicht auch Möglichkeit, wirklich die Cursor-TASTE an den Telnet-Client zu schicken?
Ist das überhaupr nötig oder kann man die Menüpunkte auch direkt auswählen?

c.wuensch 30. Sep 2006 12:20

Re: Telnet mit IdTelnet - Cursortasten senden
 
Liste der Anhänge anzeigen (Anzahl: 4)
Ich wüsste nicht wie - also mit Zahlen geht es in diesem Fall nicht.

Ich hänge jetzt mal eine Reihe von Screenshots an, wie ich mich durch das Router-Menü hangeln will. Vielleicht trägt das zur Verdeutlichung bei...

marabu 30. Sep 2006 12:28

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hallo Chris,

ich würde es mit TAB anstelle von Cursor-Steuersequenzen probieren. Welcher Router (Hersteller, Modell) ist das? Diese Menüs sind ja nur zur interaktiven Bedienung (Mensch-Maschine-Schnittstelle). Gibt dein Handbuch keine Auskunft über eine programmierbare Schnittstelle?

Gruß, marabu

c.wuensch 30. Sep 2006 12:40

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hi marabu,

- TAB geht leider nicht (also im Windows-Terminal, dann wohl auch in Delphi nicht oder?)

- Der Router ist ein Longshine LCS-883R-DSL-4F.

- Im Handbuch steht nichts über eine programmierbare Schnittstelle, aber wenn es da irgendwelche Standard-Methoden gibt, die man testen könnte, bin ich gerne bereit dazu!

Cu, Chris

mkinzler 30. Sep 2006 12:46

Re: Telnet mit IdTelnet - Cursortasten senden
 
Auf der Homepage findet man nur das Nachfolgermodell. Hat dein Router keine Weboberfläche?

marabu 30. Sep 2006 12:57

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hi Markus, er hat scheinbar: klick

Gruß, marabu

mkinzler 30. Sep 2006 13:08

Re: Telnet mit IdTelnet - Cursortasten senden
 
Dann würde ich den router per webinterface steuern.

c.wuensch 30. Sep 2006 13:31

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Dann würde ich den router per webinterface steuern.
Was ich machen möchte, ist ein Programm, das mit nur einem Klick die Gateway-Einstellung des Routers so verändert, dass kein Internet-Zugriff mehr möglich ist. Dafür müsste ich mich im Webinterface durch 5 verschiedene Webseiten klicken, die eine recht lange Seitenladezeit haben.

Aus diesem Grund versuche ich das Ganze zu automatisieren. Das habe ich sogar bereits über das Webinterface im TWebbrowser versucht, nur auch dabei kommt die lange Seitenladezeit zum Tragen.

Deshalb versuche ich das Ganze jetzt über Telnet (oder auch gerne über eine Programmierschnittstelle wie vom marabu vorgeschlagen).

Zitat:

Auf der Homepage findet man nur das Nachfolgermodell.
guckst du hier: http://treiber.longshine.de/viewtopic.php?t=43

Würde mich freuen, wenn noch jemand eine konstruktive Idee hätte :coder2:

Cu, Chris

mkinzler 30. Sep 2006 13:34

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Was ich machen möchte, ist ein Programm, das mit nur einem Klick die Gateway-Einstellung des Routers so verändert, dass kein Internet-Zugriff mehr möglich ist. Dafür müsste ich mich im Webinterface durch 5 verschiedene Webseiten klicken, die eine recht lange Seitenladezeit haben.
Warum das? Du brauchst nur den Befehl des letzen Schrittes an den Router schicken!

c.wuensch 30. Sep 2006 13:55

Re: Telnet mit IdTelnet - Cursortasten senden
 
Nein, ich habe das probiert!

1.) Die Login-Seite -> Passwort-Eingabe und Absenden

2.) Die WAN-Setup Seite (gut, die Zwischenseiten auf dem Navigationsweg können übersprungen werden)

3.) Runterscrollen und im entsprechenden Feld die IP eingeben

4.) Das Formular absenden -> die ganze Seite wird nochmal neu geladen

5.) Die Apply-Seite aufrufen

6.) Auch dieses Formular absenden

7.) Die Bestätigungsseite wird geladen

Manuell ist das furchtbar, im TWebbrowser geht das grade noch so (Zeitdauer für den Vorgang liegt bei ca. 30 sek. :kotz: ), aber ich möchte es jetzt wie gesagt mit Telnet (oder einer noch eleganteren Lösung) probieren.

Fühle dich bitte nicht angegriffen (ich bin nämlich wirklich dankbar für jede Hilfe) aber es wäre nett, wenn du aufhören würdest, ständig zu versuchen, mich zu einer anderen (und ineffektiveren) Realisierung zu überreden :roll:

mkinzler 30. Sep 2006 14:01

Re: Telnet mit IdTelnet - Cursortasten senden
 
hab das schon mit Routern von anderen herstellern gemacht. Den Weg den du in der Oberfläche gehst, mußt du nicht zwangsläufig so nachvollziehen. Geh mal auf die letzte Seite, von der du die Verbindung aufbauen bzw. die Trennung durchführen kannst und schau dir den Code an. Nur diese daten sind nötig ( u.U. noch der Login).

c.wuensch 30. Sep 2006 14:09

Re: Telnet mit IdTelnet - Cursortasten senden
 
Ok, hier liegt vielleicht ein Missverständnis vor:

Der Router stellt die Internet-Verbindung nicht direkt über das PPPoe-Protokoll her, sondern nutzt die Internet-Verbindung einer FritzBox (jetzt schlage mir bitte nicht vor, das gesamte Netzwerk umzustrukturieren :???: , das Ganze hat nämlich den Grund, dass die FritzBox wegen VoIP pausenlos mit dem Internet verbunden sein muss, und die Rechner dies eben nicht sein sollen).

Das Herstellen und Trennen der Verbindung ist somit nicht über einen "Befehl" möglich, sondern nur über den umständlichen Weg, das Gateway manuell auf einen anderen Wert zu setzen. Und hierfür ist der Weg, den ich angegeben hatte, unbestreibar der kürzeste!!!


So, da das Ganze jetzt ein wenig OT geworden ist, noch einmal die Frage(n):

- Gibt es eine Möglichkeit, die Cursor-TASTEN an den IdTelnet-Client zu senden?
- Gibt es eine Alternative zu IdTelnet, womit das geht (ICSEmulTn habe ich probiert, da habe ich aber das gleiche Problem)?
- Gibt es eine Programmierschnittstelle, mit der man das Ganze vereinfachen könnte?


Cu, Chris

mkinzler 30. Sep 2006 14:20

Re: Telnet mit IdTelnet - Cursortasten senden
 
Zitat:

Das Herstellen und Trennen der Verbindung ist somit nicht über einen "Befehl" möglich, sondern nur über den umständlichen Weg, das Gateway manuell auf einen anderen Wert zu setzen. Und hierfür ist der Weg, den ich angegeben hatte, unbestreibar der kürzeste!!!
wenn du meinst, dann viel Spass!

marabu 30. Sep 2006 15:02

Re: Telnet mit IdTelnet - Cursortasten senden
 
Hallo Chris,

welche ANSI-Steuerbefehle hast du eigentlich ausprobiert? Den Cursor steuert man mit H (zwei Parameter für row und col), die Cursortasten übermitteln die Befehle A (up), B (down), C (right) und D (left).

Grüße, marabu

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 08:28 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