MQTT over WebSockets using Netty?

I want to use MQTT over Websockets. In Netty, using Websockets is pretty simple:

ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast("codec-http", new HttpServerCodec());
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
pipeline.addLast("handler", new WebSocketServerHandler());

I found a MQTT (moquette) broker that is based on Netty.

 NettyMQTTHandler handler = new NettyMQTTHandler();
 ServerBootstrap b = new ServerBootstrap();
            b.group(m_bossGroup, m_workerGroup)
             .channel(NioServerSocketChannel.class) 
             .childHandler(new ChannelInitializer<SocketChannel>() { 
                 @Override
                 public void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline pipeline = ch.pipeline();
                    //pipeline.addFirst("metrics", new BytesMetricsHandler(m_metricsCollector));
                    pipeline.addFirst("idleStateHandler", new IdleStateHandler(0, 0, Constants.DEFAULT_CONNECT_TIMEOUT));
                    pipeline.addAfter("idleStateHandler", "idleEventHandler", new MoquetteIdleTimoutHandler());
                    //pipeline.addLast("logger", new LoggingHandler("Netty", LogLevel.ERROR));
                    pipeline.addLast("decoder", new MQTTDecoder());
                    pipeline.addLast("encoder", new MQTTEncoder());
                    pipeline.addLast("metrics", new MessageMetricsHandler(m_metricsCollector));
                    pipeline.addLast("handler", handler);
                 }
             })
             .option(ChannelOption.SO_BACKLOG, 128)
             .option(ChannelOption.SO_REUSEADDR, true)
             .childOption(ChannelOption.SO_KEEPALIVE, true); 

So, in theory, I would have to send MQTT on top of Websocket, but I have no idea if Netty is possible? Are there any tips or ideas on how to do this? Should I use MessageToMessageCodec and BinaryWebSocketFrame?

Hooray!

+4
source share
1 answer

Let me assume that your MQTTDecoderconsumes ByteBufand creates some objects of the MQTT message, and MQTTEncoderdoes the opposite, which usually happens.

, ByteBuf , Web Socket. Web Socket. :

  • A MessageToMessageDecoder, ( ) WebSocket ByteBuf, MQTTDecoder . - Web Socket.
  • A MessageToMessageEncoder, a ByteBuf ( ) -, Netty WebSocketFrameEncoder . - ByteBuf, MQTTEncoder, -.

:

  • HttpResponseEncoder
  • HttpRequestDecoder
  • HttpObjectAggregator(65536)
  • WebSocketServerProtocolHandler("/your-websocket-endpoint-path")
  • WebSocketFrameToByteBufDecoder extends MessageToMessageDecoder
  • ByteBufToWebSocketFrameEncoder extends MessageToMessageEncoder
  • MQTTEncoder
  • MQTTDecoder
  • MessageMetricsHandler
  • handler

WebSocketServerProtocolHandler - WebSocketFrameEncoder WebSocketFrameDecoder WebSocketFrameToByteBufDecoder. :

  • WebSocketFrameEncoder
  • WebSocketFrameDecoder
  • WebSocketFrameToByteBufDecoder extends MessageToMessageDecoder
  • ByteBufToWebSocketFrameEncoder extends MessageToMessageEncoder
  • MQTTEncoder
  • MQTTDecoder
  • MessageMetricsHandler
  • handler
+6

Source: https://habr.com/ru/post/1532018/


All Articles