Commit 367be12455f4545b27be16dcef27355c94e49904

Authored by nickAS21
Committed by GitHub
1 parent bfc03c4c

lwm2m: back transport clear cash (#4294)

* lwm2m: back transport clear cash

* lwm2m: back transport del old models

* lwm2m: back transport edit yml old models

* lwm2m: back transport remove lock

* lwm2m: back transport remove lock2
application/src/main/java/org/thingsboard/server/controller/Lwm2mController.java renamed from application/src/main/java/org/thingsboard/server/controller/DeviceLwm2mController.java
@@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.PathVariable; @@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.PathVariable;
22 import org.springframework.web.bind.annotation.RequestBody; 22 import org.springframework.web.bind.annotation.RequestBody;
23 import org.springframework.web.bind.annotation.RequestMapping; 23 import org.springframework.web.bind.annotation.RequestMapping;
24 import org.springframework.web.bind.annotation.RequestMethod; 24 import org.springframework.web.bind.annotation.RequestMethod;
25 -import org.springframework.web.bind.annotation.RequestParam;  
26 import org.springframework.web.bind.annotation.ResponseBody; 25 import org.springframework.web.bind.annotation.ResponseBody;
27 import org.springframework.web.bind.annotation.RestController; 26 import org.springframework.web.bind.annotation.RestController;
28 import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; 27 import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg;
@@ -30,54 +29,19 @@ import org.thingsboard.server.common.data.Device; @@ -30,54 +29,19 @@ import org.thingsboard.server.common.data.Device;
30 import org.thingsboard.server.common.data.EntityType; 29 import org.thingsboard.server.common.data.EntityType;
31 import org.thingsboard.server.common.data.audit.ActionType; 30 import org.thingsboard.server.common.data.audit.ActionType;
32 import org.thingsboard.server.common.data.exception.ThingsboardException; 31 import org.thingsboard.server.common.data.exception.ThingsboardException;
33 -import org.thingsboard.server.common.data.lwm2m.LwM2mObject;  
34 import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig; 32 import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
35 -import org.thingsboard.server.common.data.page.PageData;  
36 -import org.thingsboard.server.common.data.page.PageLink;  
37 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; 33 import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent;
38 import org.thingsboard.server.common.data.security.DeviceCredentials; 34 import org.thingsboard.server.common.data.security.DeviceCredentials;
39 import org.thingsboard.server.queue.util.TbCoreComponent; 35 import org.thingsboard.server.queue.util.TbCoreComponent;
40 import org.thingsboard.server.service.security.permission.Resource; 36 import org.thingsboard.server.service.security.permission.Resource;
41 37
42 -import java.util.List;  
43 import java.util.Map; 38 import java.util.Map;
44 39
45 @Slf4j 40 @Slf4j
46 @RestController 41 @RestController
47 @TbCoreComponent 42 @TbCoreComponent
48 @RequestMapping("/api") 43 @RequestMapping("/api")
49 -public class DeviceLwm2mController extends BaseController {  
50 -  
51 - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")  
52 - @RequestMapping(value = "/lwm2m/deviceProfile", params = {"sortOrder", "sortProperty"}, method = RequestMethod.GET)  
53 - @ResponseBody  
54 - public List<LwM2mObject> getLwm2mListObjects(@RequestParam String sortOrder,  
55 - @RequestParam String sortProperty,  
56 - @RequestParam(required = false) int[] objectIds,  
57 - @RequestParam(required = false) String searchText)  
58 - throws ThingsboardException {  
59 - try {  
60 - return lwM2MModelsRepository.getLwm2mObjects(objectIds, searchText, sortProperty, sortOrder);  
61 - } catch (Exception e) {  
62 - throw handleException(e);  
63 - }  
64 - }  
65 -  
66 - @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")  
67 - @RequestMapping(value = "/lwm2m/deviceProfile/objects", params = {"pageSize", "page"}, method = RequestMethod.GET)  
68 - @ResponseBody  
69 - public PageData<LwM2mObject> getLwm2mListObjects(@RequestParam int pageSize,  
70 - @RequestParam int page,  
71 - @RequestParam(required = false) String searchText,  
72 - @RequestParam(required = false) String sortProperty,  
73 - @RequestParam(required = false) String sortOrder) throws ThingsboardException {  
74 - try {  
75 - PageLink pageLink = createPageLink(pageSize, page, searchText, sortProperty, sortOrder);  
76 - return checkNotNull(lwM2MModelsRepository.findDeviceLwm2mObjects(getTenantId(), pageLink));  
77 - } catch (Exception e) {  
78 - throw handleException(e);  
79 - }  
80 - } 44 +public class Lwm2mController extends BaseController {
81 45
82 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") 46 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
83 @RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{securityMode}/{bootstrapServerIs}", method = RequestMethod.GET) 47 @RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{securityMode}/{bootstrapServerIs}", method = RequestMethod.GET)
@@ -17,22 +17,13 @@ package org.thingsboard.server.service.lwm2m; @@ -17,22 +17,13 @@ package org.thingsboard.server.service.lwm2m;
17 17
18 18
19 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
20 -import org.eclipse.leshan.core.model.ObjectModel;  
21 import org.eclipse.leshan.core.util.Hex; 20 import org.eclipse.leshan.core.util.Hex;
22 import org.springframework.beans.factory.annotation.Autowired; 21 import org.springframework.beans.factory.annotation.Autowired;
23 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; 22 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
24 -import org.springframework.data.domain.PageImpl;  
25 import org.springframework.stereotype.Service; 23 import org.springframework.stereotype.Service;
26 -import org.thingsboard.server.common.data.id.TenantId;  
27 -import org.thingsboard.server.common.data.lwm2m.LwM2mInstance;  
28 -import org.thingsboard.server.common.data.lwm2m.LwM2mObject;  
29 -import org.thingsboard.server.common.data.lwm2m.LwM2mResource;  
30 import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig; 24 import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
31 -import org.thingsboard.server.common.data.page.PageData;  
32 -import org.thingsboard.server.common.data.page.PageLink;  
33 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigBootstrap; 25 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigBootstrap;
34 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer; 26 import org.thingsboard.server.common.transport.lwm2m.LwM2MTransportConfigServer;
35 -import org.thingsboard.server.dao.service.Validator;  
36 import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode; 27 import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
37 28
38 import java.math.BigInteger; 29 import java.math.BigInteger;
@@ -48,16 +39,6 @@ import java.security.spec.ECParameterSpec; @@ -48,16 +39,6 @@ import java.security.spec.ECParameterSpec;
48 import java.security.spec.ECPoint; 39 import java.security.spec.ECPoint;
49 import java.security.spec.ECPublicKeySpec; 40 import java.security.spec.ECPublicKeySpec;
50 import java.security.spec.KeySpec; 41 import java.security.spec.KeySpec;
51 -import java.util.ArrayList;  
52 -import java.util.Comparator;  
53 -import java.util.List;  
54 -import java.util.concurrent.atomic.AtomicInteger;  
55 -import java.util.function.Predicate;  
56 -import java.util.stream.Collector;  
57 -import java.util.stream.Collectors;  
58 -import java.util.stream.IntStream;  
59 -  
60 -import static org.thingsboard.server.dao.service.Validator.validateId;  
61 42
62 @Slf4j 43 @Slf4j
63 @Service 44 @Service
@@ -74,127 +55,6 @@ public class LwM2MModelsRepository { @@ -74,127 +55,6 @@ public class LwM2MModelsRepository {
74 LwM2MTransportConfigBootstrap contextBootStrap; 55 LwM2MTransportConfigBootstrap contextBootStrap;
75 56
76 /** 57 /**
77 - * @param objectIds  
78 - * @param textSearch  
79 - * @return list of LwM2mObject  
80 - * Filter by Predicate (uses objectIds, if objectIds is null then it uses textSearch,  
81 - * if textSearch is null then it uses AllList from List<ObjectModel>)  
82 - */  
83 - public List<LwM2mObject> getLwm2mObjects(int[] objectIds, String textSearch, String sortProperty, String sortOrder) {  
84 - if (objectIds == null && textSearch != null && !textSearch.isEmpty()) {  
85 - objectIds = getObjectIdFromTextSearch(textSearch);  
86 - }  
87 - int[] finalObjectIds = objectIds;  
88 - return getLwm2mObjects((objectIds != null && objectIds.length > 0 && textSearch != null && !textSearch.isEmpty()) ?  
89 - (ObjectModel element) -> IntStream.of(finalObjectIds).anyMatch(x -> x == element.id) || element.name.toLowerCase().contains(textSearch.toLowerCase()) :  
90 - (objectIds != null && objectIds.length > 0) ?  
91 - (ObjectModel element) -> IntStream.of(finalObjectIds).anyMatch(x -> x == element.id) :  
92 - (textSearch != null && !textSearch.isEmpty()) ?  
93 - (ObjectModel element) -> element.name.contains(textSearch) :  
94 - null,  
95 - sortProperty, sortOrder);  
96 - }  
97 -  
98 - /**  
99 - * @param predicate  
100 - * @return list of LwM2mObject  
101 - */  
102 - private List<LwM2mObject> getLwm2mObjects(Predicate<? super ObjectModel> predicate, String sortProperty, String sortOrder) {  
103 - List<LwM2mObject> lwM2mObjects = new ArrayList<>();  
104 - List<ObjectModel> listObjects = (predicate == null) ? this.contextServer.getModelsValueCommon() :  
105 - contextServer.getModelsValueCommon().stream()  
106 - .filter(predicate)  
107 - .collect(Collectors.toList());  
108 -  
109 - listObjects.forEach(obj -> {  
110 - LwM2mObject lwM2mObject = new LwM2mObject();  
111 - lwM2mObject.setId(obj.id);  
112 - lwM2mObject.setName(obj.name);  
113 - lwM2mObject.setMultiple(obj.multiple);  
114 - lwM2mObject.setMandatory(obj.mandatory);  
115 - LwM2mInstance instance = new LwM2mInstance();  
116 - instance.setId(0);  
117 - List<LwM2mResource> resources = new ArrayList<>();  
118 - obj.resources.forEach((k, v) -> {  
119 - if (!v.operations.isExecutable()) {  
120 - LwM2mResource resource = new LwM2mResource(k, v.name, false, false, false);  
121 - resources.add(resource);  
122 - }  
123 - });  
124 - instance.setResources(resources.stream().toArray(LwM2mResource[]::new));  
125 - lwM2mObject.setInstances(new LwM2mInstance[]{instance});  
126 - lwM2mObjects.add(lwM2mObject);  
127 - });  
128 - return lwM2mObjects.size() > 1 ? this.sortList (lwM2mObjects, sortProperty, sortOrder) : lwM2mObjects;  
129 - }  
130 -  
131 - private List<LwM2mObject> sortList (List<LwM2mObject> lwM2mObjects, String sortProperty, String sortOrder) {  
132 - switch (sortProperty) {  
133 - case "name":  
134 - switch (sortOrder) {  
135 - case "ASC":  
136 - lwM2mObjects.sort((o1, o2) -> o1.getName().compareTo(o2.getName()));  
137 - break;  
138 - case "DESC":  
139 - lwM2mObjects.stream().sorted(Comparator.comparing(LwM2mObject::getName).reversed());  
140 - break;  
141 - }  
142 - case "id":  
143 - switch (sortOrder) {  
144 - case "ASC":  
145 - lwM2mObjects.sort((o1, o2) -> Long.compare(o1.getId(), o2.getId()));  
146 - break;  
147 - case "DESC":  
148 - lwM2mObjects.sort((o1, o2) -> Long.compare(o2.getId(), o1.getId()));  
149 - }  
150 - }  
151 - return lwM2mObjects;  
152 - }  
153 -  
154 - /**  
155 - * @param tenantId  
156 - * @param pageLink  
157 - * @return List of LwM2mObject in PageData format  
158 - */  
159 - public PageData<LwM2mObject> findDeviceLwm2mObjects(TenantId tenantId, PageLink pageLink) {  
160 - log.trace("Executing findDeviceProfileInfos tenantId [{}], pageLink [{}]", tenantId, pageLink);  
161 - validateId(tenantId, INCORRECT_TENANT_ID + tenantId);  
162 - Validator.validatePageLink(pageLink);  
163 - return this.findLwm2mListObjects(pageLink);  
164 - }  
165 -  
166 - /**  
167 - * @param pageLink  
168 - * @return List of LwM2mObject in PageData format, filter == TextSearch  
169 - * PageNumber = 1, PageSize = List<LwM2mObject>.size()  
170 - */  
171 - public PageData<LwM2mObject> findLwm2mListObjects(PageLink pageLink) {  
172 - PageImpl<LwM2mObject> page = new PageImpl<>(getLwm2mObjects(getObjectIdFromTextSearch(pageLink.getTextSearch()),  
173 - pageLink.getTextSearch(),  
174 - pageLink.getSortOrder().getProperty(),  
175 - pageLink.getSortOrder().getDirection().name()));  
176 - PageData<LwM2mObject> pageData = new PageData<>(page.getContent(), page.getTotalPages(), page.getTotalElements(), page.hasNext());  
177 - return pageData;  
178 - }  
179 -  
180 - /**  
181 - * Filter for id Object  
182 - * @param textSearch -  
183 - * @return - return Object id only first chartAt in textSearch  
184 - */  
185 - private int[] getObjectIdFromTextSearch(String textSearch) {  
186 - String filtered = null;  
187 - if (textSearch !=null && !textSearch.isEmpty()) {  
188 - AtomicInteger a = new AtomicInteger();  
189 - filtered = textSearch.chars ()  
190 - .mapToObj(chr -> (char) chr)  
191 - .filter(i -> Character.isDigit(i) && textSearch.charAt(a.getAndIncrement()) == i)  
192 - .collect(Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString));  
193 - }  
194 - return (filtered != null && !filtered.isEmpty()) ? new int[]{Integer.parseInt(filtered)} : new int[0];  
195 - }  
196 -  
197 - /**  
198 * @param securityMode 58 * @param securityMode
199 * @param bootstrapServerIs 59 * @param bootstrapServerIs
200 * @return ServerSecurityConfig more value is default: Important - port, host, publicKey 60 * @return ServerSecurityConfig more value is default: Important - port, host, publicKey
@@ -594,8 +594,6 @@ transport: @@ -594,8 +594,6 @@ transport:
594 # send a Confirmable message to the time when an acknowledgement is no longer expected. 594 # send a Confirmable message to the time when an acknowledgement is no longer expected.
595 # DEFAULT_TIMEOUT = 2 * 60 * 1000l; 2 min in ms 595 # DEFAULT_TIMEOUT = 2 * 60 * 1000l; 2 min in ms
596 timeout: "${LWM2M_TIMEOUT:120000}" 596 timeout: "${LWM2M_TIMEOUT:120000}"
597 -# model_path_file: "${LWM2M_MODEL_PATH_FILE:./common/transport/lwm2m/src/main/resources/models/}"  
598 - model_path_file: "${LWM2M_MODEL_PATH_FILE:}"  
599 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" 597 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}"
600 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" 598 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}"
601 request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}" 599 request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}"
@@ -609,7 +607,7 @@ transport: @@ -609,7 +607,7 @@ transport:
609 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh 607 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh
610 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" 608 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}"
611 # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}" 609 # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}"
612 -# key_store_path_file: "${KEY_STORE_PATH_FILE:/usr/share/thingsboard/conf/credentials/serverKeyStore.jks}" 610 +# key_store_path_file: "${KEY_STORE_PATH_FILE:/common/transport/lwm2m/src/main/resources/credentials/serverKeyStore.jks"
613 key_store_path_file: "${KEY_STORE_PATH_FILE:}" 611 key_store_path_file: "${KEY_STORE_PATH_FILE:}"
614 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" 612 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}"
615 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" 613 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}"
@@ -166,13 +166,13 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore { @@ -166,13 +166,13 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
166 lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap); 166 lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap);
167 lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer); 167 lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer);
168 String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LW2M_INFO, store.getEndPoint()); 168 String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LW2M_INFO, store.getEndPoint());
169 - context.sentParametersOnThingsboard(context.getTelemetryMsgObject(logMsg), LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC, sessionInfo); 169 + context.sendParametersOnThingsboard(context.getTelemetryMsgObject(logMsg), LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC, sessionInfo);
170 return lwM2MBootstrapConfig; 170 return lwM2MBootstrapConfig;
171 } else { 171 } else {
172 log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndPoint()); 172 log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndPoint());
173 log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint()); 173 log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint());
174 String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint()); 174 String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint());
175 - context.sentParametersOnThingsboard(context.getTelemetryMsgObject(logMsg), LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC, sessionInfo); 175 + context.sendParametersOnThingsboard(context.getTelemetryMsgObject(logMsg), LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC, sessionInfo);
176 return null; 176 return null;
177 } 177 }
178 } 178 }
@@ -89,12 +89,12 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -89,12 +89,12 @@ public class LwM2mTransportContextServer extends TransportContext {
89 } 89 }
90 90
91 /** 91 /**
92 - * Sent to Thingsboard Attribute || Telemetry 92 + * send to Thingsboard Attribute || Telemetry
93 * 93 *
94 * @param msg - JsonObject: [{name: value}] 94 * @param msg - JsonObject: [{name: value}]
95 * @return - dummy 95 * @return - dummy
96 */ 96 */
97 - private <T> TransportServiceCallback<Void> getPubAckCallbackSentAttrTelemetry(final T msg) { 97 + private <T> TransportServiceCallback<Void> getPubAckCallbackSendAttrTelemetry(final T msg) {
98 return new TransportServiceCallback<>() { 98 return new TransportServiceCallback<>() {
99 @Override 99 @Override
100 public void onSuccess(Void dummy) { 100 public void onSuccess(Void dummy) {
@@ -108,16 +108,16 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -108,16 +108,16 @@ public class LwM2mTransportContextServer extends TransportContext {
108 }; 108 };
109 } 109 }
110 110
111 - public void sentParametersOnThingsboard(JsonElement msg, String topicName, SessionInfoProto sessionInfo) { 111 + public void sendParametersOnThingsboard(JsonElement msg, String topicName, SessionInfoProto sessionInfo) {
112 try { 112 try {
113 if (topicName.equals(LwM2mTransportHandler.DEVICE_ATTRIBUTES_TOPIC)) { 113 if (topicName.equals(LwM2mTransportHandler.DEVICE_ATTRIBUTES_TOPIC)) {
114 PostAttributeMsg postAttributeMsg = adaptor.convertToPostAttributes(msg); 114 PostAttributeMsg postAttributeMsg = adaptor.convertToPostAttributes(msg);
115 - TransportServiceCallback call = this.getPubAckCallbackSentAttrTelemetry(postAttributeMsg);  
116 - transportService.process(sessionInfo, postAttributeMsg, this.getPubAckCallbackSentAttrTelemetry(call)); 115 + TransportServiceCallback call = this.getPubAckCallbackSendAttrTelemetry(postAttributeMsg);
  116 + transportService.process(sessionInfo, postAttributeMsg, this.getPubAckCallbackSendAttrTelemetry(call));
117 } else if (topicName.equals(LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC)) { 117 } else if (topicName.equals(LwM2mTransportHandler.DEVICE_TELEMETRY_TOPIC)) {
118 PostTelemetryMsg postTelemetryMsg = adaptor.convertToPostTelemetry(msg); 118 PostTelemetryMsg postTelemetryMsg = adaptor.convertToPostTelemetry(msg);
119 - TransportServiceCallback call = this.getPubAckCallbackSentAttrTelemetry(postTelemetryMsg);  
120 - transportService.process(sessionInfo, postTelemetryMsg, this.getPubAckCallbackSentAttrTelemetry(call)); 119 + TransportServiceCallback call = this.getPubAckCallbackSendAttrTelemetry(postTelemetryMsg);
  120 + transportService.process(sessionInfo, postTelemetryMsg, this.getPubAckCallbackSendAttrTelemetry(call));
121 } 121 }
122 } catch (AdaptorException e) { 122 } catch (AdaptorException e) {
123 log.error("[{}] Failed to process publish msg [{}]", topicName, e); 123 log.error("[{}] Failed to process publish msg [{}]", topicName, e);
@@ -242,14 +242,14 @@ public class LwM2mTransportRequest { @@ -242,14 +242,14 @@ public class LwM2mTransportRequest {
242 String msg = String.format("%s: sendRequest Replace: CoapCde - %s Lwm2m code - %d name - %s Resource path - %s value - %s SendRequest to Client", 242 String msg = String.format("%s: sendRequest Replace: CoapCde - %s Lwm2m code - %d name - %s Resource path - %s value - %s SendRequest to Client",
243 LOG_LW2M_INFO, ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(), response.getCode().getName(), request.getPath().toString(), 243 LOG_LW2M_INFO, ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(), response.getCode().getName(), request.getPath().toString(),
244 ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue().toString()); 244 ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue().toString());
245 - serviceImpl.sentLogsToThingsboard(msg, registration); 245 + serviceImpl.sendLogsToThingsboard(msg, registration);
246 log.info("[{}] [{}] - [{}] [{}] Update SendRequest[{}]", registration.getEndpoint(), ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString(), 246 log.info("[{}] [{}] - [{}] [{}] Update SendRequest[{}]", registration.getEndpoint(), ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString(),
247 ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue()); 247 ((LwM2mSingleResource) ((WriteRequest) request).getNode()).getValue());
248 } 248 }
249 } else { 249 } else {
250 String msg = String.format("%s: sendRequest: CoapCode - %s Lwm2m code - %d name - %s Resource path - %s SendRequest to Client", LOG_LW2M_ERROR, 250 String msg = String.format("%s: sendRequest: CoapCode - %s Lwm2m code - %d name - %s Resource path - %s SendRequest to Client", LOG_LW2M_ERROR,
251 ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(), response.getCode().getName(), request.getPath().toString()); 251 ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(), response.getCode().getName(), request.getPath().toString());
252 - serviceImpl.sentLogsToThingsboard(msg, registration); 252 + serviceImpl.sendLogsToThingsboard(msg, registration);
253 log.error("[{}], [{}] - [{}] [{}] error SendRequest", registration.getEndpoint(), ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString()); 253 log.error("[{}], [{}] - [{}] [{}] error SendRequest", registration.getEndpoint(), ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString());
254 } 254 }
255 }, e -> { 255 }, e -> {
@@ -258,7 +258,7 @@ public class LwM2mTransportRequest { @@ -258,7 +258,7 @@ public class LwM2mTransportRequest {
258 } 258 }
259 String msg = String.format("%s: sendRequest: Resource path - %s msg error - %s SendRequest to Client", 259 String msg = String.format("%s: sendRequest: Resource path - %s msg error - %s SendRequest to Client",
260 LOG_LW2M_ERROR, request.getPath().toString(), e.toString()); 260 LOG_LW2M_ERROR, request.getPath().toString(), e.toString());
261 - serviceImpl.sentLogsToThingsboard(msg, registration); 261 + serviceImpl.sendLogsToThingsboard(msg, registration);
262 log.error("[{}] - [{}] error SendRequest", request.getPath().toString(), e.toString()); 262 log.error("[{}] - [{}] error SendRequest", request.getPath().toString(), e.toString());
263 }); 263 });
264 264
@@ -290,7 +290,7 @@ public class LwM2mTransportRequest { @@ -290,7 +290,7 @@ public class LwM2mTransportRequest {
290 String patn = "/" + objectId + "/" + instanceId + "/" + resourceId; 290 String patn = "/" + objectId + "/" + instanceId + "/" + resourceId;
291 String msg = String.format(LOG_LW2M_ERROR + ": NumberFormatException: Resource path - %s type - %s value - %s msg error - %s SendRequest to Client", 291 String msg = String.format(LOG_LW2M_ERROR + ": NumberFormatException: Resource path - %s type - %s value - %s msg error - %s SendRequest to Client",
292 patn, type, value, e.toString()); 292 patn, type, value, e.toString());
293 - serviceImpl.sentLogsToThingsboard(msg, registration); 293 + serviceImpl.sendLogsToThingsboard(msg, registration);
294 log.error("Path: [{}] type: [{}] value: [{}] errorMsg: [{}]]", patn, type, value, e.toString()); 294 log.error("Path: [{}] type: [{}] value: [{}] errorMsg: [{}]]", patn, type, value, e.toString());
295 return null; 295 return null;
296 } 296 }
@@ -162,15 +162,12 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -162,15 +162,12 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
162 if (lwM2MClient != null) { 162 if (lwM2MClient != null) {
163 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration); 163 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
164 if (sessionInfo != null) { 164 if (sessionInfo != null) {
165 - lwM2MClient.setDeviceId(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB()));  
166 - lwM2MClient.setProfileId(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));  
167 - lwM2MClient.setDeviceName(sessionInfo.getDeviceName());  
168 - lwM2MClient.setDeviceProfileName(sessionInfo.getDeviceType()); 165 + this.initLwM2mClient (lwM2MClient, sessionInfo);
169 transportService.registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(this, sessionInfo)); 166 transportService.registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(this, sessionInfo));
170 transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), null); 167 transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), null);
171 transportService.process(sessionInfo, TransportProtos.SubscribeToAttributeUpdatesMsg.newBuilder().build(), null); 168 transportService.process(sessionInfo, TransportProtos.SubscribeToAttributeUpdatesMsg.newBuilder().build(), null);
172 - this.sentLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration);  
173 this.initLwM2mFromClientValue(registration, lwM2MClient); 169 this.initLwM2mFromClientValue(registration, lwM2MClient);
  170 + this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration);
