Go Down

Topic: DiamondBack wifi périodicité des posts (Read 783 times) previous topic - next topic

gemo

Bonjour,

En mode client Wifi (combo Blackdiamond) , je cherche à envoyer un requête POST au plus une fois par heure.

A ce que je vois c'est la boucle loop() qui décide implicitement du rythme des submit().

Par ailleurs l'ajout d'un temporisation longue ( par l'insertion d'un delay() ou d'une itérative avec millis() ) dans la boucle loop  fait perdre définitivement la connexion au serveur.

Quelqu'un a t-il  eu et résolu ce problème ?

Je vous remercie d'avance.

GM

vohu

ajoute une horloge temps réel à ton montage (enfin, c'est ce que j'aurai fait :$)

Benvenuto

Je ne suis pas certain d'avoir compris ta question :/

Pour garder une connexion active longtemps, il faut ajouter le champ Connection: Keep-Alive dans ta requête HTTP.
Mais ça ne suffira peut-être pas dans ton cas, car la plupart des serveurs fermeront la connexion après quelques minutes maximum ou après un certain quota de requêtes (100 la plupart du temps).

Si la connexion est perdue, pourquoi ne pas simplement la rétablir ?

1. ouvrir une connexion
2. envoyer la requête POST
3. fermer la connexion
4. temporiser (avec delay(), ou millis(), ou ce que tu veux)

gemo

Je n'avais pas pensé à l'utilisation d'une horloge en temps réel, sur le principe c'est dans la philosophie de ce que j'attends et cela mérite d'être creusé. Reste à trouver le bon dispositif qui s'adapte à la carte dont de nombreuses PINs sont réservées au wifi.

l'option Keep-Alive, là j'aurai du connaitre, je vais tester.

Par contre le rétablissement de connexion perdue c'est tout à fais ce que je voulais faire mais le comportement est assez erratique, j'obtient ainsi un plantage dans l'ultime instruction.server_task() : après n loop() sans erreur  .server_task(); s'execute et tout plante  avec notamment plus de trace d'execution de la boucle loop().   Je précise que sans temporisation les itérations fonctionnent normalement

Je suis parti sur la base du script SimpleClient.pde :

void setup() {
    // Initialize WiServer (we'll pass NULL for the page serving function since we don't need to serve web pages)
  WiServer.init(NULL);
 
  // Enable Serial output and ask WiServer to generate log messages (optional)
  Serial.begin(57600);
  WiServer.enableVerboseMode(true);

  // Have the processData function called when data is returned by the server
  getWeather.setReturnFunc(printData);
}


// Time (in millis) when the data should be retrieved
long updateTime = 0;

void loop(){

  // Check if it's time to get an update
  if (millis() >= updateTime) {
    getWeather.submit();   
    // Get another update one hour from now
    updateTime += 1000 * 60 * 60;
  }
 
  // Run WiServer
  WiServer.server_task();

  delay(10);
}


A tout hasard comment coderais-tu l'ouverture d'une connexion et sa fermeture dans une boucle loop() ?




Benvenuto

Pardon gemo j'avais seulement survolé ton code  :smiley-sweat:.
Enlève le delay(10) de la boucle, ce n'est pas lui qui contrôle l'intervalle entre deux appels à submit().

Ce que tu dois modifier dans le code pour changer cet intervalle c'est la ligne suivante :
Code: [Select]
updateTime += 1000 * 60 * 60;

updateTime représente l'instant (en millisecondes depuis le lancement du programme) auquel sera fait le prochain submit().
Donc :
- en ajoutant 1000 tu ajouterais une seconde
- en ajoutant 1000*60 tu ajouterais une minute
- en ajoutant 1000*60*60 tu ajoutes évidemment une heure.

As-tu essayé différentes valeurs ? Qu'obtiens-tu ?

gemo

Merci à Benvenuto pour son dernier post.

J'ai repris les tests, pour le moment les reconnexions se réalisent bien après une pause de 15 minutes. Il faudra voir sur la durée.

Pour info, j'ai détecté une anomalie à l'exécution très curieuse peut-être liée à une option du compilateur :
L'instruction updateTime= updateTime+ (1000 * 60 ); renvoyait n'importe quoi (un très grand nombre)
par contre updateTime= updateTime+ 60000 ; incrémente bien de 60000.

Cdlt


zoroastre

#6
Feb 05, 2012, 08:02 pm Last Edit: Feb 05, 2012, 08:08 pm by zoroastre Reason: 1
Yep!

Si tu as déjà une connection internet avec ton arduino, la librairie time peut trés bien suffire.

http://arduino.cc/playground/Code/Time

L'utilisation d'une DS1307 (ou équivalent) comme horloge pré-suppose qu'elle soit initialement mise à l'heure.
La librairie Time permet cette synchro en se connectant à un serveur NTP (network time protocol). D'ailleurs, la librairie permet d'utiliser directement l'horloge ntp dans ton sketch

Si tu envoies ta requette une fois par heure, il suffirait de comparer l'heure courante à l'heure enregistrée précedement.

J'utilise cette méthode dans mon script en réalisant une partie du code toutes les minutes uniquement. (Si minute() différente de minute_précedente, alors...)

Une horloge RTC (hardware) est inutile si tu as une connection internet sur ton aduino.

@+

Zoroastre.
Gné! ;)


Benvenuto


Pour info, j'ai détecté une anomalie à l'exécution très curieuse peut-être liée à une option du compilateur :
L'instruction updateTime= updateTime+ (1000 * 60 ); renvoyait n'importe quoi (un très grand nombre)
par contre updateTime= updateTime+ 60000 ; incrémente bien de 60000.


Problème classique, j'aurais dû y penser .. lorsqu'on utilise des valeurs littérales comme ceci, le compilateur utilise par défaut des entiers signés, qui ne peuvent contenir que des valeurs entre -32768 et +32767.

Au-delà de la valeur maximale tu retombes sur la valeur minimale, autrement dit 32767 + 1 sera remplacé à la compilation par -32768 et de même 1000 * 60 sera remplacé par le résultat de -32768 + (60000 modulo 32768).

Go Up