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

297 阅读1分钟

处理网关获取升级包的请求(二)

啃硬骨头

我们需要处理网关的请求,网关的请求方法是handleGatewayPublishMsg,但我不会写,只会ctrl+c ctrl+v,那就只好去复制咯。

从processDevicePublish方法中复制的代码如下:

} else if ((fwMatcher = FW_REQUEST_PATTERN.matcher(topicName)).find()) {
    getOtaPackageCallback(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.FIRMWARE);
} else if ((fwMatcher = SW_REQUEST_PATTERN.matcher(topicName)).find()) {
    getOtaPackageCallback(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.SOFTWARE);

稍微修改,变成这样:

Matcher fwMatcher;
if ((fwMatcher = GATEWAY_FW_REQUEST_PATTERN.matcher(topicName)).find()) {
    getOtaPackageCallbackByGateway(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.FIRMWARE);
    return;
} else if ((fwMatcher = GATEWAY_SW_REQUEST_PATTERN.matcher(topicName)).find()) {
    getOtaPackageCallbackByGateway(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.SOFTWARE);
    return;
}

GATEWAY_FW_REQUEST_PATTERN 模仿 FW_REQUEST_PATTERN,GATEWAY_SW_REQUEST_PATTERN 模仿 SW_REQUEST_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 Pattern GATEWAY_FW_REQUEST_PATTERN = Pattern.compile(MqttTopics.GATEWAY_FIRMWARE_REQUEST_TOPIC_PATTERN);
private static final Pattern GATEWAY_SW_REQUEST_PATTERN = Pattern.compile(MqttTopics.GATEWAY_SOFTWARE_REQUEST_TOPIC_PATTERN);

再写一个 getOtaPackageCallbackByGateway()方法,避免影响原有的 getOtaPackageCallback()方法,

改造后,整个handleGatewayPublishMsg方法如下所示:

private void handleGatewayPublishMsg(ChannelHandlerContext ctx, String topicName, int msgId, MqttPublishMessage mqttMsg) {
    try {
        // 判断是否是获取升级包请求
        Matcher fwMatcher;
        if ((fwMatcher = GATEWAY_FW_REQUEST_PATTERN.matcher(topicName)).find()) {
            getOtaPackageCallbackByGateway(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.FIRMWARE);
            return;
        } else if ((fwMatcher = GATEWAY_SW_REQUEST_PATTERN.matcher(topicName)).find()) {
            getOtaPackageCallbackByGateway(ctx, mqttMsg, msgId, fwMatcher, OtaPackageType.SOFTWARE);
            return;
        }

        switch (topicName) {
            case MqttTopics.GATEWAY_TELEMETRY_TOPIC:
                gatewaySessionHandler.onDeviceTelemetry(mqttMsg);
                break;
            case MqttTopics.GATEWAY_CLAIM_TOPIC:
                gatewaySessionHandler.onDeviceClaim(mqttMsg);
                break;
            case MqttTopics.GATEWAY_ATTRIBUTES_TOPIC:
                gatewaySessionHandler.onDeviceAttributes(mqttMsg);
                break;
            case MqttTopics.GATEWAY_ATTRIBUTES_REQUEST_TOPIC:
                gatewaySessionHandler.onDeviceAttributesRequest(mqttMsg);
                break;
            case MqttTopics.GATEWAY_RPC_TOPIC:
                gatewaySessionHandler.onDeviceRpcResponse(mqttMsg);
                break;
            case MqttTopics.GATEWAY_CONNECT_TOPIC:
                gatewaySessionHandler.onDeviceConnect(mqttMsg);
                break;
            case MqttTopics.GATEWAY_DISCONNECT_TOPIC:
                gatewaySessionHandler.onDeviceDisconnect(mqttMsg);
                break;
            default:
                ack(ctx, msgId);
        }
    } catch (RuntimeException e) {
        log.warn("[{}] Failed to process publish msg [{}][{}]", sessionId, topicName, msgId, e);
        ctx.close();
    } catch (AdaptorException e) {
        log.debug("[{}] Failed to process publish msg [{}][{}]", sessionId, topicName, msgId, e);
        sendAckOrCloseSession(ctx, topicName, msgId);
    }
}