|
|
@ -1,10 +1,5 @@ |
|
|
package com.thing.transport.mqtt.broker; |
|
|
package com.thing.transport.mqtt.broker; |
|
|
|
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_ACCEPTED; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttMessageType.*; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttQoS.*; |
|
|
|
|
|
|
|
|
|
|
|
import com.thing.common.core.enumeration.GateWayStatus; |
|
|
import com.thing.common.core.enumeration.GateWayStatus; |
|
|
import com.thing.gen.queue.QueueProto.SessionInfoProto; |
|
|
import com.thing.gen.queue.QueueProto.SessionInfoProto; |
|
|
import com.thing.gen.queue.QueueProto.TransportMsg; |
|
|
import com.thing.gen.queue.QueueProto.TransportMsg; |
|
|
@ -12,29 +7,33 @@ import com.thing.transport.api.TransportService; |
|
|
import com.thing.transport.api.TransportServiceCallback; |
|
|
import com.thing.transport.api.TransportServiceCallback; |
|
|
import com.thing.transport.api.adaptor.AdaptorException; |
|
|
import com.thing.transport.api.adaptor.AdaptorException; |
|
|
import com.thing.transport.api.session.TransportSessionUtil; |
|
|
import com.thing.transport.api.session.TransportSessionUtil; |
|
|
|
|
|
import com.thing.transport.modules.dto.ThingModelInfo; |
|
|
|
|
|
import com.thing.transport.modules.mapper.MqttBrokerMsgMapper; |
|
|
import com.thing.transport.mqtt.broker.adaptors.MqttTransportAdaptor; |
|
|
import com.thing.transport.mqtt.broker.adaptors.MqttTransportAdaptor; |
|
|
import com.thing.transport.mqtt.broker.session.DeviceSessionCtx; |
|
|
import com.thing.transport.mqtt.broker.session.DeviceSessionCtx; |
|
|
import com.thing.transport.mqtt.broker.session.MqttTopicMatcher; |
|
|
import com.thing.transport.mqtt.broker.session.MqttTopicMatcher; |
|
|
|
|
|
|
|
|
import io.netty.channel.ChannelHandlerContext; |
|
|
import io.netty.channel.ChannelHandlerContext; |
|
|
import io.netty.channel.ChannelInboundHandlerAdapter; |
|
|
import io.netty.channel.ChannelInboundHandlerAdapter; |
|
|
import io.netty.handler.codec.mqtt.*; |
|
|
import io.netty.handler.codec.mqtt.*; |
|
|
import io.netty.util.ReferenceCountUtil; |
|
|
import io.netty.util.ReferenceCountUtil; |
|
|
import io.netty.util.concurrent.Future; |
|
|
import io.netty.util.concurrent.Future; |
|
|
import io.netty.util.concurrent.GenericFutureListener; |
|
|
import io.netty.util.concurrent.GenericFutureListener; |
|
|
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
|
|
|
|
|
|
import org.apache.commons.lang3.ObjectUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
|
|
|
|
import java.net.InetSocketAddress; |
|
|
import java.net.InetSocketAddress; |
|
|
import java.util.ArrayList; |
|
|
import java.util.ArrayList; |
|
|
import java.util.List; |
|
|
import java.util.List; |
|
|
import java.util.Optional; |
|
|
|
|
|
import java.util.UUID; |
|
|
import java.util.UUID; |
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
import java.util.concurrent.ConcurrentMap; |
|
|
import java.util.concurrent.ConcurrentMap; |
|
|
|
|
|
|
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_ACCEPTED; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttMessageType.*; |
|
|
|
|
|
import static io.netty.handler.codec.mqtt.MqttQoS.*; |
|
|
|
|
|
|
|
|
@Slf4j |
|
|
@Slf4j |
|
|
public class MqttTransportHandler extends ChannelInboundHandlerAdapter implements GenericFutureListener<Future<? super Void>> { |
|
|
public class MqttTransportHandler extends ChannelInboundHandlerAdapter implements GenericFutureListener<Future<? super Void>> { |
|
|
|
|
|
|
|
|
@ -44,9 +43,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
|
|
private final MqttTransportContext context; |
|
|
private final MqttTransportContext context; |
|
|
private final MqttTransportAdaptor adaptor; |
|
|
private final MqttTransportAdaptor adaptor; |
|
|
private final TransportService transportService; |
|
|
private final TransportService transportService; |
|
|
// private final ThingService thingService; |
|
|
|
|
|
private final ConcurrentMap<MqttTopicMatcher, Integer> mqttQoSMap; |
|
|
private final ConcurrentMap<MqttTopicMatcher, Integer> mqttQoSMap; |
|
|
|
|
|
|
|
|
|
|
|
private final MqttBrokerMsgMapper brokerMsgMapper; |
|
|
private volatile SessionInfoProto sessionInfo; |
|
|
private volatile SessionInfoProto sessionInfo; |
|
|
private final DeviceSessionCtx deviceSessionCtx; |
|
|
private final DeviceSessionCtx deviceSessionCtx; |
|
|
|
|
|
|
|
|
@ -54,8 +52,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
|
|
this.sessionId = UUID.randomUUID(); |
|
|
this.sessionId = UUID.randomUUID(); |
|
|
this.context = context; |
|
|
this.context = context; |
|
|
this.transportService = context.getTransportService(); |
|
|
this.transportService = context.getTransportService(); |
|
|
// this.thingService = context.getThingService(); |
|
|
|
|
|
this.adaptor = context.getAdaptor(); |
|
|
this.adaptor = context.getAdaptor(); |
|
|
|
|
|
this.brokerMsgMapper= context.getBrokerMsgMapper(); |
|
|
this.mqttQoSMap = new ConcurrentHashMap<>(); |
|
|
this.mqttQoSMap = new ConcurrentHashMap<>(); |
|
|
this.deviceSessionCtx = new DeviceSessionCtx(sessionId, mqttQoSMap); |
|
|
this.deviceSessionCtx = new DeviceSessionCtx(sessionId, mqttQoSMap); |
|
|
} |
|
|
} |
|
|
@ -191,23 +189,23 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
|
|
String clientId = msg.payload().clientIdentifier(); |
|
|
String clientId = msg.payload().clientIdentifier(); |
|
|
String clientIp = ctx.pipeline().channel().remoteAddress().toString(); |
|
|
String clientIp = ctx.pipeline().channel().remoteAddress().toString(); |
|
|
log.info("[{}] Processing connect msg for client with user name: {}! ==连接IP==>{}", sessionId, userName, clientIp); |
|
|
log.info("[{}] Processing connect msg for client with user name: {}! ==连接IP==>{}", sessionId, userName, clientIp); |
|
|
// Optional<ThingModel> optional = thingService.getByToken(userName); |
|
|
|
|
|
// if (optional.isPresent()) { |
|
|
|
|
|
// connectSuccess(ctx, userName, clientId, clientIp, optional.get()); |
|
|
|
|
|
// } else { |
|
|
|
|
|
// log.info("[{}] connection refused bad username or password user name: {}!", sessionId, userName); |
|
|
|
|
|
// ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD)); |
|
|
|
|
|
// ctx.close(); |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
ThingModelInfo optional = brokerMsgMapper.findModelByToken(userName); |
|
|
|
|
|
if (ObjectUtils.isNotEmpty(optional)) { |
|
|
|
|
|
connectSuccess(ctx, userName, clientId, clientIp, optional); |
|
|
|
|
|
} else { |
|
|
|
|
|
log.info("[{}] connection refused bad username or password user name: {}!", sessionId, userName); |
|
|
|
|
|
ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD)); |
|
|
|
|
|
ctx.close(); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// private void connectSuccess(ChannelHandlerContext ctx, String userName, String clientId, String clientIp, ThingModel thingModel) { |
|
|
|
|
|
// deviceSessionCtx.setConnected(true); |
|
|
|
|
|
// sessionInfo = TransportSessionUtil.createSession(sessionId, thingModel.getCode(), thingModel.getGateway(), |
|
|
|
|
|
// clientId, userName, StringUtils.stripStart(clientIp, "/"), System.currentTimeMillis()); |
|
|
|
|
|
// transportService.registerSession(sessionInfo); |
|
|
|
|
|
// ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_ACCEPTED)); |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
private void connectSuccess(ChannelHandlerContext ctx, String userName, String clientId, String clientIp, ThingModelInfo thingModel) { |
|
|
|
|
|
deviceSessionCtx.setConnected(true); |
|
|
|
|
|
sessionInfo = TransportSessionUtil.createSession(sessionId, thingModel.getCode(), thingModel.getGateway(), |
|
|
|
|
|
clientId, userName, StringUtils.stripStart(clientIp, "/"), System.currentTimeMillis()); |
|
|
|
|
|
transportService.registerSession(sessionInfo); |
|
|
|
|
|
ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_ACCEPTED)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private boolean checkConnected(ChannelHandlerContext ctx, MqttMessage msg) { |
|
|
private boolean checkConnected(ChannelHandlerContext ctx, MqttMessage msg) { |
|
|
|