如何解决来自 arduino 的 post 请求的问题,在失败之前只收到 2-3 次
How to fix issue with post requests from arduino, only being received 2-3 times before failing
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()
等。
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 我应该如何在C++中使用结构体解决输入失败的问题?
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 查找在 4 和问题中代码失败的测试用例
- exteranl原生构建问题,构建命令失败,android工作室
- build命令失败,外部原生问题android工作室
- C ++回测问题:如何检查构造函数在假定失败时是否失败(给定输入的无效参数)
- 断言失败错误,C++中的矢量下标超出范围问题
- 如何解决来自 arduino 的 post 请求的问题,在失败之前只收到 2-3 次
- TFS构建由于链接问题而失败
- 班级路径问题 - getJnienv失败了
- 由于libkern.h中的语义问题,Xcode Build失败
- C++ 运行失败:退出值 2 - 我的代码出了什么问题?
- 我遇到此问题,运行程序时出现一个弹出窗口,指出调试断言失败
- 断言在C++问题中失败
- 生成文件问题,获取"目标'rgbapixel.o'的配方失败"
- 使用快速英特尔随机生成器(SSE2)会因堆栈问题而失败..已损坏
- C++将节点添加到链表的开头一次后失败.其他方法也有问题
- 失败错误处理问题
- Xcode 链接器命令失败问题