我在这里犹豫不决;我做了an issue on GitHub,我真的需要解决它。
基本上,我每隔15秒就会向dweetPro发送帖子。它可以完美地工作几个小时,然后只是随机地停止,每20个失败的响应发送一个成功的。
我已经尝试了所有我能想到的东西,我非常确定我的代码是正确的,不确定它是否与库有什么关系。我可以无限期地在我的电脑上发送Python的帖子而且永远不会失败,所以它肯定在ESP的一面。
我使用干净的2A电源,所以它不是电源问题。
以下是来自ESP发送帖子的几个Wireshark日志的链接。有效和无效都在他们身上。
有关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,它仍然无法正常工作。这真的很奇怪,这就是为什么我如此不知所措。如果它是在发送有效帖子的滚动,我可以重置/拔掉它,它仍然会工作。如果它不起作用而我也这样做,它就不会工作。
在我家的位置是否有可能产生某种干扰?
答案 0 :(得分:0)
任何时候我都听说Arduino项目在一段时间后崩溃了,我看到了String类,我立刻就对它产生了怀疑。在旧版本的Arduino中,它有一个讨厌的内存泄漏。当前版本修复了泄漏但仍然存在串联问题。基本上,当你连接两个字符串时,它必须在内存中释放它们所在的位置,并为较大的字符串分配新的空间。如果自上次连接以来堆或堆栈上没有其他任何内容,那么这可能不是问题。
但是,有人正在构建两个越来越大的字符串。并且每次必须在存储器中进一步分配内存时,留下较小字符串曾经存在的空洞。最终,堆看起来像瑞士奶酪,并且没有垃圾收集通过并对其进行碎片整理。在项目运行良好一段时间之后,突然堆和堆栈聚集在一起并且它熄灭了。
我不知道对于适用于ESP8266的Arduino是否有类似freemem的功能,但是找到一种方法来找出你有多少可用内存是值得的。如果它在程序运行时稳步缩小到0,那么你就找到了问题所在。