c++ - 如何解决来自 arduino 的发布请求的问题,在失败前只收到 2-3 次
问题描述
编辑5:
我最终通过或多或少地丢弃了我的一半代码来解决这个问题。我现在不是使用 HTTP 将数据发送到 ruby 服务器,而是使用 MQTT 到代理到 NodeJS 服务器。这里的 NodeJS 部分并不重要,但对于遇到此问题的其他任何人,我强烈建议使用 MQTT 发送所有 IoT 数据,这就是解决我的问题的原因。
我目前正在尝试将从 Arduino WiFi rev2 上的传感器收集的数据发送到托管在 Heroku 上的 rails 服务器。我通过以 JSON 格式发送我的数据来做到这一点。我的问题是,虽然我的方法最初似乎有效,但前几个 POST 请求被接收并处理得很好,在 2-3 个请求之后,arduino 挂起,我收到状态码:-2。我正在使用 ArduinoHttpClient 库。
我尝试使用具有相同问题的本地服务器,以及通过 curl 和邮递员发送 POST 请求。curl 和 postman 似乎都按预期工作,所以我想问题出在 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 秒,我将从 Serial 收到“状态代码 -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:我意外地发现,如果省略“Content-Length:”标头,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());
使用该库中的方法时,您无需显式指定请求标头 - 或 callbeginRequest()
等。post()
推荐阅读
- python - 找到图像的中心来定义一个 hitbox
- python - 关于 np.nonzero(arr)[0] 中尾随 [0] 的作用的问题
- linux-kernel - filename_lookup.part.64 vs filename_lookup 符号
- python - 将 NumPy 数据流式传输到 Tensorflow
- javascript - 自定义钩子错误:只能在函数组件的主体内部调用钩子
- r - 将两个量化列绘制到一个 geom_col 图中
- nuxt.js - 如何从 nuxt 插件发出事件?
- node.js - Apollo Server v2 - 未调用 GraphQL 解析器
- c++ - 如果容量用完,编写私有函数来扩展数组
- machine-learning - 错误:“DimensionMismatch(”矩阵 A 的维度为(1024,10),向量 B 的长度为 9“)”在 Julia 中使用 Flux