处理网关获取升级包的请求(一)
先易后难,先搞边角料
首先将主题常量搞定,在MqttTopics类中新增几个主题常量,就是我们设计好的那几个主题。
// gateway OTA 升级
public static final String GATEWAY_FIRMWARE_REQUEST_TOPIC_PATTERN = BASE_GATEWAY_API_TOPIC + FIRMWARE + REQUEST + "/" + REQUEST_ID_PATTERN + CHUNK + CHUNK_PATTERN;
public static final String GATEWAY_SOFTWARE_REQUEST_TOPIC_PATTERN = BASE_GATEWAY_API_TOPIC + SOFTWARE + REQUEST + "/" + REQUEST_ID_PATTERN + CHUNK + CHUNK_PATTERN;
public static final String GATEWAY_FIRMWARE_RESPONSES_TOPIC = BASE_GATEWAY_API_TOPIC + FIRMWARE + RESPONSE + "/" + SUB_TOPIC + CHUNK + SUB_TOPIC;
public static final String GATEWAY_SOFTWARE_RESPONSES_TOPIC = BASE_GATEWAY_API_TOPIC + SOFTWARE + RESPONSE + "/" + SUB_TOPIC + CHUNK + SUB_TOPIC;
public static final String GATEWAY_SOFTWARE_ERROR_TOPIC = BASE_GATEWAY_API_TOPIC + SOFTWARE + ERROR;
public static final String GATEWAY_FIRMWARE_ERROR_TOPIC = BASE_GATEWAY_API_TOPIC + FIRMWARE + ERROR;
public static final String GATEWAY_SOFTWARE_FIRMWARE_RESPONSES_TOPIC_FORMAT = BASE_GATEWAY_API_TOPIC + "/%s" + RESPONSE + "/%s" + CHUNK + "%d";
public static final String GATEWAY_SOFTWARE_FIRMWARE_ERROR_TOPIC_FORMAT = BASE_GATEWAY_API_TOPIC + "/%s" + ERROR;
这么规范的写法,我是怎么写出来的呢?打死我,我也写不出,就得使出我的看家本领,CTRL+C CTRL+V 大法,原创我不行,模仿第一名,下面我贴出的代码都是复制粘贴而来。它们是从下面代码改出来的,即thingsboard定义好的
public static final String DEVICE_FIRMWARE_REQUEST_TOPIC_PATTERN = BASE_DEVICE_API_TOPIC_V2 + FIRMWARE + REQUEST + "/" + REQUEST_ID_PATTERN + CHUNK + CHUNK_PATTERN;
public static final String DEVICE_FIRMWARE_RESPONSES_TOPIC = BASE_DEVICE_API_TOPIC_V2 + FIRMWARE + RESPONSE + "/" + SUB_TOPIC + CHUNK + SUB_TOPIC;
public static final String DEVICE_FIRMWARE_ERROR_TOPIC = BASE_DEVICE_API_TOPIC_V2 + FIRMWARE + ERROR;
public static final String DEVICE_SOFTWARE_FIRMWARE_RESPONSES_TOPIC_FORMAT = BASE_DEVICE_API_TOPIC_V2 + "/%s" + RESPONSE + "/%s" + CHUNK + "%d";
public static final String DEVICE_SOFTWARE_REQUEST_TOPIC_PATTERN = BASE_DEVICE_API_TOPIC_V2 + SOFTWARE + REQUEST + "/" + REQUEST_ID_PATTERN + CHUNK + CHUNK_PATTERN;
public static final String DEVICE_SOFTWARE_RESPONSES_TOPIC = BASE_DEVICE_API_TOPIC_V2 + SOFTWARE + RESPONSE + "/" + SUB_TOPIC + CHUNK + SUB_TOPIC;
public static final String DEVICE_SOFTWARE_ERROR_TOPIC = BASE_DEVICE_API_TOPIC_V2 + SOFTWARE + ERROR;
主题定义好之后,还有什么小事可干呢?网关需要订阅 response、error主题,这样它才能收到响应、错误,但现在网关订阅不了,因为还没加,取消订阅也是。
在processSubscribe方法中添加主题,我多粘贴几行周围代码,这样你就能知道在哪加了。
case MqttTopics.DEVICE_SOFTWARE_RESPONSES_TOPIC:
case MqttTopics.DEVICE_SOFTWARE_ERROR_TOPIC:
// 下面4行是新增的
case MqttTopics.GATEWAY_FIRMWARE_RESPONSES_TOPIC:
case MqttTopics.GATEWAY_FIRMWARE_ERROR_TOPIC:
case MqttTopics.GATEWAY_SOFTWARE_RESPONSES_TOPIC:
case MqttTopics.GATEWAY_SOFTWARE_ERROR_TOPIC:
registerSubQoS(topic, grantedQoSList, reqQoS);
break;
default:
log.warn("[{}] Failed to subscribe to [{}][{}]", sessionId, topic, reqQoS);
grantedQoSList.add(FAILURE.value());
break;
在processUnsubscribe方法中添加主题,我多粘贴几行周围代码,这样你就能知道在哪加了。
case MqttTopics.DEVICE_RPC_REQUESTS_SUB_SHORT_PROTO_TOPIC: {
transportService.process(deviceSessionCtx.getSessionInfo(),
TransportProtos.SubscribeToRPCMsg.newBuilder().setUnsubscribe(true).build(), null);
activityReported = true;
break;
}
// 下面4行是新增的
case MqttTopics.GATEWAY_FIRMWARE_RESPONSES_TOPIC:
case MqttTopics.GATEWAY_FIRMWARE_ERROR_TOPIC:
case MqttTopics.GATEWAY_SOFTWARE_RESPONSES_TOPIC:
case MqttTopics.GATEWAY_SOFTWARE_ERROR_TOPIC:
case MqttTopics.DEVICE_RPC_RESPONSE_SUB_TOPIC:
case MqttTopics.DEVICE_RPC_RESPONSE_SUB_SHORT_TOPIC:
到目前为止,小事好像都干完了,剩下的都是难啃的骨头,下一篇再啃骨头,啃硬骨头,我的办法就是一个字,拖,因为骨头怕熬,拖一拖,骨头就化了,因为很可能就被周围同事的高手解决了,这就是智慧。