我正在使用一个ESP8266模块来推动感官数据在线。我将其设置为thingspeak,并使用一个简单的GET请求来发送值。
现在,我试图用巧妙的数据流服务复制这个过程,但我不知道我的请求有什么问题。
传统图书馆(Wifi,以太网等)具有打印到套接字的println()方法。我不得不为ESP实现自己的库,因为我找不到任何可靠的东西,并且注意到设备在向套接字发送东西之后经常会处于“忙”状态,这使得我无法像这样成片发送请求:
client.println("POST / HTTP/1.1")
client.println("Host: arduino.plot.ly")
client.println("{\"x\":15, \"y\": 3, \"streamtoken\": \"urqcbfmjot\"\"}")所以我试着一次写完请求。我通过跳入plotly的arduino图书库(依赖于Wifi来工作)找到了请求的参数(这就是为什么我不能在ESP中使用它)。到目前为止,我还没有提供任何数据。下面是用于发送请求的代码块:
void pushData(String temp, String humid, String pres, String lum)
{
bool status = esp8266.openTCPConnection(IP, PORT);
char call[] = "POST / HTTP/1.1\r\n";
strcat(call, "Host: arduino.plot.ly\r\n");
strcat(call, "User-Agent: Arduino\r\n");
strcat(call, "Transfer-Encoding: chunked\r\n");
strcat(call, "Connection: close\r\n");
strcat(call, "\r\n");
strcat(call, "\r\n{\"x\":15, \"y\": 3, \"streamtoken\": \"urqcbfmjot\"\"}\n\r\n");
if (!status) return;
esp8266.send(call);
}
void Esp8266::send(String content)
{
String cmd;
String msg = "Sent : ";
bool status;
printDebug("Writing to TCP connection");
printDebug("Content to write :");
printDebug(content);
cmd = "AT+CIPSEND=" + String(content.length());
espSerial.println(cmd);
printDebug("Sent : " + cmd);
status = checkResponse(">", 10);
if (status)
{
espSerial.print(content);
printDebug("Content sent");
} else {
printDebug("Cursor error");
closeTCPConnection();
}
}我可能补充说,我已经成功地用cUrl测试了他们的cUrl中提供的请求,但在我的实现中也失败了。请求是:
POST HTTP/1.1
Host: stream.plot.ly
plotly-streamtoken: urqcbfmjot
{ "x": 10, "y": 2 }任何帮助都将不胜感激。作为参考,这里是我的项目的存储库。
请随意使用我的图表进行测试。主机要么是stream.plot.ly (来自文档),要么是arduino.plot.ly (来自库)。我的流令牌是urqcbfmjot,这里是与情节的联系
发布于 2015-09-09 23:47:10
您需要用分块格式发送数据。
POST / HTTP/1.1
Host: stream.plot.ly
Transfer-Encoding: chunked
plotly-streamtoken: urqcbfmjot
14
{ "x": 10, "y": 2 }使用单个数据更新的HTTP请求应该如下所示:
char call[] = "POST / HTTP/1.1\r\n";
strcat(call, "Host: stream.plot.ly\r\n");
strcat(call, "Transfer-Encoding: chunked\r\n");
strcat(call, "plotly-streamtoken: urqcbfmjot\r\n");
strcat(call, "\r\n");
strcat(call, "11\r\n"); // 11 is the length of the JSON string + "\n" in hexadecimal format
strcat(call, "{\"x\":15, \"y\": 3}\n\r\n");要发送另一个数据点,您不需要进行另一个连接。如果将现有的流连接保持为打开状态,则只需发送下一个块即可。
esp8266.send("12\r\n{\"x\":30, \"y\": 10}\n\r\n");但根据文件,
客户端停止写入数据的时间超过一分钟。如果一分钟过去而没有从客户端接收任何数据,则流连接将被关闭。(可以通过在60秒窗口内写入心跳来维护连接,心跳只是一个换行符)。
如果您在一分钟内没有发送任何内容,服务器将关闭连接。如果您不需要立即发送任何内容,您可以使用一个新的行字符"1\r\n\n\r\n"发送一个块。
但是,如果连接由于任何其他原因而下降并试图重新连接,则可能仍然需要检测断开连接。
https://stackoverflow.com/questions/32404231
复制相似问题