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

158 阅读1分钟

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

transport mqtt 大结局

到现在只剩下最后个类 GatewayOtaPackageCallback 没有写了,继续老办法,先复制 OtaPackageCallback 一份,改名为GatewayOtaPackageCallback,结果如下:

private class GatewayOtaPackageCallback implements TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> {
    private final ChannelHandlerContext ctx;
    private final int msgId;
    private final TransportProtos.GetOtaPackageRequestMsg msg;
    private final String requestId;
    private final int chunkSize;
    private final int chunk;

    OtaPackageCallback(ChannelHandlerContext ctx, int msgId, TransportProtos.GetOtaPackageRequestMsg msg, String requestId, int chunkSize, int chunk) {
        this.ctx = ctx;
        this.msgId = msgId;
        this.msg = msg;
        this.requestId = requestId;
        this.chunkSize = chunkSize;
        this.chunk = chunk;
    }

    @Override
    public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
        if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
            OtaPackageId firmwareId = new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()));
            otaPackSessions.put(requestId, firmwareId.toString());
            sendOtaPackage(ctx, msgId, firmwareId.toString(), requestId, chunkSize, chunk, OtaPackageType.valueOf(response.getType()));
        } else {
            sendOtaPackageError(ctx, response.getResponseStatus().toString());
        }
    }

    @Override
    public void onError(Throwable e) {
        log.trace("[{}] Failed to get firmware: {}", sessionId, msg, e);
        ctx.close();
    }
}

需要改的地方不多,将 sendOtaPackage 改为 sendOtaPackageToGateway,将 sendOtaPackageError 替换成 sendOtaPackageErrorToGateway。

由于 sendOtaPackageErrorToGateway 需要 OtaPackageType,需要创建GatewayOtaPackageCallback时,从外面传进来,所以需要加一个成员变量,并修改构造函数。

还有其他一些小改动,我直接贴出最终改造完成的代码,GatewayOtaPackageCallback完成代码如下:

private class GatewayOtaPackageCallback implements TransportServiceCallback<TransportProtos.GetOtaPackageResponseMsg> {
    private final ChannelHandlerContext ctx;
    private final int msgId;
    private final TransportProtos.GetOtaPackageRequestMsg msg;
    private final String requestId;
    private final int chunkSize;
    private final int chunk;
    private final OtaPackageType type;

    GatewayOtaPackageCallback(ChannelHandlerContext ctx, int msgId, TransportProtos.GetOtaPackageRequestMsg msg, String requestId, int chunkSize, int chunk, OtaPackageType type) {
        this.ctx = ctx;
        this.msgId = msgId;
        this.msg = msg;
        this.requestId = requestId;
        this.chunkSize = chunkSize;
        this.chunk = chunk;
        this.type = type;
    }

    @Override
    public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
        if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
            OtaPackageId firmwareId = new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()));
            otaPackSessions.put(requestId, firmwareId.toString());
            sendOtaPackageToGateway(ctx, msgId, firmwareId.toString(), requestId, chunkSize, chunk, OtaPackageType.valueOf(response.getType()));
        } else {
            sendOtaPackageErrorToGateway(ctx, msgId, requestId, response.getResponseStatus().toString(), OtaPackageType.valueOf(response.getType()));
        }
    }

    @Override
    public void onError(Throwable e) {
        log.trace("[{}] Failed to get firmware: {}", sessionId, msg, e);
        ack(ctx, msgId);
        sendOtaPackageErrorToGateway(ctx, msgId, requestId, e.getMessage(), type);
         // 由于是网关,不是设备,不能因为网关下面的设备乱请求,而导致网关断连,故注释断开语句
         // ctx.close();
    }
}