实现 thingsboard 网关下设备 OTA 升级功能(二)

606 阅读1分钟

观察 transport mqtt

transport mqtt 的作用就是上通下达,就是个无良中间商。上行,就是将网关或设备上报的信息送入队列queue,下行,就是将队列中的数据取出来,发送给网关或设备。

继续开局一张图

transport-mqtt.png

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(),将数据传入到方法的参数中。

收到设备的数据后,会判断是来自网关的数据,还是普通设备的数据,会分开处理,添加代码时,只需要在处理网关数据的方法里添加。