处理网关获取升级包的请求(五)
真的快结束了,只差一点
我们还需要写一个方法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,我也不知道什么用,我也是照葫芦画瓢,好像也没坏处。