add:添加ota转换

V0.5.x
荭琪枫 2023-06-12 22:58:54 +08:00
parent 22637889c0
commit c0752d8903
6 changed files with 127 additions and 83 deletions

View File

@ -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;

View File

@ -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;

View File

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

View File

@ -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
})
}
}

View File

@ -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");
}
/**

View File

@ -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;
}
}