diff --git a/broker/config/moquette.conf b/broker/config/moquette.conf
index d50351c7..0835f78e 100644
--- a/broker/config/moquette.conf
+++ b/broker/config/moquette.conf
@@ -7,6 +7,8 @@
port 1883
+websocket_port 8080
+
host 0.0.0.0
password_file config/password_file.conf
diff --git a/broker/pom.xml b/broker/pom.xml
index 93a3868f..d5d17aa1 100644
--- a/broker/pom.xml
+++ b/broker/pom.xml
@@ -99,6 +99,12 @@
4.0.8.Final
+
+ io.netty
+ netty-codec-http
+ 4.0.8.Final
+
+
org.fusesource.hawtbuf
hawtbuf
@@ -139,6 +145,13 @@
0.4.0
test
+
+
+ org.eclipse.jetty.websocket
+ websocket-client
+ 9.2.0.M1
+ test
+
diff --git a/broker/src/main/java/org/dna/mqtt/moquette/server/ConfigurationParser.java b/broker/src/main/java/org/dna/mqtt/moquette/server/ConfigurationParser.java
index 845bbee4..eb3f9c4f 100644
--- a/broker/src/main/java/org/dna/mqtt/moquette/server/ConfigurationParser.java
+++ b/broker/src/main/java/org/dna/mqtt/moquette/server/ConfigurationParser.java
@@ -29,6 +29,7 @@ class ConfigurationParser {
ConfigurationParser() {
m_properties.put("port", Integer.toString(Constants.PORT));
m_properties.put("host", Constants.HOST);
+ m_properties.put("websocket_port", Integer.toString(Constants.WEBSOCKET_PORT));
m_properties.put("password_file", "");
}
diff --git a/broker/src/main/java/org/dna/mqtt/moquette/server/Server.java b/broker/src/main/java/org/dna/mqtt/moquette/server/Server.java
index b207d96b..bf273583 100644
--- a/broker/src/main/java/org/dna/mqtt/moquette/server/Server.java
+++ b/broker/src/main/java/org/dna/mqtt/moquette/server/Server.java
@@ -26,7 +26,7 @@ public class Server {
final Server server = new Server();
server.startServer();
- System.out.println("Server started, version 0.5");
+ System.out.println("Server started, version 0.6-SNAPSHOT");
//Bind a shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
diff --git a/broker/src/main/java/org/dna/mqtt/moquette/server/netty/NettyAcceptor.java b/broker/src/main/java/org/dna/mqtt/moquette/server/netty/NettyAcceptor.java
index f0ad2a2d..ee529a3b 100644
--- a/broker/src/main/java/org/dna/mqtt/moquette/server/netty/NettyAcceptor.java
+++ b/broker/src/main/java/org/dna/mqtt/moquette/server/netty/NettyAcceptor.java
@@ -1,7 +1,9 @@
package org.dna.mqtt.moquette.server.netty;
import io.netty.bootstrap.ServerBootstrap;
+import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
+import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
@@ -9,10 +11,18 @@ import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import io.netty.handler.codec.MessageToMessageDecoder;
+import io.netty.handler.codec.MessageToMessageEncoder;
+import io.netty.handler.codec.http.HttpObjectAggregator;
+import io.netty.handler.codec.http.HttpRequestDecoder;
+import io.netty.handler.codec.http.HttpResponseEncoder;
+import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
+import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
+import io.netty.handler.timeout.IdleStateHandler;
import java.io.IOException;
-import io.netty.handler.timeout.IdleStateHandler;
+import java.util.List;
import java.util.Properties;
import org.dna.mqtt.commons.Constants;
import org.dna.mqtt.moquette.messaging.spi.IMessaging;
@@ -29,42 +39,73 @@ import org.slf4j.LoggerFactory;
*/
public class NettyAcceptor implements ServerAcceptor {
+ static class WebSocketFrameToByteBufDecoder extends MessageToMessageDecoder {
+
+ @Override
+ protected void decode(ChannelHandlerContext chc, BinaryWebSocketFrame frame, List