LWM2M: fix bug update FwUrl in client after change in profile
This commit is contained in:
parent
427ab87443
commit
c03893fb57
@ -36,6 +36,8 @@ import java.util.concurrent.Executors;
|
|||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import static org.eclipse.californium.core.network.config.NetworkConfigDefaults.DEFAULT_BLOCKWISE_STATUS_LIFETIME;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@TbCoapServerComponent
|
@TbCoapServerComponent
|
||||||
@ -91,7 +93,21 @@ public class DefaultCoapServerService implements CoapServerService {
|
|||||||
InetAddress addr = InetAddress.getByName(coapServerContext.getHost());
|
InetAddress addr = InetAddress.getByName(coapServerContext.getHost());
|
||||||
InetSocketAddress sockAddr = new InetSocketAddress(addr, coapServerContext.getPort());
|
InetSocketAddress sockAddr = new InetSocketAddress(addr, coapServerContext.getPort());
|
||||||
noSecCoapEndpointBuilder.setInetSocketAddress(sockAddr);
|
noSecCoapEndpointBuilder.setInetSocketAddress(sockAddr);
|
||||||
noSecCoapEndpointBuilder.setNetworkConfig(NetworkConfig.getStandard());
|
|
||||||
|
NetworkConfig coapConfig = new NetworkConfig();
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.COAP_PORT, 5683);
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.COAP_SECURE_PORT, 5684);
|
||||||
|
coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_STRICT_BLOCK2_OPTION, true);
|
||||||
|
coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER, true);
|
||||||
|
coapConfig.setLong(NetworkConfig.Keys.BLOCKWISE_STATUS_LIFETIME, DEFAULT_BLOCKWISE_STATUS_LIFETIME);
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE, 256 * 1024 * 1024);
|
||||||
|
coapConfig.setString(NetworkConfig.Keys.RESPONSE_MATCHING, "RELAXED");
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE, 1024);
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE, 1024);
|
||||||
|
|
||||||
|
coapConfig.setInt(NetworkConfig.Keys.MAX_RETRANSMIT, 10);
|
||||||
|
|
||||||
|
noSecCoapEndpointBuilder.setNetworkConfig(coapConfig);
|
||||||
CoapEndpoint noSecCoapEndpoint = noSecCoapEndpointBuilder.build();
|
CoapEndpoint noSecCoapEndpoint = noSecCoapEndpointBuilder.build();
|
||||||
server.addEndpoint(noSecCoapEndpoint);
|
server.addEndpoint(noSecCoapEndpoint);
|
||||||
|
|
||||||
|
|||||||
@ -18,11 +18,12 @@ package org.thingsboard.server.transport.coap;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.eclipse.californium.core.CoapResource;
|
import org.eclipse.californium.core.CoapResource;
|
||||||
import org.eclipse.californium.core.CoapServer;
|
import org.eclipse.californium.core.CoapServer;
|
||||||
|
import org.eclipse.californium.core.network.config.NetworkConfig;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.server.common.data.TbTransportService;
|
|
||||||
import org.thingsboard.server.coapserver.CoapServerService;
|
import org.thingsboard.server.coapserver.CoapServerService;
|
||||||
import org.thingsboard.server.coapserver.TbCoapServerComponent;
|
import org.thingsboard.server.coapserver.TbCoapServerComponent;
|
||||||
|
import org.thingsboard.server.common.data.TbTransportService;
|
||||||
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
||||||
import org.thingsboard.server.transport.coap.efento.CoapEfentoTransportResource;
|
import org.thingsboard.server.transport.coap.efento.CoapEfentoTransportResource;
|
||||||
|
|
||||||
@ -30,6 +31,8 @@ import javax.annotation.PostConstruct;
|
|||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
|
import static org.eclipse.californium.core.network.config.NetworkConfigDefaults.DEFAULT_BLOCKWISE_STATUS_LIFETIME;
|
||||||
|
|
||||||
@Service("CoapTransportService")
|
@Service("CoapTransportService")
|
||||||
@TbCoapServerComponent
|
@TbCoapServerComponent
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -52,6 +55,14 @@ public class CoapTransportService implements TbTransportService {
|
|||||||
public void init() throws UnknownHostException {
|
public void init() throws UnknownHostException {
|
||||||
log.info("Starting CoAP transport...");
|
log.info("Starting CoAP transport...");
|
||||||
coapServer = coapServerService.getCoapServer();
|
coapServer = coapServerService.getCoapServer();
|
||||||
|
coapServer.getConfig().setBoolean(NetworkConfig.Keys.BLOCKWISE_STRICT_BLOCK2_OPTION, true);
|
||||||
|
coapServer.getConfig().setBoolean(NetworkConfig.Keys.BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER, true);
|
||||||
|
coapServer.getConfig().setLong(NetworkConfig.Keys.BLOCKWISE_STATUS_LIFETIME, DEFAULT_BLOCKWISE_STATUS_LIFETIME);
|
||||||
|
coapServer.getConfig().setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE, 256 * 1024 * 1024);
|
||||||
|
coapServer.getConfig().setString(NetworkConfig.Keys.RESPONSE_MATCHING, "RELAXED");
|
||||||
|
coapServer.getConfig().setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE, 1024);
|
||||||
|
coapServer.getConfig().setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE, 1024);
|
||||||
|
coapServer.getConfig().setInt(NetworkConfig.Keys.MAX_RETRANSMIT, 10);
|
||||||
CoapResource api = new CoapResource(API);
|
CoapResource api = new CoapResource(API);
|
||||||
api.add(new CoapTransportResource(coapTransportContext, coapServerService, V1));
|
api.add(new CoapTransportResource(coapTransportContext, coapServerService, V1));
|
||||||
|
|
||||||
|
|||||||
@ -17,11 +17,13 @@ package org.thingsboard.server.transport.coap;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.eclipse.californium.core.coap.CoAP;
|
import org.eclipse.californium.core.coap.CoAP;
|
||||||
|
import org.eclipse.californium.core.coap.MediaTypeRegistry;
|
||||||
import org.eclipse.californium.core.coap.Request;
|
import org.eclipse.californium.core.coap.Request;
|
||||||
import org.eclipse.californium.core.coap.Response;
|
import org.eclipse.californium.core.coap.Response;
|
||||||
import org.eclipse.californium.core.network.Exchange;
|
import org.eclipse.californium.core.network.Exchange;
|
||||||
import org.eclipse.californium.core.server.resources.CoapExchange;
|
import org.eclipse.californium.core.server.resources.CoapExchange;
|
||||||
import org.eclipse.californium.core.server.resources.Resource;
|
import org.eclipse.californium.core.server.resources.Resource;
|
||||||
|
import org.thingsboard.common.util.ThingsBoardExecutors;
|
||||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
||||||
@ -32,16 +34,21 @@ import org.thingsboard.server.gen.transport.TransportProtos;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class OtaPackageTransportResource extends AbstractCoapTransportResource {
|
public class OtaPackageTransportResource extends AbstractCoapTransportResource {
|
||||||
private static final int ACCESS_TOKEN_POSITION = 2;
|
private static final int ACCESS_TOKEN_POSITION = 2;
|
||||||
|
|
||||||
private final OtaPackageType otaPackageType;
|
private final OtaPackageType otaPackageType;
|
||||||
|
private final ExecutorService sendOtaDataOutUriLarge;
|
||||||
|
|
||||||
public OtaPackageTransportResource(CoapTransportContext ctx, OtaPackageType otaPackageType) {
|
public OtaPackageTransportResource(CoapTransportContext ctx, OtaPackageType otaPackageType) {
|
||||||
super(ctx, otaPackageType.getKeyPrefix());
|
super(ctx, otaPackageType.getKeyPrefix());
|
||||||
this.otaPackageType = otaPackageType;
|
this.otaPackageType = otaPackageType;
|
||||||
|
|
||||||
|
this.setObservable(true);
|
||||||
|
this.sendOtaDataOutUriLarge = ThingsBoardExecutors.newWorkStealingPool(10, "LwM2M sendOtaDataOutUriLarge");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -132,11 +139,13 @@ public class OtaPackageTransportResource extends AbstractCoapTransportResource {
|
|||||||
Response response = new Response(CoAP.ResponseCode.CONTENT);
|
Response response = new Response(CoAP.ResponseCode.CONTENT);
|
||||||
if (data != null && data.length > 0) {
|
if (data != null && data.length > 0) {
|
||||||
response.setPayload(data);
|
response.setPayload(data);
|
||||||
|
response.getOptions().setAccept(MediaTypeRegistry.APPLICATION_OCTET_STREAM);
|
||||||
if (exchange.getRequestOptions().getBlock2() != null) {
|
if (exchange.getRequestOptions().getBlock2() != null) {
|
||||||
int chunkSize = exchange.getRequestOptions().getBlock2().getSzx();
|
int chunkSize = exchange.getRequestOptions().getBlock2().getSzx();
|
||||||
boolean lastFlag = data.length > chunkSize;
|
boolean lastFlag = data.length <= chunkSize;
|
||||||
response.getOptions().setBlock2(chunkSize, lastFlag, 0);
|
this.sendOtaDataOutUriLarge.submit(() -> {
|
||||||
}
|
response.getOptions().setBlock2(chunkSize, lastFlag, 0);
|
||||||
|
}); }
|
||||||
exchange.respond(response);
|
exchange.respond(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,10 +58,12 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
|||||||
public TbLwM2MSecurityInfo getEndpointSecurityInfoByCredentialsId(String credentialsId, LwM2mTransportUtil.LwM2mTypeServer keyValue) {
|
public TbLwM2MSecurityInfo getEndpointSecurityInfoByCredentialsId(String credentialsId, LwM2mTransportUtil.LwM2mTypeServer keyValue) {
|
||||||
CountDownLatch latch = new CountDownLatch(1);
|
CountDownLatch latch = new CountDownLatch(1);
|
||||||
final TbLwM2MSecurityInfo[] resultSecurityStore = new TbLwM2MSecurityInfo[1];
|
final TbLwM2MSecurityInfo[] resultSecurityStore = new TbLwM2MSecurityInfo[1];
|
||||||
|
log.warn("001) [{}]", credentialsId);
|
||||||
context.getTransportService().process(ValidateDeviceLwM2MCredentialsRequestMsg.newBuilder().setCredentialsId(credentialsId).build(),
|
context.getTransportService().process(ValidateDeviceLwM2MCredentialsRequestMsg.newBuilder().setCredentialsId(credentialsId).build(),
|
||||||
new TransportServiceCallback<>() {
|
new TransportServiceCallback<>() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(ValidateDeviceCredentialsResponse msg) {
|
public void onSuccess(ValidateDeviceCredentialsResponse msg) {
|
||||||
|
log.warn("002) [{}] [{}]", credentialsId, msg);
|
||||||
String credentialsBody = msg.getCredentials();
|
String credentialsBody = msg.getCredentials();
|
||||||
resultSecurityStore[0] = createSecurityInfo(credentialsId, credentialsBody, keyValue);
|
resultSecurityStore[0] = createSecurityInfo(credentialsId, credentialsBody, keyValue);
|
||||||
resultSecurityStore[0].setMsg(msg);
|
resultSecurityStore[0].setMsg(msg);
|
||||||
@ -71,6 +73,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(Throwable e) {
|
public void onError(Throwable e) {
|
||||||
|
log.warn("003) [{}] [{}] Failed to process credentials ", credentialsId, e);
|
||||||
log.trace("[{}] [{}] Failed to process credentials ", credentialsId, e);
|
log.trace("[{}] [{}] Failed to process credentials ", credentialsId, e);
|
||||||
resultSecurityStore[0] = createSecurityInfo(credentialsId, null, null);
|
resultSecurityStore[0] = createSecurityInfo(credentialsId, null, null);
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
|
|||||||
@ -25,8 +25,6 @@ import org.eclipse.californium.core.server.resources.CoapExchange;
|
|||||||
import org.eclipse.californium.core.server.resources.Resource;
|
import org.eclipse.californium.core.server.resources.Resource;
|
||||||
import org.eclipse.californium.core.server.resources.ResourceObserver;
|
import org.eclipse.californium.core.server.resources.ResourceObserver;
|
||||||
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2MUplinkMsgHandler;
|
|
||||||
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -143,7 +141,7 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource {
|
|||||||
response.setPayload(fwData);
|
response.setPayload(fwData);
|
||||||
if (exchange.getRequestOptions().getBlock2() != null) {
|
if (exchange.getRequestOptions().getBlock2() != null) {
|
||||||
int chunkSize = exchange.getRequestOptions().getBlock2().getSzx();
|
int chunkSize = exchange.getRequestOptions().getBlock2().getSzx();
|
||||||
boolean lastFlag = fwData.length > chunkSize;
|
boolean lastFlag = fwData.length <= chunkSize;
|
||||||
response.getOptions().setBlock2(chunkSize, lastFlag, 0);
|
response.getOptions().setBlock2(chunkSize, lastFlag, 0);
|
||||||
log.warn("92) with blokc2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), fwData.length, chunkSize, lastFlag);
|
log.warn("92) with blokc2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), fwData.length, chunkSize, lastFlag);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,6 +33,7 @@ import org.thingsboard.server.gen.transport.TransportProtos;
|
|||||||
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2MFirmwareUpdateStrategy;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MFirmwareUpdateStrategy;
|
||||||
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MSoftwareUpdateStrategy;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.UpdateResultFw;
|
import org.thingsboard.server.transport.lwm2m.server.UpdateResultFw;
|
||||||
@ -174,6 +175,24 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
|
|||||||
fwInfo.setCurrentName(name);
|
fwInfo.setCurrentName(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCurrentFirmwareStrategyUpdate(LwM2mClient client, Integer newStrategy, String newBaseUrl) {
|
||||||
|
log.debug("[{}] Current fw strategy: {}", client.getEndpoint(), newStrategy);
|
||||||
|
LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client);
|
||||||
|
fwInfo.setFwStrategy(LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(newStrategy));
|
||||||
|
fwInfo.setBaseUrl(newBaseUrl);
|
||||||
|
startFirmwareUpdateIfNeeded(client, fwInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCurrentSoftwareStrategyUpdate(LwM2mClient client, Integer newStrategy, String newBaseUrl) {
|
||||||
|
log.debug("[{}] Current sw strategy: {}", client.getEndpoint(), newStrategy);
|
||||||
|
LwM2MClientOtaInfo swInfo = getOrInitSwInfo(client);
|
||||||
|
swInfo.setSwStrategy(LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(newStrategy));
|
||||||
|
swInfo.setBaseUrl(newBaseUrl);
|
||||||
|
startSoftwareUpdateIfNeeded(client, swInfo);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCurrentFirmwareVersion3Update(LwM2mClient client, String version) {
|
public void onCurrentFirmwareVersion3Update(LwM2mClient client, String version) {
|
||||||
log.debug("[{}] Current fw version: {}", client.getEndpoint(), version);
|
log.debug("[{}] Current fw version: {}", client.getEndpoint(), version);
|
||||||
@ -250,6 +269,10 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void startSoftwareUpdateIfNeeded(LwM2mClient client, LwM2MClientOtaInfo swInfo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void startFirmwareUpdateUsingUrl(LwM2mClient client, String url) {
|
private void startFirmwareUpdateUsingUrl(LwM2mClient client, String url) {
|
||||||
String targetIdVer = convertObjectIdToVersionedId(FW_URL_ID, client.getRegistration());
|
String targetIdVer = convertObjectIdToVersionedId(FW_URL_ID, client.getRegistration());
|
||||||
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(config.getTimeout()).build();
|
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(config.getTimeout()).build();
|
||||||
@ -277,7 +300,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
|
|||||||
UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
|
UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
|
||||||
LwM2MFirmwareUpdateStrategy strategy;
|
LwM2MFirmwareUpdateStrategy strategy;
|
||||||
if (fwInfo.getDeliveryMethod() == null || fwInfo.getDeliveryMethod() == 2) {
|
if (fwInfo.getDeliveryMethod() == null || fwInfo.getDeliveryMethod() == 2) {
|
||||||
strategy = fwInfo.getStrategy();
|
strategy = fwInfo.getFwStrategy();
|
||||||
} else {
|
} else {
|
||||||
strategy = fwInfo.getDeliveryMethod() == 0 ? LwM2MFirmwareUpdateStrategy.OBJ_5_TEMP_URL : LwM2MFirmwareUpdateStrategy.OBJ_5_BINARY;
|
strategy = fwInfo.getDeliveryMethod() == 0 ? LwM2MFirmwareUpdateStrategy.OBJ_5_TEMP_URL : LwM2MFirmwareUpdateStrategy.OBJ_5_BINARY;
|
||||||
}
|
}
|
||||||
@ -328,9 +351,9 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
|
|||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private LwM2MClientOtaInfo getOrInitFwInfo(LwM2mClient client) {
|
public LwM2MClientOtaInfo getOrInitFwInfo(LwM2mClient client) {
|
||||||
//TODO: fetch state from the cache or DB.
|
//TODO: fetch state from the cache or DB.
|
||||||
return fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
|
return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
|
||||||
var profile = clientContext.getProfile(client.getProfileId());
|
var profile = clientContext.getProfile(client.getProfileId());
|
||||||
return new LwM2MClientOtaInfo(endpoint, OtaPackageType.FIRMWARE, profile.getClientLwM2mSettings().getFwUpdateStrategy(),
|
return new LwM2MClientOtaInfo(endpoint, OtaPackageType.FIRMWARE, profile.getClientLwM2mSettings().getFwUpdateStrategy(),
|
||||||
profile.getClientLwM2mSettings().getFwUpdateRecourse());
|
profile.getClientLwM2mSettings().getFwUpdateRecourse());
|
||||||
|
|||||||
@ -19,8 +19,9 @@ import lombok.Data;
|
|||||||
import org.thingsboard.server.common.data.StringUtils;
|
import org.thingsboard.server.common.data.StringUtils;
|
||||||
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2MFirmwareUpdateStrategy;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MFirmwareUpdateStrategy;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.UpdateStateFw;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MSoftwareUpdateStrategy;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.UpdateResultFw;
|
import org.thingsboard.server.transport.lwm2m.server.UpdateResultFw;
|
||||||
|
import org.thingsboard.server.transport.lwm2m.server.UpdateStateFw;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -44,7 +45,8 @@ public class LwM2MClientOtaInfo {
|
|||||||
private Integer deliveryMethod;
|
private Integer deliveryMethod;
|
||||||
|
|
||||||
//TODO: use value from device if applicable;
|
//TODO: use value from device if applicable;
|
||||||
private LwM2MFirmwareUpdateStrategy strategy;
|
private LwM2MFirmwareUpdateStrategy fwStrategy;
|
||||||
|
private LwM2MSoftwareUpdateStrategy swStrategy;
|
||||||
private UpdateStateFw updateState;
|
private UpdateStateFw updateState;
|
||||||
private UpdateResultFw updateResult;
|
private UpdateResultFw updateResult;
|
||||||
|
|
||||||
@ -54,7 +56,7 @@ public class LwM2MClientOtaInfo {
|
|||||||
public LwM2MClientOtaInfo(String endpoint, OtaPackageType type, Integer strategyCode, String baseUrl) {
|
public LwM2MClientOtaInfo(String endpoint, OtaPackageType type, Integer strategyCode, String baseUrl) {
|
||||||
this.endpoint = endpoint;
|
this.endpoint = endpoint;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.strategy = LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(strategyCode);
|
this.fwStrategy = LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(strategyCode);
|
||||||
this.baseUrl = baseUrl;
|
this.baseUrl = baseUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -31,6 +31,10 @@ public interface LwM2MOtaUpdateService {
|
|||||||
|
|
||||||
void onCurrentFirmwareNameUpdate(LwM2mClient client, String name);
|
void onCurrentFirmwareNameUpdate(LwM2mClient client, String name);
|
||||||
|
|
||||||
|
void onCurrentFirmwareStrategyUpdate(LwM2mClient client, Integer newStrategy, String newBaseUrl);
|
||||||
|
|
||||||
|
void onCurrentSoftwareStrategyUpdate(LwM2mClient client, Integer newStrategy, String newBaseUrl);
|
||||||
|
|
||||||
void onCurrentFirmwareVersion3Update(LwM2mClient client, String version);
|
void onCurrentFirmwareVersion3Update(LwM2mClient client, String version);
|
||||||
|
|
||||||
void onCurrentFirmwareVersion5Update(LwM2mClient client, String version);
|
void onCurrentFirmwareVersion5Update(LwM2mClient client, String version);
|
||||||
|
|||||||
@ -37,7 +37,6 @@ import org.eclipse.leshan.server.registration.Registration;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.DonAsynchron;
|
import org.thingsboard.common.util.DonAsynchron;
|
||||||
import org.thingsboard.common.util.ThingsBoardExecutors;
|
|
||||||
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.DeviceProfile;
|
import org.thingsboard.server.common.data.DeviceProfile;
|
||||||
@ -53,6 +52,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent;
|
|||||||
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
|
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
|
||||||
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||||
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MFirmwareUpdateStrategy;
|
||||||
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MSoftwareUpdateStrategy;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mOtaConvert;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mOtaConvert;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest;
|
||||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener;
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener;
|
||||||
@ -100,7 +101,6 @@ import java.util.Set;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -779,6 +779,29 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
|
|||||||
clients.forEach(client -> sendCancelObserveRequest(targetId, client));
|
clients.forEach(client -> sendCancelObserveRequest(targetId, client));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// # 7.1
|
||||||
|
// update value in fwInfo
|
||||||
|
if (!newProfile.getClientLwM2mSettings().getFwUpdateStrategy().equals(oldProfile.getClientLwM2mSettings().getFwUpdateStrategy())
|
||||||
|
|| (LwM2MFirmwareUpdateStrategy.OBJ_5_TEMP_URL.code == newProfile.getClientLwM2mSettings().getFwUpdateStrategy() &&
|
||||||
|
!newProfile.getClientLwM2mSettings().getFwUpdateRecourse().equals(oldProfile.getClientLwM2mSettings().getFwUpdateRecourse()))) {
|
||||||
|
clients.forEach(lwM2MClient -> {
|
||||||
|
otaService.onCurrentFirmwareStrategyUpdate(lwM2MClient,
|
||||||
|
newProfile.getClientLwM2mSettings().getFwUpdateStrategy(),
|
||||||
|
newProfile.getClientLwM2mSettings().getFwUpdateRecourse());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//# 7.2 // update value in swInfo
|
||||||
|
if (!newProfile.getClientLwM2mSettings().getSwUpdateStrategy().equals(oldProfile.getClientLwM2mSettings().getSwUpdateStrategy())
|
||||||
|
|| (LwM2MSoftwareUpdateStrategy.TEMP_URL.code == newProfile.getClientLwM2mSettings().getSwUpdateStrategy() &&
|
||||||
|
!newProfile.getClientLwM2mSettings().getSwUpdateRecourse().equals(oldProfile.getClientLwM2mSettings().getSwUpdateRecourse()))) {
|
||||||
|
clients.forEach(lwM2MClient -> {
|
||||||
|
otaService.onCurrentSoftwareStrategyUpdate(lwM2MClient,
|
||||||
|
newProfile.getClientLwM2mSettings().getFwUpdateStrategy(),
|
||||||
|
newProfile.getClientLwM2mSettings().getFwUpdateRecourse());
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -160,9 +160,9 @@
|
|||||||
<!-- <div fxLayout="column">-->
|
<!-- <div fxLayout="column">-->
|
||||||
<!-- <mat-form-field class="mat-block">-->
|
<!-- <mat-form-field class="mat-block">-->
|
||||||
<!-- <mat-label>{{ 'device-profile.lwm2m.client-strategy-label' | translate }}</mat-label>-->
|
<!-- <mat-label>{{ 'device-profile.lwm2m.client-strategy-label' | translate }}</mat-label>-->
|
||||||
<!-- <mat-select formControlName="clientStrategy"-->
|
<!-- <mat-select formControlName="clientOnlyObserveAfterConnect"-->
|
||||||
<!-- matTooltip="{{ 'device-profile.lwm2m.client-strategy-tip' | translate:-->
|
<!-- matTooltip="{{ 'device-profile.lwm2m.client-strategy-tip' | translate:-->
|
||||||
<!-- { count: +lwm2mDeviceProfileFormGroup.get('clientStrategy').value } }}"-->
|
<!-- { count: +lwm2mDeviceProfileFormGroup.get('clientOnlyObserveAfterConnect').value } }}"-->
|
||||||
<!-- matTooltipPosition="above">-->
|
<!-- matTooltipPosition="above">-->
|
||||||
<!-- <mat-option value=1>{{ 'device-profile.lwm2m.client-strategy-connect' | translate:-->
|
<!-- <mat-option value=1>{{ 'device-profile.lwm2m.client-strategy-connect' | translate:-->
|
||||||
<!-- {count: 1} }}</mat-option>-->
|
<!-- {count: 1} }}</mat-option>-->
|
||||||
|
|||||||
@ -97,7 +97,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
|
|||||||
binding: [],
|
binding: [],
|
||||||
bootstrapServer: [null, Validators.required],
|
bootstrapServer: [null, Validators.required],
|
||||||
lwm2mServer: [null, Validators.required],
|
lwm2mServer: [null, Validators.required],
|
||||||
clientStrategy: [1, []],
|
clientOnlyObserveAfterConnect: [1, []],
|
||||||
fwUpdateStrategy: [1, []],
|
fwUpdateStrategy: [1, []],
|
||||||
swUpdateStrategy: [1, []],
|
swUpdateStrategy: [1, []],
|
||||||
fwUpdateRecourse: [{value: '', disabled: true}, []],
|
fwUpdateRecourse: [{value: '', disabled: true}, []],
|
||||||
@ -216,7 +216,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
|
|||||||
binding: this.configurationValue.bootstrap.servers.binding,
|
binding: this.configurationValue.bootstrap.servers.binding,
|
||||||
bootstrapServer: this.configurationValue.bootstrap.bootstrapServer,
|
bootstrapServer: this.configurationValue.bootstrap.bootstrapServer,
|
||||||
lwm2mServer: this.configurationValue.bootstrap.lwm2mServer,
|
lwm2mServer: this.configurationValue.bootstrap.lwm2mServer,
|
||||||
clientStrategy: this.configurationValue.clientLwM2mSettings.clientStrategy,
|
clientOnlyObserveAfterConnect: this.configurationValue.clientLwM2mSettings.clientOnlyObserveAfterConnect,
|
||||||
fwUpdateStrategy: this.configurationValue.clientLwM2mSettings.fwUpdateStrategy || 1,
|
fwUpdateStrategy: this.configurationValue.clientLwM2mSettings.fwUpdateStrategy || 1,
|
||||||
swUpdateStrategy: this.configurationValue.clientLwM2mSettings.swUpdateStrategy || 1,
|
swUpdateStrategy: this.configurationValue.clientLwM2mSettings.swUpdateStrategy || 1,
|
||||||
fwUpdateRecourse: fwResource,
|
fwUpdateRecourse: fwResource,
|
||||||
@ -257,7 +257,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
|
|||||||
bootstrapServers.defaultMinPeriod = config.defaultMinPeriod;
|
bootstrapServers.defaultMinPeriod = config.defaultMinPeriod;
|
||||||
bootstrapServers.notifIfDisabled = config.notifIfDisabled;
|
bootstrapServers.notifIfDisabled = config.notifIfDisabled;
|
||||||
bootstrapServers.binding = config.binding;
|
bootstrapServers.binding = config.binding;
|
||||||
this.configurationValue.clientLwM2mSettings.clientStrategy = config.clientStrategy;
|
this.configurationValue.clientLwM2mSettings.clientOnlyObserveAfterConnect = config.clientOnlyObserveAfterConnect;
|
||||||
this.configurationValue.clientLwM2mSettings.fwUpdateStrategy = config.fwUpdateStrategy;
|
this.configurationValue.clientLwM2mSettings.fwUpdateStrategy = config.fwUpdateStrategy;
|
||||||
this.configurationValue.clientLwM2mSettings.swUpdateStrategy = config.swUpdateStrategy;
|
this.configurationValue.clientLwM2mSettings.swUpdateStrategy = config.swUpdateStrategy;
|
||||||
this.configurationValue.clientLwM2mSettings.fwUpdateRecourse = config.fwUpdateRecourse;
|
this.configurationValue.clientLwM2mSettings.fwUpdateRecourse = config.fwUpdateRecourse;
|
||||||
|
|||||||
@ -168,7 +168,7 @@ export interface Lwm2mProfileConfigModels {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface ClientLwM2mSettings {
|
export interface ClientLwM2mSettings {
|
||||||
clientStrategy: string;
|
clientOnlyObserveAfterConnect: number;
|
||||||
fwUpdateStrategy: number;
|
fwUpdateStrategy: number;
|
||||||
swUpdateStrategy: number;
|
swUpdateStrategy: number;
|
||||||
fwUpdateRecourse: string;
|
fwUpdateRecourse: string;
|
||||||
@ -240,7 +240,7 @@ export function getDefaultProfileConfig(hostname?: any): Lwm2mProfileConfigModel
|
|||||||
|
|
||||||
function getDefaultProfileClientLwM2mSettingsConfig(): ClientLwM2mSettings {
|
function getDefaultProfileClientLwM2mSettingsConfig(): ClientLwM2mSettings {
|
||||||
return {
|
return {
|
||||||
clientStrategy: '1',
|
clientOnlyObserveAfterConnect: 1,
|
||||||
fwUpdateStrategy: 1,
|
fwUpdateStrategy: 1,
|
||||||
swUpdateStrategy: 1,
|
swUpdateStrategy: 1,
|
||||||
fwUpdateRecourse: DEFAULT_FW_UPDATE_RESOURCE,
|
fwUpdateRecourse: DEFAULT_FW_UPDATE_RESOURCE,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user