Commit 4a6e0c7aae3c305c5332c520d0447ebd697c805c

Authored by nickAS21
Committed by GitHub
1 parent 2df1177e

Lwm2m fix bug 19 (#4422)

* lwm2m: back: Write Attributes - start

* lwm2m: front: fis bug disable instances

* lwm2m: transport: attr/discavery start

* lwm2m: transport: attributeLwm2m after update profile

* lwm2m: transport: attributeLwm2m after update profile (no delete attribute)

* Lwm2m: back: test

* Lwm2m: back: test2

* Lwm2m: back: test3

* Lwm2m: transport fix bug Write attribute through the shared attribute does not work for Object 19
@@ -362,14 +362,6 @@ public class LwM2mTransportHandler { @@ -362,14 +362,6 @@ public class LwM2mTransportHandler {
362 } 362 }
363 } 363 }
364 364
365 - public static Integer validateObjectIdFromKey(String key) {  
366 - try {  
367 - return Integer.parseInt(key.split(LWM2M_SEPARATOR_PATH)[1].split(LWM2M_SEPARATOR_KEY)[0]);  
368 - } catch (Exception e) {  
369 - return null;  
370 - }  
371 - }  
372 -  
373 public static String validateObjectVerFromKey(String key) { 365 public static String validateObjectVerFromKey(String key) {
374 try { 366 try {
375 return (key.split(LWM2M_SEPARATOR_PATH)[1].split(LWM2M_SEPARATOR_KEY)[1]); 367 return (key.split(LWM2M_SEPARATOR_PATH)[1].split(LWM2M_SEPARATOR_KEY)[1]);
@@ -120,7 +120,7 @@ public class LwM2mTransportRequest { @@ -120,7 +120,7 @@ public class LwM2mTransportRequest {
120 DownlinkRequest request = null; 120 DownlinkRequest request = null;
121 ContentFormat contentFormat = contentFormatParam != null ? ContentFormat.fromName(contentFormatParam.toUpperCase()) : null; 121 ContentFormat contentFormat = contentFormatParam != null ? ContentFormat.fromName(contentFormatParam.toUpperCase()) : null;
122 LwM2mClient lwM2MClient = lwM2mClientContext.getLwM2mClientWithReg(registration, null); 122 LwM2mClient lwM2MClient = lwM2mClientContext.getLwM2mClientWithReg(registration, null);
123 - ResourceModel resource = lwM2MClient.getResourceModel(targetIdVer); 123 + ResourceModel resource = null;
124 timeoutInMs = timeoutInMs > 0 ? timeoutInMs : DEFAULT_TIMEOUT; 124 timeoutInMs = timeoutInMs > 0 ? timeoutInMs : DEFAULT_TIMEOUT;
125 switch (typeOper) { 125 switch (typeOper) {
126 case GET_TYPE_OPER_READ: 126 case GET_TYPE_OPER_READ:
@@ -142,6 +142,7 @@ public class LwM2mTransportRequest { @@ -142,6 +142,7 @@ public class LwM2mTransportRequest {
142 request = new CancelObservationRequest(observation); 142 request = new CancelObservationRequest(observation);
143 break; 143 break;
144 case POST_TYPE_OPER_EXECUTE: 144 case POST_TYPE_OPER_EXECUTE:
  145 + resource = lwM2MClient.getResourceModel(targetIdVer);
145 if (params != null && resource != null && !resource.multiple) { 146 if (params != null && resource != null && !resource.multiple) {
146 request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resource.type, ResourceModel.Type.STRING, resultIds)); 147 request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resource.type, ResourceModel.Type.STRING, resultIds));
147 } else { 148 } else {
@@ -150,6 +151,7 @@ public class LwM2mTransportRequest { @@ -150,6 +151,7 @@ public class LwM2mTransportRequest {
150 break; 151 break;
151 case POST_TYPE_OPER_WRITE_REPLACE: 152 case POST_TYPE_OPER_WRITE_REPLACE:
152 // Request to write a <b>String Single-Instance Resource</b> using the TLV content format. 153 // Request to write a <b>String Single-Instance Resource</b> using the TLV content format.
  154 + resource = lwM2MClient.getResourceModel(targetIdVer);
153 if (resource != null && contentFormat != null) { 155 if (resource != null && contentFormat != null) {
154 // if (contentFormat.equals(ContentFormat.TLV) && !resource.multiple) { 156 // if (contentFormat.equals(ContentFormat.TLV) && !resource.multiple) {
155 if (contentFormat.equals(ContentFormat.TLV)) { 157 if (contentFormat.equals(ContentFormat.TLV)) {
@@ -171,7 +173,7 @@ public class LwM2mTransportRequest { @@ -171,7 +173,7 @@ public class LwM2mTransportRequest {
171 } 173 }
172 break; 174 break;
173 case PUT_TYPE_OPER_WRITE_ATTRIBUTES: 175 case PUT_TYPE_OPER_WRITE_ATTRIBUTES:
174 - request = createWriteAttributeRequest (target, params); 176 + request = createWriteAttributeRequest(target, params);
175 break; 177 break;
176 } 178 }
177 179
@@ -207,12 +209,16 @@ public class LwM2mTransportRequest { @@ -207,12 +209,16 @@ public class LwM2mTransportRequest {
207 if (CoAP.ResponseCode.isSuccess(((Response) response.getCoapResponse()).getCode())) { 209 if (CoAP.ResponseCode.isSuccess(((Response) response.getCoapResponse()).getCode())) {
208 this.handleResponse(registration, request.getPath().toString(), response, request); 210 this.handleResponse(registration, request.getPath().toString(), response, request);
209 if (request instanceof WriteRequest && ((WriteRequest) request).isReplaceRequest()) { 211 if (request instanceof WriteRequest && ((WriteRequest) request).isReplaceRequest()) {
  212 + LwM2mNode node = ((WriteRequest) request).getNode();
  213 + Object value = this.converter.convertValue(((LwM2mSingleResource) node).getValue(),
  214 + ((LwM2mSingleResource) node).getType(), ResourceModel.Type.STRING, request.getPath());
210 String msg = String.format("%s: sendRequest Replace: CoapCde - %s Lwm2m code - %d name - %s Resource path - %s value - %s SendRequest to Client", 215 String msg = String.format("%s: sendRequest Replace: CoapCde - %s Lwm2m code - %d name - %s Resource path - %s value - %s SendRequest to Client",
211 - LOG_LW2M_INFO, ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(), response.getCode().getName(), request.getPath().toString(),  
212 - ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue().toString()); 216 + LOG_LW2M_INFO, ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(),
  217 + response.getCode().getName(), request.getPath().toString(), value);
213 serviceImpl.sendLogsToThingsboard(msg, registration); 218 serviceImpl.sendLogsToThingsboard(msg, registration);
214 - log.info("[{}] [{}] - [{}] [{}] Update SendRequest[{}]", registration.getEndpoint(), ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString(),  
215 - ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue()); 219 + log.debug("[{}] [{}] - [{}] [{}] Update SendRequest[{}]", registration.getEndpoint(),
  220 + ((Response) response.getCoapResponse()).getCode(), response.getCode(),
  221 + request.getPath().toString(), value);
216 } 222 }
217 } else { 223 } else {
218 String msg = String.format("%s: sendRequest: CoapCode - %s Lwm2m code - %d name - %s Resource path - %s SendRequest to Client", LOG_LW2M_ERROR, 224 String msg = String.format("%s: sendRequest: CoapCode - %s Lwm2m code - %d name - %s Resource path - %s SendRequest to Client", LOG_LW2M_ERROR,
@@ -95,7 +95,6 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle @@ -95,7 +95,6 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
95 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.convertToIdVerFromObjectId; 95 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.convertToIdVerFromObjectId;
96 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.convertToObjectIdFromIdVer; 96 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.convertToObjectIdFromIdVer;
97 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.getAckCallback; 97 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.getAckCallback;
98 -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.validateObjectIdFromKey;  
99 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.validateObjectVerFromKey; 98 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandler.validateObjectVerFromKey;
100 99
101 @Slf4j 100 @Slf4j
@@ -515,9 +514,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -515,9 +514,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
515 null, null, this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getTimeout())); 514 null, null, this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getTimeout()));
516 } 515 }
517 // #1 516 // #1
  517 + this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, GET_TYPE_OPER_READ, clientObjects);
518 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, GET_TYPE_OPER_OBSERVE, clientObjects); 518 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, GET_TYPE_OPER_OBSERVE, clientObjects);
519 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, PUT_TYPE_OPER_WRITE_ATTRIBUTES, clientObjects); 519 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, PUT_TYPE_OPER_WRITE_ATTRIBUTES, clientObjects);
520 - this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, GET_TYPE_OPER_DISCOVER, clientObjects); 520 +// this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, GET_TYPE_OPER_DISCOVER, clientObjects);
521 } 521 }
522 } 522 }
523 523
@@ -748,9 +748,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -748,9 +748,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
748 if (resName != null && !resName.isEmpty()) { 748 if (resName != null && !resName.isEmpty()) {
749 try { 749 try {
750 String resValue = this.getResourceValueToString(lwM2MClient, path); 750 String resValue = this.getResourceValueToString(lwM2MClient, path);
751 - if (resValue != null) {  
752 - parameters.addProperty(resName, resValue);  
753 - } 751 + parameters.addProperty(resName, resValue);
754 } catch (Exception e) { 752 } catch (Exception e) {
755 log.error("Failed to add parameters.", e); 753 log.error("Failed to add parameters.", e);
756 } 754 }
@@ -907,10 +905,14 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -907,10 +905,14 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
907 // send Request observe to Client 905 // send Request observe to Client
908 registrationIds.forEach(registrationId -> { 906 registrationIds.forEach(registrationId -> {
909 Registration registration = lwM2mClientContext.getRegistration(registrationId); 907 Registration registration = lwM2mClientContext.getRegistration(registrationId);
910 - this.readResourceValueObserve(registration, postObserveAnalyzer.getPathPostParametersAdd(), GET_TYPE_OPER_OBSERVE); 908 + if (postObserveAnalyzer.getPathPostParametersAdd().size() > 0) {
  909 + this.readResourceValueObserve(registration, postObserveAnalyzer.getPathPostParametersAdd(), GET_TYPE_OPER_OBSERVE);
  910 + }
911 // 5.3 del 911 // 5.3 del
912 // send Request cancel observe to Client 912 // send Request cancel observe to Client
913 - this.cancelObserveIsValue(registration, postObserveAnalyzer.getPathPostParametersDel()); 913 + if (postObserveAnalyzer.getPathPostParametersDel().size() > 0) {
  914 + this.cancelObserveIsValue(registration, postObserveAnalyzer.getPathPostParametersDel());
  915 + }
914 }); 916 });
915 } 917 }
916 } 918 }
@@ -1253,11 +1255,11 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1253,11 +1255,11 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1253 return new ArrayList<>(namesIsWritable); 1255 return new ArrayList<>(namesIsWritable);
1254 } 1256 }
1255 1257
1256 - private boolean validateResourceInModel(LwM2mClient lwM2mClient, String pathKey, boolean isWritable) {  
1257 - ResourceModel resourceModel = lwM2mClient.getResourceModel(pathKey);  
1258 - Integer objectId = validateObjectIdFromKey(pathKey);  
1259 - String objectVer = validateObjectVerFromKey(pathKey);  
1260 - return resourceModel != null && (isWritable ? 1258 + private boolean validateResourceInModel(LwM2mClient lwM2mClient, String pathIdVer, boolean isWritableNotOptional) {
  1259 + ResourceModel resourceModel = lwM2mClient.getResourceModel(pathIdVer);
  1260 + Integer objectId = new LwM2mPath(convertToObjectIdFromIdVer(pathIdVer)).getObjectId();
  1261 + String objectVer = validateObjectVerFromKey(pathIdVer);
  1262 + return resourceModel != null && (isWritableNotOptional ?
1261 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId)) && resourceModel.operations.isWritable() : 1263 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId)) && resourceModel.operations.isWritable() :
1262 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId))); 1264 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId)));
1263 } 1265 }