Go Down

Topic: login et password avec Telnet.... (Read 5 times) previous topic - next topic

Jean-François

J'ai modifié un bout de code pour essayer de me connecter en Telnet sur un PC....

J'y arrive.... des fois  :smiley-mr-green:

Mon soucis est que je n'arrive pas à synchroniser la réponse du login et du password avec leurs demande respective, la plupart du temps, le password est écrit avant que la demande en soit faite, ce qui me donne :

Quote
connecting to server...
connected
ÿýÿýÿûÿû

login: root
root
Password:




et avec d'autres essais (en changeant le code) :

Quote
connecting to server...
connected
ÿýÿýÿûÿû

login: root
root
Password:

root



BusyBox v1.21.0.git (2012-09-09 13:41:47 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.


J'ai passé la matinée à essayer de différente manière de faire tomber juste le password, en mettant des if, des flags, en testant le dernier char dans le buffer.... mais le résultat est toujours foireux  :smiley-mr-green:

Voici le code expurgé de mes essais:

Code: [Select]

void loop(){
  if (client.connected()) { 
    checke_page();
   client.println("root");
  }
  else if (millis() - lastAttemptTime > requestInterval) {
    // if you're not connected, and two minutes have passed since
    // your last connection, then attempt to connect again:
    connectToServer();
  }

}

// lit ce qui se trouve sur la page
void checke_page(){
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
  }
}

// connection au serveur
void connectToServer() {
  flag=0;
  // attempt to connect, and wait a millisecond:
  Serial.println("connecting to server...");
  if (client.connect(server, 23)) {
    Serial.println("connected");
  }
  // remettre le compteur a zero pour la prochaine connexion:
  lastAttemptTime = millis();
}   


Comment pourrais je attendre l'invitation du login et du password pour remplir les champs, en cas d'interruption de la connection la relancer avec le login et tout le baratin ?
Il faut qu'un fois logguer, je puisse envoyer des commandes prédéfinies ou lire le contenu d'un fichier.
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

barbudor

1) il ne me semble pas que dans ton code tu attende les invites "login:" et "password:"
Du doit pouvoir utiliser les methods findXxxx() ou readXxxUntil() :

Code: [Select]
  bool find(char *target);   // reads data from the stream until the target string is found
  // returns true if target string is found, false if timed out (see setTimeout)

  bool find(char *target, size_t length);   // reads data from the stream until the target string of given length is found
  // returns true if target string is found, false if timed out

  bool findUntil(char *target, char *terminator);   // as find but search ends if the terminator string is found

  bool findUntil(char *target, size_t targetLen, char *terminate, size_t termLen);   // as above but search ends if the terminate string is found

  size_t readBytesUntil( char terminator, char *buffer, size_t length); // as readBytes with terminator character
  // terminates if length characters have been read, timeout, or if the terminator character  detected
  // returns the number of characters placed in the buffer (0 means no valid data found)


Si tu veux être sûr de ce qu'elles font, le code est dans Stream.cpp

2) utilise un automate


Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Jean-François

#2
Jan 20, 2013, 04:38 pm Last Edit: Jan 20, 2013, 04:42 pm by Jean-François Reason: 1
Effectivement, ce code n'attend rien....  :smiley-mr-green:, mais j'avais fait des essais dans ce sens  :smiley-mr-green:

un automate,... comme ceux d'infobarquee ?



XD XD
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

barbudor

Appelé aussi "Machine d'état"

Code: [Select]
enum { WAIT_CONNECT, WAIT_LOGIN, WAIT_PASSWORD, RUNNING } Etat;

void loop()
{
  switch( Etat )
  {
  case WAIT_CONNECT:
    //... ici le code pour se connecter au serveur telnet
    // et quand connecté :
    Etat = WAIT_LOGIN;
    break;
  case WAIT_LOGIN:
    // ... ici le code pour attendre "login:"
    // et quand reçu "login:"
    // envoyer le login puis
    Etat = WAIT_PASSWORD;
    break
... etc , je suis trop fainéant pour continuer
}


Sans oublier la gestion des cas d'erreurs tels que timeout, deconnection, etc ....
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Jean-François

Bien la machine d'état  XD, mais avant de l'utiliser, il faut que je puisse me connecter cerrectement.... :smiley-mr-green:

Un nouvel essai avec une librairie qui était en .pde  :smiley-mr-green: :

Code: [Select]
/*
* SimpleClientTextFinder
*
*/

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

byte mac[] = {
 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,3);
IPAddress server(192,168,1,64);

EthernetClient client;
TextFinder finder( client);

const unsigned long requestInterval = 15000;  // delay between requests
unsigned long lastAttemptTime = 0;   // last time you connected to the server, in milliseconds

void setup()
{
 Ethernet.begin(mac, ip);
 Serial.begin(9600);
 Serial.println("connecting...");  
 Serial.println(Ethernet.localIP());
 delay(2000);  
}

void loop()
{
 if (client.connected()) {
  // checke_page();
   if(finder.find("login: ")){    
     client.println("root");  
   }
   if(finder.find("Password: ")){    
     client.println("root");      
   }
   checke_page();
 }
 else if (millis() - lastAttemptTime > requestInterval) {
   // if you're not connected, and two minutes have passed since
   // your last connection, then attempt to connect again:
   connectToServer();
 }
}

// lit ce qui se trouve sur la page
void checke_page(){
 if (client.available()) {
   char c = client.read();
   Serial.print(c);
 }
 // if the server's disconnected, stop the client:
 if (!client.connected()) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
 }
}

void connectToServer() {
 // attempt to connect, and wait a millisecond:
 Serial.println("connecting to server...");
 if (client.connect(server, 23)) {
   Serial.println("connected");    
 }
 // remettre le compteur a zero pour la prochaine connexion:
 lastAttemptTime = millis();
}


Essai qui ne fonctionne pô  :smiley-sweat:
MacBook intel core 2 duo  os X snow Leopard 10.6
 eMac PPc G4  os X Leopard 10.5
powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up