Commit 8a23b819 by huangjy

mqtt协议包,新增远程升级

parent cb92d1d0
......@@ -2,6 +2,7 @@ package org.jetlinks.protocol.official;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import io.netty.buffer.ByteBuf;
......@@ -12,12 +13,10 @@ import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.DisconnectDeviceMessage;
import org.jetlinks.core.message.Message;
import org.jetlinks.core.message.codec.*;
import org.jetlinks.core.message.firmware.UpgradeFirmwareMessage;
import org.jetlinks.core.message.property.ReadPropertyMessage;
import org.jetlinks.core.message.property.WritePropertyMessage;
import org.jetlinks.protocol.official.entity.CustomMessage;
import org.jetlinks.protocol.official.entity.CustomReadMessage;
import org.jetlinks.protocol.official.entity.CustomWriteMessage;
import org.jetlinks.protocol.official.entity.UserServerInfo;
import org.jetlinks.protocol.official.entity.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
......@@ -127,6 +126,7 @@ public class JetLinksMqttDeviceMessageCodec implements DeviceMessageCodec {
CustomWriteMessage.PayLoad payLoad = new CustomWriteMessage.PayLoad();
payLoad.setDeviceId(deviceMessage.getDeviceId());
Map<String, Object> properties = ((WritePropertyMessage) deviceMessage).getProperties();
Object result = properties.get("usrServerInfo");
if (result != null) {
......@@ -137,12 +137,47 @@ public class JetLinksMqttDeviceMessageCodec implements DeviceMessageCodec {
} else {
payLoad.setProperties(properties);
}
customSendMessage.setPayload(payLoad);
customSendMessage.setTimestamp(deviceMessage.getTimestamp());
customSendMessage.setMessageId(deviceMessage.getMessageId());
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, true);
convertResult = TopicMessageCodec.encode(mapper, customSendMessage);
} else {
} else if (deviceMessage instanceof UpgradeFirmwareMessage) {
CustomUpgradeFirmwareMessage customUpgradeFirmwareMessage = new CustomUpgradeFirmwareMessage();
CustomUpgradeFirmwareMessage.Header header = new CustomUpgradeFirmwareMessage.Header();
header.setTimestamp(deviceMessage.getTimestamp());
header.setVersion(1);
header.setUuid(deviceMessage.getMessageId());
customUpgradeFirmwareMessage.setHeader(header);
CustomUpgradeFirmwareMessage.PayLoad payLoad = new CustomUpgradeFirmwareMessage.PayLoad();
String url = ((UpgradeFirmwareMessage) deviceMessage).getUrl();
payLoad.setUrl(url);
Map<String, Object> parameters = ((UpgradeFirmwareMessage) deviceMessage).getParameters();
payLoad.setParameters(parameters);
String signMethod = ((UpgradeFirmwareMessage) deviceMessage).getSignMethod();
payLoad.setSignMethod(signMethod);
long size = ((UpgradeFirmwareMessage) deviceMessage).getSize();
payLoad.setSize(size);
String sign = ((UpgradeFirmwareMessage) deviceMessage).getSign();
payLoad.setSign(sign);
String version = ((UpgradeFirmwareMessage) deviceMessage).getVersion();
payLoad.setFirmwareVersion(version);
payLoad.setFirmwareId(((UpgradeFirmwareMessage) deviceMessage).getFirmwareId());
customUpgradeFirmwareMessage.setPayload(payLoad);
customUpgradeFirmwareMessage.setMessageId(deviceMessage.getMessageId());
customUpgradeFirmwareMessage.setDeviceId(deviceMessage.getDeviceId());
convertResult = TopicMessageCodec.encode(mapper, customUpgradeFirmwareMessage);
}else {
convertResult = TopicMessageCodec.encode(mapper, deviceMessage);
}
......@@ -182,11 +217,11 @@ public class JetLinksMqttDeviceMessageCodec implements DeviceMessageCodec {
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
CustomMessage customMessage = JSON.parseObject(body, CustomMessage.class);
String properties = customMessage.getPayload().getProperties();
Map<String,Object> map = new HashMap<>();
String result;
Map<String,Object> map = new HashMap<>();
if (message.getTopic().contains("read") || message.getTopic().contains("write")) {
CustomMessage customMessage = JSON.parseObject(body, CustomMessage.class);
String properties = customMessage.getPayload().getProperties();
String messageId = customMessage.getHeader().getUuid();
JSONObject jsonObject = JSON.parseObject(properties);
Set<String> keySet = jsonObject.keySet();
......@@ -199,9 +234,29 @@ public class JetLinksMqttDeviceMessageCodec implements DeviceMessageCodec {
map.put("messageId",messageId);
map.put("timestamp",System.currentTimeMillis());
result = JSON.toJSONString(map);
} else if (message.getTopic().contains("firmware/upgrade")) {
CustomFirmwareMessage customFirmwareMessage = JSON.parseObject(body, CustomFirmwareMessage.class);
CustomFirmwareMessage.PayLoad payload = customFirmwareMessage.getPayload();
if (message.getTopic().contains("firmware/upgrade/reply")) {
map.put("success",true);
map.put("messageId",customFirmwareMessage.getHeader().getUuid());
} else {
map.put("success",payload.getRetCode() == 0);
map.put("progress",payload.getProgress());
map.put("complete",payload.getProgress() == 100);
map.put("errorReason",payload.getValue());
map.put("version",payload.getFirmwareVersion());
map.put("firmwareId",payload.getFirmwareId());
}
map.put("timestamp",System.currentTimeMillis());
result = JSON.toJSONString(map);
} else if (message.getTopic().contains("properties/report")){
CustomMessage customMessage = JSON.parseObject(body, CustomMessage.class);
String properties = customMessage.getPayload().getProperties();
map.put("properties", JSON.parseObject(properties));
result = JSON.toJSONString(map);
} else {
result = body;
}
byte[] bytes;
try {
......
......@@ -14,6 +14,7 @@ import org.jetlinks.core.message.state.DeviceStateCheckMessageReply;
import org.jetlinks.core.route.MqttRoute;
import org.jetlinks.core.utils.TopicUtils;
import org.jetlinks.protocol.official.entity.CustomReadMessage;
import org.jetlinks.protocol.official.entity.CustomUpgradeFirmwareMessage;
import org.jetlinks.protocol.official.entity.CustomWriteMessage;
import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux;
......@@ -234,7 +235,7 @@ public enum TopicMessageCodec {
//注销
unregister("/*/unregister", DeviceUnRegisterMessage.class),
//更新固件消息
upgradeFirmware("/*/firmware/upgrade", UpgradeFirmwareMessage.class),
upgradeFirmware("/*/firmware/upgrade", CustomUpgradeFirmwareMessage.class),
//更新固件消息回复
upgradeFirmwareReply("/*/firmware/upgrade/reply", UpgradeFirmwareMessageReply.class),
//更新固件升级进度消息
......@@ -376,6 +377,7 @@ public enum TopicMessageCodec {
return TopicPayload.of(String.join("/", topics), mapper.writeValueAsBytes(message));
}
@SneakyThrows
TopicPayload doEncode(ObjectMapper mapper, DeviceMessage message) {
String[] topics = Arrays.copyOf(pattern, pattern.length);
......
package org.jetlinks.protocol.official.entity;
import lombok.Data;
@Data
public class CustomFirmwareMessage {
private Header header;
private PayLoad payload;
private boolean success;
private String messageId;
private Long timestamp;
@Data
public class Header {
private String version;
private String uuid;
private Long timestamp;
}
@Data
public class PayLoad {
private Integer progress;
private Integer retCode;
private String firmwareVersion;
private String firmwareId;
private String value;
}
@Data
public class DeviceAttrInfo {
private String key;
private String value;
}
}
package org.jetlinks.protocol.official.entity;
import lombok.Data;
import org.jetlinks.core.message.firmware.UpgradeFirmwareMessage;
import java.util.Map;
@Data
public class CustomUpgradeFirmwareMessage extends UpgradeFirmwareMessage {
private Header header;
private PayLoad payload;
@Data
public static class Header {
private int version;
private String uuid;
private Long timestamp;
}
@Data
public static class PayLoad {
private String url;
private String firmwareVersion;
private String sign;
private String signMethod;
private String firmwareId;
private long size;
private Map<String, Object> parameters;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment