【问题标题】:ESP8266 failing post requestsESP8266 发布请求失败
【发布时间】:2017-05-21 23:39:32
【问题描述】:

我不想在这里问这个问题;我已经an issue on GitHub,我真的需要解决它。

基本上,我每 15 秒向 dweetPro 发送一次帖子。它可以完美运行数小时,然后随机停止,每 20 个失败的响应发送一个成功的响应。

我已经尝试了所有我能想到的东西,我很确定我的代码是正确的,但不确定它是与库有关还是什么。我可以在我的 PC 上无限期地从 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,但它仍然无法工作。真的很奇怪,所以我很茫然。如果它正在发送有效帖子,我可以重置/拔掉它,它仍然可以工作。如果它不工作而我做同样的事情,它就不会继续工作。

有没有可能只是我家的某种干扰?

【问题讨论】:

  • 最好在问题中显示这些 Wireshark 日志,而不是指向 Google 文件柜的外部链接。可以在屏幕截图中显示基本信息吗?我们倾向于不鼓励文件柜,因为它们的链接很脆弱,如果它们将来死掉,那么如果没有它,这个问题可能就没有多大意义。

标签: arduino wifi esp8266 arduino-esp8266


【解决方案1】:

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

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

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

【讨论】:

  • 我希望是这样。我应该添加的其他一些信息是,如果它没有发送有效的帖子,我可以重置 esp,它仍然无法正常工作。真的很奇怪,所以我很茫然。如果它正在发送有效帖子,我可以重置/拔掉它,它仍然可以工作。如果它不工作而我做同样的事情,它就不会工作了..
猜你喜欢
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2013-02-02
相关资源
最近更新 更多