nodeMCU

时间:2019-06-16 22:53:03

标签: c++ https arduino nodemcu

我正在尝试在nodeMCU和远程服务器之间建立持久连接,因为我将使用该连接每2秒将其发布到远程服务器。重新连接的成本大约为400毫秒,在我看来,这太多了。

我曾经在设置功能内运行连接代码段

 int r=0; 
 while((!httpsClient.connect(host, httpsPort)) && (r < 30))
{
 delay(100);
 Serial.print(".");
 r++;
}
Serial.println("");
if(r==30) {
 Serial.println("Connection failed");
}
else {
 Serial.println("Connected to web");
}

然后在while循环中,每隔2秒左右运行一次https post方法。

httpsClient.print(String("POST ") + "/post HTTP/1.1\r\n" +
           "Host: " + host + "\r\n" +
           "Content-Type: application/json"+ "\r\n" +
           "Content-Length: "+String(measureJson(doc)+2) + "\r\n\r\n" );
serializeJson(doc, JSONmessageBuffer);
httpsClient.print(JSONmessageBuffer);
httpsClient.print("\r\nConnection: keep-alive\r\n\r\n");

但是很遗憾,我只能发送一次包裹,并且连接会自动关闭。您能指出我应该如何建立持久HTTPS连接的方向吗?

1 个答案:

答案 0 :(得分:2)

我认为问题是您有

httpsClient.print("\r\nConnection: keep-alive\r\n\r\n");

在错误的位置。它应该包含在请求标头中-而不是在请求正文之后。到发送Connection: keep-alive行时,您已经发送了Content-Length:标头中指定长度的数据。服务器将其视为新的HTTP请求(尽管请求格式错误),因此关闭了TCP连接。

您也许可以检查HTTP服务器日志以进行验证。例如,如果您的服务器是Apache,则可能会看到包含

的行
  

“连接:保持活动状态” 400

也就是说,服务器已将您的Connection: keep-alive行解释为一个单独的请求。 400表示Bad request

实际上...您可能可以完全删除Connection: keep-alive-因为在HTTP 1.1中默认情况下连接是持久的。