Merge pull request #7044 from volodymyr-babak/bug/edge-firmware-id-missing
[3.4.1] Firmware ID not synced from cloud to edge in device / device profiles
This commit is contained in:
commit
d24e399ae0
@ -59,6 +59,10 @@ public class DeviceMsgConstructor {
|
|||||||
if (device.getAdditionalInfo() != null) {
|
if (device.getAdditionalInfo() != null) {
|
||||||
builder.setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo()));
|
builder.setAdditionalInfo(JacksonUtil.toString(device.getAdditionalInfo()));
|
||||||
}
|
}
|
||||||
|
if (device.getFirmwareId() != null) {
|
||||||
|
builder.setFirmwareIdMSB(device.getFirmwareId().getId().getMostSignificantBits())
|
||||||
|
.setFirmwareIdLSB(device.getFirmwareId().getId().getLeastSignificantBits());
|
||||||
|
}
|
||||||
if (conflictName != null) {
|
if (conflictName != null) {
|
||||||
builder.setConflictName(conflictName);
|
builder.setConflictName(conflictName);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,9 +20,9 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
||||||
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
|
|
||||||
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
|
import org.thingsboard.server.gen.edge.v1.DeviceProfileUpdateMsg;
|
||||||
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
import org.thingsboard.server.gen.edge.v1.UpdateMsgType;
|
||||||
|
import org.thingsboard.server.queue.util.DataDecodingEncodingService;
|
||||||
import org.thingsboard.server.queue.util.TbCoreComponent;
|
import org.thingsboard.server.queue.util.TbCoreComponent;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -66,6 +66,10 @@ public class DeviceProfileMsgConstructor {
|
|||||||
if (deviceProfile.getImage() != null) {
|
if (deviceProfile.getImage() != null) {
|
||||||
builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)));
|
builder.setImage(ByteString.copyFrom(deviceProfile.getImage().getBytes(StandardCharsets.UTF_8)));
|
||||||
}
|
}
|
||||||
|
if (deviceProfile.getFirmwareId() != null) {
|
||||||
|
builder.setFirmwareIdMSB(deviceProfile.getFirmwareId().getId().getMostSignificantBits())
|
||||||
|
.setFirmwareIdLSB(deviceProfile.getFirmwareId().getId().getLeastSignificantBits());
|
||||||
|
}
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,13 +33,16 @@ public class OtaPackageMsgConstructor {
|
|||||||
.setMsgType(msgType)
|
.setMsgType(msgType)
|
||||||
.setIdMSB(otaPackage.getId().getId().getMostSignificantBits())
|
.setIdMSB(otaPackage.getId().getId().getMostSignificantBits())
|
||||||
.setIdLSB(otaPackage.getId().getId().getLeastSignificantBits())
|
.setIdLSB(otaPackage.getId().getId().getLeastSignificantBits())
|
||||||
.setDeviceProfileIdMSB(otaPackage.getDeviceProfileId().getId().getMostSignificantBits())
|
|
||||||
.setDeviceProfileIdLSB(otaPackage.getDeviceProfileId().getId().getLeastSignificantBits())
|
|
||||||
.setType(otaPackage.getType().name())
|
.setType(otaPackage.getType().name())
|
||||||
.setTitle(otaPackage.getTitle())
|
.setTitle(otaPackage.getTitle())
|
||||||
.setVersion(otaPackage.getVersion())
|
.setVersion(otaPackage.getVersion())
|
||||||
.setTag(otaPackage.getTag());
|
.setTag(otaPackage.getTag());
|
||||||
|
|
||||||
|
if (otaPackage.getDeviceProfileId() != null) {
|
||||||
|
builder.setDeviceProfileIdMSB(otaPackage.getDeviceProfileId().getId().getMostSignificantBits())
|
||||||
|
.setDeviceProfileIdLSB(otaPackage.getDeviceProfileId().getId().getLeastSignificantBits());
|
||||||
|
}
|
||||||
|
|
||||||
if (otaPackage.getUrl() != null) {
|
if (otaPackage.getUrl() != null) {
|
||||||
builder.setUrl(otaPackage.getUrl());
|
builder.setUrl(otaPackage.getUrl());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,10 +71,10 @@ import org.thingsboard.server.common.data.edge.Edge;
|
|||||||
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
import org.thingsboard.server.common.data.edge.EdgeEvent;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
import org.thingsboard.server.common.data.edge.EdgeEventActionType;
|
||||||
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
import org.thingsboard.server.common.data.edge.EdgeEventType;
|
||||||
|
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
||||||
import org.thingsboard.server.common.data.id.EdgeId;
|
import org.thingsboard.server.common.data.id.EdgeId;
|
||||||
import org.thingsboard.server.common.data.id.EntityId;
|
import org.thingsboard.server.common.data.id.EntityId;
|
||||||
import org.thingsboard.server.common.data.id.EntityIdFactory;
|
import org.thingsboard.server.common.data.id.EntityIdFactory;
|
||||||
import org.thingsboard.server.common.data.id.QueueId;
|
|
||||||
import org.thingsboard.server.common.data.id.RuleChainId;
|
import org.thingsboard.server.common.data.id.RuleChainId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
|
import org.thingsboard.server.common.data.ota.ChecksumAlgorithm;
|
||||||
@ -207,13 +207,6 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
|||||||
verifyEdgeConnectionAndInitialData();
|
verifyEdgeConnectionAndInitialData();
|
||||||
}
|
}
|
||||||
|
|
||||||
private QueueId getRandomQueueId() throws Exception {
|
|
||||||
List<Queue> ruleEngineQueues = doGetTypedWithPageLink("/api/queues?serviceType={serviceType}&",
|
|
||||||
new TypeReference<PageData<Queue>>() {}, new PageLink(100), ServiceType.TB_RULE_ENGINE.name())
|
|
||||||
.getData();
|
|
||||||
return ruleEngineQueues.get(0).getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void afterTest() throws Exception {
|
public void afterTest() throws Exception {
|
||||||
try {
|
try {
|
||||||
@ -388,6 +381,21 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
|||||||
Assert.assertEquals(deviceProfileUpdateMsg.getIdLSB(), deviceProfile.getUuidId().getLeastSignificantBits());
|
Assert.assertEquals(deviceProfileUpdateMsg.getIdLSB(), deviceProfile.getUuidId().getLeastSignificantBits());
|
||||||
|
|
||||||
// 2
|
// 2
|
||||||
|
OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(deviceProfile.getId());
|
||||||
|
edgeImitator.expectMessageAmount(1);
|
||||||
|
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||||
|
|
||||||
|
deviceProfile.setFirmwareId(firmwareOtaPackageInfo.getId());
|
||||||
|
edgeImitator.expectMessageAmount(1);
|
||||||
|
deviceProfile = doPost("/api/deviceProfile", deviceProfile, DeviceProfile.class);
|
||||||
|
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||||
|
latestMessage = edgeImitator.getLatestMessage();
|
||||||
|
Assert.assertTrue(latestMessage instanceof DeviceProfileUpdateMsg);
|
||||||
|
deviceProfileUpdateMsg = (DeviceProfileUpdateMsg) latestMessage;
|
||||||
|
Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdMSB());
|
||||||
|
Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceProfileUpdateMsg.getFirmwareIdLSB());
|
||||||
|
|
||||||
|
// 3
|
||||||
edgeImitator.expectMessageAmount(1);
|
edgeImitator.expectMessageAmount(1);
|
||||||
doDelete("/api/deviceProfile/" + deviceProfile.getUuidId())
|
doDelete("/api/deviceProfile/" + deviceProfile.getUuidId())
|
||||||
.andExpect(status().isOk());
|
.andExpect(status().isOk());
|
||||||
@ -1867,18 +1875,30 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
|||||||
|
|
||||||
private Device saveDeviceOnCloudAndVerifyDeliveryToEdge() throws Exception {
|
private Device saveDeviceOnCloudAndVerifyDeliveryToEdge() throws Exception {
|
||||||
edgeImitator.expectMessageAmount(1);
|
edgeImitator.expectMessageAmount(1);
|
||||||
Device savedDevice = saveDevice(RandomStringUtils.randomAlphanumeric(15), "Default");
|
OtaPackageInfo firmwareOtaPackageInfo = saveOtaPackageInfo(thermostatDeviceProfile.getId());
|
||||||
|
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||||
|
|
||||||
|
Device savedDevice = saveDevice(RandomStringUtils.randomAlphanumeric(15), thermostatDeviceProfile.getName());
|
||||||
|
savedDevice.setFirmwareId(firmwareOtaPackageInfo.getId());
|
||||||
|
savedDevice = doPost("/api/device", savedDevice, Device.class);
|
||||||
|
|
||||||
|
// wait until device UPDATED event is sent to edge notification service
|
||||||
|
// to avoid edge notification service to send device UPDATED event before ASSIGNED_TO_EDGE
|
||||||
|
Thread.sleep(500);
|
||||||
|
|
||||||
|
edgeImitator.expectMessageAmount(1);
|
||||||
doPost("/api/edge/" + edge.getUuidId()
|
doPost("/api/edge/" + edge.getUuidId()
|
||||||
+ "/device/" + savedDevice.getUuidId(), Device.class);
|
+ "/device/" + savedDevice.getUuidId(), Device.class);
|
||||||
Assert.assertTrue(edgeImitator.waitForMessages());
|
Assert.assertTrue(edgeImitator.waitForMessages());
|
||||||
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
|
AbstractMessage latestMessage = edgeImitator.getLatestMessage();
|
||||||
Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
|
Assert.assertTrue(latestMessage instanceof DeviceUpdateMsg);
|
||||||
DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
|
DeviceUpdateMsg deviceUpdateMsg = (DeviceUpdateMsg) latestMessage;
|
||||||
Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, deviceUpdateMsg.getMsgType());
|
|
||||||
Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
|
Assert.assertEquals(deviceUpdateMsg.getIdMSB(), savedDevice.getUuidId().getMostSignificantBits());
|
||||||
Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
|
Assert.assertEquals(deviceUpdateMsg.getIdLSB(), savedDevice.getUuidId().getLeastSignificantBits());
|
||||||
Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
|
Assert.assertEquals(deviceUpdateMsg.getName(), savedDevice.getName());
|
||||||
Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
|
Assert.assertEquals(deviceUpdateMsg.getType(), savedDevice.getType());
|
||||||
|
Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getMostSignificantBits(), deviceUpdateMsg.getFirmwareIdMSB());
|
||||||
|
Assert.assertEquals(firmwareOtaPackageInfo.getUuidId().getLeastSignificantBits(), deviceUpdateMsg.getFirmwareIdLSB());
|
||||||
return savedDevice;
|
return savedDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1904,7 +1924,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
|||||||
return asset;
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Device saveDevice(String deviceName, String type) throws Exception {
|
private Device saveDevice(String deviceName, String type) {
|
||||||
Device device = new Device();
|
Device device = new Device();
|
||||||
device.setName(deviceName);
|
device.setName(deviceName);
|
||||||
device.setType(type);
|
device.setType(type);
|
||||||
@ -1918,6 +1938,20 @@ abstract public class BaseEdgeTest extends AbstractControllerTest {
|
|||||||
return doPost("/api/asset", asset, Asset.class);
|
return doPost("/api/asset", asset, Asset.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private OtaPackageInfo saveOtaPackageInfo(DeviceProfileId deviceProfileId) {
|
||||||
|
SaveOtaPackageInfoRequest firmwareInfo = new SaveOtaPackageInfoRequest();
|
||||||
|
firmwareInfo.setDeviceProfileId(deviceProfileId);
|
||||||
|
firmwareInfo.setType(FIRMWARE);
|
||||||
|
firmwareInfo.setTitle("Firmware Edge " + RandomStringUtils.randomAlphanumeric(3));
|
||||||
|
firmwareInfo.setVersion("v1.0");
|
||||||
|
firmwareInfo.setTag("My firmware #1 v1.0");
|
||||||
|
firmwareInfo.setUsesUrl(true);
|
||||||
|
firmwareInfo.setUrl("http://localhost:8080/v1/package");
|
||||||
|
firmwareInfo.setAdditionalInfo(JacksonUtil.newObjectNode());
|
||||||
|
firmwareInfo.setChecksumAlgorithm(ChecksumAlgorithm.SHA256);
|
||||||
|
return doPost("/api/otaPackage", firmwareInfo, OtaPackageInfo.class);
|
||||||
|
}
|
||||||
|
|
||||||
private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) {
|
private EdgeEvent constructEdgeEvent(TenantId tenantId, EdgeId edgeId, EdgeEventActionType edgeEventAction, UUID entityId, EdgeEventType edgeEventType, JsonNode entityBody) {
|
||||||
EdgeEvent edgeEvent = new EdgeEvent();
|
EdgeEvent edgeEvent = new EdgeEvent();
|
||||||
edgeEvent.setEdgeId(edgeId);
|
edgeEvent.setEdgeId(edgeId);
|
||||||
|
|||||||
@ -198,6 +198,8 @@ message DeviceUpdateMsg {
|
|||||||
optional string label = 10;
|
optional string label = 10;
|
||||||
optional string additionalInfo = 11;
|
optional string additionalInfo = 11;
|
||||||
optional string conflictName = 12;
|
optional string conflictName = 12;
|
||||||
|
optional int64 firmwareIdMSB = 13;
|
||||||
|
optional int64 firmwareIdLSB = 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
message DeviceProfileUpdateMsg {
|
message DeviceProfileUpdateMsg {
|
||||||
@ -216,6 +218,8 @@ message DeviceProfileUpdateMsg {
|
|||||||
bytes profileDataBytes = 13;
|
bytes profileDataBytes = 13;
|
||||||
optional string provisionDeviceKey = 14;
|
optional string provisionDeviceKey = 14;
|
||||||
optional bytes image = 15;
|
optional bytes image = 15;
|
||||||
|
optional int64 firmwareIdMSB = 16;
|
||||||
|
optional int64 firmwareIdLSB = 17;
|
||||||
}
|
}
|
||||||
|
|
||||||
message DeviceCredentialsUpdateMsg {
|
message DeviceCredentialsUpdateMsg {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user