174 } else { 171 } else {
175 log.error("Client: [{}] onRegistered [{}] name [{}] sessionInfo ", registration.getId(), registration.getEndpoint(), null); 172 log.error("Client: [{}] onRegistered [{}] name [{}] sessionInfo ", registration.getId(), registration.getEndpoint(), null);
176 } 173 }
@@ -194,6 +191,11 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -194,6 +191,11 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
194 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration); 191 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
195 if (sessionInfo != null) { 192 if (sessionInfo != null) {
196 this.checkInactivity(sessionInfo); 193 this.checkInactivity(sessionInfo);
  194 + LwM2mClient lwM2MClient = this.lwM2mClientContext.getLwM2MClient(sessionInfo);
  195 + if (lwM2MClient.getDeviceId() == null && lwM2MClient.getProfileId() == null) {
  196 + initLwM2mClient(lwM2MClient, sessionInfo);
  197 + }
  198 +
197 log.info("Client: [{}] updatedReg [{}] name [{}] profile ", registration.getId(), registration.getEndpoint(), sessionInfo.getDeviceType()); 199 log.info("Client: [{}] updatedReg [{}] name [{}] profile ", registration.getId(), registration.getEndpoint(), sessionInfo.getDeviceType());
198 } else { 200 } else {
199 log.error("Client: [{}] updatedReg [{}] name [{}] sessionInfo ", registration.getId(), registration.getEndpoint(), null); 201 log.error("Client: [{}] updatedReg [{}] name [{}] sessionInfo ", registration.getId(), registration.getEndpoint(), null);
@@ -213,7 +215,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -213,7 +215,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
213 executorUnRegistered.submit(() -> { 215 executorUnRegistered.submit(() -> {
214 try { 216 try {
215 this.setCancelObservations(registration); 217 this.setCancelObservations(registration);
216 - this.sentLogsToThingsboard(LOG_LW2M_INFO + ": Client unRegistration", registration); 218 + this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client unRegistration", registration);
217 this.closeClientSession(registration); 219 this.closeClientSession(registration);
218 } catch (Throwable t) { 220 } catch (Throwable t) {
219 log.error("[{}] endpoint [{}] error Unable un registration.", registration.getEndpoint(), t); 221 log.error("[{}] endpoint [{}] error Unable un registration.", registration.getEndpoint(), t);
@@ -221,6 +223,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -221,6 +223,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
221 }); 223 });
222 } 224 }
223 225
  226 + private void initLwM2mClient (LwM2mClient lwM2MClient, SessionInfoProto sessionInfo) {
  227 + lwM2MClient.setDeviceId(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB()));
  228 + lwM2MClient.setProfileId(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));
  229 + lwM2MClient.setDeviceName(sessionInfo.getDeviceName());
  230 + lwM2MClient.setDeviceProfileName(sessionInfo.getDeviceType());
  231 + }
  232 +
