Zur der Website werden Stomp-Websocket Nachrichten gesendet. Somit können sich mehrere Clients gleichzeitig auf den Roboter schalten und alle erhalten immer zur gleichen Zeit die aktuellen Sensorwerte. Durch die Websocket Verbindung ermöglicht dabei, das sich die Werde immer automatisch aktualisieren, ohne das dafür die Website immer wieder neu geladen werden muss.
Konfiguration des Websocket (Server):
package diy.robot.config;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
import diy.robot.domain.KeyMap.Direction;
import diy.robot.python.KeyMapValuesSenderToPython;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
implements ApplicationListener<SessionDisconnectEvent> {
@Override
public void configureMessageBroker(MessageBrokerRegistry messageBrokerRegistry) {
messageBrokerRegistry.enableSimpleBroker("/topic");
messageBrokerRegistry.setApplicationDestinationPrefixes("/app"); // "/app/direction"
}
@Override
public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/diy-robotws").withSockJS();
}
@Override
public void onApplicationEvent(SessionDisconnectEvent event) {
System.out.println("Someone disconnected from Website");
KeyMapValuesSenderToPython.sendPythonCommand(Direction.STOP, 0);
}
}
Entsprechend wird noch ein Client implementiert zum senden von Nachrichten. Die Nachrichten können dann von beliebigen Stellen im Java-Code aus gesendet werden.
package diy.robot.websocketClients;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import diy.robot.domain.SocketMessage;
public class StompWebSocketClient {
private static SimpMessageSendingOperations messagingTemplate;
public StompWebSocketClient(SimpMessageSendingOperations newMessagingTemplate) {
messagingTemplate = newMessagingTemplate;
}
public static void setMessagingTemplate(SimpMessageSendingOperations messagingTemplate) {
StompWebSocketClient.messagingTemplate = messagingTemplate;
}
public static void sendStompMessage(SocketMessage msg) throws Exception {
messagingTemplate.convertAndSend("/topic/stompMessage", msg);
}
}