Commit 54543ae4b51078ed6cb8ff33b8da45d02904bd69

Authored by Andrii Shvaika
1 parent 8b3e34f0

Merge improvements from outdated PR 4527

@@ -674,6 +674,7 @@ transport: @@ -674,6 +674,7 @@ transport:
674 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}" 674 registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}"
675 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}" 675 update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}"
676 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}" 676 un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}"
  677 + log_max_length: "${LWM2M_LOG_MAX_LENGTH:100}"
677 # Use redis for Security and Registration stores 678 # Use redis for Security and Registration stores
678 redis.enabled: "${LWM2M_REDIS_ENABLED:false}" 679 redis.enabled: "${LWM2M_REDIS_ENABLED:false}"
679 snmp: 680 snmp:
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.lwm2m.client;
  17 +
  18 +import lombok.Data;
  19 +
  20 +import java.util.UUID;
  21 +
  22 +@Data
  23 +public class LwM2mSoftwareUpdate {
  24 + private volatile String clientSwVersion;
  25 + private volatile String currentSwVersion;
  26 + private volatile UUID currentSwId;
  27 +}
@@ -29,6 +29,7 @@ import java.io.File; @@ -29,6 +29,7 @@ import java.io.File;
29 import java.io.FileInputStream; 29 import java.io.FileInputStream;
30 import java.io.IOException; 30 import java.io.IOException;
31 import java.io.InputStream; 31 import java.io.InputStream;
  32 +import java.net.URI;
32 import java.nio.file.Path; 33 import java.nio.file.Path;
33 import java.nio.file.Paths; 34 import java.nio.file.Paths;
34 import java.security.KeyStore; 35 import java.security.KeyStore;
@@ -136,18 +137,26 @@ public class LwM2MTransportServerConfig implements LwM2MSecureServerConfig { @@ -136,18 +137,26 @@ public class LwM2MTransportServerConfig implements LwM2MSecureServerConfig {
136 @Getter 137 @Getter
137 @Value("${transport.lwm2m.server.security.alias:}") 138 @Value("${transport.lwm2m.server.security.alias:}")
138 private String certificateAlias; 139 private String certificateAlias;
139 -  
140 - 140 +
  141 + @Getter
  142 + @Value("${transport.lwm2m.log_max_length:}")
  143 + private int logMaxLength;
  144 +
  145 +
141 @PostConstruct 146 @PostConstruct
142 public void init() { 147 public void init() {
  148 + URI uri = null;
143 try { 149 try {
144 - File keyStoreFile = new File(Resources.getResource(keyStorePathFile).toURI()); 150 + uri = Resources.getResource(keyStorePathFile).toURI();
  151 + log.error("URI: {}", uri);
  152 + File keyStoreFile = new File(uri);
145 InputStream inKeyStore = new FileInputStream(keyStoreFile); 153 InputStream inKeyStore = new FileInputStream(keyStoreFile);
146 keyStoreValue = KeyStore.getInstance(keyStoreType); 154 keyStoreValue = KeyStore.getInstance(keyStoreType);
147 keyStoreValue.load(inKeyStore, keyStorePassword == null ? null : keyStorePassword.toCharArray()); 155 keyStoreValue.load(inKeyStore, keyStorePassword == null ? null : keyStorePassword.toCharArray());
148 } catch (Exception e) { 156 } catch (Exception e) {
149 log.error("Unable to lookup LwM2M keystore. Reason: " + e.getMessage(), e); 157 log.error("Unable to lookup LwM2M keystore. Reason: " + e.getMessage(), e);
150 - throw new RuntimeException("Failed to lookup LwM2M keystore", e); 158 +// Absence of the key store should not block user from using plain LwM2M
  159 +// throw new RuntimeException("Failed to lookup LwM2M keystore: " + (uri != null ? uri.toString() : ""), e);
151 } 160 }
152 } 161 }
153 } 162 }
@@ -87,6 +87,7 @@ import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPA @@ -87,6 +87,7 @@ import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPA
87 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH; 87 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH;
88 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.CLIENT_NOT_AUTHORIZED; 88 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.CLIENT_NOT_AUTHORIZED;
89 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.DEVICE_ATTRIBUTES_REQUEST; 89 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.DEVICE_ATTRIBUTES_REQUEST;
  90 +import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.FR_OBJECT_ID;
