ftp client

bonjour tout le monde,
je n'arrive pas a retrouver un topic à propos d'un ftp client assez light.
le but du jeu consiste dans un petit projet météo.

1- récupération dhcp pour se connecter de n'importe ou------>OK
2- récupération des données via des capteurs------>OK
3A- envoi des données vers une bdd si adsl ok------>OK
3B- écriture des données sur SD en cas de coupure adsl------>OK
4- envoi du fichier log si adsl retrouvé via FTP ou SCP vers le server apache qui va retraité les données vers la bdd

c'est pour le 4 ou je bloque

il y aurait bien une solution qui consisterait en la lecture du fichier de log, renvoyer les données une par une, mais trop long.

bonjour,
bon après quelques recherches et certaines heures, j'arrive a me connecter au ftp.
par contre la galère est toujours pour envoyer le fichier vers le ftp.
voici le code pour le moment

void FTP()
{
  if (clientftp.connect()) {
    Serial.println("Command connected");
    clientftp.write("USER login\r\n");
    clientftp.write("PASS mdp\r\n");
    clientftp.write("SYST\r\n");
    clientftp.write("PASV\r\n");
     File datafile = SD.open("datalog.csv", FILE_READ); 
     if (datafile) {
         clientftp.write("STOR datalog.csv  /~pilote/datalog.csv\r\n");  
     }  else{ 
     Serial.println("Erreur ecriture datalog.csv"); 
     } 
  } else{
    Serial.println("echec");
  }

Bonjour,

infobarquee:
4- envoi du fichier log si adsl retrouvé via FTP ou SCP vers le server apache qui va retraité les données vers la bdd

Oublie tout de suite l'envoi par SCP, Secure Copy demande de crypter les données, avec un arduino c'est pas envisageable.

Pour le ftp c'est un peu comme du http, il faut envoyer les bonnes commandes pour s'auth puis celles pour envoyer réellement le fichier.
-> RFC959: FTP: File Transfer Functions

bon alors, je vois bien dans mes logs server, la connexion et deconnexion ftp.
par contre aucune trace de mon up de fichier.
trouvé ca sur le forum, mais aucune différence aussi bien avec un print que write

    File datafile = SD.open("datalog.csv", FILE_READ); 
     if (datafile) {

       while (datafile.available()) {
        Serial.write(datafile.read());
         clientftp.print("STOR  /~pilote/datalog.csv\r\n");  
         //clientftp.print("RETR  /~pilote/datalog.csv\r\n");  
       }
       clientftp.print("QUIT\r\n");
           datafile.close();
     }  else{ 
     Serial.println("Erreur envoi datalog.csv"); 
     } 
  } else{
    Serial.println("echec");

Salut,

Déjà, après avoir envoyé une commande au serveur, il faut lire sa réponse et l'analyser (code retour, etc).

Le protocole FTP utilise deux connexions: une pour les commandes (ça tu l'as fait presque comme il faut), et une pour les données: pour envoyer un fichier, il faut effectuer une deuxieme connexion au serveur après avoir lu la réponse à la commande STOR, vers l'adresse et le port indiqués par le serveur dans sa réponse à la commande PASV (si on choisit le mode passif). Ensuite envoyer les octets du fichiers sur cette deuxieme connexion et la fermer quand tout est envoyé. le serveur répond ensuite sur la premiere connexion pour dire que tout s'est bien passé (ou pas).

Edit: dans ton dernier post, tu envoies le contenu du fichier vers la liaison série...

je sèche toujours pour récupérer le port que me renvoit mon server ftp ]:slight_smile:
le fichier est bien créé, les données partent, mais ou?

Le port que te renvoie le serveur est dans la réponse à ta commande PASV.

Donc il faut lire et analyser toutes les réponses qu'envoie le serveur.

Une réponses est une ou plusieurs lignes terminées par \r\n.
Chaque ligne commence par 3 caractères: le code retour numérique sue 3 chiffres.
Ensuite il y a un espace si c'est la dernière ligne de la réponse, sinon il y a un '-'.

Donc il te faut une fonction qui va lire les caractères reçus en les analysant au fur et à mesure pour:

  • Récuperer le code numérique
  • Savoir si c'est la dernière ligne de la réponse et donc lire la réponse en entier.

Quelque chose comme ça:

  • lire les trois premiers caractères
  • les convertir en nombre
  • lire le quatrième caractère et le mémoriser
  • lire jusqu'à la fin de la ligne '\r' suivi de '\n'
  • si le caractère mémorise est un '-', recommencer au début de la fonction
  • sinon renvoyer le nombre converti précédemment

Cette fonction devra être appellée après chaque envoi d'une commande au serveur.
Et surtout elle devra être appellée dès la connexion au serveur établie, celui-ci commançant à cracher son essage de bienvenue :slight_smile:

Et aussi, à chaque caractère lu, l'écrire vers le port série pour voir en vrai la réponse brute du server.

Pour l'instant fais un petit programme de test qui se connecte simplement au serveur et lit le message de bienvenue à l'aide de la fonction ci-dessus que tu auras écrite.

Après on verra le séquencement des commandes et l'analyse de codes retour. Et pour la commande PASV, on fera une autre fontion pour analyser la réponse.

Bon courage !

PS: j'ai fais un client ftp pour mon boulot, donc on devrait s'en sortir :slight_smile:

infobarquee:
je sèche toujours pour récupérer le port que me renvoit mon server ftp ]:slight_smile:
le fichier est bien créé, les données partent, mais ou?

