处理网关获取升级包的请求(五)
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();
}
}