处理网关获取升级包的请求(二)
啃硬骨头
我们需要处理网关的请求,网关的请求方法是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);
}
}