Go Down

Topic: [RESOLU]Envoi d'un fichier sur serveur FTP hébergé par RaspBerry (Read 2178 times) previous topic - next topic

supercc

Super !

N'oublie pas la remarque sur les adresses MAC de fdufnews ;-)

Sinon :

Quote
Pour ne pas avoir à mettre en dur une adresse ip par module (Il pourrait y avoir 80 modules dans le futur), j'aimerais louer une adresse temporairement, juste le temps de l'envoi d'un fichier texte, au serveur DHCP.
2 remarques :

  - tu vas devoir fixer une adresse MAC de toute façon donc une adresse IP en plus (dérivant par exemple de l'adresse MAC) n'était pas vraiment plus compliqué.
  - je ne vois pas dans la bibliothèque Ethernet arduino de fonction "relachant" explicitement une adresse IP obtenue par DHCP. La réutilisation de l'IP se fera donc à l'issue de la durée du bail et donc suivant la fréquence des communications et/ou la durée du bail il faudra peut-être une IP par arduino. Mais bon si le serveur DHCP est bien configuré (plage d'adresse dynamiques assez étendue) et si le réseaux est vraiment 10.138.0.0/16 (65534 machines possible en tout) cela va bien se passer ;)

L'avenir le dira   :smiley-mr-green:

Herouis

Quote
N'oublie pas la remarque sur les adresses MAC de fdufnews ;-)
Je n'oublie pas la remarque :)

Quote
si le réseaux est vraiment 10.138.0.0/16 (65534 machines possible en tout) cela va bien se passer ;)
Le réseau est même 10.138.0.0/24, je ne sais pas si cela change quelque chose.
Au passage l'entreprise est Michelin :)

supercc

Quote
Le réseau est même 10.138.0.0/24, je ne sais pas si cela change quelque chose.
Un peu, tu viens de passer d'un réseau de 65534 machines à un réseau de 254 machines ;-)

Du coup le masque réseau (subnet) est 255.255.255.0 et non pas 255.255.0.0 comme supposé à un moment.

A mon avis ce n'est pas un souci car :

  - ce réseau t'est sans doute réservé
  - chez Michelin tout roule non ? :smiley-red:

A+

Herouis

J'ai tout de même une dernière questions qui me viens en tête, est-il possible d'envoyer mon fichier texte dans un dossier précis situé sur la raspberry?

Pour l'instant le fichier s'envoie dans le dossier principal utilisateur mais j'aimerais, pour avoir quelque chose de vraiment propre, que le fichier texte aille se ranger dans un dossier nommé Dossier_Heures_Machines présent dans le dossier principal utilisateur.

Merci :)

supercc

Oui c'est possible. Observe le code http://playground.arduino.cc/Code/FTP que tu utilises. La fonction doFTP se connecte au serveur ftp et envoie le fichier . L'idée serait de changer de répertoire (en le créant si nécessaire) après s'être connecté et avant d'envoyer le fichier. Des commandes ftp existent pour cela ( MKD mydir, CWD mydir).

Exemple (pas testé) :

Code: [Select]


// ...
String dossier="monDossier";

// connexion (cf. doFTP)
// ...

// On se place dans dossier (si échec on le crée et on se place dedans)  

client.println((String)F("CWD ")+dossier);
if(!eRcv()) {
   client.println((String)F("MKD ")+dossier);
   eRcv();

   client.println((String)F("CWD ")+dossier);
   if(!eRcv()) return 0;
}

// on est dans le dossier, on copie le fichier (cf. doFTP)
// ...




Herouis

Super, ça fonctionne, merci beaucoup.

Pendant que j'y suis j'ai encore une question (oui encore :) ),
j'aimerais que le fichier soit remonté tous les x temps en plus que lorsqu'on arrête le compteur.
Je pensais le mettre dans le loop avec un compteur qui augmente lorsqu'on atteint ce temps.

Mon code est en pièce jointe, je n'ai pas assez de place dans le post pour l'intégrer.

De plus, j'ai un problème, a chaque fois que je re téléverse le code sur l'arduino, il me met une adresse ip a la con genre 255.255.255.255 et le seul moyen que j'ai trouvé pour résoudre ce problème, c'est d'avoir un autre programme DHCP en parallèle et le compiler quand je veux tester mon nouveau code.
Est-ce normal ?

Merci.

fdufnews

