Commit eb9b0f8433235f2ef675ab22e47d4563cc0d853c

Authored by Andrii Shvaika
1 parent 7ec69234

Implementation of software management

Showing 16 changed files with 480 additions and 186 deletions
@@ -26,7 +26,6 @@ @@ -26,7 +26,6 @@
26 </appender> 26 </appender>
27 27
28 <logger name="org.thingsboard.server" level="INFO" /> 28 <logger name="org.thingsboard.server" level="INFO" />
29 - <logger name="org.thingsboard.server.transport.snmp" level="DEBUG" />  
30 29
31 <!-- <logger name="org.thingsboard.server.service.queue" level="TRACE" />--> 30 <!-- <logger name="org.thingsboard.server.service.queue" level="TRACE" />-->
32 <!-- <logger name="org.thingsboard.server.service.transport" level="TRACE" />--> 31 <!-- <logger name="org.thingsboard.server.service.transport" level="TRACE" />-->
@@ -62,7 +62,7 @@ public class TbLwM2MAuthorizer implements Authorizer { @@ -62,7 +62,7 @@ public class TbLwM2MAuthorizer implements Authorizer {
62 try { 62 try {
63 expectedSecurityInfo = securityStore.getByEndpoint(registration.getEndpoint()); 63 expectedSecurityInfo = securityStore.getByEndpoint(registration.getEndpoint());
64 } catch (LwM2MAuthException e) { 64 } catch (LwM2MAuthException e) {
65 - log.warn("Registration failed: FORBIDDEN, endpointId: [{}]", registration.getEndpoint()); 65 + log.info("Registration failed: FORBIDDEN, endpointId: [{}]", registration.getEndpoint());
66 return null; 66 return null;
67 } 67 }
68 } 68 }
@@ -26,6 +26,7 @@ import org.eclipse.californium.core.server.resources.Resource; @@ -26,6 +26,7 @@ import org.eclipse.californium.core.server.resources.Resource;
26 import org.eclipse.californium.core.server.resources.ResourceObserver; 26 import org.eclipse.californium.core.server.resources.ResourceObserver;
27 import org.thingsboard.server.cache.ota.OtaPackageDataCache; 27 import org.thingsboard.server.cache.ota.OtaPackageDataCache;
28 28
  29 +import java.util.List;
