ソースを参照

add:添加ota转换

荭琪枫 2 年 前
コミット
c0752d8903

+ 3 - 2
iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/device/message/ThingModelMessage.java

@@ -29,15 +29,16 @@ public class ThingModelMessage {
     public static final String TYPE_LIFETIME = "lifetime";
     public static final String TYPE_STATE = "state";
     public static final String TYPE_PROPERTY = "property";
+
     public static final String TYPE_EVENT = "event";
     public static final String TYPE_SERVICE = "service";
-    public static final String TYPE_CONFIG = "config";
 
+    public static final String TYPE_OTA = "ota";
+    public static final String TYPE_CONFIG = "config";
     public static final String ID_PROPERTY_GET = "get";
     public static final String ID_PROPERTY_SET = "set";
     public static final String ID_CONFIG_GET = "get";
     public static final String ID_CONFIG_SET = "set";
-
     public static final String ID_DEREGISTER = "deregister";
 
     private String id;

+ 4 - 0
iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/ota/OtaPackage.java

@@ -23,6 +23,10 @@ public class OtaPackage implements Id<String> {
 
     private String sign;
 
+    private Boolean isDiff;
+
+    private String md5;
+
     private String name;
 
     private String desc;

+ 4 - 0
iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbOtaPackage.java

@@ -23,6 +23,10 @@ public class TbOtaPackage {
 
     private String sign;
 
+    private Boolean isDiff;
+
+    private String md5;
+
     private String name;
 
     private String desc;

+ 91 - 77
iot-components/iot-mqtt-component/src/main/resources/convert.js

@@ -1,29 +1,28 @@
+var mid = 1;
 
-var mid=1;
-
-function getMid(){
+function getMid() {
     mid++;
-    if(mid>10000){
-        mid=1;
+    if (mid > 10000) {
+        mid = 1;
     }
-    return mid+"";
+    return mid + "";
 }
 
 this.decode = function (msg) {
     //对msg进行解析,并返回物模型数据
-    var content=msg.content;
+    var content = msg.content;
     var topic = content.topic;
     var payload = content.payload;
     var identifier = topic.substring(topic.lastIndexOf("/") + 1);
 
     //透传上报
-    if(topic.endsWith("/event/rawReport")){
-        var rst= component.transparentDecode(payload.params);
-        if(!rst){
+    if (topic.endsWith("/event/rawReport")) {
+        var rst = component.transparentDecode(payload.params);
+        if (!rst) {
             return null;
         }
-        rst.occur=new Date().getTime();
-        rst.time=new Date().getTime();
+        rst.occur = new Date().getTime();
+        rst.time = new Date().getTime();
         return rst;
     }
 
@@ -33,55 +32,67 @@ this.decode = function (msg) {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"property",
+            type: "property",
             identifier: "report", //属性上报
             occur: new Date().getTime(), //时间戳,设备上的事件或数据产生的本地时间
             time: new Date().getTime(), //时间戳,消息上报时间
             data: payload.params,
         };
+    } else if (topic.indexOf("/ota/") > 0) {
+        //事件上报
+        return {
+            mid: msg.mid,
+            productKey: msg.productKey,
+            deviceName: msg.deviceName,
+            type: "ota",
+            identifier: "ota",
+            occur: new Date().getTime(),
+            time: new Date().getTime(),
+            data: payload.params,
+        };
     } else if (topic.indexOf("/event/") > 0) {
         //事件上报
         return {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"event",
+            type: "event",
             identifier: identifier,
             occur: new Date().getTime(),
             time: new Date().getTime(),
             data: payload.params,
         };
-    }else if(topic.endsWith("/service/property/set_reply")){
+    } else if (topic.endsWith("/service/property/set_reply")) {
         //属性设置回复
         return {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"property",
+            type: "property",
             identifier: identifier,
             occur: new Date().getTime(),
             time: new Date().getTime(),
             code: payload.code
         };
-    }else if(topic.endsWith("/config/set_reply")){
+    } else if (topic.endsWith("/config/set_reply")) {
         //设备配置设置回复
         return {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"config",
+            type: "config",
             identifier: "set_reply",
             occur: new Date().getTime(),
             time: new Date().getTime(),
             code: payload.code
         };
-    }else if(topic.endsWith("/config/get")){
+    } else if (topic.endsWith("/config/get")) {
         //设备配置获取
         return {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"config",
+            type: "config",
             identifier: "get",
             occur: new Date().getTime(),
             time: new Date().getTime(),
@@ -93,7 +104,7 @@ this.decode = function (msg) {
             mid: msg.mid,
             productKey: msg.productKey,
             deviceName: msg.deviceName,
-            type:"service",
+            type: "service",
             identifier: identifier,
             occur: new Date().getTime(),
             time: new Date().getTime(),
@@ -104,86 +115,89 @@ this.decode = function (msg) {
     return null;
 };
 
-this.encode = function (service,device) {
-    var deviceMid=getMid();
-    var method="thing.service.";
-    var topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/service/";
-    var params={};
+this.encode = function (service, device) {
+    var deviceMid = getMid();
+    var method = "thing.service.";
+    var topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/service/";
+    var params = {};
 
     //透传下发
-    if(device.transparent){
-        var rst=component.transparentEncode(service,device);
-        topic="/sys/"+rst.productKey+"/"+rst.deviceName+"/c/service/rawSend";
-        params.model=rst.content.model;
-        params.deviceName=rst.content.deviceName;
-        params.data=rst.content.data;
+    if (device.transparent) {
+        var rst = component.transparentEncode(service, device);
+        topic = "/sys/" + rst.productKey + "/" + rst.deviceName + "/c/service/rawSend";
+        params.model = rst.content.model;
+        params.deviceName = rst.content.deviceName;
+        params.data = rst.content.data;
 
         return {
-            productKey:rst.productKey,
-            deviceName:rst.deviceName,
-            mid:rst.mid,
-            content:{
-                topic:topic,
-                payload:JSON.stringify({
-                    id:rst.mid,
-                    method:method+"rawSend",
-                    params:params
+            productKey: rst.productKey,
+            deviceName: rst.deviceName,
+            mid: rst.mid,
+            content: {
+                topic: topic,
+                payload: JSON.stringify({
+                    id: rst.mid,
+                    method: method + "rawSend",
+                    params: params
                 })
             }
         }
 
     }
 
-    var type=service.type;
-    var identifier=service.identifier;
+    var type = service.type;
+    var identifier = service.identifier;
 
-    if(type=="property"){
-        method+="property."+identifier;
-        topic+="property/"+identifier;
-    }else if(type=="service"){
-        method+=identifier;
-        topic+=identifier;
-    }else if(type=="config"){
+    if (type == "property") {
+        method += "property." + identifier;
+        topic += "property/" + identifier;
+    } else if (type == "service") {
+        method += identifier;
+        topic += identifier;
+    } else if (type == "ota") {
+        method += identifier;
+        topic = "/ota/device/upgrade/" + service.productKey + "/" + service.deviceName;
+    } else if (type == "config") {
         //设备配置下发
-        method+=identifier;
-        topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/config/"+identifier;
-    }else if(type="lifetime"){
+        method += identifier;
+        topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/config/" + identifier;
+    } else if (type = "lifetime") {
         //子设备注销下发
-        method+=identifier;
-        topic="/sys/"+service.productKey+"/"+service.deviceName+"/c/deregister";
+        method += identifier;
+        topic = "/sys/" + service.productKey + "/" + service.deviceName + "/c/deregister";
     }
-    if(type=="property" && identifier=="get"  ){
+    if (type == "property" && identifier == "get") {
         var listParams = []
-        for(var p in service.params){
+        for (var p in service.params) {
             listParams.push(service.params[p]);
         }
         return {
-            productKey:service.productKey,
-            deviceName:service.deviceName,
-            mid:deviceMid,
-            content:{
-                topic:topic,
-                payload:JSON.stringify({
-                    id:deviceMid,
-                    method:method,
+            productKey: service.productKey,
+            deviceName: service.deviceName,
+            mid: deviceMid,
+            content: {
+                topic: topic,
+                payload: JSON.stringify({
+                    id: deviceMid,
+                    method: method,
                     params: listParams
                 })
             }
         }
-    }else{
-        for(var p in service.params){
-            params[p]=service.params[p];
+    } else {
+        for (var p in service.params) {
+            params[p] = service.params[p];
         }
         return {
-            productKey:service.productKey,
-            deviceName:service.deviceName,
-            mid:deviceMid,
-            content:{
-                topic:topic,
-                payload:JSON.stringify({
-                    id:deviceMid,
-                    method:method,
-                    params:params
+            productKey: service.productKey,
+            deviceName: service.deviceName,
+            mid: deviceMid,
+            content: {
+                topic: topic,
+                payload: JSON.stringify({
+                    id: deviceMid,
+                    method: method,
+                    params: params
                 })
             }
         }

+ 4 - 2
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/DeviceService.java

@@ -73,8 +73,10 @@ public class DeviceService {
                 args, ThingModelMessage.TYPE_SERVICE, service);
     }
 
-    public String otaUpgrade(String token, boolean checkOwner) {
-        return null;
+    public String otaUpgrade(String deviceId, boolean checkOwner, Object data) {
+        DeviceInfo device = getAndCheckDevice(deviceId, checkOwner);
+        return send(deviceId, device.getProductKey(), device.getDeviceName(),
+                data, ThingModelMessage.TYPE_OTA, "OTA");
     }
 
     /**

+ 21 - 2
iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java

@@ -7,6 +7,7 @@ import cc.iotkit.data.manager.IOtaDeviceData;
 import cc.iotkit.data.manager.IOtaPackageData;
 import cc.iotkit.model.alert.AlertConfig;
 import cc.iotkit.model.ota.OtaPackage;
+import com.google.gson.JsonObject;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
@@ -63,9 +64,27 @@ public class OtaService {
     /**
      * 开始升级
      */
-    public void startUpgrade() {
+    public void startUpgrade(String otaId, String deviceId) {
+        OtaPackage otaPackage = iOtaPackageData.findById(otaId);
         //构建升级包
-        deviceService.otaUpgrade("", true);
+        JsonObject buildOtaPackage = buildOtaPackage(otaPackage);
+        String id = deviceService.otaUpgrade(deviceId, true, buildOtaPackage);
+    }
+
+    private JsonObject buildOtaPackage(OtaPackage otaPackage) {
+        JsonObject ota = new JsonObject();
+        JsonObject extData = new JsonObject();
+        extData.addProperty("key1", "测试1");
+        extData.addProperty("key2", "测试2");
+        ota.addProperty("size", otaPackage.getSize());
+        ota.addProperty("sign", otaPackage.getSign());
+        ota.addProperty("version", otaPackage.getVersion());
+        ota.addProperty("isDiff", Boolean.toString(otaPackage.getIsDiff()));
+        ota.addProperty("url", otaPackage.getUrl());
+        ota.addProperty("signMethod", "MD5");
+        ota.addProperty("module", "MCU");
+        ota.add("extData", extData);
+        return ota;
     }
 
 }