Le morceau de code suivant est bizarre.
Code: [Select]
      S = now.second();   //Prend les secondes actuelles
   
      if(S > C)       //Compare si une seconde est passée de 0 a 58
      {
        compteur++;       //Ajoute 1 au compteur
        fonctionnement = compteur/3600;   //Converti le compteur en secondes
        Serial.println("boucle");       //Indicateur de debogage pour dire qu'on est passé dans la boucle
      }
      if(S < C)   //Compare si une seconde est passée(pour 59 secondes)
      {
        compteur++;     //Ajoute 1 au compteur
        fonctionnement = compteur/3600;     //Converti le compteur en secondes
        Serial.println("boucle");     //Indicateur de debogage pour dire qu'on est passé dans la boucle
      }

.....

      C = now.second();         //Prend les secondes actuelles pour etre comparé


Les 2 if font la même chose. Cela pourrait être remplacé par un if (S!=C)
Le fait de relire la RTC pour charger C en fin de boucle peut te faire perdre une seconde. Si le bloc de code, qui accède à la SD card, subit un ralentissement tu vas perdre une seconde.
Il suffirait de remplacer :
C = now.second();
par
C = S;

La variable etat n'est mise à jour qu'une fois dans le setup() et nulle part ailleurs:
  • si c'est normal, le code qui teste etat dans loop() est inutile et tu peux en virer la moitié
  • si c'est anormal, il faut rajouter un digitalRead(pininterrupt); quelque part dans loop()

Tu sembles avoir peur d'user l'EEPROM puisque tu comptes un nombre d'écriture et allume une alerte.
Si c'est la cas, il faudrait écrire ton compteur à une autre adresse lorsque tu approches de la fin de vie présumée de l'EEPROM et remettre à zéro le nombre d'écriture ce qui augmenterait la vie de ton système.

Herouis

J'ai suivi ton conseil et cela fonctionne.
J'ai un peu modifié le programme, maintenant le fichier remontera tous les jours à 15h peut importe l'état du bouton, en plus de remonter lorsqu'on éteint la machine.

Je n'ai pas trop compris ce que tu m'as dit sur l'EEPROM, je n'ai pas peur de l'utiliser, la led est juste un avertisseur pour changer l'arduino MEGA lorsque l'EEPROM est en fin de vie.

Merci.

fdufnews

Je n'ai pas trop compris ce que tu m'as dit sur l'EEPROM, je n'ai pas peur de l'utiliser, la led est juste un avertisseur pour changer l'arduino MEGA lorsque l'EEPROM est en fin de vie.
Oui mais tu n'écris que quelques adresses ans l'EEPROM. Donc lorsque tu arrives en "fin de vie" en fait c'est la fin de vie pour ces quelques octets et il te reste tout le reste de l'EEPROM dans lequel tu n'as jamais écrit.

Herouis

D'accord donc si je change l'adresse de chaque variable et que je l'augmente de 8 (C'est bien 8 octets un long ?), je double l'espérance de vie du module ?

Es-tu sur que ce n'est pas l'entièreté de l'eeprom qui est limité en ecriture plutôt que chaque octet ?

J'en ai discuté avec mon maitre de stage, il me conseille de laisser comme ceci plutôt que de se compliquer la vie et de risquer d'empiéter sur d'autres octets déjà utilisés.

Merci.

supercc

De plus, j'ai un problème, a chaque fois que je re téléverse le code sur l'arduino, il me met une adresse ip a la con genre 255.255.255.255 et le seul moyen que j'ai trouvé pour résoudre ce problème, c'est d'avoir un autre programme DHCP en parallèle et le compiler quand je veux tester mon nouveau code.
Est-ce normal ?
Bonsoir,

je n'ai pas tout compris (comment une compilation d'un programme peut influer sur une requête DHCP d'un autre programme ?).

Peut-être une piste : éteins tu la carte après le téléchargement ? Auquel cas lorsque que tu la réalimentes électriquement la requête DHCP est peut-être faite trop tôt, avant que le shield Ethernet ait le temps de correctement s'initialiser.

Pour tester cette théorie ajoute simplement un delay(1000) avant Ethernet.begin(mac);




Herouis

Bonjour,

Je ne comprends pas tout non plus sur cette histoire d'adresse IP qui prend 255.255.255.255 lors de l'initialisation de l'arduino.
J'ai essayé de rajouter 1 sec de délai comme tu me l'as dit mais rien ne change.
Est-ce encore une fois un de mystères incompréhensibles de l'Arduino ?  :smiley-roll-blue:

Merci.

supercc

Et si après avoir attendu 1 s tu refais une requête DHCP ?


Go Up