@ -101,8 +101,6 @@ import static io.netty.handler.codec.mqtt.MqttMessageType.UNSUBACK;
import static io.netty.handler.codec.mqtt.MqttQoS.AT_LEAST_ONCE ;
import static io.netty.handler.codec.mqtt.MqttQoS.AT_MOST_ONCE ;
import static io.netty.handler.codec.mqtt.MqttQoS.FAILURE ;
import static org.thingsboard.server.common.data.device.profile.MqttTopics.DEVICE_FIRMWARE_REQUEST_TOPIC_PATTERN ;
import static org.thingsboard.server.common.data.device.profile.MqttTopics.DEVICE_SOFTWARE_REQUEST_TOPIC_PATTERN ;
/ * *
* @author Andrew Shvayka
@ -110,8 +108,8 @@ import static org.thingsboard.server.common.data.device.profile.MqttTopics.DEVIC
@Slf4j
public class MqttTransportHandler extends ChannelInboundHandlerAdapter implements GenericFutureListener < Future < ? super Void > > , SessionMsgListener {
private static final Pattern FW_REQUEST_PATTERN = Pattern . compile ( DEVICE_FIRMWARE_REQUEST_TOPIC_PATTERN ) ;
private static final Pattern SW_REQUEST_PATTERN = Pattern . compile ( DEVICE_SOFTWARE_REQUEST_TOPIC_PATTERN ) ;
private static final Pattern FW_REQUEST_PATTERN = Pattern . compile ( MqttTopics . DEVICE_FIRMWARE_REQUEST_TOPIC_PATTERN ) ;
private static final Pattern SW_REQUEST_PATTERN = Pattern . compile ( MqttTopics . DEVICE_SOFTWARE_REQUEST_TOPIC_PATTERN ) ;
private static final String PAYLOAD_TOO_LARGE = "PAYLOAD_TOO_LARGE" ;
@ -133,6 +131,11 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
private final ConcurrentHashMap < String , Integer > chunkSizes ;
private final ConcurrentMap < Integer , TransportProtos . ToDeviceRpcRequestMsg > rpcAwaitingAck ;
private TopicType attrSubTopicType ;
private TopicType rpcSubTopicType ;
private TopicType attrReqTopicType ;
private TopicType toServerRpcSubTopicType ;
MqttTransportHandler ( MqttTransportContext context , SslHandler sslHandler ) {
this . sessionId = UUID . randomUUID ( ) ;
this . context = context ;
@ -355,14 +358,16 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
TransportProtos . PostTelemetryMsg postTelemetryMsg = payloadAdaptor . convertToPostTelemetry ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postTelemetryMsg , getPubAckCallback ( ctx , msgId , postTelemetryMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_ATTRIBUTES_REQUEST_TOPIC_PREFIX ) ) {
TransportProtos . GetAttributeRequestMsg getAttributeMsg = payloadAdaptor . convertToGetAttributes ( deviceSessionCtx , mqttMsg ) ;
TransportProtos . GetAttributeRequestMsg getAttributeMsg = payloadAdaptor . convertToGetAttributes ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_ATTRIBUTES_REQUEST_TOPIC_PREFIX ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , getAttributeMsg , getPubAckCallback ( ctx , msgId , getAttributeMsg ) ) ;
attrReqTopicType = TopicType . V1 ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_RESPONSE_TOPIC ) ) {
TransportProtos . ToDeviceRpcResponseMsg rpcResponseMsg = payloadAdaptor . convertToDeviceRpcResponse ( deviceSessionCtx , mqttMsg ) ;
TransportProtos . ToDeviceRpcResponseMsg rpcResponseMsg = payloadAdaptor . convertToDeviceRpcResponse ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_RESPONSE_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcResponseMsg , getPubAckCallback ( ctx , msgId , rpcResponseMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_REQUESTS_TOPIC ) ) {
TransportProtos . ToServerRpcRequestMsg rpcRequestMsg = payloadAdaptor . convertToServerRpcRequest ( deviceSessionCtx , mqttMsg ) ;
TransportProtos . ToServerRpcRequestMsg rpcRequestMsg = payloadAdaptor . convertToServerRpcRequest ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_REQUESTS_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcRequestMsg , getPubAckCallback ( ctx , msgId , rpcRequestMsg ) ) ;
toServerRpcSubTopicType = TopicType . V1 ;
} else if ( topicName . equals ( MqttTopics . DEVICE_CLAIM_TOPIC ) ) {
TransportProtos . ClaimDeviceMsg claimDeviceMsg = payloadAdaptor . convertToClaimDevice ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , claimDeviceMsg , getPubAckCallback ( ctx , msgId , claimDeviceMsg ) ) ;
@ -370,6 +375,57 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
getOtaPackageCallback ( ctx , mqttMsg , msgId , fwMatcher , OtaPackageType . FIRMWARE ) ;
} else if ( ( fwMatcher = SW_REQUEST_PATTERN . matcher ( topicName ) ) . find ( ) ) {
getOtaPackageCallback ( ctx , mqttMsg , msgId , fwMatcher , OtaPackageType . SOFTWARE ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_TELEMETRY_SHORT_TOPIC ) ) {
TransportProtos . PostTelemetryMsg postTelemetryMsg = payloadAdaptor . convertToPostTelemetry ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postTelemetryMsg , getPubAckCallback ( ctx , msgId , postTelemetryMsg ) ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_TELEMETRY_SHORT_JSON_TOPIC ) ) {
TransportProtos . PostTelemetryMsg postTelemetryMsg = context . getJsonMqttAdaptor ( ) . convertToPostTelemetry ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postTelemetryMsg , getPubAckCallback ( ctx , msgId , postTelemetryMsg ) ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_TELEMETRY_SHORT_PROTO_TOPIC ) ) {
TransportProtos . PostTelemetryMsg postTelemetryMsg = context . getProtoMqttAdaptor ( ) . convertToPostTelemetry ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postTelemetryMsg , getPubAckCallback ( ctx , msgId , postTelemetryMsg ) ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_ATTRIBUTES_SHORT_TOPIC ) ) {
TransportProtos . PostAttributeMsg postAttributeMsg = payloadAdaptor . convertToPostAttributes ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postAttributeMsg , getPubAckCallback ( ctx , msgId , postAttributeMsg ) ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_ATTRIBUTES_SHORT_JSON_TOPIC ) ) {
TransportProtos . PostAttributeMsg postAttributeMsg = context . getJsonMqttAdaptor ( ) . convertToPostAttributes ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postAttributeMsg , getPubAckCallback ( ctx , msgId , postAttributeMsg ) ) ;
} else if ( topicName . equals ( MqttTopics . DEVICE_ATTRIBUTES_SHORT_PROTO_TOPIC ) ) {
TransportProtos . PostAttributeMsg postAttributeMsg = context . getProtoMqttAdaptor ( ) . convertToPostAttributes ( deviceSessionCtx , mqttMsg ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , postAttributeMsg , getPubAckCallback ( ctx , msgId , postAttributeMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_RESPONSE_SHORT_JSON_TOPIC ) ) {
TransportProtos . ToDeviceRpcResponseMsg rpcResponseMsg = context . getJsonMqttAdaptor ( ) . convertToDeviceRpcResponse ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_RESPONSE_SHORT_JSON_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcResponseMsg , getPubAckCallback ( ctx , msgId , rpcResponseMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_RESPONSE_SHORT_PROTO_TOPIC ) ) {
TransportProtos . ToDeviceRpcResponseMsg rpcResponseMsg = context . getProtoMqttAdaptor ( ) . convertToDeviceRpcResponse ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_RESPONSE_SHORT_PROTO_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcResponseMsg , getPubAckCallback ( ctx , msgId , rpcResponseMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_RESPONSE_SHORT_TOPIC ) ) {
TransportProtos . ToDeviceRpcResponseMsg rpcResponseMsg = payloadAdaptor . convertToDeviceRpcResponse ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_RESPONSE_SHORT_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcResponseMsg , getPubAckCallback ( ctx , msgId , rpcResponseMsg ) ) ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_REQUESTS_SHORT_JSON_TOPIC ) ) {
TransportProtos . ToServerRpcRequestMsg rpcRequestMsg = context . getJsonMqttAdaptor ( ) . convertToServerRpcRequest ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_REQUESTS_SHORT_JSON_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcRequestMsg , getPubAckCallback ( ctx , msgId , rpcRequestMsg ) ) ;
toServerRpcSubTopicType = TopicType . V2_JSON ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_REQUESTS_SHORT_PROTO_TOPIC ) ) {
TransportProtos . ToServerRpcRequestMsg rpcRequestMsg = context . getProtoMqttAdaptor ( ) . convertToServerRpcRequest ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_REQUESTS_SHORT_PROTO_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcRequestMsg , getPubAckCallback ( ctx , msgId , rpcRequestMsg ) ) ;
toServerRpcSubTopicType = TopicType . V2_PROTO ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_RPC_REQUESTS_SHORT_TOPIC ) ) {
TransportProtos . ToServerRpcRequestMsg rpcRequestMsg = payloadAdaptor . convertToServerRpcRequest ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_RPC_REQUESTS_SHORT_TOPIC ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , rpcRequestMsg , getPubAckCallback ( ctx , msgId , rpcRequestMsg ) ) ;
toServerRpcSubTopicType = TopicType . V2 ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_JSON_TOPIC_PREFIX ) ) {
TransportProtos . GetAttributeRequestMsg getAttributeMsg = context . getJsonMqttAdaptor ( ) . convertToGetAttributes ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_JSON_TOPIC_PREFIX ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , getAttributeMsg , getPubAckCallback ( ctx , msgId , getAttributeMsg ) ) ;
attrReqTopicType = TopicType . V2_JSON ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_PROTO_TOPIC_PREFIX ) ) {
TransportProtos . GetAttributeRequestMsg getAttributeMsg = context . getProtoMqttAdaptor ( ) . convertToGetAttributes ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_PROTO_TOPIC_PREFIX ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , getAttributeMsg , getPubAckCallback ( ctx , msgId , getAttributeMsg ) ) ;
attrReqTopicType = TopicType . V2_PROTO ;
} else if ( topicName . startsWith ( MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_TOPIC_PREFIX ) ) {
TransportProtos . GetAttributeRequestMsg getAttributeMsg = payloadAdaptor . convertToGetAttributes ( deviceSessionCtx , mqttMsg , MqttTopics . DEVICE_ATTRIBUTES_REQUEST_SHORT_TOPIC_PREFIX ) ;
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , getAttributeMsg , getPubAckCallback ( ctx , msgId , getAttributeMsg ) ) ;
attrReqTopicType = TopicType . V2 ;
} else {
transportService . reportActivity ( deviceSessionCtx . getSessionInfo ( ) ) ;
ack ( ctx , msgId ) ;
@ -541,19 +597,53 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
try {
switch ( topic ) {
case MqttTopics . DEVICE_ATTRIBUTES_TOPIC : {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , TransportProtos . SubscribeToAttributeUpdatesMsg . newBuilder ( ) . build ( ) , null ) ;
registerSubQoS ( topic , grantedQoSList , reqQoS ) ;
processAttributesSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V1 ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_TOPIC : {
processAttributesSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2 ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_JSON_TOPIC : {
processAttributesSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2_JSON ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_PROTO_TOPIC : {
processAttributesSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2_PROTO ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_TOPIC : {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , TransportProtos . SubscribeToRPCMsg . newBuilder ( ) . build ( ) , null ) ;
registerSubQoS ( topic , grantedQoSList , reqQoS ) ;
processRpcSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V1 ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_TOPIC : {
processRpcSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2 ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_JSON_TOPIC : {
processRpcSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2_JSON ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_PROTO_TOPIC : {
processRpcSubscribe ( grantedQoSList , topic , reqQoS , TopicType . V2_PROTO ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_JSON_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_PROTO_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_JSON_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_PROTO_TOPIC :
case MqttTopics . GATEWAY_ATTRIBUTES_TOPIC :
case MqttTopics . GATEWAY_RPC_TOPIC :
case MqttTopics . GATEWAY_ATTRIBUTES_RESPONSE_TOPIC :
@ -580,6 +670,18 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
ctx . writeAndFlush ( createSubAckMessage ( mqttMsg . variableHeader ( ) . messageId ( ) , grantedQoSList ) ) ;
}
private void processRpcSubscribe ( List < Integer > grantedQoSList , String topic , MqttQoS reqQoS , TopicType topicType ) {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , TransportProtos . SubscribeToRPCMsg . newBuilder ( ) . build ( ) , null ) ;
rpcSubTopicType = topicType ;
registerSubQoS ( topic , grantedQoSList , reqQoS ) ;
}
private void processAttributesSubscribe ( List < Integer > grantedQoSList , String topic , MqttQoS reqQoS , TopicType topicType ) {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) , TransportProtos . SubscribeToAttributeUpdatesMsg . newBuilder ( ) . build ( ) , null ) ;
attrSubTopicType = topicType ;
registerSubQoS ( topic , grantedQoSList , reqQoS ) ;
}
private void registerSubQoS ( String topic , List < Integer > grantedQoSList , MqttQoS reqQoS ) {
grantedQoSList . add ( getMinSupportedQos ( reqQoS ) ) ;
mqttQoSMap . put ( new MqttTopicMatcher ( topic ) , getMinSupportedQos ( reqQoS ) ) ;
@ -595,18 +697,43 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
mqttQoSMap . remove ( new MqttTopicMatcher ( topicName ) ) ;
try {
switch ( topicName ) {
case MqttTopics . DEVICE_ATTRIBUTES_TOPIC : {
case MqttTopics . DEVICE_ATTRIBUTES_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_PROTO_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_SHORT_JSON_TOPIC : {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) ,
TransportProtos . SubscribeToAttributeUpdatesMsg . newBuilder ( ) . setUnsubscribe ( true ) . build ( ) , null ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_TOPIC : {
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_TOPIC :
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_TOPIC :
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_JSON_TOPIC :
case MqttTopics . DEVICE_RPC_REQUESTS_SUB_SHORT_PROTO_TOPIC : {
transportService . process ( deviceSessionCtx . getSessionInfo ( ) ,
TransportProtos . SubscribeToRPCMsg . newBuilder ( ) . setUnsubscribe ( true ) . build ( ) , null ) ;
activityReported = true ;
break ;
}
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_JSON_TOPIC :
case MqttTopics . DEVICE_RPC_RESPONSE_SUB_SHORT_PROTO_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_JSON_TOPIC :
case MqttTopics . DEVICE_ATTRIBUTES_RESPONSES_SHORT_PROTO_TOPIC :
case MqttTopics . GATEWAY_ATTRIBUTES_TOPIC :
case MqttTopics . GATEWAY_RPC_TOPIC :
case MqttTopics . GATEWAY_ATTRIBUTES_RESPONSE_TOPIC :
case MqttTopics . DEVICE_PROVISION_RESPONSE_TOPIC :
case MqttTopics . DEVICE_FIRMWARE_RESPONSES_TOPIC :
case MqttTopics . DEVICE_FIRMWARE_ERROR_TOPIC :
case MqttTopics . DEVICE_SOFTWARE_RESPONSES_TOPIC :
case MqttTopics . DEVICE_SOFTWARE_ERROR_TOPIC : {
activityReported = true ;
break ;
}
}
} catch ( Exception e ) {
log . warn ( "[{}] Failed to process unsubscription [{}] to [{}]" , sessionId , mqttMsg . variableHeader ( ) . messageId ( ) , topicName ) ;
@ -837,8 +964,29 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
@Override
public void onGetAttributesResponse ( TransportProtos . GetAttributeResponseMsg response ) {
log . trace ( "[{}] Received get attributes response" , sessionId ) ;
String topicBase ;
MqttTransportAdaptor adaptor ;
switch ( attrReqTopicType ) {
case V2 :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
topicBase = MqttTopics . DEVICE_ATTRIBUTES_RESPONSE_SHORT_TOPIC_PREFIX ;
break ;
case V2_JSON :
adaptor = context . getJsonMqttAdaptor ( ) ;
topicBase = MqttTopics . DEVICE_ATTRIBUTES_RESPONSE_SHORT_JSON_TOPIC_PREFIX ;
break ;
case V2_PROTO :
adaptor = context . getProtoMqttAdaptor ( ) ;
topicBase = MqttTopics . DEVICE_ATTRIBUTES_RESPONSE_SHORT_PROTO_TOPIC_PREFIX ;
break ;
default :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
topicBase = MqttTopics . DEVICE_ATTRIBUTES_RESPONSE_TOPIC_PREFIX ;
break ;
}
try {
deviceSessionCtx . getPayloadAdaptor ( ) . convertToPublish ( deviceSessionCtx , response ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
a daptor. convertToPublish ( deviceSessionCtx , response , topicBa se ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
} catch ( Exception e ) {
log . trace ( "[{}] Failed to convert device attributes response to MQTT msg" , sessionId , e ) ;
}
@ -847,8 +995,29 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
@Override
public void onAttributeUpdate ( UUID sessionId , TransportProtos . AttributeUpdateNotificationMsg notification ) {
log . trace ( "[{}] Received attributes update notification to device" , sessionId ) ;
log . info ( "[{}] : attrSubTopicType: {}" , notification . toString ( ) , attrSubTopicType ) ;
String topic ;
MqttTransportAdaptor adaptor ;
switch ( attrSubTopicType ) {
case V2 :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
topic = MqttTopics . DEVICE_ATTRIBUTES_SHORT_TOPIC ;
break ;
case V2_JSON :
adaptor = context . getJsonMqttAdaptor ( ) ;
topic = MqttTopics . DEVICE_ATTRIBUTES_SHORT_JSON_TOPIC ;
break ;
case V2_PROTO :
adaptor = context . getProtoMqttAdaptor ( ) ;
topic = MqttTopics . DEVICE_ATTRIBUTES_SHORT_PROTO_TOPIC ;
break ;
default :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
topic = MqttTopics . DEVICE_ATTRIBUTES_TOPIC ;
break ;
}
try {
deviceSessionCtx . getPayloadAdaptor ( ) . convertToPublish ( deviceSessionCtx , notification ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
a daptor. convertToPublish ( deviceSessionCtx , notification , topic ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
} catch ( Exception e ) {
log . trace ( "[{}] Failed to convert device attributes update to MQTT msg" , sessionId , e ) ;
}
@ -862,9 +1031,29 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
@Override
public void onToDeviceRpcRequest ( UUID sessionId , TransportProtos . ToDeviceRpcRequestMsg rpcRequest ) {
log . trace ( "[{}] Received RPC command to device" , sessionId ) ;
log . info ( "[{}] Received RPC command to device" , sessionId ) ;
String baseTopic ;
MqttTransportAdaptor adaptor ;
switch ( rpcSubTopicType ) {
case V2 :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_REQUESTS_SHORT_TOPIC ;
break ;
case V2_JSON :
adaptor = context . getJsonMqttAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_REQUESTS_SHORT_JSON_TOPIC ;
break ;
case V2_PROTO :
adaptor = context . getProtoMqttAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_REQUESTS_SHORT_PROTO_TOPIC ;
break ;
default :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_REQUESTS_TOPIC ;
break ;
}
try {
deviceSessionCtx . getPayloadAdaptor ( ) . convertToPublish ( deviceSessionCtx , rpcRequest ) . ifPresent ( payload - > {
a daptor. convertToPublish ( deviceSessionCtx , rpcRequest , baseTopic ) . ifPresent ( payload - > {
int msgId = ( ( MqttPublishMessage ) payload ) . variableHeader ( ) . packetId ( ) ;
if ( isAckExpected ( payload ) ) {
rpcAwaitingAck . put ( msgId , rpcRequest ) ;
@ -898,9 +1087,29 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
@Override
public void onToServerRpcResponse ( TransportProtos . ToServerRpcResponseMsg rpcResponse ) {
log . trace ( "[{}] Received RPC command to server" , sessionId ) ;
log . trace ( "[{}] Received RPC response from server" , sessionId ) ;
String baseTopic ;
MqttTransportAdaptor adaptor ;
switch ( toServerRpcSubTopicType ) {
case V2 :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_RESPONSE_SHORT_TOPIC ;
break ;
case V2_JSON :
adaptor = context . getJsonMqttAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_RESPONSE_SHORT_JSON_TOPIC ;
break ;
case V2_PROTO :
adaptor = context . getProtoMqttAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_RESPONSE_SHORT_PROTO_TOPIC ;
break ;
default :
adaptor = deviceSessionCtx . getPayloadAdaptor ( ) ;
baseTopic = MqttTopics . DEVICE_RPC_RESPONSE_TOPIC ;
break ;
}
try {
deviceSessionCtx . getPayloadAdaptor ( ) . convertToPublish ( deviceSessionCtx , rpcResponse ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
a daptor. convertToPublish ( deviceSessionCtx , rpcResponse , baseTopic ) . ifPresent ( deviceSessionCtx . getChannel ( ) : : writeAndFlush ) ;
} catch ( Exception e ) {
log . trace ( "[{}] Failed to convert device RPC command to MQTT msg" , sessionId , e ) ;
}
@ -923,4 +1132,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
public void onDeviceUpdate ( TransportProtos . SessionInfoProto sessionInfo , Device device , Optional < DeviceProfile > deviceProfileOpt ) {
deviceSessionCtx . onDeviceUpdate ( sessionInfo , device , deviceProfileOpt ) ;
}
private enum TopicType {
V1 , V2 , V2_JSON , V2_PROTO
}
}