Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« on: January 20, 2013, 09:25:53 am » |
J'ai modifié un bout de code pour essayer de me connecter en Telnet sur un PC.... J'y arrive.... des fois  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 : connecting to server... connected ÿýÿýÿûÿû
login: root root Password:
et avec d'autres essais (en changeant le code) : 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  Voici le code expurgé de mes essais: 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.
|
|
|
|
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Ile-de-France (92 sud), France
Offline
Edison Member
Karma: 22
Posts: 1817
|
 |
« Reply #1 on: January 20, 2013, 09:39:01 am » |
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() : 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
|
|
|
|
|
Logged
|
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 ?
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #2 on: January 20, 2013, 10:38:25 am » |
|
|
|
|
« Last Edit: January 20, 2013, 10:42:15 am by Jean-François »
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Ile-de-France (92 sud), France
Offline
Edison Member
Karma: 22
Posts: 1817
|
 |
« Reply #3 on: January 20, 2013, 10:59:28 am » |
Appelé aussi "Machine d'état" 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 ....
|
|
|
|
|
Logged
|
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 ?
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #4 on: January 20, 2013, 01:17:24 pm » |
Bien la machine d'état  , mais avant de l'utiliser, il faut que je puisse me connecter cerrectement....  Un nouvel essai avec une librairie qui était en .pde  : /* * 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ô 
|
|
|
|
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Offline
God Member
Karma: 4
Posts: 835
|
 |
« Reply #5 on: January 20, 2013, 04:36:57 pm » |
bonjour, ca y est il copie mes coincs  sinon tu peux faire une chose comme ca ouverture connexion delay(2000); inscription du login delay(2000); inscription du mdp delay(2000);
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #6 on: January 20, 2013, 05:22:47 pm » |
J'ai déjà essayé ta solution infobarquee et c'est pas un problème de tempo, mais plus "d'étape".
|
|
|
|
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Offline
God Member
Karma: 4
Posts: 835
|
 |
« Reply #7 on: January 21, 2013, 05:29:20 am » |
J'ai déjà essayé ta solution infobarquee et c'est pas un problème de tempo, mais plus "d'étape".
déjà, est ce qu'en manuel ca fonctionne? car la solution de find est bonne, expect en bash de mémoire. as tu vérifié les ports et les logs sur ton server? EDIT : ton server est sous quel OS? si linux, telnet-server est il installé?
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #8 on: January 21, 2013, 05:56:38 am » |
En manuel ça fonctionne... c'est le premier truc que j'essaye afin de bien comprendre la cinématique et l'enchainement des commandes. J'ai fait une machine d'état (merci barbudor) et ça fonctionne jusqu'à un certain point. enum { WAIT_CONNECT, WAIT_LOGIN, WAIT_PASSWORD, WAIT_INVIT, RUNNING } Etat = WAIT_CONNECT;
void loop() { switch( Etat ) { case WAIT_CONNECT: //... ici le code pour se connecter au serveur telnet Serial.println("connection au serveur telnet..."); if (client.connect(server, 23)) { Serial.println("connecté..."); Etat = WAIT_LOGIN; } // remettre le compteur a zero pour la prochaine connexion: lastAttemptTime = millis(); break; case WAIT_LOGIN: if (client.available()) { char c = client.read(); Serial.print(c); stringOne+=c; } if (!client.connected()) { Serial.println(); Serial.println("déconnecté...."); client.stop(); Etat = WAIT_CONNECT; } // ... ici le code pour attendre "login:" if(stringOne.endsWith("login: ")){ client.print("root\n"); Etat = WAIT_PASSWORD; } break; case WAIT_PASSWORD: if (client.available()) { char c = client.read(); Serial.print(c); stringOne+=c; } if (!client.connected()) { Serial.println(); Serial.println("déconnecté...."); client.stop(); Etat = WAIT_CONNECT; } // ... ici le code pour attendre "login:" if(stringOne.endsWith("Password:")){ client.print("root\n"); Etat = WAIT_INVIT; } break; case WAIT_INVIT: if (client.available()) { char c = client.read(); Serial.print(c); stringOne+=c; } if (!client.connected()) { Serial.println(); Serial.println("déconnecté...."); client.stop(); Etat = WAIT_CONNECT; } // ... ici le code pour attendre l'invit de commande" if(stringOne.endsWith("# ")){ Etat = RUNNING; delay(100); } break; case RUNNING: // ... ici le code pour faire la commande client.print("date\n"); delay(100); Etat = WAIT_INVIT; break; } } Je vais jusqu'à l'invitation de commande symbolisée par "#", la commande passe plusieurs fois puis l'affichage se bloque sur "#" Attente de l'attribution de l'adresse IP: Mon IP:192.168.1.105 connection au serveur telnet... connecté... ÿýÿýÿûÿû
login: root Password:
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.
# date Mon Jan 21 11:15:04 UTC 2013 # date Mon Jan 21 11:15:04 UTC 2013 # date Mon Jan 21 11:15:05 UTC 2013 # date Mon Jan 21 11:15:05 UTC 2013 # date Mon Jan 21 11:15:05 UTC 2013 # date Mon Jan 21 11:15:06 UTC 2013 # date Mon Jan 21 11:15:06 UTC 2013 #
|
|
|
|
« Last Edit: January 21, 2013, 06:16:47 am by Jean-François »
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Offline
God Member
Karma: 4
Posts: 835
|
 |
« Reply #9 on: January 21, 2013, 06:41:00 am » |
hummmm, ca ressemble à un ban. trop de commandes rapprochées et ton ip est blacklistée. tu as quoi dans le syslog? peut être la solution. sinon trouves tu l'ip du nono dans iptables -l ou -l n (j'ai un doute).
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #10 on: January 21, 2013, 07:06:39 am » |
Avec #netstat # netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State ... tcp 0 134 192.168.1.64:23 192.168.1.105:1025 ESTABLISHED ...
La commande netstat ne fait qu'un renvoi puis elle s'arrête, avec ls ça faisait environ 30 renvoi Si j'utilise netstat depuis une console distante, je peux faire une répétition manuellement toutes les 1/2 seconde, voir plus rapide, et je n'ai pas de problème d'arrêt. Avec l'arduino, même en mettant des delay() de 3-5 secondes, cela ne change rien.
|
|
|
|
« Last Edit: January 21, 2013, 07:25:58 am by Jean-François »
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
Offline
Edison Member
Karma: 6
Posts: 2435
|
 |
« Reply #11 on: January 21, 2013, 07:57:58 am » |
Avec #netstat # netstat Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State ... tcp 0 134 192.168.1.64:23 192.168.1.105:1025 ESTABLISHED ...
La commande netstat ne fait qu'un renvoi puis elle s'arrête, avec ls ça faisait environ 30 renvoi Si j'utilise netstat depuis une console distante, je peux faire une répétition manuellement toutes les 1/2 seconde, voir plus rapide, et je n'ai pas de problème d'arrêt. Avec l'arduino, même en mettant des delay() de 3-5 secondes, cela ne change rien. Salut JF juste en passant, parce que ce n'est pas ma specialité les reseaux  mais tu utilise quoi sur l'arduino ? un shield ethernet w1500 ? si oui, peut etre voir du coté du nombre de sessions ouvertes et/ou de debit, j'avais fait un test (faut que je retrouve le topic) ça ne volait pas tres haut ! 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #12 on: January 21, 2013, 08:30:59 am » |
J'utilise le truc officiel...  je crois que c'est le machin "Wquelquechose" en effet 
|
|
|
|
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
France
Offline
Full Member
Karma: 0
Posts: 128
|
 |
« Reply #13 on: January 21, 2013, 09:04:53 am » |
4 connexions simultanées, je crois.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Geneva
Offline
Faraday Member
Karma: 22
Posts: 2879
Yoplait... le pt'it suisse
|
 |
« Reply #14 on: January 21, 2013, 09:13:03 am » |
dans ce cas de figure, je n'ai qu'une connexion active avec le serveur.
|
|
|
|
|
Logged
|
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 Panther 10.3.9 Arduino Diecimila Arduino Mega Arduino Standalone Arduino 1307.04 
|
|
|
|
|