![]() |
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Den entsprechenden Steuerbefaehl an Router senden.
|
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
|
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 |
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: ![]() Grüße vom marabu |
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
|
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... |
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 |
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Auf der Homepage findet man nur das Nachfolgermodell. Hat dein Router keine Weboberfläche?
|
Re: Telnet mit IdTelnet - Cursortasten senden
|
Re: Telnet mit IdTelnet - Cursortasten senden
Dann würde ich den router per webinterface steuern.
|
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
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:
![]() Würde mich freuen, wenn noch jemand eine konstruktive Idee hätte :coder2: Cu, Chris |
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
|
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: |
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).
|
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
|
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Nach einigem Ausprobieren bin ich zu folgendem Code gekommen:
Delphi-Quellcode:
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 ;-(
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 ;-(( Hast du da vielleicht ein paar Tipps, was ich noch testen könnte / sollte? Cu, Chris |
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
Zitat:
-> 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:
Hier noch ein Ausschnitt aus meiner aktuellen Memo-Ausgabe (besonders interessante Zeilen habe ich mit Sternchen hervorgehoben):
Delphi-Quellcode:
Wie man sieht, wird meine Escape-Sequenz zum Cursor-Bewegen anscheinend im Klartext angezeigt (kann das richtig sein?).
[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 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 |
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 |
Re: Telnet mit IdTelnet - Cursortasten senden
Zitat:
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. |
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:
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