#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. @Мичи да, я нашел это. Я был очень занят, и у меня не было времени написать решение. Я скоро опубликую его!