ESP8266发布请求失败

时间:2017-05-21 23:39:32

标签: arduino wifi esp8266 arduino-esp8266

我在这里犹豫不决;我做了an issue on GitHub,我真的需要解决它。

基本上,我每隔15秒就会向dweetPro发送帖子。它可以完美地工作几个小时,然后只是随机地停止,每20个失败的响应发送一个成功的。

我已经尝试了所有我能想到的东西,我非常确定我的代码是正确的,不确定它是否与库有什么关系。我可以无限期地在我的电脑上发送Python的帖子而且永远不会失败,所以它肯定在ESP的一面。

我使用干净的2A电源,所以它不是电源问题。

以下是来自ESP发送帖子的几个Wireshark日志的链接。有效和无效都在他们身上。

One

Two

有关GitHub问题的更多信息。这是我使用的代码,使用了调试行:

  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");
}

成功后,s打印200,失败时打印-1。

在Wireshark上,每个成功的帖子都会显示数据,但是对于不成功的帖子,它会显示前几个失败的帖子的一些数据,然后它就会停止。它就像是超载本身或其他东西。

再一次,抱歉这个问题的集群,但我不知道还能做什么。我花了很多时间在这上面,看不到尽头。非常感谢你们。

编辑:我应该添加的其他一些信息是,如果它没有发送有效的帖子,我可以重置ESP,它仍然无法正常工作。这真的很奇怪,这就是为什么我如此不知所措。如果它是在发送有效帖子的滚动,我可以重置/拔掉它,它仍然会工作。如果它不起作用而我也这样做,它就不会工作。

在我家的位置是否有可能产生某种干扰?

1 个答案:

答案 0 :(得分:0)

任何时候我都听说Arduino项目在一段时间后崩溃了,我看到了String类,我立刻就对它产生了怀疑。在旧版本的Arduino中,它有一个讨厌的内存泄漏。当前版本修复了泄漏但仍然存在串联问题。基本上,当你连接两个字符串时,它必须在内存中释放它们所在的位置,并为较大的字符串分配新的空间。如果自上次连接以来堆或堆栈上没有其他任何内容,那么这可能不是问题。

但是,有人正在构建两个越来越大的字符串。并且每次必须在存储器中进一步分配内存时,留下较小字符串曾经存在的空洞。最终,堆看起来像瑞士奶酪,并且没有垃圾收集通过并对其进行碎片整理。在项目运行良好一段时间之后,突然堆和堆栈聚集在一起并且它熄灭了。

我不知道对于适用于ESP8266的Arduino是否有类似freemem的功能,但是找到一种方法来找出你有多少可用内存是值得的。如果它在程序运行时稳步缩小到0,那么你就找到了问题所在。