224 private void closeClientSession(Registration registration) { 233 private void closeClientSession(Registration registration) {
225 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration); 234 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
226 if (sessionInfo != null) { 235 if (sessionInfo != null) {
@@ -283,7 +292,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -283,7 +292,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
283 } 292 }
284 293
285 /** 294 /**
286 - * Update - sent request in change value resources in Client 295 + * Update - send request in change value resources in Client
287 * Path to resources from profile equal keyName or from ModelObject equal name 296 * Path to resources from profile equal keyName or from ModelObject equal name
288 * Only for resources: isWritable && isPresent as attribute in profile -> LwM2MClientProfile (format: CamelCase) 297 * Only for resources: isWritable && isPresent as attribute in profile -> LwM2MClientProfile (format: CamelCase)
289 * Delete - nothing * 298 * Delete - nothing *
@@ -308,13 +317,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -308,13 +317,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
308 log.error("Resource path - [{}] value - [{}] is not Writable and cannot be updated", pathIdVer, value); 317 log.error("Resource path - [{}] value - [{}] is not Writable and cannot be updated", pathIdVer, value);
309 String logMsg = String.format("%s: attributeUpdate: Resource path - %s value - %s is not Writable and cannot be updated", 318 String logMsg = String.format("%s: attributeUpdate: Resource path - %s value - %s is not Writable and cannot be updated",
310 LOG_LW2M_ERROR, pathIdVer, value); 319 LOG_LW2M_ERROR, pathIdVer, value);
311 - this.sentLogsToThingsboard(logMsg, lwM2MClient.getRegistration()); 320 + this.sendLogsToThingsboard(logMsg, lwM2MClient.getRegistration());
312 } 321 }
313 } else { 322 } else {
314 log.error("Attribute name - [{}] value - [{}] is not present as attribute in profile and cannot be updated", de.getKey(), value); 323 log.error("Attribute name - [{}] value - [{}] is not present as attribute in profile and cannot be updated", de.getKey(), value);
315 String logMsg = String.format("%s: attributeUpdate: attribute name - %s value - %s is not present as attribute in profile and cannot be updated", 324 String logMsg = String.format("%s: attributeUpdate: attribute name - %s value - %s is not present as attribute in profile and cannot be updated",
316 LOG_LW2M_ERROR, de.getKey(), value); 325 LOG_LW2M_ERROR, de.getKey(), value);
317 - this.sentLogsToThingsboard(logMsg, lwM2MClient.getRegistration()); 326 + this.sendLogsToThingsboard(logMsg, lwM2MClient.getRegistration());
318 } 327 }
319 }); 328 });
320 } else if (msg.getSharedDeletedCount() > 0) { 329 } else if (msg.getSharedDeletedCount() > 0) {
@@ -422,7 +431,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -422,7 +431,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
422 * @param msg - text msg 431 * @param msg - text msg
423 * @param registration - Id of Registration LwM2M Client 432 * @param registration - Id of Registration LwM2M Client
424 */ 433 */
425 - public void sentLogsToThingsboard(String msg, Registration registration) { 434 + public void sendLogsToThingsboard(String msg, Registration registration) {
426 if (msg != null) { 435 if (msg != null) {
427 JsonObject telemetries = new JsonObject(); 436 JsonObject telemetries = new JsonObject();
428 telemetries.addProperty(LOG_LW2M_TELEMETRY, msg); 437 telemetries.addProperty(LOG_LW2M_TELEMETRY, msg);
@@ -433,7 +442,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -433,7 +442,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
433 442
434 /** 443 /**
435 * // !!! Ok 444 * // !!! Ok
436 - * Prepare Sent to Thigsboard callback - Attribute or Telemetry 445 + * Prepare send to Thigsboard callback - Attribute or Telemetry
437 * 446 *
438 * @param msg - JsonArray: [{name: value}] 447 * @param msg - JsonArray: [{name: value}]
439 * @param topicName - Api Attribute or Telemetry 448 * @param topicName - Api Attribute or Telemetry
@@ -442,7 +451,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -442,7 +451,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
442 public void updateParametersOnThingsboard(JsonElement msg, String topicName, Registration registration) { 451 public void updateParametersOnThingsboard(JsonElement msg, String topicName, Registration registration) {
443 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration); 452 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
444 if (sessionInfo != null) { 453 if (sessionInfo != null) {
445 - lwM2mTransportContextServer.sentParametersOnThingsboard(msg, topicName, sessionInfo); 454 + lwM2mTransportContextServer.sendParametersOnThingsboard(msg, topicName, sessionInfo);
446 } else { 455 } else {
447 log.error("Client: [{}] updateParametersOnThingsboard [{}] sessionInfo ", registration, null); 456 log.error("Client: [{}] updateParametersOnThingsboard [{}] sessionInfo ", registration, null);
448 } 457 }
@@ -517,7 +526,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -517,7 +526,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
517 } 526 }
518 527
519 /** 528 /**
520 - * Sent Attribute and Telemetry to Thingsboard 529 + * send Attribute and Telemetry to Thingsboard
521 * #1 - get AttrName/TelemetryName with value from LwM2MClient: 530 * #1 - get AttrName/TelemetryName with value from LwM2MClient:
522 * -- resourceId == path from LwM2MClientProfile.postAttributeProfile/postTelemetryProfile/postObserveProfile 531 * -- resourceId == path from LwM2MClientProfile.postAttributeProfile/postTelemetryProfile/postObserveProfile
523 * -- AttrName/TelemetryName == resourceName from ModelObject.objectModel, value from ModelObject.instance.resource(resourceId) 532 * -- AttrName/TelemetryName == resourceName from ModelObject.objectModel, value from ModelObject.instance.resource(resourceId)
@@ -594,17 +603,17 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -594,17 +603,17 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
594 result = JacksonUtil.fromString(lwM2MClientProfile.getPostObserveProfile().toString(), new TypeReference<>() { 603 result = JacksonUtil.fromString(lwM2MClientProfile.getPostObserveProfile().toString(), new TypeReference<>() {
595 }); 604 });
596 } 605 }
597 - Set<String> pathSent = ConcurrentHashMap.newKeySet(); 606 + Set<String> pathSend = ConcurrentHashMap.newKeySet();
598 result.forEach(target -> { 607 result.forEach(target -> {
599 // #1.1 608 // #1.1
600 String[] resPath = target.split("/"); 609 String[] resPath = target.split("/");
601 String instance = "/" + resPath[1] + "/" + resPath[2]; 610 String instance = "/" + resPath[1] + "/" + resPath[2];
602 if (clientInstances != null && clientInstances.size() > 0 && clientInstances.contains(instance)) { 611 if (clientInstances != null && clientInstances.size() > 0 && clientInstances.contains(instance)) {
603 - pathSent.add(target); 612 + pathSend.add(target);
604 } 613 }
605 }); 614 });
606 - lwM2MClient.getPendingRequests().addAll(pathSent);  
607 - pathSent.forEach(target -> lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, ContentFormat.TLV.getName(), 615 + lwM2MClient.getPendingRequests().addAll(pathSend);
  616 + pathSend.forEach(target -> lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, ContentFormat.TLV.getName(),
608 null, null, this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getTimeout())); 617 null, null, this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getTimeout()));
609 if (GET_TYPE_OPER_OBSERVE.equals(typeOper)) { 618 if (GET_TYPE_OPER_OBSERVE.equals(typeOper)) {
610 lwM2MClient.initValue(this, null); 619 lwM2MClient.initValue(this, null);
@@ -745,15 +754,15 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -745,15 +754,15 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
745 * #3.2 Telemetry isChange (add&del) 754 * #3.2 Telemetry isChange (add&del)
746 * #3.3 KeyName isChange (add) 755 * #3.3 KeyName isChange (add)
747 * #4 update 756 * #4 update
748 - * #4.1 add If #3 isChange, then analyze and update Value in Transport form Client and sent Value to thingsboard 757 + * #4.1 add If #3 isChange, then analyze and update Value in Transport form Client and send Value to thingsboard
749 * #4.2 del 758 * #4.2 del
750 * -- if add attributes includes del telemetry - result del for observe 759 * -- if add attributes includes del telemetry - result del for observe
751 * #5 760 * #5
752 * #5.1 Observe isChange (add&del) 761 * #5.1 Observe isChange (add&del)
753 * #5.2 Observe.add 762 * #5.2 Observe.add
754 - * -- path Attr/Telemetry includes newObserve and does not include oldObserve: sent Request observe to Client 763 + * -- path Attr/Telemetry includes newObserve and does not include oldObserve: send Request observe to Client
755 * #5.3 Observe.del 764 * #5.3 Observe.del
756 - * -- different between newObserve and oldObserve: sent Request cancel observe to client 765 + * -- different between newObserve and oldObserve: send Request cancel observe to client
757 * 766 *
758 * @param registrationIds - 767 * @param registrationIds -
759 * @param deviceProfile - 768 * @param deviceProfile -
@@ -778,20 +787,20 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -778,20 +787,20 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
778 JsonObject keyNameNew = lwM2MClientProfileNew.getPostKeyNameProfile(); 787 JsonObject keyNameNew = lwM2MClientProfileNew.getPostKeyNameProfile();
779 788
780 // #3 789 // #3
781 - ResultsAnalyzerParameters sentAttrToThingsboard = new ResultsAnalyzerParameters(); 790 + ResultsAnalyzerParameters sendAttrToThingsboard = new ResultsAnalyzerParameters();
782 // #3.1 791 // #3.1
783 if (!attributeOld.equals(attributeNew)) { 792 if (!attributeOld.equals(attributeNew)) {
784 ResultsAnalyzerParameters postAttributeAnalyzer = this.getAnalyzerParameters(new Gson().fromJson(attributeOld, new TypeToken<Set<String>>() { 793 ResultsAnalyzerParameters postAttributeAnalyzer = this.getAnalyzerParameters(new Gson().fromJson(attributeOld, new TypeToken<Set<String>>() {
785 }.getType()), attributeSetNew); 794 }.getType()), attributeSetNew);
786 - sentAttrToThingsboard.getPathPostParametersAdd().addAll(postAttributeAnalyzer.getPathPostParametersAdd());  
787 - sentAttrToThingsboard.getPathPostParametersDel().addAll(postAttributeAnalyzer.getPathPostParametersDel()); 795 + sendAttrToThingsboard.getPathPostParametersAdd().addAll(postAttributeAnalyzer.getPathPostParametersAdd());
  796 + sendAttrToThingsboard.getPathPostParametersDel().addAll(postAttributeAnalyzer.getPathPostParametersDel());
788 } 797 }
789 // #3.2 798 // #3.2
790 if (!telemetryOld.equals(telemetryNew)) { 799 if (!telemetryOld.equals(telemetryNew)) {
791 ResultsAnalyzerParameters postTelemetryAnalyzer = this.getAnalyzerParameters(new Gson().fromJson(telemetryOld, new TypeToken<Set<String>>() { 800 ResultsAnalyzerParameters postTelemetryAnalyzer = this.getAnalyzerParameters(new Gson().fromJson(telemetryOld, new TypeToken<Set<String>>() {
792 }.getType()), telemetrySetNew); 801 }.getType()), telemetrySetNew);
793 - sentAttrToThingsboard.getPathPostParametersAdd().addAll(postTelemetryAnalyzer.getPathPostParametersAdd());  
794 - sentAttrToThingsboard.getPathPostParametersDel().addAll(postTelemetryAnalyzer.getPathPostParametersDel()); 802 + sendAttrToThingsboard.getPathPostParametersAdd().addAll(postTelemetryAnalyzer.getPathPostParametersAdd());
  803 + sendAttrToThingsboard.getPathPostParametersDel().addAll(postTelemetryAnalyzer.getPathPostParametersDel());
795 } 804 }
796 // #3.3 805 // #3.3
797 if (!keyNameOld.equals(keyNameNew)) { 806 if (!keyNameOld.equals(keyNameNew)) {
@@ -799,24 +808,24 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -799,24 +808,24 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
799 }.getType()), 808 }.getType()),
800 new Gson().fromJson(keyNameNew.toString(), new TypeToken<ConcurrentHashMap<String, String>>() { 809 new Gson().fromJson(keyNameNew.toString(), new TypeToken<ConcurrentHashMap<String, String>>() {
801 }.getType())); 810 }.getType()));
802 - sentAttrToThingsboard.getPathPostParametersAdd().addAll(keyNameChange.getPathPostParametersAdd()); 811 + sendAttrToThingsboard.getPathPostParametersAdd().addAll(keyNameChange.getPathPostParametersAdd());
803 } 812 }
804 813
805 // #4.1 add 814 // #4.1 add
806 - if (sentAttrToThingsboard.getPathPostParametersAdd().size() > 0) { 815 + if (sendAttrToThingsboard.getPathPostParametersAdd().size() > 0) {
807 // update value in Resources 816 // update value in Resources
808 registrationIds.forEach(registrationId -> { 817 registrationIds.forEach(registrationId -> {
809 // LeshanServer lwServer = leshanServer; 818 // LeshanServer lwServer = leshanServer;
810 Registration registration = lwM2mClientContext.getRegistration(registrationId); 819 Registration registration = lwM2mClientContext.getRegistration(registrationId);
811 - this.readResourceValueObserve(registration, sentAttrToThingsboard.getPathPostParametersAdd(), GET_TYPE_OPER_READ);  
812 - // sent attr/telemetry to tingsboard for new path  
813 - this.updateAttrTelemetry(registration, sentAttrToThingsboard.getPathPostParametersAdd()); 820 + this.readResourceValueObserve(registration, sendAttrToThingsboard.getPathPostParametersAdd(), GET_TYPE_OPER_READ);
  821 + // send attr/telemetry to tingsboard for new path
  822 + this.updateAttrTelemetry(registration, sendAttrToThingsboard.getPathPostParametersAdd());
814 }); 823 });
815 } 824 }
816 // #4.2 del 825 // #4.2 del
817 - if (sentAttrToThingsboard.getPathPostParametersDel().size() > 0) {  
818 - ResultsAnalyzerParameters sentAttrToThingsboardDel = this.getAnalyzerParameters(sentAttrToThingsboard.getPathPostParametersAdd(), sentAttrToThingsboard.getPathPostParametersDel());  
819 - sentAttrToThingsboard.setPathPostParametersDel(sentAttrToThingsboardDel.getPathPostParametersDel()); 826 + if (sendAttrToThingsboard.getPathPostParametersDel().size() > 0) {
  827 + ResultsAnalyzerParameters sendAttrToThingsboardDel = this.getAnalyzerParameters(sendAttrToThingsboard.getPathPostParametersAdd(), sendAttrToThingsboard.getPathPostParametersDel());
  828 + sendAttrToThingsboard.setPathPostParametersDel(sendAttrToThingsboardDel.getPathPostParametersDel());
820 } 829 }
821 830
822 // #5.1 831 // #5.1
@@ -826,17 +835,17 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -826,17 +835,17 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
826 //#5.2 add 835 //#5.2 add
827 // path Attr/Telemetry includes newObserve 836 // path Attr/Telemetry includes newObserve
828 attributeSetOld.addAll(telemetrySetOld); 837 attributeSetOld.addAll(telemetrySetOld);
829 - ResultsAnalyzerParameters sentObserveToClientOld = this.getAnalyzerParametersIn(attributeSetOld, observeSetOld); // add observe 838 + ResultsAnalyzerParameters sendObserveToClientOld = this.getAnalyzerParametersIn(attributeSetOld, observeSetOld); // add observe
830 attributeSetNew.addAll(telemetrySetNew); 839 attributeSetNew.addAll(telemetrySetNew);
831 - ResultsAnalyzerParameters sentObserveToClientNew = this.getAnalyzerParametersIn(attributeSetNew, observeSetNew); // add observe 840 + ResultsAnalyzerParameters sendObserveToClientNew = this.getAnalyzerParametersIn(attributeSetNew, observeSetNew); // add observe
832 // does not include oldObserve 841 // does not include oldObserve
833 - ResultsAnalyzerParameters postObserveAnalyzer = this.getAnalyzerParameters(sentObserveToClientOld.getPathPostParametersAdd(), sentObserveToClientNew.getPathPostParametersAdd());  
834 - // sent Request observe to Client 842 + ResultsAnalyzerParameters postObserveAnalyzer = this.getAnalyzerParameters(sendObserveToClientOld.getPathPostParametersAdd(), sendObserveToClientNew.getPathPostParametersAdd());
  843 + // send Request observe to Client
835 registrationIds.forEach(registrationId -> { 844 registrationIds.forEach(registrationId -> {
836 Registration registration = lwM2mClientContext.getRegistration(registrationId); 845 Registration registration = lwM2mClientContext.getRegistration(registrationId);
837 this.readResourceValueObserve(registration, postObserveAnalyzer.getPathPostParametersAdd(), GET_TYPE_OPER_OBSERVE); 846 this.readResourceValueObserve(registration, postObserveAnalyzer.getPathPostParametersAdd(), GET_TYPE_OPER_OBSERVE);
838 // 5.3 del 847 // 5.3 del
839 - // sent Request cancel observe to Client 848 + // send Request cancel observe to Client
840 this.cancelObserveIsValue(registration, postObserveAnalyzer.getPathPostParametersDel()); 849 this.cancelObserveIsValue(registration, postObserveAnalyzer.getPathPostParametersDel());
841 }); 850 });
842 } 851 }
@@ -877,7 +886,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -877,7 +886,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
877 886
878 /** 887 /**
879 * Update Resource value after change RezAttrTelemetry in config Profile 888 * Update Resource value after change RezAttrTelemetry in config Profile
880 - * sent response Read to Client and add path to pathResAttrTelemetry in LwM2MClient.getAttrTelemetryObserveValue() 889 + * send response Read to Client and add path to pathResAttrTelemetry in LwM2MClient.getAttrTelemetryObserveValue()
881 * 890 *
882 * @param registration - Registration LwM2M Client 891 * @param registration - Registration LwM2M Client
883 * @param targets - path Resources == [ "/2/0/0", "/2/0/1"] 892 * @param targets - path Resources == [ "/2/0/0", "/2/0/1"]
@@ -967,7 +976,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -967,7 +976,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
967 * #1 Get path resource by result attributesResponse 976 * #1 Get path resource by result attributesResponse
968 * #1.1 If two names have equal path => last time attribute 977 * #1.1 If two names have equal path => last time attribute
969 * #2.1 if there is a difference in values between the current resource values and the shared attribute values 978 * #2.1 if there is a difference in values between the current resource values and the shared attribute values
970 - * => sent to client Request Update of value (new value from shared attribute) 979 + * => send to client Request Update of value (new value from shared attribute)
971 * and LwM2MClient.delayedRequests.add(path) 980 * and LwM2MClient.delayedRequests.add(path)
972 * #2.1 if there is not a difference in values between the current resource values and the shared attribute values 981 * #2.1 if there is not a difference in values between the current resource values and the shared attribute values
973 * 982 *
@@ -36,6 +36,7 @@ import static org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode.NO @@ -36,6 +36,7 @@ import static org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode.NO
36 @Service 36 @Service
37 @TbLwM2mTransportComponent 37 @TbLwM2mTransportComponent
38 public class LwM2mClientContextImpl implements LwM2mClientContext { 38 public class LwM2mClientContextImpl implements LwM2mClientContext {
  39 +
39 private static final boolean INFOS_ARE_COMPROMISED = false; 40 private static final boolean INFOS_ARE_COMPROMISED = false;
40 41
41 private final Map<String /** registrationId */, LwM2mClient> lwM2mClients = new ConcurrentHashMap<>(); 42 private final Map<String /** registrationId */, LwM2mClient> lwM2mClients = new ConcurrentHashMap<>();
@@ -51,10 +52,10 @@ public class LwM2mClientContextImpl implements LwM2mClientContext { @@ -51,10 +52,10 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
51 } 52 }
52 53
53 public void delRemoveSessionAndListener(String registrationId) { 54 public void delRemoveSessionAndListener(String registrationId) {
54 - LwM2mClient lwM2MClient = lwM2mClients.get(registrationId); 55 + LwM2mClient lwM2MClient = this.lwM2mClients.get(registrationId);
55 if (lwM2MClient != null) { 56 if (lwM2MClient != null) {
56 - securityStore.remove(lwM2MClient.getEndpoint(), INFOS_ARE_COMPROMISED);  
57 - lwM2mClients.remove(registrationId); 57 + this.securityStore.remove(lwM2MClient.getEndpoint(), INFOS_ARE_COMPROMISED);
  58 + this.lwM2mClients.remove(registrationId);
58 } 59 }
59 } 60 }
60 61
@@ -94,7 +94,7 @@ public class TbLwM2mStoreConfiguration { @@ -94,7 +94,7 @@ public class TbLwM2mStoreConfiguration {
94 SecurityInfo securityInfo = securityStore.getByEndpoint(endPoint); 94 SecurityInfo securityInfo = securityStore.getByEndpoint(endPoint);
95 if (securityInfo == null) { 95 if (securityInfo == null) {
96 LwM2mClient lwM2mClient = clientContext.getLwM2MClient(endPoint, null); 96 LwM2mClient lwM2mClient = clientContext.getLwM2MClient(endPoint, null);
97 - if (lwM2mClient != null && !lwM2mClient.getRegistration().getIdentity().isSecure()){ 97 + if (lwM2mClient != null && lwM2mClient.getRegistration() != null && !lwM2mClient.getRegistration().getIdentity().isSecure()){
98 return null; 98 return null;
99 } 99 }
100 securityInfo = clientContext.addLwM2mClientToSession(endPoint).getSecurityInfo(); 100 securityInfo = clientContext.addLwM2mClientToSession(endPoint).getSecurityInfo();
@@ -18,7 +18,6 @@ package org.thingsboard.server.common.transport.lwm2m; @@ -18,7 +18,6 @@ package org.thingsboard.server.common.transport.lwm2m;
18 import lombok.Getter; 18 import lombok.Getter;
19 import lombok.Setter; 19 import lombok.Setter;
20 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
21 -import org.eclipse.leshan.core.model.ObjectModel;  
22 import org.eclipse.leshan.core.model.ResourceModel; 21 import org.eclipse.leshan.core.model.ResourceModel;
23 import org.eclipse.leshan.core.node.LwM2mPath; 22 import org.eclipse.leshan.core.node.LwM2mPath;
24 import org.eclipse.leshan.server.model.LwM2mModelProvider; 23 import org.eclipse.leshan.server.model.LwM2mModelProvider;
@@ -38,7 +37,6 @@ import java.security.KeyStore; @@ -38,7 +37,6 @@ import java.security.KeyStore;
38 import java.security.KeyStoreException; 37 import java.security.KeyStoreException;
39 import java.security.NoSuchAlgorithmException; 38 import java.security.NoSuchAlgorithmException;
40 import java.security.cert.CertificateException; 39 import java.security.cert.CertificateException;
41 -import java.util.List;  
42 40
43 @Slf4j 41 @Slf4j
44 @Component 42 @Component
@@ -46,9 +44,6 @@ import java.util.List; @@ -46,9 +44,6 @@ import java.util.List;
46 public class LwM2MTransportConfigServer { 44 public class LwM2MTransportConfigServer {
47 45
48 @Getter 46 @Getter
49 - private String MODEL_PATH_DEFAULT = "models";  
50 -  
51 - @Getter  
52 private String KEY_STORE_DEFAULT_RESOURCE_PATH = "credentials"; 47 private String KEY_STORE_DEFAULT_RESOURCE_PATH = "credentials";
53 48
54 @Getter 49 @Getter
@@ -81,10 +76,6 @@ public class LwM2MTransportConfigServer { @@ -81,10 +76,6 @@ public class LwM2MTransportConfigServer {
81 76
82 @Getter 77 @Getter
83 @Setter 78 @Setter
84 - private List<ObjectModel> modelsValueCommon;  
85 -  
86 - @Getter  
87 - @Setter  
88 private LwM2mModelProvider modelProvider; 79 private LwM2mModelProvider modelProvider;
89 80
90 @Getter 81 @Getter
@@ -96,10 +87,6 @@ public class LwM2MTransportConfigServer { @@ -96,10 +87,6 @@ public class LwM2MTransportConfigServer {
96 private long sessionReportTimeout; 87 private long sessionReportTimeout;
97 88
98 @Getter 89 @Getter
99 - @Value("${transport.lwm2m.model_path_file:}")  
100 - private String modelPathFile;  
101 -  
102 - @Getter  
103 @Value("${transport.lwm2m.recommended_ciphers:}") 90 @Value("${transport.lwm2m.recommended_ciphers:}")
104 private boolean recommendedCiphers; 91 private boolean recommendedCiphers;
105 92
@@ -236,15 +223,9 @@ public class LwM2MTransportConfigServer { @@ -236,15 +223,9 @@ public class LwM2MTransportConfigServer {
236 public ResourceModel getResourceModel(Registration registration, LwM2mPath pathIds) { 223 public ResourceModel getResourceModel(Registration registration, LwM2mPath pathIds) {
237 return this.modelProvider.getObjectModel(registration).getResourceModel(pathIds.getObjectId(), pathIds.getResourceId()); 224 return this.modelProvider.getObjectModel(registration).getResourceModel(pathIds.getObjectId(), pathIds.getResourceId());
238 } 225 }
239 - 226 +
240 public ResourceModel.Type getResourceModelType(Registration registration, LwM2mPath pathIds) { 227 public ResourceModel.Type getResourceModelType(Registration registration, LwM2mPath pathIds) {
241 ResourceModel resource = this.getResourceModel(registration, pathIds); 228 ResourceModel resource = this.getResourceModel(registration, pathIds);
242 return (resource == null) ? null : resource.type; 229 return (resource == null) ? null : resource.type;
243 } 230 }
244 -  
245 - public ResourceModel.Operations getOperation(Registration registration, LwM2mPath pathIds) {  
246 - ResourceModel resource = this.getResourceModel(registration, pathIds);  
247 - return (resource == null) ? ResourceModel.Operations.NONE : resource.operations;  
248 - }  
249 -  
250 } 231 }
@@ -127,8 +127,6 @@ transport: @@ -127,8 +127,6 @@ transport:
127 # send a Confirmable message to the time when an acknowledgement is no longer expected. 127 # send a Confirmable message to the time when an acknowledgement is no longer expected.
128 # DEFAULT_TIMEOUT = 2 * 60 * 1000l; 2 min in ms 128 # DEFAULT_TIMEOUT = 2 * 60 * 1000l; 2 min in ms
129 timeout: "${LWM2M_TIMEOUT:120000}" 129 timeout: "${LWM2M_TIMEOUT:120000}"
130 - # model_path_file: "${LWM2M_MODEL_PATH_FILE:./common/transport/lwm2m/src/main/resources/models/}"  
131 - model_path_file: "${LWM2M_MODEL_PATH_FILE:}"  
132 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}" 130 recommended_ciphers: "${LWM2M_RECOMMENDED_CIPHERS:false}"
133 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}" 131 recommended_supported_groups: "${LWM2M_RECOMMENDED_SUPPORTED_GROUPS:true}"
134 request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}" 132 request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}"
@@ -142,7 +140,7 @@ transport: @@ -142,7 +140,7 @@ transport:
142 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh 140 # Create new X509 Certificates: common/transport/lwm2m/src/main/resources/credentials/shell/lwM2M_credentials.sh
143 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}" 141 key_store_type: "${LWM2M_KEYSTORE_TYPE:JKS}"
144 # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}" 142 # key_store_type: "${LWM2M_KEYSTORE_TYPE:PKCS12}"
145 - # key_store_path_file: "${KEY_STORE_PATH_FILE:/usr/share/thingsboard/conf/credentials/serverKeyStore.jks}" 143 + # key_store_path_file: "${KEY_STORE_PATH_FILE:/transport/lwm2m/src/main/data/credentials/serverKeyStore.jks}"
146 key_store_path_file: "${KEY_STORE_PATH_FILE:}" 144 key_store_path_file: "${KEY_STORE_PATH_FILE:}"
147 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}" 145 key_store_password: "${LWM2M_KEYSTORE_PASSWORD_SERVER:server_ks_password}"
148 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}" 146 root_alias: "${LWM2M_SERVER_ROOT_CA:rootca}"