29 import java.util.UUID; 30 import java.util.UUID;
30 import java.util.concurrent.ConcurrentHashMap; 31 import java.util.concurrent.ConcurrentHashMap;
31 import java.util.concurrent.ConcurrentMap; 32 import java.util.concurrent.ConcurrentMap;
@@ -69,17 +70,18 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource { @@ -69,17 +70,18 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource {
69 70
70 @Override 71 @Override
71 protected void processHandleGet(CoapExchange exchange) { 72 protected void processHandleGet(CoapExchange exchange) {
72 - log.warn("90) processHandleGet [{}]", exchange);  
73 - if (exchange.getRequestOptions().getUriPath().size() >= 2 &&  
74 - (FIRMWARE_UPDATE_COAP_RESOURCE.equals(exchange.getRequestOptions().getUriPath().get(exchange.getRequestOptions().getUriPath().size() - 2)) ||  
75 - SOFTWARE_UPDATE_COAP_RESOURCE.equals(exchange.getRequestOptions().getUriPath().get(exchange.getRequestOptions().getUriPath().size() - 2)))) { 73 + log.debug("processHandleGet [{}]", exchange);
  74 + List<String> uriPath = exchange.getRequestOptions().getUriPath();
  75 + if (uriPath.size() >= 2 &&
  76 + (FIRMWARE_UPDATE_COAP_RESOURCE.equals(uriPath.get(uriPath.size() - 2)) ||
  77 + SOFTWARE_UPDATE_COAP_RESOURCE.equals(uriPath.get(uriPath.size() - 2)))) {
76 this.sendOtaData(exchange); 78 this.sendOtaData(exchange);
77 } 79 }
78 } 80 }
79 81
80 @Override 82 @Override
81 protected void processHandlePost(CoapExchange exchange) { 83 protected void processHandlePost(CoapExchange exchange) {
82 - log.warn("2) processHandleGet [{}]", exchange); 84 + log.debug("processHandlePost [{}]", exchange);
83 } 85 }
84 86
85 /** 87 /**
@@ -136,16 +138,16 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource { @@ -136,16 +138,16 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource {
136 UUID currentId = UUID.fromString(idStr); 138 UUID currentId = UUID.fromString(idStr);
137 Response response = new Response(CoAP.ResponseCode.CONTENT); 139 Response response = new Response(CoAP.ResponseCode.CONTENT);
138 byte[] fwData = this.getOtaData(currentId); 140 byte[] fwData = this.getOtaData(currentId);
139 - log.warn("91) read softWare data (length): [{}]", fwData.length); 141 + log.debug("Read softWare data (length): [{}]", fwData.length);
140 if (fwData != null && fwData.length > 0) { 142 if (fwData != null && fwData.length > 0) {
141 response.setPayload(fwData); 143 response.setPayload(fwData);
142 if (exchange.getRequestOptions().getBlock2() != null) { 144 if (exchange.getRequestOptions().getBlock2() != null) {
143 int chunkSize = exchange.getRequestOptions().getBlock2().getSzx(); 145 int chunkSize = exchange.getRequestOptions().getBlock2().getSzx();
144 boolean lastFlag = fwData.length <= chunkSize; 146 boolean lastFlag = fwData.length <= chunkSize;
145 response.getOptions().setBlock2(chunkSize, lastFlag, 0); 147 response.getOptions().setBlock2(chunkSize, lastFlag, 0);
146 - log.warn("92) with blokc2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), fwData.length, chunkSize, lastFlag); 148 + log.trace("With block2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), fwData.length, chunkSize, lastFlag);
147 } else { 149 } else {
148 - log.warn("92) with block1 Send currentId: [{}], length: [{}], ", currentId.toString(), fwData.length); 150 + log.trace("With block1 Send currentId: [{}], length: [{}], ", currentId.toString(), fwData.length);
149 } 151 }
150 exchange.respond(response); 152 exchange.respond(response);
151 } 153 }
@@ -69,7 +69,7 @@ import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPA @@ -69,7 +69,7 @@ import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPA
69 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_RESULT_ID; 69 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_RESULT_ID;
70 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_STATE_ID; 70 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_STATE_ID;
71 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_RESULT_ID; 71 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_RESULT_ID;
72 -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_UPDATE_STATE_ID; 72 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_STATE_ID;
73 73
74 @Slf4j 74 @Slf4j
75 public class LwM2mTransportUtil { 75 public class LwM2mTransportUtil {
@@ -143,7 +143,7 @@ public class LwM2mTransportUtil { @@ -143,7 +143,7 @@ public class LwM2mTransportUtil {
143 lwM2mOtaConvert.setCurrentType(STRING); 143 lwM2mOtaConvert.setCurrentType(STRING);
144 lwM2mOtaConvert.setValue(FirmwareUpdateResult.fromUpdateResultFwByCode(((Long) value).intValue()).getType()); 144 lwM2mOtaConvert.setValue(FirmwareUpdateResult.fromUpdateResultFwByCode(((Long) value).intValue()).getType());
145 return lwM2mOtaConvert; 145 return lwM2mOtaConvert;
146 - } else if (SW_UPDATE_STATE_ID.equals(path)) { 146 + } else if (SW_STATE_ID.equals(path)) {
147 lwM2mOtaConvert.setCurrentType(STRING); 147 lwM2mOtaConvert.setCurrentType(STRING);
148 lwM2mOtaConvert.setValue(SoftwareUpdateState.fromUpdateStateSwByCode(((Long) value).intValue()).type); 148 lwM2mOtaConvert.setValue(SoftwareUpdateState.fromUpdateStateSwByCode(((Long) value).intValue()).type);
149 return lwM2mOtaConvert; 149 return lwM2mOtaConvert;
@@ -163,7 +163,7 @@ public class LwM2mTransportUtil { @@ -163,7 +163,7 @@ public class LwM2mTransportUtil {
163 if (transportConfiguration.getType().equals(DeviceTransportType.LWM2M)) { 163 if (transportConfiguration.getType().equals(DeviceTransportType.LWM2M)) {
164 return (Lwm2mDeviceProfileTransportConfiguration) transportConfiguration; 164 return (Lwm2mDeviceProfileTransportConfiguration) transportConfiguration;
165 } else { 165 } else {
166 - log.warn("[{}] Received profile with invalid transport configuration: {}", deviceProfile.getId(), deviceProfile.getProfileData().getTransportConfiguration()); 166 + log.info("[{}] Received profile with invalid transport configuration: {}", deviceProfile.getId(), deviceProfile.getProfileData().getTransportConfiguration());
167 throw new IllegalArgumentException("Received profile with invalid transport configuration: " + transportConfiguration.getType()); 167 throw new IllegalArgumentException("Received profile with invalid transport configuration: " + transportConfiguration.getType());
168 } 168 }
169 } 169 }
@@ -185,7 +185,7 @@ public class LwM2mTransportUtil { @@ -185,7 +185,7 @@ public class LwM2mTransportUtil {
185 return pathIdVer; 185 return pathIdVer;
186 } 186 }
187 } catch (Exception e) { 187 } catch (Exception e) {
188 - log.warn("Issue converting path with version [{}] to path without version: ", pathIdVer, e); 188 + log.debug("Issue converting path with version [{}] to path without version: ", pathIdVer, e);
189 throw new RuntimeException(e); 189 throw new RuntimeException(e);
190 } 190 }
191 } 191 }
@@ -123,6 +123,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService { @@ -123,6 +123,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
123 String newFirmwareUrl = null; 123 String newFirmwareUrl = null;
124 String newSoftwareTitle = null; 124 String newSoftwareTitle = null;
125 String newSoftwareVersion = null; 125 String newSoftwareVersion = null;
  126 + String newSoftwareUrl = null;
126 List<TransportProtos.TsKvProto> otherAttributes = new ArrayList<>(); 127 List<TransportProtos.TsKvProto> otherAttributes = new ArrayList<>();
127 for (TransportProtos.TsKvProto tsKvProto : msg.getSharedUpdatedList()) { 128 for (TransportProtos.TsKvProto tsKvProto : msg.getSharedUpdatedList()) {
128 String attrName = tsKvProto.getKv().getKey(); 129 String attrName = tsKvProto.getKv().getKey();
@@ -136,7 +137,9 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService { @@ -136,7 +137,9 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
136 newSoftwareTitle = getStrValue(tsKvProto); 137 newSoftwareTitle = getStrValue(tsKvProto);
137 } else if (DefaultLwM2MOtaUpdateService.SOFTWARE_VERSION.equals(attrName)) { 138 } else if (DefaultLwM2MOtaUpdateService.SOFTWARE_VERSION.equals(attrName)) {
138 newSoftwareVersion = getStrValue(tsKvProto); 139 newSoftwareVersion = getStrValue(tsKvProto);
139 - } else { 140 + } else if (DefaultLwM2MOtaUpdateService.SOFTWARE_URL.equals(attrName)) {
  141 + newSoftwareUrl = getStrValue(tsKvProto);
  142 + }else {
140 otherAttributes.add(tsKvProto); 143 otherAttributes.add(tsKvProto);
141 } 144 }
142 } 145 }
@@ -144,7 +147,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService { @@ -144,7 +147,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
144 otaUpdateService.onTargetFirmwareUpdate(lwM2MClient, newFirmwareTitle, newFirmwareVersion, Optional.ofNullable(newFirmwareUrl)); 147 otaUpdateService.onTargetFirmwareUpdate(lwM2MClient, newFirmwareTitle, newFirmwareVersion, Optional.ofNullable(newFirmwareUrl));
145 } 148 }
146 if (newSoftwareTitle != null || newSoftwareVersion != null) { 149 if (newSoftwareTitle != null || newSoftwareVersion != null) {
147 - otaUpdateService.onTargetSoftwareUpdate(lwM2MClient, newSoftwareTitle, newSoftwareVersion); 150 + otaUpdateService.onTargetSoftwareUpdate(lwM2MClient, newSoftwareTitle, newSoftwareVersion, Optional.ofNullable(newSoftwareUrl));
148 } 151 }
149 if (!otherAttributes.isEmpty()) { 152 if (!otherAttributes.isEmpty()) {
150 onAttributesUpdate(lwM2MClient, otherAttributes); 153 onAttributesUpdate(lwM2MClient, otherAttributes);
@@ -45,10 +45,12 @@ import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteRequ @@ -45,10 +45,12 @@ import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteRequ
45 import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest; 45 import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest;
46 import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteResponseCallback; 46 import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteResponseCallback;
47 import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; 47 import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
  48 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MClientFwOtaInfo;
48 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MFirmwareUpdateStrategy; 49 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MFirmwareUpdateStrategy;
49 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareDeliveryMethod; 50 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareDeliveryMethod;
50 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateResult; 51 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateResult;
51 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateState; 52 import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateState;
  53 +import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MClientSwOtaInfo;
52 import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MSoftwareUpdateStrategy; 54 import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MSoftwareUpdateStrategy;
53 import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateResult; 55 import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateResult;
54 import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateState; 56 import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateState;
@@ -91,12 +93,13 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -91,12 +93,13 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
91 public static final String FIRMWARE_UPDATE_COAP_RESOURCE = "tbfw"; 93 public static final String FIRMWARE_UPDATE_COAP_RESOURCE = "tbfw";
92 public static final String SOFTWARE_UPDATE_COAP_RESOURCE = "tbsw"; 94 public static final String SOFTWARE_UPDATE_COAP_RESOURCE = "tbsw";
93 private static final String FW_PACKAGE_5_ID = "/5/0/0"; 95 private static final String FW_PACKAGE_5_ID = "/5/0/0";
  96 + private static final String FW_PACKAGE_19_ID = "/19/0/0";
94 private static final String FW_URL_ID = "/5/0/1"; 97 private static final String FW_URL_ID = "/5/0/1";
95 private static final String FW_EXECUTE_ID = "/5/0/2"; 98 private static final String FW_EXECUTE_ID = "/5/0/2";
96 public static final String FW_STATE_ID = "/5/0/3"; 99 public static final String FW_STATE_ID = "/5/0/3";
97 public static final String FW_RESULT_ID = "/5/0/5"; 100 public static final String FW_RESULT_ID = "/5/0/5";
98 public static final String FW_NAME_ID = "/5/0/6"; 101 public static final String FW_NAME_ID = "/5/0/6";
99 - public static final String FW_5_VER_ID = "/5/0/7"; 102 + public static final String FW_VER_ID = "/5/0/7";
100 /** 103 /**
101 * Quectel@Hi15RM1-HLB_V1.0@BC68JAR01A10,V150R100C20B300SP7,V150R100C20B300SP7@8 104 * Quectel@Hi15RM1-HLB_V1.0@BC68JAR01A10,V150R100C20B300SP7,V150R100C20B300SP7@8
102 * Revision:BC68JAR01A10 105 * Revision:BC68JAR01A10
@@ -104,17 +107,19 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -104,17 +107,19 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
104 public static final String FW_3_VER_ID = "/3/0/3"; 107 public static final String FW_3_VER_ID = "/3/0/3";
105 public static final String FW_DELIVERY_METHOD = "/5/0/9"; 108 public static final String FW_DELIVERY_METHOD = "/5/0/9";
106 109
107 - private static final String SW_NAME_ID = "/9/0/0";  
108 - private static final String SW_VER_ID = "/9/0/1"; 110 + public static final String SW_3_VER_ID = "/3/0/19";
  111 +
  112 + public static final String SW_NAME_ID = "/9/0/0";
  113 + public static final String SW_VER_ID = "/9/0/1";
109 public static final String SW_PACKAGE_ID = "/9/0/2"; 114 public static final String SW_PACKAGE_ID = "/9/0/2";
110 public static final String SW_PACKAGE_URI_ID = "/9/0/3"; 115 public static final String SW_PACKAGE_URI_ID = "/9/0/3";
111 public static final String SW_INSTALL_ID = "/9/0/4"; 116 public static final String SW_INSTALL_ID = "/9/0/4";
112 - public static final String SW_UPDATE_STATE_ID = "/9/0/7"; 117 + public static final String SW_STATE_ID = "/9/0/7";
113 public static final String SW_RESULT_ID = "/9/0/9"; 118 public static final String SW_RESULT_ID = "/9/0/9";
114 public static final String SW_UN_INSTALL_ID = "/9/0/6"; 119 public static final String SW_UN_INSTALL_ID = "/9/0/6";
115 120
116 - private final Map<String, LwM2MClientOtaInfo> fwStates = new ConcurrentHashMap<>();  
117 - private final Map<String, LwM2MClientOtaInfo> swStates = new ConcurrentHashMap<>(); 121 + private final Map<String, LwM2MClientFwOtaInfo> fwStates = new ConcurrentHashMap<>();
  122 + private final Map<String, LwM2MClientSwOtaInfo> swStates = new ConcurrentHashMap<>();
118 123
119 private final TransportService transportService; 124 private final TransportService transportService;
120 private final LwM2mClientContext clientContext; 125 private final LwM2mClientContext clientContext;
@@ -155,27 +160,41 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -155,27 +160,41 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
155 //TODO: add locks by client fwInfo. 160 //TODO: add locks by client fwInfo.
156 //TODO: check that the client supports FW and SW by checking the supported objects in the model. 161 //TODO: check that the client supports FW and SW by checking the supported objects in the model.
157 List<String> attributesToFetch = new ArrayList<>(); 162 List<String> attributesToFetch = new ArrayList<>();
158 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 163 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
159 if (fwInfo.isSupported()) { 164 if (fwInfo.isSupported()) {
160 attributesToFetch.add(FIRMWARE_TITLE); 165 attributesToFetch.add(FIRMWARE_TITLE);
161 attributesToFetch.add(FIRMWARE_VERSION); 166 attributesToFetch.add(FIRMWARE_VERSION);
162 attributesToFetch.add(FIRMWARE_URL); 167 attributesToFetch.add(FIRMWARE_URL);
163 } 168 }
164 169
  170 + LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
  171 + if (swInfo.isSupported()) {
  172 + attributesToFetch.add(SOFTWARE_TITLE);
  173 + attributesToFetch.add(SOFTWARE_VERSION);
  174 + attributesToFetch.add(SOFTWARE_URL);
  175 + }
  176 +
165 if (!attributesToFetch.isEmpty()) { 177 if (!attributesToFetch.isEmpty()) {
166 var future = attributesService.getSharedAttributes(client, attributesToFetch); 178 var future = attributesService.getSharedAttributes(client, attributesToFetch);
167 DonAsynchron.withCallback(future, attrs -> { 179 DonAsynchron.withCallback(future, attrs -> {
168 if (fwInfo.isSupported()) { 180 if (fwInfo.isSupported()) {
169 - Optional<String> newFirmwareTitle = getAttributeValue(attrs, FIRMWARE_TITLE);  
170 - Optional<String> newFirmwareVersion = getAttributeValue(attrs, FIRMWARE_VERSION);  
171 - Optional<String> newFirmwareUrl = getAttributeValue(attrs, FIRMWARE_URL);  
172 - if (newFirmwareTitle.isPresent() && newFirmwareVersion.isPresent()) {  
173 - onTargetFirmwareUpdate(client, newFirmwareTitle.get(), newFirmwareVersion.get(), newFirmwareUrl); 181 + Optional<String> newFwTitle = getAttributeValue(attrs, FIRMWARE_TITLE);
  182 + Optional<String> newFwVersion = getAttributeValue(attrs, FIRMWARE_VERSION);
  183 + Optional<String> newFwUrl = getAttributeValue(attrs, FIRMWARE_URL);
  184 + if (newFwTitle.isPresent() && newFwVersion.isPresent()) {
  185 + onTargetFirmwareUpdate(client, newFwTitle.get(), newFwVersion.get(), newFwUrl);
  186 + }
  187 + }
  188 + if (swInfo.isSupported()) {
  189 + Optional<String> newSwTitle = getAttributeValue(attrs, SOFTWARE_TITLE);
  190 + Optional<String> newSwVersion = getAttributeValue(attrs, SOFTWARE_VERSION);
  191 + Optional<String> newSwUrl = getAttributeValue(attrs, SOFTWARE_URL);
  192 + if (newSwTitle.isPresent() && newSwVersion.isPresent()) {
  193 + onTargetSoftwareUpdate(client, newSwTitle.get(), newSwVersion.get(), newSwUrl);
174 } 194 }
175 } 195 }
176 }, throwable -> { 196 }, throwable -> {
177 if (fwInfo.isSupported()) { 197 if (fwInfo.isSupported()) {
178 - fwInfo.setTargetFetchFailure(true);  
179 update(fwInfo); 198 update(fwInfo);
180 } 199 }
181 }, executor); 200 }, executor);
@@ -184,7 +203,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -184,7 +203,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
184 203
185 @Override 204 @Override
186 public void forceFirmwareUpdate(LwM2mClient client) { 205 public void forceFirmwareUpdate(LwM2mClient client) {
187 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 206 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
188 fwInfo.setRetryAttempts(0); 207 fwInfo.setRetryAttempts(0);
189 fwInfo.setFailedPackageId(null); 208 fwInfo.setFailedPackageId(null);
190 startFirmwareUpdateIfNeeded(client, fwInfo); 209 startFirmwareUpdateIfNeeded(client, fwInfo);
@@ -192,7 +211,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -192,7 +211,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
192 211
193 @Override 212 @Override
194 public void onTargetFirmwareUpdate(LwM2mClient client, String newFirmwareTitle, String newFirmwareVersion, Optional<String> newFirmwareUrl) { 213 public void onTargetFirmwareUpdate(LwM2mClient client, String newFirmwareTitle, String newFirmwareVersion, Optional<String> newFirmwareUrl) {
195 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 214 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
196 fwInfo.updateTarget(newFirmwareTitle, newFirmwareVersion, newFirmwareUrl); 215 fwInfo.updateTarget(newFirmwareTitle, newFirmwareVersion, newFirmwareUrl);
197 update(fwInfo); 216 update(fwInfo);
198 startFirmwareUpdateIfNeeded(client, fwInfo); 217 startFirmwareUpdateIfNeeded(client, fwInfo);
@@ -201,15 +220,20 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -201,15 +220,20 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
201 @Override 220 @Override
202 public void onCurrentFirmwareNameUpdate(LwM2mClient client, String name) { 221 public void onCurrentFirmwareNameUpdate(LwM2mClient client, String name) {
203 log.debug("[{}] Current fw name: {}", client.getEndpoint(), name); 222 log.debug("[{}] Current fw name: {}", client.getEndpoint(), name);
204 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client);  
205 - fwInfo.setCurrentName(name); 223 + getOrInitFwInfo(client).setCurrentName(name);
  224 + }
  225 +
  226 + @Override
  227 + public void onCurrentSoftwareNameUpdate(LwM2mClient client, String name) {
  228 + log.debug("[{}] Current sw name: {}", client.getEndpoint(), name);
  229 + getOrInitSwInfo(client).setCurrentName(name);
206 } 230 }
207 231
208 @Override 232 @Override
209 public void onFirmwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) { 233 public void onFirmwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) {
210 log.debug("[{}] Current fw strategy: {}", client.getEndpoint(), configuration.getFwUpdateStrategy()); 234 log.debug("[{}] Current fw strategy: {}", client.getEndpoint(), configuration.getFwUpdateStrategy());
211 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client);  
212 - fwInfo.setFwStrategy(LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(configuration.getFwUpdateStrategy())); 235 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
  236 + fwInfo.setStrategy(LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(configuration.getFwUpdateStrategy()));
213 fwInfo.setBaseUrl(configuration.getFwUpdateResource()); 237 fwInfo.setBaseUrl(configuration.getFwUpdateResource());
214 startFirmwareUpdateIfNeeded(client, fwInfo); 238 startFirmwareUpdateIfNeeded(client, fwInfo);
215 } 239 }
@@ -217,30 +241,30 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -217,30 +241,30 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
217 @Override 241 @Override
218 public void onCurrentSoftwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) { 242 public void onCurrentSoftwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) {
219 log.debug("[{}] Current sw strategy: {}", client.getEndpoint(), configuration.getSwUpdateStrategy()); 243 log.debug("[{}] Current sw strategy: {}", client.getEndpoint(), configuration.getSwUpdateStrategy());
220 - LwM2MClientOtaInfo swInfo = getOrInitSwInfo(client);  
221 - swInfo.setSwStrategy(LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(configuration.getSwUpdateStrategy())); 244 + LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
  245 + swInfo.setStrategy(LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(configuration.getSwUpdateStrategy()));
222 swInfo.setBaseUrl(configuration.getSwUpdateResource()); 246 swInfo.setBaseUrl(configuration.getSwUpdateResource());
223 startSoftwareUpdateIfNeeded(client, swInfo); 247 startSoftwareUpdateIfNeeded(client, swInfo);
224 } 248 }
225 249
226 @Override 250 @Override
227 public void onCurrentFirmwareVersion3Update(LwM2mClient client, String version) { 251 public void onCurrentFirmwareVersion3Update(LwM2mClient client, String version) {
228 - log.debug("[{}] Current fw version: {}", client.getEndpoint(), version);  
229 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 252 + log.debug("[{}] Current fw version(3): {}", client.getEndpoint(), version);
  253 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
230 fwInfo.setCurrentVersion3(version); 254 fwInfo.setCurrentVersion3(version);
231 } 255 }
232 256
233 @Override 257 @Override
234 - public void onCurrentFirmwareVersion5Update(LwM2mClient client, String version) {  
235 - log.debug("[{}] Current fw version: {}", client.getEndpoint(), version);  
236 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client);  
237 - fwInfo.setCurrentVersion5(version); 258 + public void onCurrentFirmwareVersionUpdate(LwM2mClient client, String version) {
  259 + log.debug("[{}] Current fw version(5): {}", client.getEndpoint(), version);
  260 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
  261 + fwInfo.setCurrentVersion(version);
238 } 262 }
239 263
240 @Override 264 @Override
241 public void onCurrentFirmwareStateUpdate(LwM2mClient client, Long stateCode) { 265 public void onCurrentFirmwareStateUpdate(LwM2mClient client, Long stateCode) {
242 log.debug("[{}] Current fw state: {}", client.getEndpoint(), stateCode); 266 log.debug("[{}] Current fw state: {}", client.getEndpoint(), stateCode);
243 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 267 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
244 FirmwareUpdateState state = FirmwareUpdateState.fromStateFwByCode(stateCode.intValue()); 268 FirmwareUpdateState state = FirmwareUpdateState.fromStateFwByCode(stateCode.intValue());
245 if (FirmwareUpdateState.DOWNLOADED.equals(state)) { 269 if (FirmwareUpdateState.DOWNLOADED.equals(state)) {
246 executeFwUpdate(client); 270 executeFwUpdate(client);
@@ -255,7 +279,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -255,7 +279,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
255 @Override 279 @Override
256 public void onCurrentFirmwareResultUpdate(LwM2mClient client, Long code) { 280 public void onCurrentFirmwareResultUpdate(LwM2mClient client, Long code) {
257 log.debug("[{}] Current fw result: {}", client.getEndpoint(), code); 281 log.debug("[{}] Current fw result: {}", client.getEndpoint(), code);
258 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 282 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
259 FirmwareUpdateResult result = FirmwareUpdateResult.fromUpdateResultFwByCode(code.intValue()); 283 FirmwareUpdateResult result = FirmwareUpdateResult.fromUpdateResultFwByCode(code.intValue());
260 Optional<OtaPackageUpdateStatus> status = toOtaPackageUpdateStatus(result); 284 Optional<OtaPackageUpdateStatus> status = toOtaPackageUpdateStatus(result);
261 status.ifPresent(otaStatus -> sendStateUpdateToTelemetry(client, fwInfo, 285 status.ifPresent(otaStatus -> sendStateUpdateToTelemetry(client, fwInfo,
@@ -272,16 +296,66 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -272,16 +296,66 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
272 @Override 296 @Override
273 public void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient client, Long value) { 297 public void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient client, Long value) {
274 log.debug("[{}] Current fw delivery method: {}", client.getEndpoint(), value); 298 log.debug("[{}] Current fw delivery method: {}", client.getEndpoint(), value);
275 - LwM2MClientOtaInfo fwInfo = getOrInitFwInfo(client); 299 + LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
276 fwInfo.setDeliveryMethod(value.intValue()); 300 fwInfo.setDeliveryMethod(value.intValue());
277 } 301 }
278 302
279 @Override 303 @Override
280 - public void onTargetSoftwareUpdate(LwM2mClient client, String newSoftwareTitle, String newSoftwareVersion) { 304 + public void onCurrentSoftwareVersion3Update(LwM2mClient client, String version) {
  305 + log.debug("[{}] Current sw version(3): {}", client.getEndpoint(), version);
  306 + getOrInitSwInfo(client).setCurrentVersion3(version);
  307 + }
  308 +
  309 + @Override
  310 + public void onCurrentSoftwareVersionUpdate(LwM2mClient client, String version) {
  311 + log.debug("[{}] Current sw version(9): {}", client.getEndpoint(), version);
  312 + getOrInitSwInfo(client).setCurrentVersion(version);
  313 + }
281 314
  315 + @Override
  316 + public void onCurrentSoftwareStateUpdate(LwM2mClient client, Long stateCode) {
  317 + log.debug("[{}] Current sw state: {}", client.getEndpoint(), stateCode);
  318 + LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
  319 + SoftwareUpdateState state = SoftwareUpdateState.fromUpdateStateSwByCode(stateCode.intValue());
  320 + if (SoftwareUpdateState.INITIAL.equals(state)) {
  321 + startSoftwareUpdateIfNeeded(client, swInfo);
  322 + } else if (SoftwareUpdateState.DELIVERED.equals(state)) {
  323 + executeSwInstall(client);
  324 + }
  325 + swInfo.setUpdateState(state);
  326 + Optional<OtaPackageUpdateStatus> status = toOtaPackageUpdateStatus(state);
  327 + status.ifPresent(otaStatus -> sendStateUpdateToTelemetry(client, swInfo,
  328 + otaStatus, "Firmware Update State: " + state.name()));
  329 + update(swInfo);
282 } 330 }
283 331
284 - private void startFirmwareUpdateIfNeeded(LwM2mClient client, LwM2MClientOtaInfo fwInfo) { 332 +
  333 + @Override
  334 + public void onCurrentSoftwareResultUpdate(LwM2mClient client, Long code) {
  335 + log.debug("[{}] Current sw result: {}", client.getEndpoint(), code);
  336 + LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
  337 + SoftwareUpdateResult result = SoftwareUpdateResult.fromUpdateResultSwByCode(code.intValue());
  338 + Optional<OtaPackageUpdateStatus> status = toOtaPackageUpdateStatus(result);
  339 + status.ifPresent(otaStatus -> sendStateUpdateToTelemetry(client, swInfo,
  340 + otaStatus, "Firmware Update Result: " + result.name()));
  341 + if (result.isAgain() && swInfo.getRetryAttempts() <= 2) {
  342 + swInfo.setRetryAttempts(swInfo.getRetryAttempts() + 1);
  343 + startSoftwareUpdateIfNeeded(client, swInfo);
  344 + } else {
  345 + swInfo.update(result);
  346 + }
  347 + update(swInfo);
  348 + }
  349 +
  350 + @Override
  351 + public void onTargetSoftwareUpdate(LwM2mClient client, String newSoftwareTitle, String newSoftwareVersion, Optional<String> newFirmwareUrl) {
  352 + LwM2MClientSwOtaInfo fwInfo = getOrInitSwInfo(client);
  353 + fwInfo.updateTarget(newSoftwareTitle, newSoftwareVersion, newFirmwareUrl);
  354 + update(fwInfo);
  355 + startSoftwareUpdateIfNeeded(client, fwInfo);
  356 + }
  357 +
  358 + private void startFirmwareUpdateIfNeeded(LwM2mClient client, LwM2MClientFwOtaInfo fwInfo) {
285 try { 359 try {
286 if (!fwInfo.isSupported()) { 360 if (!fwInfo.isSupported()) {
287 log.debug("[{}] Fw update is not supported: {}", client.getEndpoint(), fwInfo); 361 log.debug("[{}] Fw update is not supported: {}", client.getEndpoint(), fwInfo);
@@ -289,35 +363,70 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -289,35 +363,70 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
289 } else if (fwInfo.isUpdateRequired()) { 363 } else if (fwInfo.isUpdateRequired()) {
290 if (StringUtils.isNotEmpty(fwInfo.getTargetUrl())) { 364 if (StringUtils.isNotEmpty(fwInfo.getTargetUrl())) {
291 log.debug("[{}] Starting update to [{}{}] using URL: {}", client.getEndpoint(), fwInfo.getTargetName(), fwInfo.getTargetVersion(), fwInfo.getTargetUrl()); 365 log.debug("[{}] Starting update to [{}{}] using URL: {}", client.getEndpoint(), fwInfo.getTargetName(), fwInfo.getTargetVersion(), fwInfo.getTargetUrl());
292 - startFirmwareUpdateUsingUrl(client, fwInfo.getTargetUrl()); 366 + startUpdateUsingUrl(client, FW_URL_ID, fwInfo.getTargetUrl());
293 } else { 367 } else {
294 log.debug("[{}] Starting update to [{}{}] using binary", client.getEndpoint(), fwInfo.getTargetName(), fwInfo.getTargetVersion()); 368 log.debug("[{}] Starting update to [{}{}] using binary", client.getEndpoint(), fwInfo.getTargetName(), fwInfo.getTargetVersion());
295 - startFirmwareUpdateUsingBinary(client, fwInfo); 369 + startUpdateUsingBinary(client, fwInfo);
296 } 370 }
297 } 371 }
298 } catch (Exception e) { 372 } catch (Exception e) {
299 - log.warn("[{}] failed to update client: {}", client.getEndpoint(), fwInfo, e); 373 + log.info("[{}] failed to update client: {}", client.getEndpoint(), fwInfo, e);
300 sendStateUpdateToTelemetry(client, fwInfo, OtaPackageUpdateStatus.FAILED, "Internal server error: " + e.getMessage()); 374 sendStateUpdateToTelemetry(client, fwInfo, OtaPackageUpdateStatus.FAILED, "Internal server error: " + e.getMessage());
301 } 375 }
302 } 376 }
303 377
304 - private void startSoftwareUpdateIfNeeded(LwM2mClient client, LwM2MClientOtaInfo swInfo) { 378 + private void startSoftwareUpdateIfNeeded(LwM2mClient client, LwM2MClientSwOtaInfo swInfo) {
  379 + try {
  380 + if (!swInfo.isSupported()) {
  381 + log.debug("[{}] Sw update is not supported: {}", client.getEndpoint(), swInfo);
  382 + sendStateUpdateToTelemetry(client, swInfo, OtaPackageUpdateStatus.FAILED, "Client does not support software update or profile misconfiguration!");
  383 + } else if (swInfo.isUpdateRequired()) {
  384 + if (SoftwareUpdateState.INSTALLED.equals(swInfo.getUpdateState())) {
  385 + log.debug("[{}] Attempt to restore the update state: {}", client.getEndpoint(), swInfo.getUpdateState());
  386 + executeSwUninstallForUpdate(client);
  387 + } else {
  388 + if (StringUtils.isNotEmpty(swInfo.getTargetUrl())) {
  389 + log.debug("[{}] Starting update to [{}{}] using URL: {}", client.getEndpoint(), swInfo.getTargetName(), swInfo.getTargetVersion(), swInfo.getTargetUrl());
  390 + startUpdateUsingUrl(client, SW_PACKAGE_URI_ID, swInfo.getTargetUrl());
  391 + } else {
  392 + log.debug("[{}] Starting update to [{}{}] using binary", client.getEndpoint(), swInfo.getTargetName(), swInfo.getTargetVersion());
  393 + startUpdateUsingBinary(client, swInfo);
  394 + }
  395 + }
  396 + }
  397 + } catch (Exception e) {
  398 + log.info("[{}] failed to update client: {}", client.getEndpoint(), swInfo, e);
  399 + sendStateUpdateToTelemetry(client, swInfo, OtaPackageUpdateStatus.FAILED, "Internal server error: " + e.getMessage());
  400 + }
  401 + }
  402 +
  403 + public void startUpdateUsingBinary(LwM2mClient client, LwM2MClientSwOtaInfo swInfo) {
  404 + this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), swInfo.getType().name()),
  405 + new TransportServiceCallback<>() {
  406 + @Override
  407 + public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
  408 + executor.submit(() -> doUpdateSoftwareUsingBinary(response, swInfo, client));
  409 + }
305 410
  411 + @Override
  412 + public void onError(Throwable e) {
  413 + logService.log(client, "Failed to process software update: " + e.getMessage());
  414 + }
  415 + });
306 } 416 }
307 417
308 - private void startFirmwareUpdateUsingUrl(LwM2mClient client, String url) {  
309 - String targetIdVer = convertObjectIdToVersionedId(FW_URL_ID, client.getRegistration()); 418 + private void startUpdateUsingUrl(LwM2mClient client, String id, String url) {
  419 + String targetIdVer = convertObjectIdToVersionedId(id, client.getRegistration());
310 TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(config.getTimeout()).build(); 420 TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(config.getTimeout()).build();
311 downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, targetIdVer)); 421 downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, targetIdVer));
312 } 422 }
313 423
314 - public void startFirmwareUpdateUsingBinary(LwM2mClient client, LwM2MClientOtaInfo fwInfo) {  
315 - String versionedId = convertObjectIdToVersionedId(FW_PACKAGE_5_ID, client.getRegistration());  
316 - this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), OtaPackageType.FIRMWARE.name()), 424 + public void startUpdateUsingBinary(LwM2mClient client, LwM2MClientFwOtaInfo fwInfo) {
  425 + this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), fwInfo.getType().name()),
317 new TransportServiceCallback<>() { 426 new TransportServiceCallback<>() {
318 @Override 427 @Override
319 public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) { 428 public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) {
320 - executor.submit(() -> doUpdateFirmwareUsingBinary(response, fwInfo, versionedId, client)); 429 + executor.submit(() -> doUpdateFirmwareUsingBinary(response, fwInfo, client));
321 } 430 }
322 431
323 @Override 432 @Override
@@ -327,34 +436,60 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -327,34 +436,60 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
327 }); 436 });
328 } 437 }
329 438
330 - private void doUpdateFirmwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientOtaInfo fwInfo, String versionedId, LwM2mClient client) { 439 + private void doUpdateFirmwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientFwOtaInfo info, LwM2mClient client) {
331 if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) { 440 if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
332 UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()); 441 UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
333 LwM2MFirmwareUpdateStrategy strategy; 442 LwM2MFirmwareUpdateStrategy strategy;
334 - if (fwInfo.getDeliveryMethod() == null || fwInfo.getDeliveryMethod() == FirmwareDeliveryMethod.BOTH.code) {  
335 - strategy = fwInfo.getFwStrategy(); 443 + if (info.getDeliveryMethod() == null || info.getDeliveryMethod() == FirmwareDeliveryMethod.BOTH.code) {
  444 + strategy = info.getStrategy();
336 } else { 445 } else {
337 - strategy = fwInfo.getDeliveryMethod() == FirmwareDeliveryMethod.PULL.code ? LwM2MFirmwareUpdateStrategy.OBJ_5_TEMP_URL : LwM2MFirmwareUpdateStrategy.OBJ_5_BINARY; 446 + strategy = info.getDeliveryMethod() == FirmwareDeliveryMethod.PULL.code ? LwM2MFirmwareUpdateStrategy.OBJ_5_TEMP_URL : LwM2MFirmwareUpdateStrategy.OBJ_5_BINARY;
338 } 447 }
339 switch (strategy) { 448 switch (strategy) {
340 case OBJ_5_BINARY: 449 case OBJ_5_BINARY:
341 - byte[] firmwareChunk = otaPackageDataCache.get(otaPackageId.toString(), 0, 0);  
342 - TbLwM2MWriteReplaceRequest writeRequest = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId)  
343 - .value(firmwareChunk).contentFormat(ContentFormat.OPAQUE)  
344 - .timeout(config.getTimeout()).build();  
345 - downlinkHandler.sendWriteReplaceRequest(client, writeRequest, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, versionedId)); 450 + startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_5_ID, client.getRegistration()), otaPackageId);
  451 + break;
  452 + case OBJ_19_BINARY:
  453 + startUpdateUsingBinary(client, convertObjectIdToVersionedId(FW_PACKAGE_19_ID, client.getRegistration()), otaPackageId);
346 break; 454 break;
347 case OBJ_5_TEMP_URL: 455 case OBJ_5_TEMP_URL:
348 - startFirmwareUpdateUsingUrl(client, fwInfo.getBaseUrl() + "/" + FIRMWARE_UPDATE_COAP_RESOURCE + "/" + otaPackageId.toString()); 456 + startUpdateUsingUrl(client, FW_URL_ID, info.getBaseUrl() + "/" + FIRMWARE_UPDATE_COAP_RESOURCE + "/" + otaPackageId.toString());
  457 + break;
  458 + default:
  459 + sendStateUpdateToTelemetry(client, info, OtaPackageUpdateStatus.FAILED, "Unsupported strategy: " + strategy.name());
  460 + }
  461 + } else {
  462 + sendStateUpdateToTelemetry(client, info, OtaPackageUpdateStatus.FAILED, "Failed to fetch OTA package: " + response.getResponseStatus());
  463 + }
  464 + }
  465 +
  466 + private void doUpdateSoftwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientSwOtaInfo info, LwM2mClient client) {
  467 + if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
  468 + UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
  469 + LwM2MSoftwareUpdateStrategy strategy = info.getStrategy();
  470 + switch (strategy) {
  471 + case BINARY:
  472 + startUpdateUsingBinary(client, convertObjectIdToVersionedId(SW_PACKAGE_ID, client.getRegistration()), otaPackageId);
  473 + break;
  474 + case TEMP_URL:
  475 + startUpdateUsingUrl(client, SW_PACKAGE_URI_ID, info.getBaseUrl() + "/" + FIRMWARE_UPDATE_COAP_RESOURCE + "/" + otaPackageId.toString());
349 break; 476 break;
350 default: 477 default:
351 - sendStateUpdateToTelemetry(client, fwInfo, OtaPackageUpdateStatus.FAILED, "Unsupported strategy: " + strategy.name()); 478 + sendStateUpdateToTelemetry(client, info, OtaPackageUpdateStatus.FAILED, "Unsupported strategy: " + strategy.name());
352 } 479 }
353 } else { 480 } else {
354 - sendStateUpdateToTelemetry(client, fwInfo, OtaPackageUpdateStatus.FAILED, "Failed to fetch OTA package: " + response.getResponseStatus()); 481 + sendStateUpdateToTelemetry(client, info, OtaPackageUpdateStatus.FAILED, "Failed to fetch OTA package: " + response.getResponseStatus());
355 } 482 }
356 } 483 }
357 484
  485 + private void startUpdateUsingBinary(LwM2mClient client, String versionedId, UUID otaPackageId) {
  486 + byte[] firmwareChunk = otaPackageDataCache.get(otaPackageId.toString(), 0, 0);
  487 + TbLwM2MWriteReplaceRequest writeRequest = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId)
  488 + .value(firmwareChunk).contentFormat(ContentFormat.OPAQUE)
  489 + .timeout(config.getTimeout()).build();
  490 + downlinkHandler.sendWriteReplaceRequest(client, writeRequest, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, versionedId));
  491 + }
  492 +
358 private TransportProtos.GetOtaPackageRequestMsg createOtaPackageRequestMsg(TransportProtos.SessionInfoProto sessionInfo, String nameFwSW) { 493 private TransportProtos.GetOtaPackageRequestMsg createOtaPackageRequestMsg(TransportProtos.SessionInfoProto sessionInfo, String nameFwSW) {
359 return TransportProtos.GetOtaPackageRequestMsg.newBuilder() 494 return TransportProtos.GetOtaPackageRequestMsg.newBuilder()
360 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB()) 495 .setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
@@ -370,6 +505,16 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -370,6 +505,16 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
370 downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, FW_EXECUTE_ID)); 505 downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, FW_EXECUTE_ID));
371 } 506 }
372 507
  508 + private void executeSwInstall(LwM2mClient client) {
  509 + TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_INSTALL_ID).timeout(config.getTimeout()).build();
  510 + downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID));
  511 + }
  512 +
  513 + private void executeSwUninstallForUpdate(LwM2mClient client) {
  514 + TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_UN_INSTALL_ID).params("1").timeout(config.getTimeout()).build();
  515 + downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID));
  516 + }
  517 +
373 private Optional<String> getAttributeValue(List<TransportProtos.TsKvProto> attrs, String keyName) { 518 private Optional<String> getAttributeValue(List<TransportProtos.TsKvProto> attrs, String keyName) {
374 for (TransportProtos.TsKvProto attr : attrs) { 519 for (TransportProtos.TsKvProto attr : attrs) {
375 if (keyName.equals(attr.getKv().getKey())) { 520 if (keyName.equals(attr.getKv().getKey())) {
@@ -383,40 +528,41 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -383,40 +528,41 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
383 return Optional.empty(); 528 return Optional.empty();
384 } 529 }
385 530
386 - public LwM2MClientOtaInfo getOrInitFwInfo(LwM2mClient client) { 531 + private LwM2MClientFwOtaInfo getOrInitFwInfo(LwM2mClient client) {
387 return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> { 532 return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
388 - LwM2MClientOtaInfo info = otaInfoStore.get(OtaPackageType.FIRMWARE, endpoint); 533 + LwM2MClientFwOtaInfo info = otaInfoStore.getFw(endpoint);
389 if (info == null) { 534 if (info == null) {
390 var profile = clientContext.getProfile(client.getProfileId()); 535 var profile = clientContext.getProfile(client.getProfileId());
391 - info = new LwM2MClientOtaInfo(endpoint, OtaPackageType.FIRMWARE,  
392 - LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(profile.getClientLwM2mSettings().getFwUpdateStrategy()),  
393 - profile.getClientLwM2mSettings().getFwUpdateResource()); 536 + info = new LwM2MClientFwOtaInfo(endpoint, profile.getClientLwM2mSettings().getFwUpdateResource(),
  537 + LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(profile.getClientLwM2mSettings().getFwUpdateStrategy()));
394 update(info); 538 update(info);
395 } 539 }
396 return info; 540 return info;
397 }); 541 });
398 } 542 }
399 543
400 - private LwM2MClientOtaInfo getOrInitSwInfo(LwM2mClient client) {  
401 - return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> {  
402 - LwM2MClientOtaInfo info = otaInfoStore.get(OtaPackageType.SOFTWARE, endpoint); 544 + private LwM2MClientSwOtaInfo getOrInitSwInfo(LwM2mClient client) {
  545 + return this.swStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
  546 + LwM2MClientSwOtaInfo info = otaInfoStore.getSw(endpoint);
403 if (info == null) { 547 if (info == null) {
404 var profile = clientContext.getProfile(client.getProfileId()); 548 var profile = clientContext.getProfile(client.getProfileId());
405 - info = new LwM2MClientOtaInfo(endpoint, OtaPackageType.SOFTWARE,  
406 - LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(profile.getClientLwM2mSettings().getFwUpdateStrategy()),  
407 - profile.getClientLwM2mSettings().getSwUpdateResource()); 549 + info = new LwM2MClientSwOtaInfo(endpoint, profile.getClientLwM2mSettings().getSwUpdateResource(),
  550 + LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(profile.getClientLwM2mSettings().getFwUpdateStrategy()));
408 update(info); 551 update(info);
409 } 552 }
410 return info; 553 return info;
411 }); 554 });
  555 + }
412 556
  557 + private void update(LwM2MClientFwOtaInfo info) {
  558 + otaInfoStore.putFw(info);
413 } 559 }
414 560
415 - private void update(LwM2MClientOtaInfo info) {  
416 - otaInfoStore.put(info); 561 + private void update(LwM2MClientSwOtaInfo info) {
  562 + otaInfoStore.putSw(info);
417 } 563 }
418 564
419 - private void sendStateUpdateToTelemetry(LwM2mClient client, LwM2MClientOtaInfo fwInfo, OtaPackageUpdateStatus status, String log) { 565 + private void sendStateUpdateToTelemetry(LwM2mClient client, LwM2MClientOtaInfo<?, ?, ?> fwInfo, OtaPackageUpdateStatus status, String log) {
420 List<TransportProtos.KeyValueProto> result = new ArrayList<>(); 566 List<TransportProtos.KeyValueProto> result = new ArrayList<>();
421 TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(getAttributeKey(fwInfo.getType(), STATE)); 567 TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(getAttributeKey(fwInfo.getType(), STATE));
422 kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV(status.name()); 568 kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV(status.name());
@@ -462,22 +608,31 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -462,22 +608,31 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
462 } 608 }
463 } 609 }
464 610
  611 + private static Optional<OtaPackageUpdateStatus> toOtaPackageUpdateStatus(SoftwareUpdateState swUpdateState) {
  612 + switch (swUpdateState) {
  613 + case INITIAL:
  614 + return Optional.empty();
  615 + case DOWNLOAD_STARTED:
  616 + return Optional.of(DOWNLOADING);
  617 + case DOWNLOADED:
  618 + return Optional.of(DOWNLOADING);
  619 + case DELIVERED:
  620 + return Optional.of(DOWNLOADED);
  621 + case INSTALLED:
  622 + return Optional.empty();
  623 + default:
  624 + throw new CodecException("Invalid value stateSw %d for SoftwareUpdateState.", swUpdateState);
  625 + }
  626 + }
  627 +
465 /** 628 /**
466 * FirmwareUpdateStatus { 629 * FirmwareUpdateStatus {
467 * DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING, UPDATED, FAILED 630 * DOWNLOADING, DOWNLOADED, VERIFIED, UPDATING, UPDATED, FAILED
468 */ 631 */
469 - public static Optional<OtaPackageUpdateStatus> toSwSateResultUpdateStatus(SoftwareUpdateState softwareUpdateState, SoftwareUpdateResult softwareUpdateResult) { 632 + public static Optional<OtaPackageUpdateStatus> toOtaPackageUpdateStatus(SoftwareUpdateResult softwareUpdateResult) {
470 switch (softwareUpdateResult) { 633 switch (softwareUpdateResult) {
471 case INITIAL: 634 case INITIAL:
472 - switch (softwareUpdateState) {  
473 - case INITIAL:  
474 - case DOWNLOAD_STARTED:  
475 - return Optional.of(DOWNLOADING);  
476 - case DOWNLOADED:  
477 - return Optional.of(DOWNLOADED);  
478 - case DELIVERED:  
479 - return Optional.of(VERIFIED);  
480 - } 635 + return Optional.empty();
481 case DOWNLOADING: 636 case DOWNLOADING:
482 return Optional.of(DOWNLOADING); 637 return Optional.of(DOWNLOADING);
483 case SUCCESSFULLY_INSTALLED: 638 case SUCCESSFULLY_INSTALLED:
@@ -495,7 +650,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl @@ -495,7 +650,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
495 case UN_INSTALL_FAILURE: 650 case UN_INSTALL_FAILURE:
496 return Optional.of(FAILED); 651 return Optional.of(FAILED);
497 default: 652 default:
498 - throw new CodecException("Invalid value stateFw %s %s for FirmwareUpdateStatus.", softwareUpdateState.name(), softwareUpdateResult.name()); 653 + throw new CodecException("Invalid value stateFw %s for FirmwareUpdateStatus.", softwareUpdateResult.name());
499 } 654 }
500 } 655 }
501 656
@@ -20,60 +20,42 @@ import lombok.Data; @@ -20,60 +20,42 @@ import lombok.Data;
20 import lombok.NoArgsConstructor; 20 import lombok.NoArgsConstructor;
21 import org.thingsboard.server.common.data.StringUtils; 21 import org.thingsboard.server.common.data.StringUtils;
22 import org.thingsboard.server.common.data.ota.OtaPackageType; 22 import org.thingsboard.server.common.data.ota.OtaPackageType;
23 -import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MFirmwareUpdateStrategy;  
24 -import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateResult;  
25 -import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateState;  
26 -import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MSoftwareUpdateStrategy;  
27 23
28 import java.util.Optional; 24 import java.util.Optional;
29 25
30 @Data 26 @Data
31 @NoArgsConstructor 27 @NoArgsConstructor
32 -public class LwM2MClientOtaInfo { 28 +public abstract class LwM2MClientOtaInfo<Strategy, State, Result> {
33 29
34 private String endpoint; 30 private String endpoint;
35 - private OtaPackageType type;  
36 -  
37 private String baseUrl; 31 private String baseUrl;
38 32
39 - private boolean targetFetchFailure;  
40 - private String targetName;  
41 - private String targetVersion;  
42 - private String targetUrl;  
43 -  
44 - private boolean currentFetchFailure;  
45 - private String currentName;  
46 - private String currentVersion3;  
47 - private String currentVersion5;  
48 - private Integer deliveryMethod; 33 + protected String targetName;
  34 + protected String targetVersion;
  35 + protected String targetUrl;
49 36
50 //TODO: use value from device if applicable; 37 //TODO: use value from device if applicable;
51 - private LwM2MFirmwareUpdateStrategy fwStrategy;  
52 - private LwM2MSoftwareUpdateStrategy swStrategy;  
53 - private FirmwareUpdateState updateState;  
54 - private FirmwareUpdateResult updateResult; 38 + protected Strategy strategy;
  39 + protected State updateState;
  40 + protected Result result;
55 41
56 - private String failedPackageId;  
57 - private int retryAttempts; 42 + protected String failedPackageId;
  43 + protected int retryAttempts;
58 44
59 - public LwM2MClientOtaInfo(String endpoint, OtaPackageType type, LwM2MFirmwareUpdateStrategy fwStrategy, String baseUrl) {  
60 - this.endpoint = endpoint;  
61 - this.type = type;  
62 - this.fwStrategy = fwStrategy;  
63 - this.baseUrl = baseUrl;  
64 - } 45 + protected String currentName;
  46 + protected String currentVersion3;
  47 + protected String currentVersion;
65 48
66 - public LwM2MClientOtaInfo(String endpoint, OtaPackageType type, LwM2MSoftwareUpdateStrategy swStrategy, String baseUrl) { 49 + public LwM2MClientOtaInfo(String endpoint, String baseUrl, Strategy strategy) {
67 this.endpoint = endpoint; 50 this.endpoint = endpoint;
68 - this.type = type;  
69 - this.swStrategy = swStrategy;  
70 this.baseUrl = baseUrl; 51 this.baseUrl = baseUrl;
  52 + this.strategy = strategy;
71 } 53 }
72 54
73 - public void updateTarget(String targetName, String targetVersion, Optional<String> newFirmwareUrl) { 55 + public void updateTarget(String targetName, String targetVersion, Optional<String> newTargetUrl) {
74 this.targetName = targetName; 56 this.targetName = targetName;
75 this.targetVersion = targetVersion; 57 this.targetVersion = targetVersion;
76 - this.targetUrl = newFirmwareUrl.orElse(null); 58 + this.targetUrl = newTargetUrl.orElse(null);
77 } 59 }
78 60
79 @JsonIgnore 61 @JsonIgnore
@@ -82,7 +64,7 @@ public class LwM2MClientOtaInfo { @@ -82,7 +64,7 @@ public class LwM2MClientOtaInfo {
82 return false; 64 return false;
83 } else { 65 } else {
84 String targetPackageId = getPackageId(targetName, targetVersion); 66 String targetPackageId = getPackageId(targetName, targetVersion);
85 - String currentPackageIdUsingObject5 = getPackageId(currentName, currentVersion5); 67 + String currentPackageIdUsingObject5 = getPackageId(currentName, currentVersion);
86 if (StringUtils.isNotEmpty(failedPackageId) && failedPackageId.equals(targetPackageId)) { 68 if (StringUtils.isNotEmpty(failedPackageId) && failedPackageId.equals(targetPackageId)) {
87 return false; 69 return false;
88 } else { 70 } else {
@@ -99,25 +81,15 @@ public class LwM2MClientOtaInfo { @@ -99,25 +81,15 @@ public class LwM2MClientOtaInfo {
99 81
100 @JsonIgnore 82 @JsonIgnore
101 public boolean isSupported() { 83 public boolean isSupported() {
102 - return StringUtils.isNotEmpty(currentName) || StringUtils.isNotEmpty(currentVersion5) || StringUtils.isNotEmpty(currentVersion3); 84 + return StringUtils.isNotEmpty(currentName) || StringUtils.isNotEmpty(currentVersion) || StringUtils.isNotEmpty(currentVersion3);
103 } 85 }
104 86
105 - public void update(FirmwareUpdateResult updateResult) {  
106 - this.updateResult = updateResult;  
107 - switch (updateResult) {  
108 - case INITIAL:  
109 - break;  
110 - case UPDATE_SUCCESSFULLY:  
111 - retryAttempts = 0;  
112 - break;  
113 - default:  
114 - failedPackageId = getPackageId(targetName, targetVersion);  
115 - break;  
116 - }  
117 - } 87 + public abstract void update(Result result);
118 88
119 - private static String getPackageId(String name, String version) { 89 + protected static String getPackageId(String name, String version) {
120 return (StringUtils.isNotEmpty(name) ? name : "") + (StringUtils.isNotEmpty(version) ? version : ""); 90 return (StringUtils.isNotEmpty(name) ? name : "") + (StringUtils.isNotEmpty(version) ? version : "");
121 } 91 }
122 92
  93 + public abstract OtaPackageType getType();
  94 +
123 } 95 }
@@ -26,9 +26,9 @@ public interface LwM2MOtaUpdateService { @@ -26,9 +26,9 @@ public interface LwM2MOtaUpdateService {
26 26
27 void forceFirmwareUpdate(LwM2mClient client); 27 void forceFirmwareUpdate(LwM2mClient client);
28 28
29 - void onTargetFirmwareUpdate(LwM2mClient client, String newFirmwareTitle, String newFirmwareVersion, Optional<String> newFirmwareUrl); 29 + void onTargetFirmwareUpdate(LwM2mClient client, String newFwTitle, String newFwVersion, Optional<String> newFwUrl);
30 30
31 - void onTargetSoftwareUpdate(LwM2mClient client, String newSoftwareTitle, String newSoftwareVersion); 31 + void onTargetSoftwareUpdate(LwM2mClient client, String newSwTitle, String newSwVersion, Optional<String> newSwUrl);
32 32
33 void onCurrentFirmwareNameUpdate(LwM2mClient client, String name); 33 void onCurrentFirmwareNameUpdate(LwM2mClient client, String name);
34 34
@@ -38,11 +38,21 @@ public interface LwM2MOtaUpdateService { @@ -38,11 +38,21 @@ public interface LwM2MOtaUpdateService {
38 38
39 void onCurrentFirmwareVersion3Update(LwM2mClient client, String version); 39 void onCurrentFirmwareVersion3Update(LwM2mClient client, String version);
40 40
41 - void onCurrentFirmwareVersion5Update(LwM2mClient client, String version); 41 + void onCurrentFirmwareVersionUpdate(LwM2mClient client, String version);
42 42
43 void onCurrentFirmwareStateUpdate(LwM2mClient client, Long state); 43 void onCurrentFirmwareStateUpdate(LwM2mClient client, Long state);
44 44
45 void onCurrentFirmwareResultUpdate(LwM2mClient client, Long result); 45 void onCurrentFirmwareResultUpdate(LwM2mClient client, Long result);
46 46
47 void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient lwM2MClient, Long value); 47 void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient lwM2MClient, Long value);
  48 +
  49 + void onCurrentSoftwareNameUpdate(LwM2mClient lwM2MClient, String name);
  50 +
  51 + void onCurrentSoftwareVersion3Update(LwM2mClient lwM2MClient, String version);
  52 +
  53 + void onCurrentSoftwareVersionUpdate(LwM2mClient client, String version);
  54 +
  55 + void onCurrentSoftwareStateUpdate(LwM2mClient lwM2MClient, Long value);
  56 +
  57 + void onCurrentSoftwareResultUpdate(LwM2mClient client, Long result);
48 } 58 }
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.lwm2m.server.ota.firmware;
  17 +
  18 +import com.fasterxml.jackson.annotation.JsonIgnore;
  19 +import lombok.Data;
  20 +import lombok.EqualsAndHashCode;
  21 +import lombok.NoArgsConstructor;
  22 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  23 +import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo;
  24 +
  25 +@Data
  26 +@EqualsAndHashCode(callSuper = true)
  27 +@NoArgsConstructor
  28 +public class LwM2MClientFwOtaInfo extends LwM2MClientOtaInfo<LwM2MFirmwareUpdateStrategy, FirmwareUpdateState, FirmwareUpdateResult> {
  29 +
  30 + private Integer deliveryMethod;
  31 +
  32 + public LwM2MClientFwOtaInfo(String endpoint, String baseUrl, LwM2MFirmwareUpdateStrategy strategy) {
  33 + super(endpoint, baseUrl, strategy);
  34 + }
  35 +
  36 + @JsonIgnore
  37 + @Override
  38 + public OtaPackageType getType() {
  39 + return OtaPackageType.FIRMWARE;
  40 + }
  41 +
  42 + public void update(FirmwareUpdateResult result) {
  43 + this.result = result;
  44 + switch (result) {
  45 + case INITIAL:
  46 + break;
  47 + case UPDATE_SUCCESSFULLY:
  48 + retryAttempts = 0;
  49 + break;
  50 + default:
  51 + failedPackageId = getPackageId(targetName, targetVersion);
  52 + break;
  53 + }
  54 + }
  55 +
  56 +}
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.lwm2m.server.ota.software;
  17 +
  18 +import com.fasterxml.jackson.annotation.JsonIgnore;
  19 +import lombok.Data;
  20 +import lombok.EqualsAndHashCode;
  21 +import lombok.NoArgsConstructor;
  22 +import org.thingsboard.server.common.data.StringUtils;
  23 +import org.thingsboard.server.common.data.ota.OtaPackageType;
  24 +import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo;
  25 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateResult;
  26 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.FirmwareUpdateState;
  27 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MFirmwareUpdateStrategy;
  28 +
  29 +@Data
  30 +@EqualsAndHashCode(callSuper = true)
  31 +@NoArgsConstructor
  32 +public class LwM2MClientSwOtaInfo extends LwM2MClientOtaInfo<LwM2MSoftwareUpdateStrategy, SoftwareUpdateState, SoftwareUpdateResult> {
  33 +
  34 + public LwM2MClientSwOtaInfo(String endpoint, String baseUrl, LwM2MSoftwareUpdateStrategy strategy) {
  35 + super(endpoint, baseUrl, strategy);
  36 + }
  37 +
  38 + @JsonIgnore
  39 + @Override
  40 + public OtaPackageType getType() {
  41 + return OtaPackageType.SOFTWARE;
  42 + }
  43 +
  44 +
  45 + public void update(SoftwareUpdateResult result) {
  46 + this.result = result;
  47 + switch (result) {
  48 + case INITIAL:
  49 + break;
  50 + //TODO: implement
  51 + default:
  52 + failedPackageId = getPackageId(targetName, targetVersion);
  53 + break;
  54 + }
  55 + }
  56 +
  57 +}
@@ -15,6 +15,8 @@ @@ -15,6 +15,8 @@
15 */ 15 */
16 package org.thingsboard.server.transport.lwm2m.server.ota.software; 16 package org.thingsboard.server.transport.lwm2m.server.ota.software;
17 17
  18 +import lombok.Getter;
  19 +
18 /** 20 /**
19 * SW Update Result 21 * SW Update Result
20 * Contains the result of downloading or installing/uninstalling the software 22 * Contains the result of downloading or installing/uninstalling the software
@@ -56,6 +58,7 @@ public enum SoftwareUpdateResult { @@ -56,6 +58,7 @@ public enum SoftwareUpdateResult {
56 58
57 public int code; 59 public int code;
58 public String type; 60 public String type;
  61 + @Getter
59 public boolean isAgain; 62 public boolean isAgain;
60 63
61 SoftwareUpdateResult(int code, String type, boolean isAgain) { 64 SoftwareUpdateResult(int code, String type, boolean isAgain) {
@@ -82,7 +82,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler { @@ -82,7 +82,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
82 public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg rpcRequst, TransportProtos.SessionInfoProto sessionInfo) { 82 public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg rpcRequst, TransportProtos.SessionInfoProto sessionInfo) {
83 this.cleanupOldSessions(); 83 this.cleanupOldSessions();
84 UUID requestUUID = new UUID(rpcRequst.getRequestIdMSB(), rpcRequst.getRequestIdLSB()); 84 UUID requestUUID = new UUID(rpcRequst.getRequestIdMSB(), rpcRequst.getRequestIdLSB());
85 - log.warn("Received params: {}", rpcRequst.getParams()); 85 + log.debug("Received params: {}", rpcRequst.getParams());
86 // We use this map to protect from browser issue that the same command is sent twice. 86 // We use this map to protect from browser issue that the same command is sent twice.
87 // TODO: This is probably not the best place and should be moved to DeviceActor 87 // TODO: This is probably not the best place and should be moved to DeviceActor
88 if (!this.rpcSubscriptions.containsKey(requestUUID)) { 88 if (!this.rpcSubscriptions.containsKey(requestUUID)) {
@@ -308,20 +308,19 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler { @@ -308,20 +308,19 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
308 } 308 }
309 309
310 private void cleanupOldSessions() { 310 private void cleanupOldSessions() {
311 - log.warn("4.1) before rpcSubscriptions.size(): [{}]", rpcSubscriptions.size()); 311 + log.debug("Before rpcSubscriptions.size(): [{}]", rpcSubscriptions.size());
312 if (rpcSubscriptions.size() > 0) { 312 if (rpcSubscriptions.size() > 0) {
313 long currentTime = System.currentTimeMillis(); 313 long currentTime = System.currentTimeMillis();
314 Set<UUID> rpcSubscriptionsToRemove = rpcSubscriptions.entrySet().stream().filter(kv -> currentTime > kv.getValue()).map(Map.Entry::getKey).collect(Collectors.toSet()); 314 Set<UUID> rpcSubscriptionsToRemove = rpcSubscriptions.entrySet().stream().filter(kv -> currentTime > kv.getValue()).map(Map.Entry::getKey).collect(Collectors.toSet());
315 - log.warn("4.2) System.currentTimeMillis(): [{}]", System.currentTimeMillis());  
316 - log.warn("4.3) rpcSubscriptionsToRemove: [{}]", rpcSubscriptionsToRemove); 315 + log.debug("RpcSubscriptionsToRemove: [{}]", rpcSubscriptionsToRemove);
317 rpcSubscriptionsToRemove.forEach(rpcSubscriptions::remove); 316 rpcSubscriptionsToRemove.forEach(rpcSubscriptions::remove);
318 } 317 }
319 - log.warn("4.4) after rpcSubscriptions.size(): [{}]", rpcSubscriptions.size()); 318 + log.debug("After rpcSubscriptions.size(): [{}]", rpcSubscriptions.size());
320 } 319 }
321 320
322 @Override 321 @Override
323 public void onToDeviceRpcResponse(TransportProtos.ToDeviceRpcResponseMsg toDeviceResponse, TransportProtos.SessionInfoProto sessionInfo) { 322 public void onToDeviceRpcResponse(TransportProtos.ToDeviceRpcResponseMsg toDeviceResponse, TransportProtos.SessionInfoProto sessionInfo) {
324 - log.warn("5) onToDeviceRpcResponse: [{}], sessionUUID: [{}]", toDeviceResponse, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())); 323 + log.debug("OnToDeviceRpcResponse: [{}], sessionUUID: [{}]", toDeviceResponse, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()));
325 transportService.process(sessionInfo, toDeviceResponse, null); 324 transportService.process(sessionInfo, toDeviceResponse, null);
326 } 325 }
327 326
@@ -15,18 +15,28 @@ @@ -15,18 +15,28 @@
15 */ 15 */
16 package org.thingsboard.server.transport.lwm2m.server.store; 16 package org.thingsboard.server.transport.lwm2m.server.store;
17 17
18 -import org.thingsboard.server.common.data.ota.OtaPackageType;  
19 -import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo; 18 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MClientFwOtaInfo;
  19 +import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MClientSwOtaInfo;
20 20
21 public class TbDummyLwM2MClientOtaInfoStore implements TbLwM2MClientOtaInfoStore { 21 public class TbDummyLwM2MClientOtaInfoStore implements TbLwM2MClientOtaInfoStore {
22 22
23 @Override 23 @Override
24 - public LwM2MClientOtaInfo get(OtaPackageType type, String endpoint) { 24 + public LwM2MClientFwOtaInfo getFw(String endpoint) {
25 return null; 25 return null;
26 } 26 }
27 27
28 @Override 28 @Override
29 - public void put(LwM2MClientOtaInfo info) { 29 + public LwM2MClientSwOtaInfo getSw(String endpoint) {
  30 + return null;
  31 + }
  32 +
  33 + @Override
  34 + public void putFw(LwM2MClientFwOtaInfo info) {
  35 +
  36 + }
  37 +
  38 + @Override
  39 + public void putSw(LwM2MClientSwOtaInfo info) {
30 40
31 } 41 }
32 } 42 }
@@ -17,10 +17,16 @@ package org.thingsboard.server.transport.lwm2m.server.store; @@ -17,10 +17,16 @@ package org.thingsboard.server.transport.lwm2m.server.store;
17 17
18 import org.thingsboard.server.common.data.ota.OtaPackageType; 18 import org.thingsboard.server.common.data.ota.OtaPackageType;
19 import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo; 19 import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo;
  20 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MClientFwOtaInfo;
  21 +import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MClientSwOtaInfo;
20 22
21 public interface TbLwM2MClientOtaInfoStore { 23 public interface TbLwM2MClientOtaInfoStore {
22 24
23 - LwM2MClientOtaInfo get(OtaPackageType type, String endpoint); 25 + LwM2MClientFwOtaInfo getFw(String endpoint);
24 26
25 - void put(LwM2MClientOtaInfo info); 27 + LwM2MClientSwOtaInfo getSw(String endpoint);
  28 +
  29 + void putFw(LwM2MClientFwOtaInfo info);
  30 +
  31 + void putSw(LwM2MClientSwOtaInfo info);
26 } 32 }
@@ -17,6 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.store; @@ -17,6 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.store;
17 17
18 import org.eclipse.leshan.server.security.NonUniqueSecurityInfoException; 18 import org.eclipse.leshan.server.security.NonUniqueSecurityInfoException;
19 import org.eclipse.leshan.server.security.SecurityInfo; 19 import org.eclipse.leshan.server.security.SecurityInfo;
  20 +import org.jetbrains.annotations.Nullable;
20 import org.nustaq.serialization.FSTConfiguration; 21 import org.nustaq.serialization.FSTConfiguration;
21 import org.springframework.data.redis.connection.RedisConnectionFactory; 22 import org.springframework.data.redis.connection.RedisConnectionFactory;
22 import org.springframework.integration.redis.util.RedisLockRegistry; 23 import org.springframework.integration.redis.util.RedisLockRegistry;
@@ -24,6 +25,8 @@ import org.thingsboard.common.util.JacksonUtil; @@ -24,6 +25,8 @@ import org.thingsboard.common.util.JacksonUtil;
24 import org.thingsboard.server.common.data.ota.OtaPackageType; 25 import org.thingsboard.server.common.data.ota.OtaPackageType;
25 import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo; 26 import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo;
26 import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo; 27 import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MClientOtaInfo;
  28 +import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MClientFwOtaInfo;
  29 +import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MClientSwOtaInfo;
27 30
28 import java.util.concurrent.locks.Lock; 31 import java.util.concurrent.locks.Lock;
29 32
@@ -36,19 +39,36 @@ public class TbLwM2mRedisClientOtaInfoStore implements TbLwM2MClientOtaInfoStore @@ -36,19 +39,36 @@ public class TbLwM2mRedisClientOtaInfoStore implements TbLwM2MClientOtaInfoStore
36 this.connectionFactory = connectionFactory; 39 this.connectionFactory = connectionFactory;
37 } 40 }
38 41
39 - @Override  
40 - public LwM2MClientOtaInfo get(OtaPackageType type, String endpoint) { 42 + private void put(OtaPackageType type, LwM2MClientOtaInfo<?, ?, ?> info) {
41 try (var connection = connectionFactory.getConnection()) { 43 try (var connection = connectionFactory.getConnection()) {
42 - byte[] data = connection.get((OTA_EP + type + endpoint).getBytes());  
43 - return JacksonUtil.fromBytes(data, LwM2MClientOtaInfo.class); 44 + connection.set((OTA_EP + type + info.getEndpoint()).getBytes(), JacksonUtil.toString(info).getBytes());
44 } 45 }
45 } 46 }
46 47
47 @Override 48 @Override
48 - public void put(LwM2MClientOtaInfo info) { 49 + public LwM2MClientFwOtaInfo getFw(String endpoint) {
  50 + return getLwM2MClientOtaInfo(OtaPackageType.FIRMWARE, endpoint, LwM2MClientFwOtaInfo.class);
  51 + }
  52 +
  53 + @Override
  54 + public void putFw(LwM2MClientFwOtaInfo info) {
  55 + put(OtaPackageType.FIRMWARE, info);
  56 + }
  57 +
  58 + @Override
  59 + public LwM2MClientSwOtaInfo getSw(String endpoint) {
  60 + return getLwM2MClientOtaInfo(OtaPackageType.SOFTWARE, endpoint, LwM2MClientSwOtaInfo.class);
  61 + }
  62 +
  63 + @Override
  64 + public void putSw(LwM2MClientSwOtaInfo info) {
  65 + put(OtaPackageType.SOFTWARE, info);
  66 + }
  67 +
  68 + private <T extends LwM2MClientOtaInfo<?, ?, ?>> T getLwM2MClientOtaInfo(OtaPackageType type, String endpoint, Class<T> clazz) {
49 try (var connection = connectionFactory.getConnection()) { 69 try (var connection = connectionFactory.getConnection()) {
50 - connection.set((OTA_EP + info.getType() + info.getEndpoint()).getBytes(), JacksonUtil.toString(info).getBytes()); 70 + byte[] data = connection.get((OTA_EP + type + endpoint).getBytes());
  71 + return JacksonUtil.fromBytes(data, clazz);
51 } 72 }
52 } 73 }
53 -  
54 } 74 }
@@ -90,7 +90,6 @@ import javax.annotation.PreDestroy; @@ -90,7 +90,6 @@ import javax.annotation.PreDestroy;
90 import java.util.ArrayList; 90 import java.util.ArrayList;
91 import java.util.Collection; 91 import java.util.Collection;
92 import java.util.Collections; 92 import java.util.Collections;
93 -import java.util.HashMap;  
94 import java.util.HashSet; 93 import java.util.HashSet;
95 import java.util.List; 94 import java.util.List;
96 import java.util.Map; 95 import java.util.Map;
@@ -111,11 +110,16 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.c @@ -111,11 +110,16 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.c
111 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertOtaUpdateValueToString; 110 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertOtaUpdateValueToString;
112 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.fromVersionedIdToObjectId; 111 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.fromVersionedIdToObjectId;
113 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_3_VER_ID; 112 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_3_VER_ID;
114 -import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_5_VER_ID; 113 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_VER_ID;
115 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_DELIVERY_METHOD; 114 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_DELIVERY_METHOD;
116 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_NAME_ID; 115 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_NAME_ID;
117 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_RESULT_ID; 116 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_RESULT_ID;
118 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_STATE_ID; 117 import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FW_STATE_ID;
  118 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_3_VER_ID;
  119 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_NAME_ID;
  120 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_RESULT_ID;
  121 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_STATE_ID;
  122 +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SW_VER_ID;
119 123
120 124
121 @Slf4j 125 @Slf4j
@@ -238,7 +242,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl @@ -238,7 +242,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
238 executor.submit(() -> { 242 executor.submit(() -> {
239 LwM2mClient lwM2MClient = clientContext.getClientByEndpoint(registration.getEndpoint()); 243 LwM2mClient lwM2MClient = clientContext.getClientByEndpoint(registration.getEndpoint());
240 try { 244 try {
241 - log.warn("[{}] [{{}] Client: update after Registration", registration.getEndpoint(), registration.getId()); 245 + log.info("[{}] [{{}] Client: update after Registration", registration.getEndpoint(), registration.getId());
242 logService.log(lwM2MClient, String.format("[%s][%s] Updated registration.", registration.getId(), registration.getSocketAddress())); 246 logService.log(lwM2MClient, String.format("[%s][%s] Updated registration.", registration.getId(), registration.getSocketAddress()));
243 clientContext.updateRegistration(lwM2MClient, registration); 247 clientContext.updateRegistration(lwM2MClient, registration);
244 this.reportActivityAndRegister(lwM2MClient.getSession()); 248 this.reportActivityAndRegister(lwM2MClient.getSession());
@@ -318,7 +322,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl @@ -318,7 +322,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
318 } 322 }
319 323
320 public void onUpdateValueAfterReadCompositeResponse(Registration registration, ReadCompositeResponse response) { 324 public void onUpdateValueAfterReadCompositeResponse(Registration registration, ReadCompositeResponse response) {
321 - log.warn("201) ReadCompositeResponse: [{}]", response); 325 + log.trace("ReadCompositeResponse: [{}]", response);
322 if (response.getContent() != null) { 326 if (response.getContent() != null) {
323 LwM2mClient lwM2MClient = clientContext.getClientByEndpoint(registration.getEndpoint()); 327 LwM2mClient lwM2MClient = clientContext.getClientByEndpoint(registration.getEndpoint());
324 response.getContent().forEach((k, v) -> { 328 response.getContent().forEach((k, v) -> {
@@ -407,19 +411,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl @@ -407,19 +411,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
407 Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getProfileId()); 411 Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getProfileId());
408 Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient); 412 Set<String> supportedObjects = clientContext.getSupportedIdVerInClient(lwM2MClient);
409 if (supportedObjects != null && supportedObjects.size() > 0) { 413 if (supportedObjects != null && supportedObjects.size() > 0) {
410 - // #1  
411 this.sendReadRequests(lwM2MClient, profile, supportedObjects); 414 this.sendReadRequests(lwM2MClient, profile, supportedObjects);
412 - // test composite  
413 - String[] paths = new String[]{"/3/0", "/1/0", "/5/0"};  
414 -// String [] paths = new String[] {"/5"};  
415 -// String [] paths = new String[] {"/"};  
416 -// String [] paths = new String[] {"/9"};  
417 -// defaultLwM2MDownlinkMsgHandler.sendReadCompositeRequest(lwM2MClient, paths, this);  
418 - Map<String, Object> nodes = new HashMap<>();  
419 - nodes.put("/3/0/14", "+02");  
420 - nodes.put("/1/0/2", 100);  
421 - nodes.put("/5/0/1", "coap://localhost:5685");  
422 -// defaultLwM2MDownlinkMsgHandler.sendWriteCompositeRequest(lwM2MClient, nodes, this);  
423 this.sendObserveRequests(lwM2MClient, profile, supportedObjects); 415 this.sendObserveRequests(lwM2MClient, profile, supportedObjects);
424 this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects); 416 this.sendWriteAttributeRequests(lwM2MClient, profile, supportedObjects);
425 // Removed. Used only for debug. 417 // Removed. Used only for debug.
@@ -531,14 +523,24 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl @@ -531,14 +523,24 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
531 otaService.onCurrentFirmwareNameUpdate(lwM2MClient, (String) lwM2mResource.getValue()); 523 otaService.onCurrentFirmwareNameUpdate(lwM2MClient, (String) lwM2mResource.getValue());
532 } else if (path.equals(convertObjectIdToVersionedId(FW_3_VER_ID, registration))) { 524 } else if (path.equals(convertObjectIdToVersionedId(FW_3_VER_ID, registration))) {
533 otaService.onCurrentFirmwareVersion3Update(lwM2MClient, (String) lwM2mResource.getValue()); 525 otaService.onCurrentFirmwareVersion3Update(lwM2MClient, (String) lwM2mResource.getValue());
534 - } else if (path.equals(convertObjectIdToVersionedId(FW_5_VER_ID, registration))) {  
535 - otaService.onCurrentFirmwareVersion5Update(lwM2MClient, (String) lwM2mResource.getValue()); 526 + } else if (path.equals(convertObjectIdToVersionedId(FW_VER_ID, registration))) {
  527 + otaService.onCurrentFirmwareVersionUpdate(lwM2MClient, (String) lwM2mResource.getValue());
536 } else if (path.equals(convertObjectIdToVersionedId(FW_STATE_ID, registration))) { 528 } else if (path.equals(convertObjectIdToVersionedId(FW_STATE_ID, registration))) {
537 otaService.onCurrentFirmwareStateUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); 529 otaService.onCurrentFirmwareStateUpdate(lwM2MClient, (Long) lwM2mResource.getValue());
538 } else if (path.equals(convertObjectIdToVersionedId(FW_RESULT_ID, registration))) { 530 } else if (path.equals(convertObjectIdToVersionedId(FW_RESULT_ID, registration))) {
539 otaService.onCurrentFirmwareResultUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); 531 otaService.onCurrentFirmwareResultUpdate(lwM2MClient, (Long) lwM2mResource.getValue());
540 } else if (path.equals(convertObjectIdToVersionedId(FW_DELIVERY_METHOD, registration))) { 532 } else if (path.equals(convertObjectIdToVersionedId(FW_DELIVERY_METHOD, registration))) {
541 otaService.onCurrentFirmwareDeliveryMethodUpdate(lwM2MClient, (Long) lwM2mResource.getValue()); 533 otaService.onCurrentFirmwareDeliveryMethodUpdate(lwM2MClient, (Long) lwM2mResource.getValue());
  534 + } else if (path.equals(convertObjectIdToVersionedId(SW_NAME_ID, registration))) {
  535 + otaService.onCurrentSoftwareNameUpdate(lwM2MClient, (String) lwM2mResource.getValue());
  536 + } else if (path.equals(convertObjectIdToVersionedId(SW_VER_ID, registration))) {
  537 + otaService.onCurrentSoftwareVersionUpdate(lwM2MClient, (String) lwM2mResource.getValue());
  538 + } else if (path.equals(convertObjectIdToVersionedId(SW_3_VER_ID, registration))) {
  539 + otaService.onCurrentSoftwareVersion3Update(lwM2MClient, (String) lwM2mResource.getValue());
  540 + } else if (path.equals(convertObjectIdToVersionedId(SW_STATE_ID, registration))) {
  541 + otaService.onCurrentSoftwareStateUpdate(lwM2MClient, (Long) lwM2mResource.getValue());
  542 + } else if (path.equals(convertObjectIdToVersionedId(SW_RESULT_ID, registration))) {
  543 + otaService.onCurrentSoftwareResultUpdate(lwM2MClient, (Long) lwM2mResource.getValue());
542 } 544 }
543 this.updateAttrTelemetry(registration, Collections.singleton(path)); 545 this.updateAttrTelemetry(registration, Collections.singleton(path));
544 } else { 546 } else {
@@ -698,7 +700,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl @@ -698,7 +700,7 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
698 700
699 @Override 701 @Override
700 public void onWriteCompositeResponseOk(LwM2mClient client, WriteCompositeRequest request) { 702 public void onWriteCompositeResponseOk(LwM2mClient client, WriteCompositeRequest request) {
701 - log.warn("202) ReadCompositeResponse: [{}]", request.getNodes()); 703 + log.trace("ReadCompositeResponse: [{}]", request.getNodes());
702 request.getNodes().forEach((k, v) -> { 704 request.getNodes().forEach((k, v) -> {
703 this.updateResourcesValue(client, (LwM2mResource) v, k.toString()); 705 this.updateResourcesValue(client, (LwM2mResource) v, k.toString());
704 }); 706 });