Commit 367be12455f4545b27be16dcef27355c94e49904
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
Showing
11 changed files
with
71 additions
and
260 deletions
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}" |