Невозможно подключить ESP32 (как клиент) с помощью spring boot с помощью WebSockets

#spring-boot #websocket #esp32

#spring-boot #веб- сокет #esp32

Вопрос:

Я пытаюсь подключить свой esp32 к своему приложению spring boot с помощью websockets. ESP32 является клиентом, а приложение SpringBoot — сервером.

Я добавил зависимость maven в свой pom.xml вот так:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
 

И я настроил брокер сообщений следующим образом:

 import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/esp");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/gs-guide-websocket").withSockJS();
    }
}
 

Когда я запускаю приложение spring boot, кажется, что все правильно, ошибок или сбоев нет.

Теперь сторона ESP32. Вот код, который я использую:

 #include <Arduino.h>
#include <WiFi.h>
#include <WebSocketsClient.h>

const char* ssid = "*****";
const char* password = "*****";

const char* serverAddress = "server_address";
const int serverPort = server_port;
const char* stompEndpoint = "/gs-guide-websocket";

WebSocketsClient webSocket;

void setup() {
  Serial.begin(115200);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  webSocket.begin(serverAddress, serverPort, stompEndpoint);

  webSocket.onEvent(webSocketEvent);

  webSocket.setReconnectInterval(5000);

  webSocket.enableHeartbeat(15000, 3000, 2);
}

void loop() {
  webSocket.loop();
}

void webSocketEvent(WStype_t type, uint8_t * payload, size_t len) {
  switch(type) {
    case WStype_DISCONNECTED:
      Serial.printf("[WSc] Disconnected!n");
      break;
      
    case WStype_CONNECTED:
      Serial.printf("[WSc] Connected to url: %sn", payload);
      break;
      
    case WStype_TEXT:
      Serial.printf("[WSc] get text: %sn", payload);
      break;
      
    case WStype_BIN:
      Serial.printf("[WSc] get binary length: %un", len);
      break;
      
    case WStype_PING:
      Serial.printf("[WSc] get pingn");
      break;
      
    case WStype_PONG:
      Serial.printf("[WSc] get pongn");
      break;
      
    }

}
 

(адрес сервера и порт сервера правильно настроены в моем коде, а также учетные данные wifi)
Этот код компилируется правильно, и я запрограммировал его на ESP32.

При запуске ESP32 приложение spring boot отображает эту ошибку в консоли:

 : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [a]
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:559) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

2020-12-14 20:44:28.399  INFO 3756 --- [MessageBroker-1] o.s.w.s.c.WebSocketMessageBrokerStats    : WebSocketSession[0 current WS(0)-HttpStream(0)-HttpPoll(0), 0 total, 0 closed abnormally (0 connect failure, 0 send limit, 0 transport error)], stompSubProtocol[processed CONNECT(0)-CONNECTED(0)-DISCONNECT(0)], stompBrokerRelay[null], inboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], outboundChannel[pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0], sockJsScheduler[pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]

 

И ESP32 показывает в консоли, что Wc отключен. Я видел много руководств, но не могу решить эту проблему. Кто-нибудь может помочь? Спасибо!

Вот библиотека, которую я использую: https://github.com/Links2004/arduinoWebSockets

Редактировать

Я также пытался вставить webSocket.setExtraHeaders(); ESP32 и тоже не работал.

Комментарии:

1. Нашли ли вы решение своей проблемы? Было бы здорово, если бы вы поделились этим здесь. Спасибо!

2. @Мичи да, я нашел это. Я был очень занят, и у меня не было времени написать решение. Я скоро опубликую его!