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

187 阅读1分钟

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

真的快结束了,只差一点

我们还需要写一个方法sendOtaPackageErrorToGateway(),这个方法是发送错误响应,它原本就有一个发送错误的方法 sendOtaPackageError(),我们将它复制一份,改名为sendOtaPackageErrorToGateway,结果如下:

private void sendOtaPackageErrorToGateway(ChannelHandlerContext ctx, String error) {
    log.warn("[{}] {}", sessionId, error);
    deviceSessionCtx.getChannel().writeAndFlush(deviceSessionCtx
            .getPayloadAdaptor()
            .createMqttPublishMsg(deviceSessionCtx, MqttTopics.DEVICE_FIRMWARE_ERROR_TOPIC, error.getBytes()));
    ctx.close();
}

由于发送的负载就是 String error,不符合我们的设计,我们想要返回一个json,大概长这样 {requestId: xxx, error: "xxx"}。

ctx.close();不应该执行,因为它会断开连接,我们不希望网关断连,最终改造如下:

private void sendOtaPackageErrorToGateway(ChannelHandlerContext ctx, int msgId, String requestId, String error, OtaPackageType type) {
    log.warn("[{}] {}", sessionId, error);
    ack(ctx, msgId);

    HashMap<String, String> errorMap = new HashMap<>();
    errorMap.put("requestId", requestId);
    errorMap.put("error", error);

    Gson gson = new Gson();
    String errorJson = gson.toJson(errorMap);

    deviceSessionCtx.getChannel().writeAndFlush(deviceSessionCtx
            .getPayloadAdaptor()
            .createMqttPublishMsg(deviceSessionCtx, String.format(MqttTopics.GATEWAY_SOFTWARE_FIRMWARE_ERROR_TOPIC_FORMAT, type.getKeyPrefix()), errorJson.getBytes()));
    // 由于是网关,不是设备,不能因为网关下面的设备乱请求,而导致网关断连,故注释断开语句
    // ctx.close();
}

添加了一句ack(ctx, msgId);发送ack,我也不知道什么用,我也是照葫芦画瓢,好像也没坏处。