90 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.FR_PATH_RESOURCE_VER_ID; 91 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.FR_PATH_RESOURCE_VER_ID;
91 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LOG_LW2M_ERROR; 92 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LOG_LW2M_ERROR;
92 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LOG_LW2M_INFO; 93 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LOG_LW2M_INFO;
@@ -1420,9 +1421,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler @@ -1420,9 +1421,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
1420 int chunkSize = 0; 1421 int chunkSize = 0;
1421 int chunk = 0; 1422 int chunk = 0;
1422 byte[] firmwareChunk = firmwareDataCache.get(lwM2MClient.getFrUpdate().getCurrentFwId().toString(), chunkSize, chunk); 1423 byte[] firmwareChunk = firmwareDataCache.get(lwM2MClient.getFrUpdate().getCurrentFwId().toString(), chunkSize, chunk);
1423 - Integer objectId = 5;  
1424 - String verSupportedObject = lwM2MClient.getRegistration().getSupportedObject().get(objectId);  
1425 - String targetIdVer = LWM2M_SEPARATOR_PATH + objectId + LWM2M_SEPARATOR_KEY + verSupportedObject + LWM2M_SEPARATOR_PATH + 0 + LWM2M_SEPARATOR_PATH + 0; 1424 + String verSupportedObject = lwM2MClient.getRegistration().getSupportedObject().get(FR_OBJECT_ID);
  1425 + String targetIdVer = LWM2M_SEPARATOR_PATH + FR_OBJECT_ID + LWM2M_SEPARATOR_KEY + verSupportedObject + LWM2M_SEPARATOR_PATH + 0 + LWM2M_SEPARATOR_PATH + 0;
