.childHandler(new MqttTransportServerInitializer(maxPayloadSize));
// 绑定端口,并同步等待成功,即启动服务端
try {
channelFuture = b.bind(port).sync();
status = true;
} catch (InterruptedException e) {
log.error("Server starting error");
status = false;
}
log.info("Server started!");
}
@Override
public void shutdown() {
log.info("Stopping Server");
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
status = false;
log.info("server stopped!");
}
@Override
public Boolean status() {
return this.status;
}
}
##### 消息处理
当netty接收到设备上行消息之后,进行解析处理,将消息广播到消息总线,后续设备订阅消息总线中的内容,再进行业务处理。
package com.soft863.gateway.mqtt;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.mqtt.MqttDecoder;
import io.netty.handler.codec.mqtt.MqttEncoder;
/**
* @Author: 刘华林
* @Date: 19-4-3 下午3:26
* @Version 1.0
*/
public class MqttTransportServerInitializer extends ChannelInitializer {
private final int maxPayloadSize;
public MqttTransportServerInitializer(int maxPayloadSize) {
this.maxPayloadSize = maxPayloadSize;
}
@Override
protected void initChannel(SocketChannel socketChannel) {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast("decoder", new MqttDecoder(maxPayloadSize));
pipeline.addLast("encoder", MqttEncoder.INSTANCE);
MqttTransportHandler handler = new MqttTransportHandler();
pipeline.addLast(handler);
socketChannel.closeFuture().addListener(handler);
}
}
package com.soft863.gateway.mqtt;
import com.alibaba.fastjson.JSON;
import com.soft863.gateway.DeviceInstance;
import com.soft863.gateway.auth.DeviceAuthenticator;
import com.soft863.gateway.matcher.TopicMatcher;
import com.soft863.gateway.message.DefaultDeviceMsg;
import com.soft863.gateway.message.Message;
import com.soft863.gateway.message.codec.DefaultTransport;
import com.soft863.gateway.message.codec.FromDeviceMessageContext;
import com.soft863.gateway.message.codec.mqtt.SimpleMqttMessage;
import com.soft863.gateway.mqtt.adapter.JsonMqttAdaptor;
import com.soft863.gateway.protocol.DeviceMessageCodec;
import com.soft863.gateway.protocol.ProtocolSupport;
import com.soft863.gateway.registry.DeviceSession;
import com.soft863.gateway.registry.MemoryProtocolSupportRegistry;
import com.soft863.gateway.tsl.adaptor.AdaptorException;
import com.soft863.gateway.util.ApplicationUtil;
import com.soft863.stream.core.eventbus.EventBus;
import com.soft863.stream.core.eventbus.message.AdapterMessage;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.mqtt.*;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import lombok.extern.slf4j.Slf4j;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.u