package eu.hgross.blaubot.websocket; import java.util.Arrays; import eu.hgross.blaubot.core.Blaubot; import eu.hgross.blaubot.core.BlaubotAdapterConfig; import eu.hgross.blaubot.core.BlaubotDevice; import eu.hgross.blaubot.core.BlaubotFactory; import eu.hgross.blaubot.core.ConnectionStateMachineConfig; import eu.hgross.blaubot.core.IBlaubotAdapter; import eu.hgross.blaubot.core.IBlaubotConnection; import eu.hgross.blaubot.core.IBlaubotDevice; import eu.hgross.blaubot.core.acceptor.ConnectionMetaDataDTO; import eu.hgross.blaubot.core.acceptor.IBlaubotConnectionAcceptor; import eu.hgross.blaubot.core.acceptor.IBlaubotIncomingConnectionListener; import eu.hgross.blaubot.core.acceptor.discovery.BlaubotBeaconStore; import eu.hgross.blaubot.core.connector.IBlaubotConnector; public class BlaubotWebsocketAdapter implements IBlaubotAdapter { /** * The path for the web socket handshake */ public static final String WEBSOCKET_PATH = "/blaubot"; /** * The max allowable websocket frame size. Above this limits, connections will be disconnected. * Note: This limit exists because it is a big gate for DoS attacks and is usually much lower by * default, then used by blaubot. */ public static final int MAX_WEBSOCKET_FRAME_SIZE = Integer.MAX_VALUE; /** * The request parameter name for the unique device id when connecting to WEBSOCKET_PATH */ public static final String URI_PARAM_UNIQUEDEVICEID = "uniqueDeviceId"; private static final int KING_TIMEOUT_WITHOUT_PEASANTS = 10000; private static final int CROWNING_PREPARATION_TIME_FACTOR = 3; private final BlaubotWebsocketConnector connector; private final BlaubotWebsocketAcceptor acceptor; private final BlaubotAdapterConfig adapterConfig; private final ConnectionStateMachineConfig connectionStateMachineConfig; private Blaubot blaubot; /** * * @param ownDevice our own device * @param hostAddress the own host address (interfaces to bind to) * @param acceptorPort the acceptor port to use (to open the websocket server on) */ public BlaubotWebsocketAdapter(IBlaubotDevice ownDevice, String hostAddress, int acceptorPort) { this.connector = new BlaubotWebsocketConnector(this, ownDevice); this.acceptor = new BlaubotWebsocketAcceptor(this, hostAddress, acceptorPort); this.adapterConfig = new BlaubotAdapterConfig(); this.connectionStateMachineConfig = new ConnectionStateMachineConfig(); this.connectionStateMachineConfig.setCrowningPreparationTimeout(CROWNING_PREPARATION_TIME_FACTOR * adapterConfig.getKeepAliveInterval()); this.connectionStateMachineConfig.setKingWithoutPeasantsTimeout(KING_TIMEOUT_WITHOUT_PEASANTS); ConnectionStateMachineConfig.validateTimeouts(connectionStateMachineConfig, adapterConfig); } @Override public IBlaubotConnector getConnector() { return connector; } @Override public IBlaubotConnectionAcceptor getConnectionAcceptor() { return acceptor; } @Override public void setBlaubot(Blaubot blaubotInstance) { this.blaubot = blaubotInstance; } @Override public Blaubot getBlaubot() { return blaubot; } @Override public ConnectionStateMachineConfig getConnectionStateMachineConfig() { return connectionStateMachineConfig; } @Override public BlaubotAdapterConfig getBlaubotAdapterConfig() { return adapterConfig; } public static void main(String[] args) { // server device WebsocketConnectionMetaDataDTO serverDto = new WebsocketConnectionMetaDataDTO("localhost", "/websocket", 8080); BlaubotDevice serverDevice = new BlaubotDevice("server1"); BlaubotBeaconStore beaconStore = new BlaubotBeaconStore(); beaconStore.putConnectionMetaData("server1", Arrays.asList(new ConnectionMetaDataDTO[]{serverDto})); String hostAddress = BlaubotFactory.getLocalIpAddress().getHostAddress(); BlaubotWebsocketAdapter adapter = new BlaubotWebsocketAdapter(serverDevice, hostAddress, 8080); IBlaubotConnectionAcceptor connectionAcceptor = adapter.getConnectionAcceptor(); connectionAcceptor.setAcceptorListener(new IBlaubotIncomingConnectionListener() { @Override public void onConnectionEstablished(IBlaubotConnection connection) { System.out.println("Got connection: " + connection); } }); connectionAcceptor.startListening(); IBlaubotConnector connector = adapter.getConnector(); IBlaubotConnection connectorResult = connector.connectToBlaubotDevice(serverDevice); System.out.println("Connector got connection: " + connectorResult); } }