如何解决来自 arduino 的 post 请求的问题,在失败之前只收到 2-3 次

How to fix issue with post requests from arduino, only being received 2-3 times before failing

本文关键字:失败 问题 请求 解决 何解决 post arduino      更新时间:2023-10-16

EDIT5:

我最终通过或多或少地扔掉一半的代码来解决这个问题。我现在不是使用 HTTP 将数据发送到 ruby 服务器,而是使用 MQTT 到代理到 NodeJS 服务器。这里的 NodeJS 部分并不重要,但对于遇到此问题的任何其他人来说,我强烈建议使用 MQTT 发送所有物联网数据,这就是解决我的问题的原因。

我目前正在尝试将从Arduino WiFi rev2上的传感器收集的数据发送到托管在Heroku上的rails服务器。我通过以 JSON 格式发送数据来做到这一点。我的问题是,虽然我的方法最初似乎有效,但前几个 POST 请求被接收和处理正常,但在 2-3 个请求后,arduino 挂起,我收到状态代码:-2。我正在使用ArduinoHttpClient库。

我尝试使用具有相同问题的本地服务器,以及通过 curl 和邮递员发送 POST 请求。curl 和邮递员似乎都按预期工作,所以我想问题出在 arduino 代码上,尽管我不确定。

client.beginRequest();
client.post("/input");
client.sendHeader("Content-Type", "application/json");
client.sendHeader("Content-Length", postData.length());
client.beginBody();
client.println(postData);
client.endRequest();
LED(0,128,0);
Serial.println("Gone");
int statusCode = client.responseStatusCode();
String response = client.responseBody();
Serial.print("Status code: ");
Serial.println(statusCode);
Serial.print("Response: ");
Serial.println(response);

当此代码失败时,arduino 将挂起大约 20-40 秒,我将从串行收到"状态代码 -3"。但是,我过去也收到过状态代码-2和-4。 当它成功时,我会收到以下内容:"状态代码:204",这是我所期望的。

编辑: 此后,我尝试发布到 requestcatcher.com,但问题仍然存在。因此,我相当有信心这是一个arduino问题,我还收到了以下输出:

POST /input HTTP/1.1
Host: arduino.requestcatcher.com
Connection: close
Connection: close
Content-Length: 88
Content-Type: application/json
User-Agent: Arduino/2.2.0

{"inputs":[{"input_id":"1","value":1.778002}{"input_id":"2","value":18.037}],"id":"13"}

编辑2: 我不小心发现,如果省略"内容长度:"标头,POST 请求会很好。显然,实际上没有发送JSON,因此这并不能解决我的问题,但很可能是此标头或JSON本身是问题所在。

编辑3: 无论服务器如何,我都会收到状态代码 -4 或 -3,即使在请求捕获器上也是如此。

编辑4: 经过各种调整,代码现在如下所示。这似乎有所帮助,并且失败的频率较低,但仍然失败。我开始怀疑这是否是ArduinoHttpClient的问题。

String postData = "";
serializeJson(doc, postData);
serializeJson(doc, Serial);
Serial.println(postData)
client.post("/input", "application/json", postData.c_str());
LED(0,128,0);
Serial.println("Gone");
int statusCode = client.responseStatusCode();
Serial.print("Status code: ");
Serial.println(statusCode);
client.stop();
doc.clear();
lastCycle = millis();

尝试替换

client.beginRequest();
client.post("/input");
client.sendHeader("Content-Type", "application/json");
client.sendHeader("Content-Length", postData.length());
client.beginBody();
client.println(postData);
client.endRequest();

用只是

String contentType = "application/json";
client.post("/input", contentType, postData);

client.post("/input", "application/json", postData.c_str());

使用该库中的post()方法时,无需显式指定请求标头或调用beginRequest()等。