1426 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(), 1426 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(),
1427 firmwareChunk, config.getTimeout(), null); 1427 firmwareChunk, config.getTimeout(), null);
1428 log.warn("updateFirmwareClient [{}] [{}]", lwM2MClient.getFrUpdate().getCurrentFwVersion(), lwM2MClient.getFrUpdate().getClientFwVersion()); 1428 log.warn("updateFirmwareClient [{}] [{}]", lwM2MClient.getFrUpdate().getCurrentFwVersion(), lwM2MClient.getFrUpdate().getClientFwVersion());
@@ -117,29 +117,29 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -117,29 +117,29 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
117 builder.setLocalAddress(config.getHost(), serverPortNoSec); 117 builder.setLocalAddress(config.getHost(), serverPortNoSec);
118 builder.setLocalSecureAddress(config.getSecureHost(), serverSecurePort); 118 builder.setLocalSecureAddress(config.getSecureHost(), serverSecurePort);
119 builder.setDecoder(new DefaultLwM2mNodeDecoder()); 119 builder.setDecoder(new DefaultLwM2mNodeDecoder());
120 - /** Use a magic converter to support bad type send by the UI. */ 120 + /* Use a magic converter to support bad type send by the UI. */
121 builder.setEncoder(new DefaultLwM2mNodeEncoder(LwM2mValueConverterImpl.getInstance())); 121 builder.setEncoder(new DefaultLwM2mNodeEncoder(LwM2mValueConverterImpl.getInstance()));
122 122
123 123
124 - /** Create CoAP Config */ 124 + /* Create CoAP Config */
125 NetworkConfig networkConfig = getCoapConfig(serverPortNoSec, serverSecurePort); 125 NetworkConfig networkConfig = getCoapConfig(serverPortNoSec, serverSecurePort);
126 BlockwiseLayer blockwiseLayer = new BlockwiseLayer(networkConfig); 126 BlockwiseLayer blockwiseLayer = new BlockwiseLayer(networkConfig);
127 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort)); 127 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
128 128
129 - /** Define model provider (Create Models )*/ 129 + /* Define model provider (Create Models )*/
130 LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.lwM2mClientContext, this.helper, this.context); 130 LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.lwM2mClientContext, this.helper, this.context);
131 config.setModelProvider(modelProvider); 131 config.setModelProvider(modelProvider);
132 builder.setObjectModelProvider(modelProvider); 132 builder.setObjectModelProvider(modelProvider);
133 133
134 - /** Create credentials */ 134 + /* Create credentials */
135 this.setServerWithCredentials(builder); 135 this.setServerWithCredentials(builder);
136 136
137 - /** Set securityStore with new registrationStore */ 137 + /* Set securityStore with new registrationStore */
138 builder.setSecurityStore(securityStore); 138 builder.setSecurityStore(securityStore);
139 builder.setRegistrationStore(registrationStore); 139 builder.setRegistrationStore(registrationStore);
140 140
141 141
142 - /** Create DTLS Config */ 142 + /* Create DTLS Config */
143 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder(); 143 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
144 dtlsConfig.setServerOnly(true); 144 dtlsConfig.setServerOnly(true);
145 dtlsConfig.setRecommendedSupportedGroupsOnly(config.isRecommendedSupportedGroups()); 145 dtlsConfig.setRecommendedSupportedGroupsOnly(config.isRecommendedSupportedGroups());
@@ -156,10 +156,10 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -156,10 +156,10 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
156 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256); 156 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256);
157 } 157 }
158 158
159 - /** Set DTLS Config */ 159 + /* Set DTLS Config */
160 builder.setDtlsConfig(dtlsConfig); 160 builder.setDtlsConfig(dtlsConfig);
161 161
162 - /** Create LWM2M server */ 162 + /* Create LWM2M server */
163 return builder.build(); 163 return builder.build();
164 } 164 }
165 165
@@ -173,10 +173,10 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -173,10 +173,10 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
173 trustedCertificates[0] = rootCAX509Cert; 173 trustedCertificates[0] = rootCAX509Cert;
174 builder.setTrustedCertificates(trustedCertificates); 174 builder.setTrustedCertificates(trustedCertificates);
175 } else { 175 } else {
176 - /** by default trust all */ 176 + /* by default trust all */
177 builder.setTrustedCertificates(new X509Certificate[0]); 177 builder.setTrustedCertificates(new X509Certificate[0]);
178 } 178 }
179 - /** Set securityStore with registrationStore*/ 179 + /* Set securityStore with registrationStore*/
180 builder.setAuthorizer(new DefaultAuthorizer(securityStore, new SecurityChecker() { 180 builder.setAuthorizer(new DefaultAuthorizer(securityStore, new SecurityChecker() {
181 @Override 181 @Override
182 protected boolean matchX509Identity(String endpoint, String receivedX509CommonName, 182 protected boolean matchX509Identity(String endpoint, String receivedX509CommonName,
@@ -189,7 +189,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -189,7 +189,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
189 this.infoPramsUri("RPK"); 189 this.infoPramsUri("RPK");
190 this.infoParamsServerKey(this.publicKey, this.privateKey); 190 this.infoParamsServerKey(this.publicKey, this.privateKey);
191 } else { 191 } else {
192 - /** by default trust all */ 192 + /* by default trust all */
193 builder.setTrustedCertificates(new X509Certificate[0]); 193 builder.setTrustedCertificates(new X509Certificate[0]);
194 log.info("Unable to load X509 files for LWM2MServer"); 194 log.info("Unable to load X509 files for LWM2MServer");
195 this.pskMode = true; 195 this.pskMode = true;
@@ -256,7 +256,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -256,7 +256,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
256 } 256 }
257 257
258 private void generateKeyForRPK() throws NoSuchAlgorithmException, InvalidParameterSpecException, InvalidKeySpecException { 258 private void generateKeyForRPK() throws NoSuchAlgorithmException, InvalidParameterSpecException, InvalidKeySpecException {
259 - /** Get Elliptic Curve Parameter spec for secp256r1 */ 259 + /* Get Elliptic Curve Parameter spec for secp256r1 */
260 AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC"); 260 AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC");
261 algoParameters.init(new ECGenParameterSpec("secp256r1")); 261 algoParameters.init(new ECGenParameterSpec("secp256r1"));
262 ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class); 262 ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class);
@@ -280,17 +280,17 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @@ -280,17 +280,17 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
280 } 280 }
281 281
282 private void infoParamsServerKey(PublicKey publicKey, PrivateKey privateKey) { 282 private void infoParamsServerKey(PublicKey publicKey, PrivateKey privateKey) {
283 - /** Get x coordinate */ 283 + /* Get x coordinate */
284 byte[] x = ((ECPublicKey) publicKey).getW().getAffineX().toByteArray(); 284 byte[] x = ((ECPublicKey) publicKey).getW().getAffineX().toByteArray();
285 if (x[0] == 0) 285 if (x[0] == 0)
286 x = Arrays.copyOfRange(x, 1, x.length); 286 x = Arrays.copyOfRange(x, 1, x.length);
287 287
288 - /** Get Y coordinate */ 288 + /* Get Y coordinate */
289 byte[] y = ((ECPublicKey) publicKey).getW().getAffineY().toByteArray(); 289 byte[] y = ((ECPublicKey) publicKey).getW().getAffineY().toByteArray();
290 if (y[0] == 0) 290 if (y[0] == 0)
291 y = Arrays.copyOfRange(y, 1, y.length); 291 y = Arrays.copyOfRange(y, 1, y.length);
292 292
293 - /** Get Curves params */ 293 + /* Get Curves params */
294 String params = ((ECPublicKey) publicKey).getParams().toString(); 294 String params = ((ECPublicKey) publicKey).getParams().toString();
295 String privHex = Hex.encodeHexString(privateKey.getEncoded()); 295 String privHex = Hex.encodeHexString(privateKey.getEncoded());
296 log.info(" \n- Public Key (Hex): [{}] \n" + 296 log.info(" \n- Public Key (Hex): [{}] \n" +
@@ -23,73 +23,72 @@ public class LwM2mNetworkConfig { @@ -23,73 +23,72 @@ public class LwM2mNetworkConfig {
23 NetworkConfig coapConfig = new NetworkConfig(); 23 NetworkConfig coapConfig = new NetworkConfig();
24 coapConfig.setInt(NetworkConfig.Keys.COAP_PORT,serverPortNoSec); 24 coapConfig.setInt(NetworkConfig.Keys.COAP_PORT,serverPortNoSec);
25 coapConfig.setInt(NetworkConfig.Keys.COAP_SECURE_PORT,serverSecurePort); 25 coapConfig.setInt(NetworkConfig.Keys.COAP_SECURE_PORT,serverSecurePort);
26 - /**  
27 - * Example:Property for large packet:  
28 - * #NetworkConfig config = new NetworkConfig();  
29 - * #config.setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE,32);  
30 - * #config.setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE,32);  
31 - * #config.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE,2048);  
32 - * #config.setInt(NetworkConfig.Keys.MAX_RETRANSMIT,3);  
33 - * #config.setInt(NetworkConfig.Keys.MAX_TRANSMIT_WAIT,120000); 26 + /*
  27 + Example:Property for large packet:
  28 + #NetworkConfig config = new NetworkConfig();
  29 + #config.setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE,32);
  30 + #config.setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE,32);
  31 + #config.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE,2048);
  32 + #config.setInt(NetworkConfig.Keys.MAX_RETRANSMIT,3);
  33 + #config.setInt(NetworkConfig.Keys.MAX_TRANSMIT_WAIT,120000);
34 */ 34 */
35 35
36 - /**  
37 - * Property to indicate if the response should always include the Block2 option \  
38 - * when client request early blockwise negociation but the response can be sent on one packet.  
39 - * - value of false indicate that the server will respond without block2 option if no further blocks are required.  
40 - * - value of true indicate that the server will response with block2 option event if no further blocks are required.  
41 - * CoAP client will try to use block mode  
42 - * or adapt the block size when receiving a 4.13 Entity too large response code 36 + /*
  37 + Property to indicate if the response should always include the Block2 option \
  38 + when client request early blockwise negociation but the response can be sent on one packet.
  39 + - value of false indicate that the server will respond without block2 option if no further blocks are required.
  40 + - value of true indicate that the server will response with block2 option event if no further blocks are required.
  41 + CoAP client will try to use block mode
  42 + or adapt the block size when receiving a 4.13 Entity too large response code
43 */ 43 */
44 coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_STRICT_BLOCK2_OPTION, true); 44 coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_STRICT_BLOCK2_OPTION, true);
45 - /***  
46 - * Property to indicate if the response should always include the Block2 option \  
47 - * when client request early blockwise negociation but the response can be sent on one packet.  
48 - * - value of false indicate that the server will respond without block2 option if no further blocks are required.  
49 - * - value of true indicate that the server will response with block2 option event if no further blocks are required. 45 + /*
  46 + Property to indicate if the response should always include the Block2 option \
  47 + when client request early blockwise negociation but the response can be sent on one packet.
  48 + - value of false indicate that the server will respond without block2 option if no further blocks are required.
  49 + - value of true indicate that the server will response with block2 option event if no further blocks are required.
50 */ 50 */
51 coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER, true); 51 coapConfig.setBoolean(NetworkConfig.Keys.BLOCKWISE_ENTITY_TOO_LARGE_AUTO_FAILOVER, true);
52 52
53 coapConfig.setInt(NetworkConfig.Keys.BLOCKWISE_STATUS_LIFETIME, 300000); 53 coapConfig.setInt(NetworkConfig.Keys.BLOCKWISE_STATUS_LIFETIME, 300000);
54 - /**  
55 - * !!! REQUEST_ENTITY_TOO_LARGE CODE=4.13  
56 - * The maximum size of a resource body (in bytes) that will be accepted  
57 - * as the payload of a POST/PUT or the response to a GET request in a  
58 - * transparent> blockwise transfer.  
59 - * This option serves as a safeguard against excessive memory  
60 - * consumption when many resources contain large bodies that cannot be  
61 - * transferred in a single CoAP message. This option has no impact on  
62 - * *manually* managed blockwise transfers in which the blocks are handled individually.  
63 - * Note that this option does not prevent local clients or resource  
64 - * implementations from sending large bodies as part of a request or response to a peer.  
65 - * The default value of this property is DEFAULT_MAX_RESOURCE_BODY_SIZE = 8192  
66 - * A value of {@code 0} turns off transparent handling of blockwise transfers altogether. 54 + /*
  55 + !!! REQUEST_ENTITY_TOO_LARGE CODE=4.13
  56 + The maximum size of a resource body (in bytes) that will be accepted
  57 + as the payload of a POST/PUT or the response to a GET request in a
  58 + transparent> blockwise transfer.
  59 + This option serves as a safeguard against excessive memory
  60 + consumption when many resources contain large bodies that cannot be
  61 + transferred in a single CoAP message. This option has no impact on
  62 + *manually* managed blockwise transfers in which the blocks are handled individually.
  63 + Note that this option does not prevent local clients or resource
  64 + implementations from sending large bodies as part of a request or response to a peer.
  65 + The default value of this property is DEFAULT_MAX_RESOURCE_BODY_SIZE = 8192
  66 + A value of {@code 0} turns off transparent handling of blockwise transfers altogether.
67 */ 67 */
68 -// coapConfig.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE, 8192);  
69 coapConfig.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE, 256 * 1024 * 1024); 68 coapConfig.setInt(NetworkConfig.Keys.MAX_RESOURCE_BODY_SIZE, 256 * 1024 * 1024);
70 - /**  
71 - * The default DTLS response matcher.  
72 - * Supported values are STRICT, RELAXED, or PRINCIPAL.  
73 - * The default value is STRICT.  
74 - * Create new instance of udp endpoint context matcher.  
75 - * Params:  
76 - * checkAddress  
77 - * – true with address check, (STRICT, UDP)  
78 - * - false, without 69 + /*
  70 + The default DTLS response matcher.
  71 + Supported values are STRICT, RELAXED, or PRINCIPAL.
  72 + The default value is STRICT.
  73 + Create new instance of udp endpoint context matcher.
  74 + Params:
  75 + checkAddress
  76 + – true with address check, (STRICT, UDP)
  77 + - false, without
79 */ 78 */
80 coapConfig.setString(NetworkConfig.Keys.RESPONSE_MATCHING, "STRICT"); 79 coapConfig.setString(NetworkConfig.Keys.RESPONSE_MATCHING, "STRICT");
81 - /**  
82 - * https://tools.ietf.org/html/rfc7959#section-2.9.3  
83 - * The block size (number of bytes) to use when doing a blockwise transfer. \  
84 - * This value serves as the upper limit for block size in blockwise transfers 80 + /*
  81 + https://tools.ietf.org/html/rfc7959#section-2.9.3
  82 + The block size (number of bytes) to use when doing a blockwise transfer. \
  83 + This value serves as the upper limit for block size in blockwise transfers
85 */ 84 */
86 coapConfig.setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE, 1024); 85 coapConfig.setInt(NetworkConfig.Keys.PREFERRED_BLOCK_SIZE, 1024);
87 - /**  
88 - * The maximum payload size (in bytes) that can be transferred in a  
89 - * single message, i.e. without requiring a blockwise transfer.  
90 - * NB: this value MUST be adapted to the maximum message size supported by the transport layer.  
91 - * In particular, this value cannot exceed the network's MTU if UDP is used as the transport protocol  
92 - * DEFAULT_VALUE = 1024 86 + /*
  87 + The maximum payload size (in bytes) that can be transferred in a
  88 + single message, i.e. without requiring a blockwise transfer.
  89 + NB: this value MUST be adapted to the maximum message size supported by the transport layer.
  90 + In particular, this value cannot exceed the network's MTU if UDP is used as the transport protocol
  91 + DEFAULT_VALUE = 1024
93 */ 92 */
94 coapConfig.setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE, 1024); 93 coapConfig.setInt(NetworkConfig.Keys.MAX_MESSAGE_SIZE, 1024);
95 94
@@ -404,17 +404,40 @@ public class LwM2mTransportRequest { @@ -404,17 +404,40 @@ public class LwM2mTransportRequest {
404 } 404 }
405 } 405 }
406 406
407 - private void infoWriteResponse(Registration registration, LwM2mResponse response,  
408 - DownlinkRequest request) {  
409 - LwM2mNode node = ((WriteRequest) request).getNode();  
410 - Object value = this.converter.convertValue(((LwM2mSingleResource) node).getValue(),  
411 - ((LwM2mSingleResource) node).getType(), ResourceModel.Type.STRING, request.getPath());  
412 - String msg = String.format("%s: Update finished successfully: CoapCde - %s Lwm2m code - %d name - %s Resource path - %s value - %s",  
413 - LOG_LW2M_INFO, ((Response) response.getCoapResponse()).getCode(), response.getCode().getCode(),  
414 - response.getCode().getName(), request.getPath().toString(), value);  
415 - serviceImpl.sendLogsToThingsboard(msg, registration.getId());  
416 - log.trace("[{}] [{}] [{}] - [{}] [{}] Update finished successfully: [{}]", request.getClass().getName().toString(), registration.getEndpoint(),  
417 - ((Response) response.getCoapResponse()).getCode(), response.getCode(),  
418 - request.getPath().toString(), value); 407 + private void infoWriteResponse(Registration registration, LwM2mResponse response, DownlinkRequest request) {
  408 + try {
  409 + LwM2mNode node = ((WriteRequest) request).getNode();
  410 + String msg;
  411 + Object value;
  412 + LwM2mSingleResource singleResource = (LwM2mSingleResource) node;
  413 + if (singleResource.getType() == ResourceModel.Type.STRING || singleResource.getType() == ResourceModel.Type.OPAQUE) {
  414 + int valueLength;
  415 + if (singleResource.getType() == ResourceModel.Type.STRING) {
  416 + valueLength = ((String) singleResource.getValue()).length();
  417 + value = ((String) singleResource.getValue())
  418 + .substring(Math.min(valueLength, config.getLogMaxLength()));
  419 +
  420 + } else {
  421 + valueLength = ((byte[]) singleResource.getValue()).length;
  422 + value = new String(Arrays.copyOf(((byte[]) singleResource.getValue()),
  423 + Math.min(valueLength, config.getLogMaxLength())));
  424 + }
  425 + value = valueLength > config.getLogMaxLength() ? value + "..." : value;
  426 + msg = String.format("%s: Update finished successfully: Lwm2m code - %d Resource path - %s length - %s value - %s",
  427 + LOG_LW2M_INFO, response.getCode().getCode(), request.getPath().toString(), valueLength, value);
  428 + } else {
  429 + value = this.converter.convertValue(singleResource.getValue(),
  430 + singleResource.getType(), ResourceModel.Type.STRING, request.getPath());
  431 + msg = String.format("%s: Update finished successfully: Lwm2m code - %d Resource path - %s value - %s",
  432 + LOG_LW2M_INFO, response.getCode().getCode(), request.getPath().toString(), value);
  433 + }
  434 + if (msg != null) {
  435 + serviceImpl.sendLogsToThingsboard(msg, registration.getId());
  436 + log.warn("[{}] [{}] [{}] - [{}] [{}] Update finished successfully: [{}]", request.getClass().getName(), registration.getEndpoint(),
  437 + ((Response) response.getCoapResponse()).getCode(), response.getCode(), request.getPath().toString(), value);
  438 + }
  439 + } catch (Exception e) {
  440 + log.trace("Fail convert value from request to string. ", e);
  441 + }
419 } 442 }
420 } 443 }