节点MCU上的持久https连接



>我正在尝试在我的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.1rn" +
           "Host: " + host + "rn" +
           "Content-Type: application/json"+ "rn" +
           "Content-Length: "+String(measureJson(doc)+2) + "rnrn" );
serializeJson(doc, JSONmessageBuffer);
httpsClient.print(JSONmessageBuffer);
httpsClient.print("rnConnection: keep-alivernrn");

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

我认为问题是你有

httpsClient.print("rnConnection: keep-alivernrn");

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

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

"连接:保持活动状态" 400

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

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

最新更新