bonjour infobarquee
je n'ai pas descendu tout le topic, mais il doit y avoir un peu à manger pour tes canetons ! :grin:

:grin:
j'ai lu et re re re lu le topic que tu donne.
mais soit il manque des trucs, soit il faut passer par l'IDE 1.0 sous windaub, soit le script en bas de la page 1 est pas bon, car même avec la lib UDP, ca ne fonctionne pas.

infobarquee:
:grin:
j'ai lu et re re re lu le topic que tu donne.
mais soit il manque des trucs, soit il faut passer par l'IDE 1.0 sous windaub, soit le script en bas de la page 1 est pas bon, car même avec la lib UDP, ca ne fonctionne pas.

a priori à partir de là

c'est du .ino donc 1.0

L'exemple du post n°14 de http://arduino.cc/forum/index.php/topic,93502.0.html fonctionne chez moi, pour du get
Attention, le code de ce post a changé il y a qque jours, car cela ne fonctionnait pas avec tous les serveurs FTP, y compris celui de la freebox V6.
Si tu n'y arrives pas, je peux te passer mon code complet.

cedric2:
L'exemple du post n°14 de http://arduino.cc/forum/index.php/topic,93502.0.html fonctionne chez moi, pour du get
Attention, le code de ce post a changé il y a qque jours, car cela ne fonctionnait pas avec tous les serveurs FTP, y compris celui de la freebox V6.
Si tu n'y arrives pas, je peux te passer mon code complet.

bonjour cedric2
tu peux déjà passer ton code complet, ça peut même pour simple culture et curiosité, intéresser d'autres contributeurs :grin:

Slt,

Je vais faire un post complet pour présenter mon projet quand j'aurais fini (Au moins quand il sera un peu "présentable")
Pour le moment, c'est encore du pre-Alpha, je touche encore le code tous les jours...

Je viens de sortir la partie FTP, qui prend le fichier "/Disque dur/A/conf.txt" sur une V6 et le copie sur la carte SD
Google Code Archive - Long-term storage for Google Code Project Hosting. -> ftp_freebox.ino

Vous devez juste modifier le password et l'ip de la freebox V6 pour que cela fonctionne chez vous.
Si vous voulez accéder à un serveur FTP distant, il faut mettre la default gateway, (ou ne pas mettre d'ip du tout dans le projet, comme cela tout sera appris en DHCP)

J'arrive à 20k de ROM, mais c'est surtout la partie gestion de la SDcard qui prend beaucoup.