2017-05-21 3 views
0

Je suis hésitant à demander ceci ici; J'ai fait an issue on GitHub, et j'ai vraiment besoin résolu. Fondamentalement, j'envoie des messages à dweetPro toutes les 15 secondes. Il fonctionnera parfaitement pendant des heures, puis il s'arrêtera au hasard, en envoyant un succès pour 20 réponses ratées.ESP8266 demandes de post échec

J'ai essayé tout ce que je peux penser, je suis assez sûr que mon code est correct, je ne sais pas si c'est quelque chose avec la bibliothèque ou quoi. Je peux envoyer les messages de Python sur mon PC indéfiniment et n'échoue jamais, donc c'est définitivement du côté de l'ESP. J'utilise une alimentation propre de 2A, donc ce n'est pas un problème d'alimentation.

Voici le lien d'un couple de journaux Wireshark provenant des postes d'envoi ESP. Les deux valide et invalide sont sur eux.

One

Two

Certains plus d'informations peuvent être trouvées sur la question sur GitHub. Voici le code que je utilise, avec des lignes de débogage utilisé:

void send_to_server(String* time_sent, float magnitude, String status, 
    int earthquake_occured, float* data, int data_size) 
    { 
    int content_length; 
    String content = make_json_content(&content_length, magnitude, 
     status, earthquake_occured, data, data_size); 

    int s = -100; 
    int c = 0; 
    while (s<0 && c<10) 
    { 
     HTTPClient http; 
     http.setTimeout(1000); 

     bool suc = http.begin("http://dweetpro.io/v2/dweets"); 
     Serial.print("Success?: "); Serial.println(suc); 

     http.addHeader("Content-Type", "application/json"); 
     http.addHeader("Accept", "application/json"); 
     http.addHeader("X-DWEET-AUTH", "xxx"); 

     int timerr = millis(); 
     Serial.println("Posting"); 
     s = http.POST(content); 
     Serial.print("Posted: "); Serial.println(millis() - timerr); 
     Serial.print("Post len: "); Serial.println(s); 
     http.writeToStream(&Serial); 
     Serial.println(""); 
     http.end(); 
     ++c; 
    } 
    Serial.println("Ended"); 
} 

En cas de succès, s imprime 200, lors d'un échec, il imprime -1.

Sur Wireshark, tous les messages réussis afficheront des données, mais pour les posts infructueux, il affichera des données pour les premiers échecs, puis il s'arrêtera. C'est comme si elle se surchargeait ou quelque chose.

Encore une fois, désolé pour ce groupe de questions, mais je ne sais pas quoi faire d'autre. J'ai passé tellement de temps là-dessus sans fin en vue. Merci beaucoup à vous tous.

EDIT: Une autre information que j'aurais dû ajouter est que si elle n'envoie pas de messages valides, je peux réinitialiser l'ESP et cela ne fonctionnera toujours pas. C'est vraiment bizarre, c'est pourquoi je suis tellement perdu. S'il est sur un rouleau en envoyant des messages valides, je peux réinitialiser/débrancher et cela fonctionnera encore. Si ça ne marche pas et que je fais la même chose, ça ne marchera pas encore.

Y a-t-il une chance que ce soit juste une sorte d'interférence à mon domicile?

+1

Plutôt que des liens externes vers un casier de fichiers Google, il peut être préférable d'afficher ces journaux Wireshark dans la question. Les informations essentielles peuvent-elles être affichées dans les captures d'écran? Nous avons tendance à décourager les casiers de fichiers, car leurs liens sont fragiles et s'ils meurent dans le futur, alors la question peut ne pas avoir beaucoup de sens sans elle. – halfer

Répondre

0

Chaque fois que j'entends parler d'un projet Arduino qui se bloque après un certain temps et que je vois la classe String, je m'en méfie tout de suite. Dans les anciennes versions de l'Arduino, il y avait une mauvaise fuite de mémoire. Les versions actuelles ont corrigé cette fuite mais laissent toujours le problème avec la concaténation. Fondamentalement, lorsque vous concaténez deux Strings, vous devez libérer l'emplacement en mémoire où ils se trouvaient et allouer un nouvel espace pour la plus grande chaîne. Si rien d'autre n'est passé sur le tas ou la pile depuis la dernière concaténation, cela ne pose peut-être pas de problème.

Mais ce qui se passe, c'est que quelqu'un est en train de construire deux cordes qui sont à la fois de plus en plus grandes. Et à chaque fois, il doit allouer de plus en plus cette mémoire dans la mémoire, en laissant des trous où se trouvaient les plus petites chaînes. Finalement, le tas ressemble à du fromage suisse et il n'y a pas de ramassage des ordures à venir et à défragmenter. Après que le projet a fonctionné correctement pendant un certain temps, soudainement le tas et la pile se sont réunis et il est éteint.Je ne sais pas s'il existe une fonction comme freemem pour l'Arduino qui fonctionne pour l'ESP8266, mais il serait intéressant de trouver un moyen de déterminer la quantité de mémoire libre dont vous disposez. Si elle diminue progressivement à 0 alors que le programme s'exécute, vous avez trouvé votre problème.

+0

J'aimerais que ce soit ça. Une autre information que j'aurais dû ajouter est que si elle n'envoie pas de messages valides, je peux réinitialiser l'esp et cela ne fonctionnera toujours pas. C'est vraiment bizarre, c'est pourquoi je suis tellement perdu. S'il est sur un rouleau en envoyant des messages valides, je peux réinitialiser/débrancher et cela fonctionnera encore. Si ça ne marche pas et que je fais de même, ça ne marchera pas encore ... –