Telnet-Steuerung



  • Ich soll hier in einem bestehenden Programm ein externes Gerät (IP-gesteuerter Schalter) ansteuern. Dieser versteht laut Dokumentation HTTP (eine minimalistische Web-Oberfläche mit zwei Buttons zum Ein- und Ausschalten) und Telnet*. Letzteres wäre vermutlich ideal, um den Schalter aus meinem Programm anzusteuern, nur fehlen mir dazu ein wenig die Grundlagen:
    Was muß ich aus dem Programm heraus senden/empfangen/auswerten, um eine Verbindung über Telnet herzustellen, eine Anweisung an den Schalter zu senden und die Verbindung wieder zu trennen?

    *In der Bedienungsanleitung steht auch eine Liste der unterstützten Befehle, für mich wichtig ist vor allem "ips1 ein" bzw. "E" zum Aktivieren des Schalters und "exit"/"X" zum Verbindung trennen.



  • Wenn er auch HTTP versteht, dann kannst du auch einfach libcurl nutzen oder dir die notwendigen Befehle selber zusammenreimen. Es könnte darauf hinauslaufen, das du am Ende nur z.B. folgendes senden musst:

    GET /index/?status=off HTTP/1.0\r\n\r\n

    Siehe: http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol



  • Das hier vielleicht noch als Ergänzung

    VlG



  • Eventuell sollten wir mal einen Schritt zurücktreten. Ich weiß, welche Befehle ich über Telnet schicken müsste, um den Schalter zu einer Reaktion zu bewegen. Ich wollte allerdings wissen, was ich benötige, damit er diese Befehle auch als solche akzeptiert.
    Oder reicht es tatsächlich aus, wenn ich mir eine TCP-Verbindung hole und dort blind irgendwelche Nachrichten rausschreibe?

    @hmmm: Einen HTTP-Request über Telnet zu schicken halte ich ein wenig für Overkill, wenn der Schalter für den selben Zweck eigene Befehle zur Verfügung stellt 😉



  • CStoll schrieb:

    Eventuell sollten wir mal einen Schritt zurücktreten. Ich weiß, welche Befehle ich über Telnet schicken müsste, um den Schalter zu einer Reaktion zu bewegen. Ich wollte allerdings wissen, was ich benötige, damit er diese Befehle auch als solche akzeptiert.
    Oder reicht es tatsächlich aus, wenn ich mir eine TCP-Verbindung hole und dort blind irgendwelche Nachrichten rausschreibe?

    @hmmm: Einen HTTP-Request über Telnet zu schicken halte ich ein wenig für Overkill, wenn der Schalter für den selben Zweck eigene Befehle zur Verfügung stellt 😉

    Mit Telnet kenne ich mich nicht aus, aber ich vermute, das es reicht, wenn du dich einfach mit dem Server verbindest und die gewünschten Befehle sendest. Du kannst das ja auch erst mal manuell über Telnet ausprobieren und schauen, was du als Antwort erhältst.

    Einen HTTP-Request über Telnet zu schicken war nie gemeint. Telnet wurde in den Beispielen(!) nur zur Demonstration verwendet. Man hätte das genau so gut mit Putty machen können oder indem man sich in seinem Programm mit Sockets eine TCP-Verbindung aufbaut. Das Ergebnis ist das gleiche.

    Alles in allem würde ich dazu raten das ganze einfach auszuprobieren.



  • Also blind Daten über TCP rauszuschicken hat im ersten Test nicht so funktioniert wie ich das beabsichtigt habe. Ich verbinde mich per TCP mit dem Schalter, aber ich bekomme keine sinnvollen Antworten von ihm zurück.

    ein wenig vereinfacht sieht es momentan so aus:

    TcpClient client = new TcpClient();
    client.Connect( adresse, port );
    NetworkStream stream = client.GetStream();
    
    while(!ende)
    {
      String snd = Console.ReadLine();
      stream.Write(ASCIIEncoding.Default.GetBytes(snd),0,snd.Length);
      StringBuilder rcv = new StringBuilder();
      while(stream.DataAvailable)
      {
        int rcv_val = stream.ReadByte();
        rcv.AppendFormat(" {0:X2}",rcv_val);
      }
      Console.WriteLine(rcv.ToString());
    }
    

    Als Antwort erhalte ich bei der ersten Anfrage "FF FD 03 FF FE 01 FF FB 01" und anschließend keine weitere Reaktion (unabhängig davon, was ich sende).

    PS: Eine Verbindung über Telnet (aus der Eingabeaufforderung heraus) hat funktioniert, aber für die manuelle Ansteuerung aus dem Programm heraus fehlt mir noch irgendwas im Protokoll 😞



  • Nachtrag: Beim anwählen über Telnet fragt das Gerät als erstes nach Username (ist mir bekannt) und Passwort (keins vergeben), bevor ich weitere Anweisungen geben kann. Inzwischen habe ich es irgendwie geschafft, die entpsrechende Meldung "IPS1 Telnet Server ..." aus meinem Programm heraus zu empfangen, aber der anschließende Login scheitert, weil ich nicht genau weiß, was exakt er erwartet.



  • Ich hab' per trial und error doch etwas zusammengezimmert, was für meine Zwecke ausreicht. Dazu mußte ich jedes Zeichen des Befehls einzeln mit anschließendem Zeilenumbruch (CRLF) senden und jeweils kurz warten.
    (und die Abfrage der Login-Daten konnte ich unterwegs auch noch abschalten, damit muß ich wirklich nur "E\n" und "X\n" schicken)


Log in to reply