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

500 阅读1分钟

网关请求方式设计

到目前为止,我们已经知道如何获取任意设备的升级包,需要deviceId和tenantId就能获取,但我们知道,网关一般只知道设备的deviceName,这个deviceName是设备上报信息必须要带的,如何由deviceName得到deviceId和tenantId呢?这个问题经过我看代码,也找到了方法,transport mqtt已经有这种功能的方法,我们只需要调用,就能通过deviceName得到deviceId,后面一篇文章再介绍这个方法。

交互.png

现在已经彻底可以想获取哪个设备的升级包,就能获取哪个设备的升级包。现在任务就是想好 transport mqtt 如何与网关交互,网关如何请求某个设备的升级包。这个随便设计,我的设计如下:

firmware升级包

用途topic
网关发送请求的topicv1/gateway/fw/request/requestId/chunk/{requestId}/chunk/{chunk}
网关收到响应的topicv1/gateway/fw/response/+/chunk/+
网关收到错误的topicv1/gateway/fw/error
网关发送请求

需要准备的参数

变量名用途
requestId请求ID,收到响应时,若responseId与该请求ID一样,代表是该请求的响应
deviceName哪个设备
chunk升级包第几块,从0开始
chunkSize每块多少字节

将 requestId、chunk 参数填入该主题中 v1/gateway/fw/request/requestId/chunk/{requestId}/chunk/{chunk}

并发送负载 {deviceName: deviceName, chunkSize: chunkSize}

网关收到响应

从 v1/gateway/fw/response/+/chunk/+ 提取参数,第一个+号的位置是responseId,第二个+号的位置是chunk,负载是升级包数据。

网关收到错误

负载是个json,{requestId: requestId, error: "xxx"}

software升级包

与 firmware 类似,就不写了。