首页 > 解决方案 > 如何解决来自 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();

标签: c++ruby-on-railsjsonarduinonetwork-programming

解决方案


尝试更换

  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()


推荐阅读