观察 transport mqtt
transport mqtt 的作用就是上通下达,就是个无良中间商。上行,就是将网关或设备上报的信息送入队列queue,下行,就是将队列中的数据取出来,发送给网关或设备。
继续开局一张图
transport mqtt 下行
下行就是通过实现一个 SessionMsgListener 接口,队列中的数据就会自动传到接口方法中的参数中,谁调的呢?当然是transport运输大队长调的,具体就是 transport-api 模块 org.thingsboard.server.common.transport.service 包 DefaultTransportService 类调的。
public interface SessionMsgListener {
void onGetAttributesResponse(GetAttributeResponseMsg getAttributesResponse);
void onAttributeUpdate(UUID sessionId, AttributeUpdateNotificationMsg attributeUpdateNotification);
void onRemoteSessionCloseCommand(UUID sessionId, SessionCloseNotificationProto sessionCloseNotification);
void onToDeviceRpcRequest(UUID sessionId, ToDeviceRpcRequestMsg toDeviceRequest);
void onToServerRpcResponse(ToServerRpcResponseMsg toServerResponse);
void onDeviceDeleted(DeviceId deviceId);
default void onUplinkNotification(UplinkNotificationMsg notificationMsg){};
default void onToTransportUpdateCredentials(ToTransportUpdateCredentialsProto toTransportUpdateCredentials){}
default void onDeviceProfileUpdate(TransportProtos.SessionInfoProto newSessionInfo, DeviceProfile deviceProfile) {}
default void onDeviceUpdate(TransportProtos.SessionInfoProto sessionInfo, Device device,
Optional<DeviceProfile> deviceProfileOpt) {}
default void onResourceUpdate(TransportProtos.ResourceUpdateMsg resourceUpdateMsgOpt) {}
default void onResourceDelete(TransportProtos.ResourceDeleteMsg resourceUpdateMsgOpt) {}
}
上面下达的命令,就是由这几个接口方法体现,transport mqtt收到命令,就会将数据发送到对应的网关或设备,因为transport mqtt拥有tcp长连接会话,随时可发送。
transport mqtt 上行
transport mqtt 采用 netty 实现mqtt服务器,netty 启动tcp服务端,通过配置 MqttEncoder、MqttDecoder Mqtt编解码器,摇身一变,升级为mqtt服务器。
netty每建立一条连接,就会调用 MqttTransportServerInitializer.initChannel()方法,调用这个方法,会为每个连接创建独属于它的 MqttTransportHandler 消息处理器。
MqttTransportHandler继承ChannelInboundHandlerAdapter,数据的入口就是 channelRead()方法,netty框架就是这样设计的,netty收到数据后,会调用channelRead(),将数据传入到方法的参数中。
收到设备的数据后,会判断是来自网关的数据,还是普通设备的数据,会分开处理,添加代码时,只需要在处理网关数据的方法里添加。