Постоянное соединение https на nodeMCU - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь создать постоянное соединение между моим 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 я запускаю метод https post каждые 2 секунды или около того.

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 Ответ

2 голосов
/ 17 июня 2019

Я думаю, проблема в том, что у вас

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.

...