diff --git a/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/device/message/ThingModelMessage.java b/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/device/message/ThingModelMessage.java index 16e94774..858abc8f 100644 --- a/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/device/message/ThingModelMessage.java +++ b/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; diff --git a/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/ota/OtaPackage.java b/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/ota/OtaPackage.java index 64aa5e81..d188a6a5 100644 --- a/iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/ota/OtaPackage.java +++ b/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 { private String sign; + private Boolean isDiff; + + private String md5; + private String name; private String desc; diff --git a/iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbOtaPackage.java b/iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbOtaPackage.java index 54ca0459..5c91287f 100644 --- a/iot-common/iot-common-dao/iot-data-serviceImpl-rdb/src/main/java/cc/iotkit/data/model/TbOtaPackage.java +++ b/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; diff --git a/iot-components/iot-mqtt-component/src/main/resources/convert.js b/iot-components/iot-mqtt-component/src/main/resources/convert.js index cec5b1ff..9e6fabd0 100644 --- a/iot-components/iot-mqtt-component/src/main/resources/convert.js +++ b/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 }) } } diff --git a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/DeviceService.java b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/DeviceService.java index a08a3782..f89a31c0 100644 --- a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/DeviceService.java +++ b/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"); } /** diff --git a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java b/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java index a3f93382..94cba9ee 100644 --- a/iot-module/iot-manager/src/main/java/cc/iotkit/manager/service/OtaService.java +++ b/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; } }