DiamondBack wifi périodicité des posts

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

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

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

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)

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() ?

Pardon gemo j'avais seulement survolé ton code :sweat_smile:.
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 :

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 10006060 tu ajoutes évidemment une heure.

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

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

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.

Superbe idée !
Merci

gemo:
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).