c++ - nodeMCU 上的持久 https 连接

标签 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 连接的方向吗?

最佳答案

我认为问题是你有

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

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

您可以检查 HTTP 服务器日志来验证这一点。例如,如果您的服务器是 Apache,您可能会看到一行包含

"Connection: Keep-alive" 400

即,服务器已将您的 Connection: keep-alive 行解释为单独的请求。 400 表示 错误请求

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

关于c++ - nodeMCU 上的持久 https 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56623168/

相关文章:

c++ - tensorflow C++ API 中的 float 据类型

c++ - 从 nvprof 输出计算内存带宽的奇怪结果

c# - 如何从 .net 控制台应用程序调用 HTTPS Web 服务方法?

r - 忽略R httr连接中的SSL错误

c++ - 如何减少逻辑表达式?

c++ - 对嵌套结构单链和双链进行排序

ssl - 打开 HTTPS 页面时的浏览器步骤

安卓蓝牙应用

Arduino LED 不闪烁

arduino - Arduino 支持哪些 CPU?