Go Down

Topic: Get response from telnet server with putty, but not with Arduino telnet client (Read 3 times) previous topic - next topic

vav2sab

Apologies - my bad. I forgot to include one segment, which performs actual login (I have adapted my original sketch by removing irrelevant parts). Here's the fixed code - it should work now.

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>

EthernetClient host;                                   //  host as Ethernet client
String prompt;                                         //  host telnet server prompt as string

void setup () {                                        //  start connections:
  Serial.begin (9600);                                 //    start console
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //    define mac address (optional)
  IPAddress ip (192, 168, 1, 177);                     //    define ip address
  Ethernet.begin (mac, ip);                            //    start Ethernet
  loginhost();                                         //    establish connection with host
}

void loginhost () {                                    //  login to host
  IPAddress hostip (192, 168, 1, 103);                 //    specify host ip address
  if (host.connect (hostip, 23)) {                     //    check if host is connected
    inquiry ();                                        //      run inquiry routine
    host.write ("user");                               //      enter user id
    inquiry ();                                        //      run inquiry routine
    host.write ("password");                           //      enter password
    do inquiry ();                                     //      loop inquiry routine
    while (!prompt.endsWith ("# "));                   //      until # prompt is returned
    host.write ("whatever else");                      //      enter another command if needed
    do inquiry ();                                     //      loop inquiry routine
    while (!prompt.endsWith ("some other prompt"));    //      until some other prompt is returned
  }
//  Serial.println ("HOST READY");                       //      confirm successfully established connection
}

void inquiry () {                                      //  inquiry host for telnet parameters
  while (host.available () == 0) delay (1);            //    if host does not respond wait for 1 millisecond and loop
  do {                                                 //    loop
    parse ();                                          //      negotiation routine
    delay (200);                                       //      wait for 200 milliseconds
  }
  while (host.available () > 0);                       //    until any character is returned
}

void parse () {                                        //  negotiate telnet parameters with host
  String inpstr;                                       //    input string as string
  int inpint, verbint, optint;                         //    telnet parameters as integers
  while (host.available () > 0) {                      //    if host responds loop:
    inpint = host.read ();                             //      receive returned character
    switch (inpint) {                                  //      evaluate returned character
      case -1:                                         //        if character is nothing
        break;                                         //          break the routine
      case 255:                                        //        if character is 255 (start negotiation)
        verbint = host.read ();                        //          receive negotiation verb character
        if (verbint == - 1) break;                     //          if negotiation verb character is nothing break the routine
        switch (verbint) {                             //          evaluate negotiation verb character
          case 255:                                    //          if negotiation verb character is 255 (start negotiation)
            inpstr += verbint;                         //            add negotiation verb character to input string
            break;                                     //            break the routine
          case 251:                                    //          if negotiation verb character is 251 (will) or
          case 252:                                    //          if negotiation verb character is 252 (wont) or
          case 253:                                    //          if negotiation verb character is 253 (do) or
          case 254:                                    //          if negotiation verb character is 254 (dont)
            optint = host.read();                      //            receive negotiation option character
            if (optint == -1) break;                   //            if negotiation option character is nothing break the routine 
            host.write (255);                          //            send character 255 (start negotiation)
            if (optint == 3)                           //            if negotiation option character is 3 (suppress-go-ahead)
              host.write (verbint == 253 ? 253 : 251); //              send character 253 (do) if negotiation verb character was 253 (do) else send character 251 (will)
            else                                       //            if negotiation option character is not 3 (suppress-go-ahead)
              host.write (verbint == 253 ? 252 : 254); //              send character 252 (wont) if negotiation verb character was 253 (do) else send character 254 (dont)
            host.write (optint);                       //            send negotiation option character
            break;                                     //          break the routine
          default:                                     //        if negotiation verb character is none of the above
            break;                                     //          break the routine
        }
        break;                                         //      break the routine
      default:                                         //    if character is none of the above
        inpstr += char (inpint);                       //      add character to input string
        break;                                         //      break the routine
    }
  }
}

void loop () {                                         //  run your loop routine
}

Go Up