Browse Source

Merge pull request #5254 from thingsboard/lwm2m_fix_bug_on_review

[3.3.2]Lwm2m fix bug on review
pull/5268/head
Andrew Shvayka 5 years ago
committed by GitHub
parent
commit
c45f0be1dd
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      application/src/main/java/org/thingsboard/server/controller/BaseController.java
  2. 6
      application/src/main/java/org/thingsboard/server/controller/Lwm2mController.java
  3. 2
      application/src/main/resources/thingsboard.yml
  4. 6
      application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java
  5. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java
  6. 6
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MBinaryAppDataContainer.java
  7. 8
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MLocation.java
  8. 6
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTemperatureSensor.java
  9. 30
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java
  10. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/client/SwLwM2MDevice.java
  11. 6
      application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/OtaLwM2MIntegrationTest.java
  12. 139
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java
  13. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationCreateTest.java
  14. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationDeleteTest.java
  15. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationDiscoverTest.java
  16. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationExecuteTest.java
  17. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationObserveTest.java
  18. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationReadTest.java
  19. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationWriteAttributesTest.java
  20. 4
      application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationWriteTest.java
  21. 2
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwM2MIntegrationTest.java
  22. 10
      application/src/test/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerHelperTest.java
  23. 3
      common/data/src/main/java/org/thingsboard/server/common/data/security/DeviceCredentials.java
  24. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/LwM2MTransportBootstrapService.java
  25. 14
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2MBootstrapConfig.java
  26. 57
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2MBootstrapSecurityStore.java
  27. 17
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2mDefaultBootstrapSessionManager.java
  28. 14
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2MCredentialsSecurityInfoValidator.java
  29. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2MRPkCredentials.java
  30. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/TbLwM2MAuthorizer.java
  31. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/TbLwM2MDtlsCertificateVerifier.java
  32. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/AbstractLwM2MTransportResource.java
  33. 22
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2MTransportService.java
  34. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MNetworkConfig.java
  35. 27
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MOperationType.java
  36. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MOtaConvert.java
  37. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MQueuedRequest.java
  38. 14
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MServerListener.java
  39. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MSessionMsgListener.java
  40. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportCoapResource.java
  41. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportContext.java
  42. 12
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportServerHelper.java
  43. 10
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MVersionedModelProvider.java
  44. 72
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/attributes/DefaultLwM2MAttributesService.java
  45. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/attributes/LwM2MAttributesService.java
  46. 80
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClient.java
  47. 37
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClientContext.java
  48. 90
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClientContextImpl.java
  49. 12
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/AbstractTbLwM2MRequestCallback.java
  50. 264
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/DefaultLwM2MDownlinkMsgHandler.java
  51. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/HasVersionedId.java
  52. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/HasVersionedIds.java
  53. 34
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/LwM2MDownlinkMsgHandler.java
  54. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelAllObserveCallback.java
  55. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelAllRequest.java
  56. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelObserveCallback.java
  57. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelObserveRequest.java
  58. 11
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCreateRequest.java
  59. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCreateResponseCallback.java
  60. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDeleteCallback.java
  61. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDeleteRequest.java
  62. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverAllRequest.java
  63. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverCallback.java
  64. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverRequest.java
  65. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDownlinkRequest.java
  66. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MExecuteCallback.java
  67. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MExecuteRequest.java
  68. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveAllRequest.java
  69. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveCallback.java
  70. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveRequest.java
  71. 26
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MReadCallback.java
  72. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MReadRequest.java
  73. 57
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MTargetedCallback.java
  74. 10
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MUplinkTargetedCallback.java
  75. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteAttributesCallback.java
  76. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteAttributesRequest.java
  77. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteReplaceRequest.java
  78. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteResponseCallback.java
  79. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteUpdateRequest.java
  80. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MReadCompositeCallback.java
  81. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MReadCompositeRequest.java
  82. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MWriteCompositeRequest.java
  83. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MWriteResponseCompositeCallback.java
  84. 10
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/log/DefaultLwM2MTelemetryLogService.java
  85. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/log/LwM2MTelemetryLogService.java
  86. 84
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java
  87. 36
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/LwM2MOtaUpdateService.java
  88. 132
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java
  89. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCancelAllObserveCallback.java
  90. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCancelObserveCallback.java
  91. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCreateResponseCallback.java
  92. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDiscoverCallback.java
  93. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java
  94. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcEmptyResponseCallback.java
  95. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcLinkSetCallback.java
  96. 4
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcLwM2MDownlinkCallback.java
  97. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcReadResponseCallback.java
  98. 6
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/composite/RpcReadResponseCompositeCallback.java
  99. 10
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/session/DefaultLwM2MSessionManager.java
  100. 8
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbDummyLwM2MClientStore.java

4
application/src/main/java/org/thingsboard/server/controller/BaseController.java

@ -126,7 +126,6 @@ import org.thingsboard.server.service.component.ComponentDiscoveryService;
import org.thingsboard.server.service.edge.EdgeLicenseService; import org.thingsboard.server.service.edge.EdgeLicenseService;
import org.thingsboard.server.service.edge.EdgeNotificationService; import org.thingsboard.server.service.edge.EdgeNotificationService;
import org.thingsboard.server.service.edge.rpc.EdgeRpcService; import org.thingsboard.server.service.edge.rpc.EdgeRpcService;
import org.thingsboard.server.service.lwm2m.LwM2MServiceImpl;
import org.thingsboard.server.service.ota.OtaPackageStateService; import org.thingsboard.server.service.ota.OtaPackageStateService;
import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.profile.TbDeviceProfileCache;
import org.thingsboard.server.service.resource.TbResourceService; import org.thingsboard.server.service.resource.TbResourceService;
@ -185,9 +184,6 @@ public abstract class BaseController {
@Autowired @Autowired
protected DeviceProfileService deviceProfileService; protected DeviceProfileService deviceProfileService;
@Autowired
protected LwM2MServiceImpl lwM2MService;
@Autowired @Autowired
protected AssetService assetService; protected AssetService assetService;

6
application/src/main/java/org/thingsboard/server/controller/Lwm2mController.java

@ -17,6 +17,7 @@ package org.thingsboard.server.controller;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
@ -31,6 +32,8 @@ import org.thingsboard.server.common.data.exception.ThingsboardException;
import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig; import org.thingsboard.server.common.data.lwm2m.ServerSecurityConfig;
import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentials;
import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.queue.util.TbCoreComponent;
import org.thingsboard.server.service.lwm2m.LwM2MService;
import org.thingsboard.server.service.lwm2m.LwM2MServiceImpl;
import org.thingsboard.server.service.security.permission.Resource; import org.thingsboard.server.service.security.permission.Resource;
import java.util.Map; import java.util.Map;
@ -41,6 +44,9 @@ import java.util.Map;
@RequestMapping("/api") @RequestMapping("/api")
public class Lwm2mController extends BaseController { public class Lwm2mController extends BaseController {
@Autowired
protected LwM2MService lwM2MService;
@PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')") @PreAuthorize("hasAnyAuthority('TENANT_ADMIN', 'CUSTOMER_USER')")
@RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}", method = RequestMethod.GET) @RequestMapping(value = "/lwm2m/deviceProfile/bootstrap/{isBootstrapServer}", method = RequestMethod.GET)
@ResponseBody @ResponseBody

2
application/src/main/resources/thingsboard.yml

@ -693,6 +693,8 @@ transport:
ota_pool_size: "${LWM2M_OTA_POOL_SIZE:10}" ota_pool_size: "${LWM2M_OTA_POOL_SIZE:10}"
clean_period_in_sec: "${LWM2M_CLEAN_PERIOD_IN_SEC:2}" clean_period_in_sec: "${LWM2M_CLEAN_PERIOD_IN_SEC:2}"
log_max_length: "${LWM2M_LOG_MAX_LENGTH:1024}" log_max_length: "${LWM2M_LOG_MAX_LENGTH:1024}"
psm_activity_timer: "${LWM2M_PSM_ACTIVITY_TIMER:10000}"
paging_transmission_window: "${LWM2M_PAGING_TRANSMISSION_WINDOW:10000}"
# Use redis for Security and Registration stores # Use redis for Security and Registration stores
redis.enabled: "${LWM2M_REDIS_ENABLED:false}" redis.enabled: "${LWM2M_REDIS_ENABLED:false}"
snmp: snmp:

6
application/src/test/java/org/thingsboard/server/transport/lwm2m/AbstractLwM2MIntegrationTest.java

@ -186,7 +186,7 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractWebsocketTest
wsClient.registerWaitForUpdate(); wsClient.registerWaitForUpdate();
this.endpoint = endpoint; this.endpoint = endpoint;
createNewClient (security, coapConfig); createNewClient (security, coapConfig, false);
String msg = wsClient.waitForUpdate(); String msg = wsClient.waitForUpdate();
EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class); EntityDataUpdate update = mapper.readValue(msg, EntityDataUpdate.class);
@ -256,11 +256,11 @@ public abstract class AbstractLwM2MIntegrationTest extends AbstractWebsocketTest
this.endpoint = endpoint; this.endpoint = endpoint;
} }
public void createNewClient (Security security, NetworkConfig coapConfig) throws Exception { public void createNewClient (Security security, NetworkConfig coapConfig, boolean isRpc) throws Exception {
clientDestroy(); clientDestroy();
client = new LwM2MTestClient(this.executor, this.endpoint); client = new LwM2MTestClient(this.executor, this.endpoint);
int clientPort = SocketUtils.findAvailableTcpPort(); int clientPort = SocketUtils.findAvailableTcpPort();
client.init(security, coapConfig, clientPort); client.init(security, coapConfig, clientPort, isRpc);
} }
private void clientDestroy() { private void clientDestroy() {

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/FwLwM2MDevice.java

@ -83,7 +83,7 @@ public class FwLwM2MDevice extends BaseInstanceEnabler implements Destroyable {
@Override @Override
public WriteResponse write(ServerIdentity identity, boolean replace, int resourceId, LwM2mResource value) { public WriteResponse write(ServerIdentity identity, boolean replace, int resourceId, LwM2mResource value) {
log.warn("Write on Device resource /{}/{}/{}", getModel().id, getId(), resourceId); log.info("Write on Device resource /{}/{}/{}", getModel().id, getId(), resourceId);
switch (resourceId) { switch (resourceId) {
case 0: case 0:

6
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mBinaryAppDataContainer.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MBinaryAppDataContainer.java

@ -37,7 +37,7 @@ import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
public class LwM2mBinaryAppDataContainer extends BaseInstanceEnabler implements Destroyable { public class LwM2MBinaryAppDataContainer extends BaseInstanceEnabler implements Destroyable {
/** /**
* id = 0 * id = 0
@ -76,10 +76,10 @@ public class LwM2mBinaryAppDataContainer extends BaseInstanceEnabler implements
private Integer appID = -1; private Integer appID = -1;
private static final List<Integer> supportedResources = Arrays.asList(0, 1, 2, 3, 4, 5); private static final List<Integer> supportedResources = Arrays.asList(0, 1, 2, 3, 4, 5);
public LwM2mBinaryAppDataContainer() { public LwM2MBinaryAppDataContainer() {
} }
public LwM2mBinaryAppDataContainer(ScheduledExecutorService executorService, Integer id) { public LwM2MBinaryAppDataContainer(ScheduledExecutorService executorService, Integer id) {
try { try {
if (id != null) this.setId(id); if (id != null) this.setId(id);
executorService.scheduleWithFixedDelay(() -> executorService.scheduleWithFixedDelay(() ->

8
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mLocation.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MLocation.java

@ -30,7 +30,7 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
public class LwM2mLocation extends BaseInstanceEnabler implements Destroyable { public class LwM2MLocation extends BaseInstanceEnabler implements Destroyable {
private float latitude; private float latitude;
private float longitude; private float longitude;
@ -39,11 +39,11 @@ public class LwM2mLocation extends BaseInstanceEnabler implements Destroyable {
protected static final Random RANDOM = new Random(); protected static final Random RANDOM = new Random();
private static final List<Integer> supportedResources = Arrays.asList(0, 1, 5); private static final List<Integer> supportedResources = Arrays.asList(0, 1, 5);
public LwM2mLocation() { public LwM2MLocation() {
this(null, null, 1.0f); this(null, null, 1.0f);
} }
public LwM2mLocation(Float latitude, Float longitude, float scaleFactor) { public LwM2MLocation(Float latitude, Float longitude, float scaleFactor) {
if (latitude != null) { if (latitude != null) {
this.latitude = latitude + 90f; this.latitude = latitude + 90f;
@ -59,7 +59,7 @@ public class LwM2mLocation extends BaseInstanceEnabler implements Destroyable {
timestamp = new Date(); timestamp = new Date();
} }
public LwM2mLocation(Float latitude, Float longitude, float scaleFactor, ScheduledExecutorService executorService, Integer id) { public LwM2MLocation(Float latitude, Float longitude, float scaleFactor, ScheduledExecutorService executorService, Integer id) {
try { try {
if (id != null) this.setId(id); if (id != null) this.setId(id);
if (latitude != null) { if (latitude != null) {

6
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2mTemperatureSensor.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTemperatureSensor.java

@ -32,7 +32,7 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
public class LwM2mTemperatureSensor extends BaseInstanceEnabler implements Destroyable { public class LwM2MTemperatureSensor extends BaseInstanceEnabler implements Destroyable {
private static final String UNIT_CELSIUS = "cel"; private static final String UNIT_CELSIUS = "cel";
private double currentTemp = 20d; private double currentTemp = 20d;
@ -41,11 +41,11 @@ public class LwM2mTemperatureSensor extends BaseInstanceEnabler implements Destr
protected static final Random RANDOM = new Random(); protected static final Random RANDOM = new Random();
private static final List<Integer> supportedResources = Arrays.asList(5601, 5602, 5700, 5701); private static final List<Integer> supportedResources = Arrays.asList(5601, 5602, 5700, 5701);
public LwM2mTemperatureSensor() { public LwM2MTemperatureSensor() {
} }
public LwM2mTemperatureSensor(ScheduledExecutorService executorService, Integer id) { public LwM2MTemperatureSensor(ScheduledExecutorService executorService, Integer id) {
try { try {
if (id != null) this.setId(id); if (id != null) this.setId(id);
executorService.scheduleWithFixedDelay(this::adjustTemperature, 2000, 2000, TimeUnit.MILLISECONDS); executorService.scheduleWithFixedDelay(this::adjustTemperature, 2000, 2000, TimeUnit.MILLISECONDS);

30
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/LwM2MTestClient.java

@ -44,8 +44,7 @@ import org.eclipse.leshan.core.request.BootstrapRequest;
import org.eclipse.leshan.core.request.DeregisterRequest; import org.eclipse.leshan.core.request.DeregisterRequest;
import org.eclipse.leshan.core.request.RegisterRequest; import org.eclipse.leshan.core.request.RegisterRequest;
import org.eclipse.leshan.core.request.UpdateRequest; import org.eclipse.leshan.core.request.UpdateRequest;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; import org.thingsboard.server.transport.lwm2m.utils.LwM2MValueConverterImpl;
import org.junit.Assert;
import org.junit.Assert; import org.junit.Assert;
import java.io.IOException; import java.io.IOException;
@ -81,11 +80,11 @@ public class LwM2MTestClient {
private SimpleLwM2MDevice lwM2MDevice; private SimpleLwM2MDevice lwM2MDevice;
private FwLwM2MDevice fwLwM2MDevice; private FwLwM2MDevice fwLwM2MDevice;
private SwLwM2MDevice swLwM2MDevice; private SwLwM2MDevice swLwM2MDevice;
private LwM2mBinaryAppDataContainer lwM2MBinaryAppDataContainer; private LwM2MBinaryAppDataContainer lwM2MBinaryAppDataContainer;
private LwM2MLocationParams locationParams; private LwM2MLocationParams locationParams;
private LwM2mTemperatureSensor lwM2MTemperatureSensor; private LwM2MTemperatureSensor lwM2MTemperatureSensor;
public void init(Security security, NetworkConfig coapConfig, int port) throws InvalidDDFFileException, IOException { public void init(Security security, NetworkConfig coapConfig, int port, boolean isRpc) throws InvalidDDFFileException, IOException {
Assert.assertNull("client already initialized", client); Assert.assertNull("client already initialized", client);
List<ObjectModel> models = new ArrayList<>(); List<ObjectModel> models = new ArrayList<>();
for (String resourceName : resources) { for (String resourceName : resources) {
@ -100,12 +99,12 @@ public class LwM2MTestClient {
initializer.setInstancesForObject(FIRMWARE, fwLwM2MDevice = new FwLwM2MDevice()); initializer.setInstancesForObject(FIRMWARE, fwLwM2MDevice = new FwLwM2MDevice());
initializer.setInstancesForObject(SOFTWARE_MANAGEMENT, swLwM2MDevice = new SwLwM2MDevice()); initializer.setInstancesForObject(SOFTWARE_MANAGEMENT, swLwM2MDevice = new SwLwM2MDevice());
initializer.setClassForObject(ACCESS_CONTROL, DummyInstanceEnabler.class); initializer.setClassForObject(ACCESS_CONTROL, DummyInstanceEnabler.class);
initializer.setInstancesForObject(BINARY_APP_DATA_CONTAINER, lwM2MBinaryAppDataContainer = new LwM2mBinaryAppDataContainer(executor, objectInstanceId_0), initializer.setInstancesForObject(BINARY_APP_DATA_CONTAINER, lwM2MBinaryAppDataContainer = new LwM2MBinaryAppDataContainer(executor, objectInstanceId_0),
new LwM2mBinaryAppDataContainer(executor, objectInstanceId_1)); new LwM2MBinaryAppDataContainer(executor, objectInstanceId_1));
locationParams = new LwM2MLocationParams(); locationParams = new LwM2MLocationParams();
locationParams.getPos(); locationParams.getPos();
initializer.setInstancesForObject(LOCATION, new LwM2mLocation(locationParams.getLatitude(), locationParams.getLongitude(), locationParams.getScaleFactor(), executor, objectInstanceId_0)); initializer.setInstancesForObject(LOCATION, new LwM2MLocation(locationParams.getLatitude(), locationParams.getLongitude(), locationParams.getScaleFactor(), executor, objectInstanceId_0));
initializer.setInstancesForObject(TEMPERATURE_SENSOR, lwM2MTemperatureSensor = new LwM2mTemperatureSensor(executor, objectInstanceId_0), new LwM2mTemperatureSensor(executor, objectInstanceId_12)); initializer.setInstancesForObject(TEMPERATURE_SENSOR, lwM2MTemperatureSensor = new LwM2MTemperatureSensor(executor, objectInstanceId_0), new LwM2MTemperatureSensor(executor, objectInstanceId_12));
DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder(); DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
dtlsConfig.setRecommendedCipherSuitesOnly(true); dtlsConfig.setRecommendedCipherSuitesOnly(true);
@ -158,7 +157,7 @@ public class LwM2MTestClient {
builder.setSharedExecutor(executor); builder.setSharedExecutor(executor);
builder.setDecoder(new DefaultLwM2mDecoder(false)); builder.setDecoder(new DefaultLwM2mDecoder(false));
builder.setEncoder(new DefaultLwM2mEncoder(new LwM2mValueConverterImpl(), false)); builder.setEncoder(new DefaultLwM2mEncoder(new LwM2MValueConverterImpl(), false));
client = builder.build(); client = builder.build();
LwM2mClientObserver observer = new LwM2mClientObserver() { LwM2mClientObserver observer = new LwM2mClientObserver() {
@ -250,8 +249,9 @@ public class LwM2MTestClient {
} }
}; };
this.client.addObserver(observer); this.client.addObserver(observer);
if (!isRpc) {
client.start(); client.start();
}
} }
public void destroy() { public void destroy() {
@ -278,4 +278,10 @@ public class LwM2MTestClient {
} }
} }
public void start() {
if (client != null) {
client.start();
}
}
} }

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/client/SwLwM2MDevice.java

@ -83,7 +83,7 @@ public class SwLwM2MDevice extends BaseInstanceEnabler implements Destroyable {
@Override @Override
public WriteResponse write(ServerIdentity identity, boolean replace, int resourceId, LwM2mResource value) { public WriteResponse write(ServerIdentity identity, boolean replace, int resourceId, LwM2mResource value) {
log.warn("Write on Device resource /{}/{}/{}", getModel().id, getId(), resourceId); log.info("Write on Device resource /{}/{}/{}", getModel().id, getId(), resourceId);
switch (resourceId) { switch (resourceId) {
case 2: case 2:

6
application/src/test/java/org/thingsboard/server/transport/lwm2m/ota/sql/OtaLwM2MIntegrationTest.java

@ -137,7 +137,7 @@ public class OtaLwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest {
createDeviceProfile(transportConfiguration); createDeviceProfile(transportConfiguration);
NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint); NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint);
final Device device = createDevice(credentials); final Device device = createDevice(credentials);
createNewClient(SECURITY, COAP_CONFIG); createNewClient(SECURITY, COAP_CONFIG, false);
Thread.sleep(1000); Thread.sleep(1000);
@ -164,7 +164,7 @@ public class OtaLwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest {
createDeviceProfile(OTA_TRANSPORT_CONFIGURATION); createDeviceProfile(OTA_TRANSPORT_CONFIGURATION);
NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint); NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint);
final Device device = createDevice(credentials); final Device device = createDevice(credentials);
createNewClient(SECURITY, COAP_CONFIG); createNewClient(SECURITY, COAP_CONFIG, false);
Thread.sleep(1000); Thread.sleep(1000);
@ -203,7 +203,7 @@ public class OtaLwM2MIntegrationTest extends AbstractOtaLwM2MIntegrationTest {
createDeviceProfile(OTA_TRANSPORT_CONFIGURATION); createDeviceProfile(OTA_TRANSPORT_CONFIGURATION);
NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint); NoSecClientCredentials credentials = createNoSecClientCredentials(endpoint);
final Device device = createDevice(credentials); final Device device = createDevice(credentials);
createNewClient(SECURITY, COAP_CONFIG); createNewClient(SECURITY, COAP_CONFIG, false);
Thread.sleep(1000); Thread.sleep(1000);

139
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/AbstractRpcLwM2MIntegrationTest.java

@ -50,63 +50,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resources;
@DaoSqlTest @DaoSqlTest
public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MIntegrationTest { public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MIntegrationTest {
protected final String RPC_TRANSPORT_CONFIGURATION = "{\n" + protected String RPC_TRANSPORT_CONFIGURATION;
" \"type\": \"LWM2M\",\n" +
" \"observeAttr\": {\n" +
" \"keyName\": {\n" +
" \"" + "/" + DEVICE + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\": \"" + resourceIdName_3_9 + "\",\n" +
" \"" + "/" + DEVICE + "/" + objectInstanceId_0 + "/" + resourceId_14 + "\": \"" + resourceIdName_3_14 + "\",\n" +
" \"" + "/" + BINARY_APP_DATA_CONTAINER + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\": \"" + resourceIdName_19_0_0 + "\",\n" +
" \"" + "/" + BINARY_APP_DATA_CONTAINER + "/" + objectInstanceId_1 + "/" + resourceId_0 + "\": \"" + resourceIdName_19_1_0 + "\"\n" +
" },\n" +
" \"observe\": [\n" +
" \"" + "/" + DEVICE + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\",\n" +
" \"" + "/" + BINARY_APP_DATA_CONTAINER + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\"\n" +
" ],\n" +
" \"attribute\": [\n" +
" ],\n" +
" \"telemetry\": [\n" +
" \"" + "/" + DEVICE + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\",\n" +
" \"" + "/" + DEVICE + "/" + objectInstanceId_0 + "/" + resourceId_14 + "\",\n" +
" \"" + "/" + BINARY_APP_DATA_CONTAINER + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\",\n" +
" \"" + "/" + BINARY_APP_DATA_CONTAINER + "/" + objectInstanceId_1 + "/" + resourceId_0 + "\"\n" +
" ],\n" +
" \"attributeLwm2m\": {}\n" +
" },\n" +
" \"bootstrap\": {\n" +
" \"servers\": {\n" +
" \"binding\": \"U\",\n" +
" \"shortId\": 123,\n" +
" \"lifetime\": 300,\n" +
" \"notifIfDisabled\": true,\n" +
" \"defaultMinPeriod\": 1\n" +
" },\n" +
" \"lwm2mServer\": {\n" +
" \"host\": \"localhost\",\n" +
" \"port\": 5686,\n" +
" \"serverId\": 123,\n" +
" \"serverPublicKey\": \"\",\n" +
" \"bootstrapServerIs\": false,\n" +
" \"clientHoldOffTime\": 1,\n" +
" \"bootstrapServerAccountTimeout\": 0\n" +
" },\n" +
" \"bootstrapServer\": {\n" +
" \"host\": \"localhost\",\n" +
" \"port\": 5687,\n" +
" \"serverId\": 111,\n" +
" \"securityMode\": \"NO_SEC\",\n" +
" \"serverPublicKey\": \"\",\n" +
" \"bootstrapServerIs\": true,\n" +
" \"clientHoldOffTime\": 1,\n" +
" \"bootstrapServerAccountTimeout\": 0\n" +
" }\n" +
" },\n" +
" \"clientLwM2mSettings\": {\n" +
" \"clientOnlyObserveAfterConnect\": 1,\n" +
" \"fwUpdateStrategy\": 1,\n" +
" \"swUpdateStrategy\": 1\n" +
" }\n" +
"}";
protected static final String ENDPOINT_RPC = "deviceEndpointRpc"; protected static final String ENDPOINT_RPC = "deviceEndpointRpc";
protected ScheduledExecutorService executor; protected ScheduledExecutorService executor;
@ -137,14 +81,7 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
@Before @Before
public void beforeTest() throws Exception { public void beforeTest() throws Exception {
init(); init();
createDeviceProfile(RPC_TRANSPORT_CONFIGURATION); createNewClient (SECURITY, COAP_CONFIG, true);
Thread.sleep(1000);
NoSecClientCredentials credentials = createNoSecClientCredentials(ENDPOINT_RPC);
final Device device = createDevice(credentials);
deviceId = device.getId().getId().toString();
createNewClient (SECURITY, COAP_CONFIG);
Thread.sleep(1000); Thread.sleep(1000);
@ -182,7 +119,76 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
objectInstanceIdVer_3 = (String) expectedObjectIdVerInstances.stream().filter(predicate_3).findFirst().get(); objectInstanceIdVer_3 = (String) expectedObjectIdVerInstances.stream().filter(predicate_3).findFirst().get();
objectInstanceIdVer_5 = (String) expectedObjectIdVerInstances.stream().filter(path -> ((String) path).contains("/" + FIRMWARE)).findFirst().get(); objectInstanceIdVer_5 = (String) expectedObjectIdVerInstances.stream().filter(path -> ((String) path).contains("/" + FIRMWARE)).findFirst().get();
objectInstanceIdVer_9 = (String) expectedObjectIdVerInstances.stream().filter(path -> ((String) path).contains("/" + SOFTWARE_MANAGEMENT)).findFirst().get(); objectInstanceIdVer_9 = (String) expectedObjectIdVerInstances.stream().filter(path -> ((String) path).contains("/" + SOFTWARE_MANAGEMENT)).findFirst().get();
}
RPC_TRANSPORT_CONFIGURATION = "{\n" +
" \"type\": \"LWM2M\",\n" +
" \"observeAttr\": {\n" +
" \"keyName\": {\n" +
" \"" + objectIdVer_3 + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\": \"" + resourceIdName_3_9 + "\",\n" +
" \"" + objectIdVer_3 + "/" + objectInstanceId_0 + "/" + resourceId_14 + "\": \"" + resourceIdName_3_14 + "\",\n" +
" \"" + objectIdVer_19 + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\": \"" + resourceIdName_19_0_0 + "\",\n" +
" \"" + objectIdVer_19 + "/" + objectInstanceId_1 + "/" + resourceId_0 + "\": \"" + resourceIdName_19_1_0 + "\"\n" +
" },\n" +
" \"observe\": [\n" +
" \"" + objectIdVer_3 + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\",\n" +
" \"" + objectIdVer_19 + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\"\n" +
" ],\n" +
" \"attribute\": [\n" +
" ],\n" +
" \"telemetry\": [\n" +
" \"" + objectIdVer_3 + "/" + objectInstanceId_0 + "/" + resourceId_9 + "\",\n" +
" \"" + objectIdVer_3 + "/" + objectInstanceId_0 + "/" + resourceId_14 + "\",\n" +
" \"" + objectIdVer_19 + "/" + objectInstanceId_0 + "/" + resourceId_0 + "\",\n" +
" \"" + objectIdVer_19 + "/" + objectInstanceId_1 + "/" + resourceId_0 + "\"\n" +
" ],\n" +
" \"attributeLwm2m\": {}\n" +
" },\n" +
" \"bootstrap\": {\n" +
" \"servers\": {\n" +
" \"binding\": \"U\",\n" +
" \"shortId\": 123,\n" +
" \"lifetime\": 300,\n" +
" \"notifIfDisabled\": true,\n" +
" \"defaultMinPeriod\": 1\n" +
" },\n" +
" \"lwm2mServer\": {\n" +
" \"host\": \"localhost\",\n" +
" \"port\": 5686,\n" +
" \"serverId\": 123,\n" +
" \"serverPublicKey\": \"\",\n" +
" \"bootstrapServerIs\": false,\n" +
" \"clientHoldOffTime\": 1,\n" +
" \"bootstrapServerAccountTimeout\": 0\n" +
" },\n" +
" \"bootstrapServer\": {\n" +
" \"host\": \"localhost\",\n" +
" \"port\": 5687,\n" +
" \"serverId\": 111,\n" +
" \"securityMode\": \"NO_SEC\",\n" +
" \"serverPublicKey\": \"\",\n" +
" \"bootstrapServerIs\": true,\n" +
" \"clientHoldOffTime\": 1,\n" +
" \"bootstrapServerAccountTimeout\": 0\n" +
" }\n" +
" },\n" +
" \"clientLwM2mSettings\": {\n" +
" \"clientOnlyObserveAfterConnect\": 1,\n" +
" \"fwUpdateStrategy\": 1,\n" +
" \"swUpdateStrategy\": 1\n" +
" }\n" +
"}";
createDeviceProfile(RPC_TRANSPORT_CONFIGURATION);
Thread.sleep(1000);
NoSecClientCredentials credentials = createNoSecClientCredentials(ENDPOINT_RPC);
final Device device = createDevice(credentials);
deviceId = device.getId().getId().toString();
Thread.sleep(1000);
client.start();
}
protected String pathIdVerToObjectId(String pathIdVer) { protected String pathIdVerToObjectId(String pathIdVer) {
if (pathIdVer.contains("_")){ if (pathIdVer.contains("_")){
@ -192,4 +198,5 @@ public abstract class AbstractRpcLwM2MIntegrationTest extends AbstractLwM2MInteg
} }
return pathIdVer; return pathIdVer;
} }
} }

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationCreateTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationCreateTest.java

@ -31,7 +31,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInsta
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_0; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_0;
public class RpcLwm2mIntegrationCreateTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationCreateTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* Create {"id":"/19_1.1","value":{"0":{"0":"00AC"}, "1":1}} * Create {"id":"/19_1.1","value":{"0":{"0":"00AC"}, "1":1}}

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationDeleteTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationDeleteTest.java

@ -29,7 +29,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInsta
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
public class RpcLwm2mIntegrationDeleteTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationDeleteTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* if there is such an instance * if there is such an instance

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationDiscoverTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationDiscoverTest.java

@ -35,7 +35,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.objectInsta
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_2; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_2;
public class RpcLwm2mIntegrationDiscoverTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationDiscoverTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* DiscoverAll * DiscoverAll

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationExecuteTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationExecuteTest.java

@ -33,7 +33,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
public class RpcLwm2mIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationExecuteTest extends AbstractRpcLwM2MIntegrationTest {
/** /**

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationObserveTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationObserveTest.java

@ -32,7 +32,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_3; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_3;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
public class RpcLwm2mIntegrationObserveTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationObserveTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* ObserveReadAll * ObserveReadAll

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationReadTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationReadTest.java

@ -41,7 +41,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
public class RpcLwm2mIntegrationReadTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationReadTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* Read {"id":"/3"} * Read {"id":"/3"}

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationWriteAttributesTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationWriteAttributesTest.java

@ -34,7 +34,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
public class RpcLwm2mIntegrationWriteAttributesTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationWriteAttributesTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
* WriteAttributes {"id":"/3/0/14","attributes":{"pmax":100, "pmin":10}} * WriteAttributes {"id":"/3/0/14","attributes":{"pmax":100, "pmin":10}}

4
application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwm2mIntegrationWriteTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/rpc/sql/RpcLwM2MIntegrationWriteTest.java

@ -36,7 +36,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceId_9;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceInstanceId_2; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.resourceInstanceId_2;
public class RpcLwm2mIntegrationWriteTest extends AbstractRpcLwM2MIntegrationTest { public class RpcLwM2MIntegrationWriteTest extends AbstractRpcLwM2MIntegrationTest {
/** /**
@ -121,7 +121,7 @@ public class RpcLwm2mIntegrationWriteTest extends AbstractRpcLwM2MIntegrationTes
ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class); ObjectNode rpcActualResult = JacksonUtil.fromString(actualResult, ObjectNode.class);
assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText()); assertEquals(ResponseCode.BAD_REQUEST.getName(), rpcActualResult.get("result").asText());
String actualValues = rpcActualResult.get("error").asText(); String actualValues = rpcActualResult.get("error").asText();
String expected = "Resource value is: String. Value of Multi-Instance Resource must be in Json format!"; String expected = "is bad. Value of Multi-Instance Resource must be in Json format!";
assertTrue(actualValues.contains(expected)); assertTrue(actualValues.contains(expected));
} }

2
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwm2mIntegrationTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/security/sql/PskLwM2MIntegrationTest.java

@ -28,7 +28,7 @@ import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.SECURE_COAP
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.SECURE_URI; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.SECURE_URI;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.SHORT_SERVER_ID; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.SHORT_SERVER_ID;
public class PskLwm2mIntegrationTest extends AbstractSecurityLwM2MIntegrationTest { public class PskLwM2MIntegrationTest extends AbstractSecurityLwM2MIntegrationTest {
@Test @Test
public void testConnectWithPSKAndObserveTelemetry() throws Exception { public void testConnectWithPSKAndObserveTelemetry() throws Exception {

10
application/src/test/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerHelperTest.java

@ -37,7 +37,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_TELEMETRY; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_TELEMETRY;
class LwM2mTransportServerHelperTest { class LwM2mTransportServerHelperTest {
@ -47,15 +47,15 @@ class LwM2mTransportServerHelperTest {
long now; long now;
List<TransportProtos.KeyValueProto> kvList; List<TransportProtos.KeyValueProto> kvList;
ConcurrentMap<String, AtomicLong> keyTsLatestMap; ConcurrentMap<String, AtomicLong> keyTsLatestMap;
LwM2mTransportServerHelper helper; LwM2MTransportServerHelper helper;
LwM2mTransportContext context; LwM2MTransportContext context;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
now = System.currentTimeMillis(); now = System.currentTimeMillis();
context = mock(LwM2mTransportContext.class); context = mock(LwM2MTransportContext.class);
helper = spy(new LwM2mTransportServerHelper(context)); helper = spy(new LwM2MTransportServerHelper(context));
willReturn(now).given(helper).getCurrentTimeMillis(); willReturn(now).given(helper).getCurrentTimeMillis();
kvList = List.of( kvList = List.of(
TransportProtos.KeyValueProto.newBuilder().setKey(KEY_SW_STATE).setStringV(DOWNLOADING).build(), TransportProtos.KeyValueProto.newBuilder().setKey(KEY_SW_STATE).setStringV(DOWNLOADING).build(),

3
common/data/src/main/java/org/thingsboard/server/common/data/security/DeviceCredentials.java

@ -15,9 +15,6 @@
*/ */
package org.thingsboard.server.common.data.security; package org.thingsboard.server.common.data.security;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.thingsboard.server.common.data.BaseData; import org.thingsboard.server.common.data.BaseData;
import org.thingsboard.server.common.data.id.DeviceCredentialsId; import org.thingsboard.server.common.data.id.DeviceCredentialsId;

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/LwM2MTransportBootstrapService.java

@ -30,7 +30,7 @@ import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MInMemoryBoot
import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager; import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2mTransportService; import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2MTransportService;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@ -40,7 +40,7 @@ import java.security.PrivateKey;
import java.security.PublicKey; import java.security.PublicKey;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import static org.thingsboard.server.transport.lwm2m.server.LwM2mNetworkConfig.getCoapConfig; import static org.thingsboard.server.transport.lwm2m.server.LwM2MNetworkConfig.getCoapConfig;
@Slf4j @Slf4j
@Component @Component
@ -93,7 +93,7 @@ public class LwM2MTransportBootstrapService {
DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder(); DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
dtlsConfig.setRecommendedSupportedGroupsOnly(serverConfig.isRecommendedSupportedGroups()); dtlsConfig.setRecommendedSupportedGroupsOnly(serverConfig.isRecommendedSupportedGroups());
dtlsConfig.setRecommendedCipherSuitesOnly(serverConfig.isRecommendedCiphers()); dtlsConfig.setRecommendedCipherSuitesOnly(serverConfig.isRecommendedCiphers());
dtlsConfig.setSupportedCipherSuites(this.pskMode ? DefaultLwM2mTransportService.PSK_CIPHER_SUITES : DefaultLwM2mTransportService.RPK_OR_X509_CIPHER_SUITES); dtlsConfig.setSupportedCipherSuites(this.pskMode ? DefaultLwM2MTransportService.PSK_CIPHER_SUITES : DefaultLwM2MTransportService.RPK_OR_X509_CIPHER_SUITES);
/* Set DTLS Config */ /* Set DTLS Config */
builder.setDtlsConfig(dtlsConfig); builder.setDtlsConfig(dtlsConfig);

14
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2MBootstrapConfig.java

@ -17,6 +17,8 @@ package org.thingsboard.server.transport.lwm2m.bootstrap.secure;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.eclipse.leshan.core.SecurityMode; import org.eclipse.leshan.core.SecurityMode;
import org.eclipse.leshan.core.request.BindingMode; import org.eclipse.leshan.core.request.BindingMode;
import org.eclipse.leshan.core.util.Hex; import org.eclipse.leshan.core.util.Hex;
@ -41,7 +43,9 @@ public class LwM2MBootstrapConfig implements Serializable {
* notifIfDisabled: boolean, * notifIfDisabled: boolean,
* binding: string * binding: string
* */ * */
LwM2MBootstrapServers servers; @Getter
@Setter
private LwM2MBootstrapServers servers;
/** -bootstrapServer, lwm2mServer /** -bootstrapServer, lwm2mServer
* interface ServerSecurityConfig * interface ServerSecurityConfig
@ -56,9 +60,13 @@ public class LwM2MBootstrapConfig implements Serializable {
* serverId?: number, * serverId?: number,
* bootstrapServerAccountTimeout: number * bootstrapServerAccountTimeout: number
* */ * */
LwM2MServerBootstrap bootstrapServer; @Getter
@Setter
private LwM2MServerBootstrap bootstrapServer;
LwM2MServerBootstrap lwm2mServer; @Getter
@Setter
private LwM2MServerBootstrap lwm2mServer;
@JsonIgnore @JsonIgnore
public BootstrapConfig getLwM2MBootstrapConfig() { public BootstrapConfig getLwM2MBootstrapConfig() {

57
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2MBootstrapSecurityStore.java

@ -29,11 +29,11 @@ import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.device.data.lwm2m.BootstrapConfiguration; import org.thingsboard.server.common.data.device.data.lwm2m.BootstrapConfiguration;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator; import org.thingsboard.server.transport.lwm2m.secure.LwM2MCredentialsSecurityInfoValidator;
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo; import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo;
import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener; import org.thingsboard.server.transport.lwm2m.server.LwM2MSessionMsgListener;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportContext;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportServerHelper;
import java.io.IOException; import java.io.IOException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@ -43,11 +43,11 @@ import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_ERROR; import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MTypeServer.BOOTSTRAP;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_INFO; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_ERROR;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_TELEMETRY; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.getBootstrapParametersFromThingsboard; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_TELEMETRY;
import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer.BOOTSTRAP; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getBootstrapParametersFromThingsboard;
@Slf4j @Slf4j
@Service("LwM2MBootstrapSecurityStore") @Service("LwM2MBootstrapSecurityStore")
@ -56,13 +56,13 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
private final EditableBootstrapConfigStore bootstrapConfigStore; private final EditableBootstrapConfigStore bootstrapConfigStore;
private final LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator; private final LwM2MCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator;
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
private final Map<String /* endpoint */, TransportProtos.SessionInfoProto> bsSessions = new ConcurrentHashMap<>(); private final Map<String /* endpoint */, TransportProtos.SessionInfoProto> bsSessions = new ConcurrentHashMap<>();
public LwM2MBootstrapSecurityStore(EditableBootstrapConfigStore bootstrapConfigStore, LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator, LwM2mTransportContext context, LwM2mTransportServerHelper helper) { public LwM2MBootstrapSecurityStore(EditableBootstrapConfigStore bootstrapConfigStore, LwM2MCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator, LwM2MTransportContext context, LwM2MTransportServerHelper helper) {
this.bootstrapConfigStore = bootstrapConfigStore; this.bootstrapConfigStore = bootstrapConfigStore;
this.lwM2MCredentialsSecurityInfoValidator = lwM2MCredentialsSecurityInfoValidator; this.lwM2MCredentialsSecurityInfoValidator = lwM2MCredentialsSecurityInfoValidator;
this.context = context; this.context = context;
@ -86,10 +86,10 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
bootstrapConfigStore.add(endPoint, bsConfigNew); bootstrapConfigStore.add(endPoint, bsConfigNew);
} catch (InvalidConfigurationException e) { } catch (InvalidConfigurationException e) {
if (e.getMessage().contains("Psk identity") && e.getMessage().contains("already used for this bootstrap server")) { if (e.getMessage().contains("Psk identity") && e.getMessage().contains("already used for this bootstrap server")) {
log.trace("", e); log.trace("Invalid Bootstrap Configuration", e);
} }
else { else {
log.error("", e); log.error("Invalid Bootstrap Configuration", e);
} }
} }
return store.getSecurityInfo() == null ? null : Collections.singletonList(store.getSecurityInfo()).iterator(); return store.getSecurityInfo() == null ? null : Collections.singletonList(store.getSecurityInfo()).iterator();
@ -109,7 +109,7 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
try { try {
bootstrapConfigStore.add(store.getEndpoint(), bsConfig); bootstrapConfigStore.add(store.getEndpoint(), bsConfig);
} catch (InvalidConfigurationException e) { } catch (InvalidConfigurationException e) {
log.error("", e); log.error("Invalid Bootstrap Configuration", e);
} }
return store.getSecurityInfo(); return store.getSecurityInfo();
} }
@ -158,11 +158,11 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
LwM2MBootstrapConfig lwM2MBootstrapConfig = store.getBootstrapCredentialConfig(); LwM2MBootstrapConfig lwM2MBootstrapConfig = store.getBootstrapCredentialConfig();
if (lwM2MBootstrapConfig != null) { if (lwM2MBootstrapConfig != null) {
BootstrapConfiguration bootstrapObject = getBootstrapParametersFromThingsboard(store.getDeviceProfile()); BootstrapConfiguration bootstrapObject = getBootstrapParametersFromThingsboard(store.getDeviceProfile());
lwM2MBootstrapConfig.servers = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getServers()), LwM2MBootstrapServers.class); lwM2MBootstrapConfig.setServers(JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getServers()), LwM2MBootstrapServers.class));
LwM2MServerBootstrap profileServerBootstrap = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getBootstrapServer()), LwM2MServerBootstrap.class); LwM2MServerBootstrap bootstrapServerProfile = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getBootstrapServer()), LwM2MServerBootstrap.class);
if (SecurityMode.NO_SEC != profileServerBootstrap.getSecurityMode() && profileServerBootstrap != null) { if (SecurityMode.NO_SEC != bootstrapServerProfile.getSecurityMode() && bootstrapServerProfile != null) {
profileServerBootstrap.setSecurityHost( profileServerBootstrap.getHost()); bootstrapServerProfile.setSecurityHost(bootstrapServerProfile.getHost());
profileServerBootstrap.setSecurityPort( profileServerBootstrap.getPort()); bootstrapServerProfile.setSecurityPort(bootstrapServerProfile.getPort());
} }
LwM2MServerBootstrap profileLwm2mServer = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getLwm2mServer()), LwM2MServerBootstrap.class); LwM2MServerBootstrap profileLwm2mServer = JacksonUtil.fromString(JacksonUtil.toString(bootstrapObject.getLwm2mServer()), LwM2MServerBootstrap.class);
if (SecurityMode.NO_SEC != profileLwm2mServer.getSecurityMode() && profileLwm2mServer != null) { if (SecurityMode.NO_SEC != profileLwm2mServer.getSecurityMode() && profileLwm2mServer != null) {
@ -172,10 +172,10 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
UUID sessionUUiD = UUID.randomUUID(); UUID sessionUUiD = UUID.randomUUID();
TransportProtos.SessionInfoProto sessionInfo = helper.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits()); TransportProtos.SessionInfoProto sessionInfo = helper.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits());
bsSessions.put(store.getEndpoint(), sessionInfo); bsSessions.put(store.getEndpoint(), sessionInfo);
context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, null, null, sessionInfo, context.getTransportService())); context.getTransportService().registerAsyncSession(sessionInfo, new LwM2MSessionMsgListener(null, null, null, sessionInfo, context.getTransportService()));
if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap, lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer)) { if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.getBootstrapServer(), bootstrapServerProfile, lwM2MBootstrapConfig.getLwm2mServer(), profileLwm2mServer)) {
lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap); lwM2MBootstrapConfig.setBootstrapServer(new LwM2MServerBootstrap(lwM2MBootstrapConfig.getBootstrapServer(), bootstrapServerProfile));
lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer); lwM2MBootstrapConfig.setLwm2mServer(new LwM2MServerBootstrap(lwM2MBootstrapConfig.getLwm2mServer(), profileLwm2mServer));
String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LWM2M_INFO, store.getEndpoint()); String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LWM2M_INFO, store.getEndpoint());
helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo); helper.sendParametersOnThingsboardTelemetry(helper.getKvStringtoThingsboard(LOG_LWM2M_TELEMETRY, logMsg), sessionInfo);
return lwM2MBootstrapConfig; return lwM2MBootstrapConfig;
@ -187,7 +187,6 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
return null; return null;
} }
} }
log.error("Unable to decode Json or Certificate for [{}]", store.getEndpoint()); log.error("Unable to decode Json or Certificate for [{}]", store.getEndpoint());
return null; return null;
} }
@ -197,13 +196,13 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
* and (lwm2mServer in credential and lwm2mServer in profile * and (lwm2mServer in credential and lwm2mServer in profile
* *
* @param bootstrapFromCredential - Bootstrap -> Security of bootstrapServer in credential * @param bootstrapFromCredential - Bootstrap -> Security of bootstrapServer in credential
* @param profileServerBootstrap - Bootstrap -> Security of bootstrapServer in profile * @param bootstrapServerProfile - Bootstrap -> Security of bootstrapServer in profile
* @param lwm2mFromCredential - Bootstrap -> Security of lwm2mServer in credential * @param lwm2mFromCredential - Bootstrap -> Security of lwm2mServer in credential
* @param profileLwm2mServer - Bootstrap -> Security of lwm2mServer in profile * @param profileLwm2mServer - Bootstrap -> Security of lwm2mServer in profile
* @return false if not sync between SecurityMode of Bootstrap credential and profile * @return false if not sync between SecurityMode of Bootstrap credential and profile
*/ */
private boolean getValidatedSecurityMode(LwM2MServerBootstrap bootstrapFromCredential, LwM2MServerBootstrap profileServerBootstrap, LwM2MServerBootstrap lwm2mFromCredential, LwM2MServerBootstrap profileLwm2mServer) { private boolean getValidatedSecurityMode(LwM2MServerBootstrap bootstrapFromCredential, LwM2MServerBootstrap bootstrapServerProfile, LwM2MServerBootstrap lwm2mFromCredential, LwM2MServerBootstrap profileLwm2mServer) {
return (bootstrapFromCredential.getSecurityMode().equals(profileServerBootstrap.getSecurityMode()) && return (bootstrapFromCredential.getSecurityMode().equals(bootstrapServerProfile.getSecurityMode()) &&
lwm2mFromCredential.getSecurityMode().equals(profileLwm2mServer.getSecurityMode())); lwm2mFromCredential.getSecurityMode().equals(profileLwm2mServer.getSecurityMode()));
} }

17
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/bootstrap/secure/LwM2mDefaultBootstrapSessionManager.java

@ -39,7 +39,7 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_INFO; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
@Slf4j @Slf4j
public class LwM2mDefaultBootstrapSessionManager extends DefaultBootstrapSessionManager { public class LwM2mDefaultBootstrapSessionManager extends DefaultBootstrapSessionManager {
@ -199,25 +199,24 @@ public class LwM2mDefaultBootstrapSessionManager extends DefaultBootstrapSession
@Override @Override
public BootstrapPolicy onRequestFailure(BootstrapSession bsSession, public BootstrapPolicy onRequestFailure(BootstrapSession bsSession,
BootstrapDownlinkRequest<? extends LwM2mResponse> request, Throwable cause) { BootstrapDownlinkRequest<? extends LwM2mResponse> request, Throwable cause) {
this.sendLogs (bsSession.getEndpoint(), this.sendLogs(bsSession.getEndpoint(),
String.format("%s: %s %s failed because of %s for %s : %s", LOG_LWM2M_INFO, String.format("%s: %s %s failed because of %s for %s : %s", LOG_LWM2M_INFO, request.getClass().getSimpleName(),
request.getClass().getSimpleName(), request.getPath().toString(), cause.toString(), bsSession.toString(), request.toString())); request.getPath().toString(), cause.toString(), bsSession.toString(), request.toString()));
return BootstrapPolicy.failed(); return BootstrapPolicy.failed();
} }
@Override @Override
public void end(BootstrapSession bsSession) { public void end(BootstrapSession bsSession) {
this.sendLogs (bsSession.getEndpoint(), this.sendLogs(bsSession.getEndpoint(), String.format("%s: Bootstrap session finished : %s", LOG_LWM2M_INFO, bsSession.toString()));
String.format("%s: Bootstrap session finished : %s", LOG_LWM2M_INFO, bsSession.toString()));
} }
@Override @Override
public void failed(BootstrapSession bsSession, BootstrapFailureCause cause) { public void failed(BootstrapSession bsSession, BootstrapFailureCause cause) {
this.sendLogs (bsSession.getEndpoint(), this.sendLogs(bsSession.getEndpoint(), String.format("%s: Bootstrap session failed by %s: %s", LOG_LWM2M_INFO,
String.format("%s: Bootstrap session failed by %s: %s", LOG_LWM2M_INFO, cause.toString(), bsSession.toString())); cause.toString(), bsSession.toString()));
} }
private void sendLogs (String endpointName, String logMsg) { private void sendLogs(String endpointName, String logMsg) {
log.info(logMsg); log.info(logMsg);
transportService.log(((LwM2MBootstrapSecurityStore) bsSecurityStore).getSessionByEndpoint(endpointName), logMsg); transportService.log(((LwM2MBootstrapSecurityStore) bsSecurityStore).getSessionByEndpoint(endpointName), logMsg);
} }

14
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2MCredentialsSecurityInfoValidator.java

@ -32,9 +32,9 @@ import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MC
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials; import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportContext;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MTypeServer;
import java.io.IOException; import java.io.IOException;
import java.security.GeneralSecurityException; import java.security.GeneralSecurityException;
@ -46,18 +46,18 @@ import static org.eclipse.leshan.core.SecurityMode.NO_SEC;
import static org.eclipse.leshan.core.SecurityMode.PSK; import static org.eclipse.leshan.core.SecurityMode.PSK;
import static org.eclipse.leshan.core.SecurityMode.RPK; import static org.eclipse.leshan.core.SecurityMode.RPK;
import static org.eclipse.leshan.core.SecurityMode.X509; import static org.eclipse.leshan.core.SecurityMode.X509;
import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer.BOOTSTRAP; import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MTypeServer.BOOTSTRAP;
@Slf4j @Slf4j
@Component @Component
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
@RequiredArgsConstructor @RequiredArgsConstructor
public class LwM2mCredentialsSecurityInfoValidator { public class LwM2MCredentialsSecurityInfoValidator {
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
public TbLwM2MSecurityInfo getEndpointSecurityInfoByCredentialsId(String credentialsId, LwM2mTypeServer keyValue) { public TbLwM2MSecurityInfo getEndpointSecurityInfoByCredentialsId(String credentialsId, LwM2MTypeServer keyValue) {
CountDownLatch latch = new CountDownLatch(1); CountDownLatch latch = new CountDownLatch(1);
final TbLwM2MSecurityInfo[] resultSecurityStore = new TbLwM2MSecurityInfo[1]; final TbLwM2MSecurityInfo[] resultSecurityStore = new TbLwM2MSecurityInfo[1];
log.trace("Validating credentials [{}]", credentialsId); log.trace("Validating credentials [{}]", credentialsId);
@ -102,7 +102,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
* @param keyValue - * @param keyValue -
* @return SecurityInfo * @return SecurityInfo
*/ */
private TbLwM2MSecurityInfo createSecurityInfo(String endpoint, String jsonStr, LwM2mTypeServer keyValue) { private TbLwM2MSecurityInfo createSecurityInfo(String endpoint, String jsonStr, LwM2MTypeServer keyValue) {
TbLwM2MSecurityInfo result = new TbLwM2MSecurityInfo(); TbLwM2MSecurityInfo result = new TbLwM2MSecurityInfo();
LwM2MCredentials credentials = JacksonUtil.fromString(jsonStr, LwM2MCredentials.class); LwM2MCredentials credentials = JacksonUtil.fromString(jsonStr, LwM2MCredentials.class);
if (credentials != null) { if (credentials != null) {

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mRPkCredentials.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2MRPkCredentials.java

@ -37,7 +37,7 @@ import java.util.List;
@Slf4j @Slf4j
@Data @Data
public class LwM2mRPkCredentials { public class LwM2MRPkCredentials {
private PublicKey serverPublicKey; private PublicKey serverPublicKey;
private PrivateKey serverPrivateKey; private PrivateKey serverPrivateKey;
private X509Certificate certificate; private X509Certificate certificate;
@ -49,7 +49,7 @@ public class LwM2mRPkCredentials {
* @param publY * @param publY
* @param privS * @param privS
*/ */
public LwM2mRPkCredentials(String publX, String publY, String privS) { public LwM2MRPkCredentials(String publX, String publY, String privS) {
generatePublicKeyRPK(publX, publY, privS); generatePublicKeyRPK(publX, publY, privS);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/TbLwM2MAuthorizer.java

@ -26,7 +26,7 @@ import org.eclipse.leshan.server.security.SecurityInfo;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MDtlsSessionStore; import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MDtlsSessionStore;
import org.thingsboard.server.transport.lwm2m.server.store.TbSecurityStore; import org.thingsboard.server.transport.lwm2m.server.store.TbSecurityStore;
@ -39,7 +39,7 @@ public class TbLwM2MAuthorizer implements Authorizer {
private final TbLwM2MDtlsSessionStore sessionStorage; private final TbLwM2MDtlsSessionStore sessionStorage;
private final TbSecurityStore securityStore; private final TbSecurityStore securityStore;
private final SecurityChecker securityChecker = new SecurityChecker(); private final SecurityChecker securityChecker = new SecurityChecker();
private final LwM2mClientContext clientContext; private final LwM2MClientContext clientContext;
@Override @Override
public Registration isAuthorized(UplinkRequest<?> request, Registration registration, Identity senderIdentity) { public Registration isAuthorized(UplinkRequest<?> request, Registration registration, Identity senderIdentity) {

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/TbLwM2MDtlsCertificateVerifier.java

@ -57,7 +57,7 @@ import java.security.cert.X509Certificate;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer.CLIENT; import static org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MTypeServer.CLIENT;
@Slf4j @Slf4j
@Component @Component
@ -67,7 +67,7 @@ public class TbLwM2MDtlsCertificateVerifier implements NewAdvancedCertificateVer
private final TbLwM2MDtlsSessionStore sessionStorage; private final TbLwM2MDtlsSessionStore sessionStorage;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2mCredentialsSecurityInfoValidator securityInfoValidator; private final LwM2MCredentialsSecurityInfoValidator securityInfoValidator;
private final TbMainSecurityStore securityStore; private final TbMainSecurityStore securityStore;
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/AbstractLwM2mTransportResource.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/AbstractLwM2MTransportResource.java

@ -20,9 +20,9 @@ import org.eclipse.californium.core.server.resources.CoapExchange;
import org.eclipse.leshan.core.californium.LwM2mCoapResource; import org.eclipse.leshan.core.californium.LwM2mCoapResource;
@Slf4j @Slf4j
public abstract class AbstractLwM2mTransportResource extends LwM2mCoapResource { public abstract class AbstractLwM2MTransportResource extends LwM2mCoapResource {
public AbstractLwM2mTransportResource(String name) { public AbstractLwM2MTransportResource(String name) {
super(name); super(name);
} }

22
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2MTransportService.java

@ -33,10 +33,10 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MAuthorizer; import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MAuthorizer;
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MDtlsCertificateVerifier; import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MDtlsCertificateVerifier;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.store.TbSecurityStore; import org.thingsboard.server.transport.lwm2m.server.store.TbSecurityStore;
import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2MUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2MUplinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; import org.thingsboard.server.transport.lwm2m.utils.LwM2MValueConverterImpl;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@ -48,26 +48,26 @@ import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_ECDHE
import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8; import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256; import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_WITH_AES_128_CBC_SHA256;
import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_WITH_AES_128_CCM_8; import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_WITH_AES_128_CCM_8;
import static org.thingsboard.server.transport.lwm2m.server.LwM2mNetworkConfig.getCoapConfig; import static org.thingsboard.server.transport.lwm2m.server.LwM2MNetworkConfig.getCoapConfig;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_UPDATE_COAP_RESOURCE; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_UPDATE_COAP_RESOURCE;
@Slf4j @Slf4j
@Component @Component
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
@RequiredArgsConstructor @RequiredArgsConstructor
public class DefaultLwM2mTransportService implements LwM2MTransportService { public class DefaultLwM2MTransportService implements LwM2MTransportService {
public static final CipherSuite[] RPK_OR_X509_CIPHER_SUITES = {TLS_PSK_WITH_AES_128_CCM_8, TLS_PSK_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256}; public static final CipherSuite[] RPK_OR_X509_CIPHER_SUITES = {TLS_PSK_WITH_AES_128_CCM_8, TLS_PSK_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256};
public static final CipherSuite[] PSK_CIPHER_SUITES = {TLS_PSK_WITH_AES_128_CCM_8, TLS_PSK_WITH_AES_128_CBC_SHA256}; public static final CipherSuite[] PSK_CIPHER_SUITES = {TLS_PSK_WITH_AES_128_CCM_8, TLS_PSK_WITH_AES_128_CBC_SHA256};
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
private final OtaPackageDataCache otaPackageDataCache; private final OtaPackageDataCache otaPackageDataCache;
private final DefaultLwM2MUplinkMsgHandler handler; private final DefaultLwM2MUplinkMsgHandler handler;
private final CaliforniumRegistrationStore registrationStore; private final CaliforniumRegistrationStore registrationStore;
private final TbSecurityStore securityStore; private final TbSecurityStore securityStore;
private final LwM2mClientContext lwM2mClientContext; private final LwM2MClientContext lwM2mClientContext;
private final TbLwM2MDtlsCertificateVerifier certificateVerifier; private final TbLwM2MDtlsCertificateVerifier certificateVerifier;
private final TbLwM2MAuthorizer authorizer; private final TbLwM2MAuthorizer authorizer;
@ -83,7 +83,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
* nameFile = "BC68JAR01A09_TO_BC68JAR01A10.bin" * nameFile = "BC68JAR01A09_TO_BC68JAR01A10.bin"
* "coap://host:port/{path}/{token}/{nameFile}" * "coap://host:port/{path}/{token}/{nameFile}"
*/ */
LwM2mTransportCoapResource otaCoapResource = new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE); LwM2MTransportCoapResource otaCoapResource = new LwM2MTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE);
this.server.coap().getServer().add(otaCoapResource); this.server.coap().getServer().add(otaCoapResource);
this.startLhServer(); this.startLhServer();
this.context.setServer(server); this.context.setServer(server);
@ -92,7 +92,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
private void startLhServer() { private void startLhServer() {
log.info("Starting LwM2M transport server..."); log.info("Starting LwM2M transport server...");
this.server.start(); this.server.start();
LwM2mServerListener lhServerCertListener = new LwM2mServerListener(handler); LwM2MServerListener lhServerCertListener = new LwM2MServerListener(handler);
this.server.getRegistrationService().addListener(lhServerCertListener.registrationListener); this.server.getRegistrationService().addListener(lhServerCertListener.registrationListener);
this.server.getPresenceService().addListener(lhServerCertListener.presenceListener); this.server.getPresenceService().addListener(lhServerCertListener.presenceListener);
this.server.getObservationService().addListener(lhServerCertListener.observationListener); this.server.getObservationService().addListener(lhServerCertListener.observationListener);
@ -112,13 +112,13 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService {
builder.setLocalSecureAddress(config.getSecureHost(), config.getSecurePort()); builder.setLocalSecureAddress(config.getSecureHost(), config.getSecurePort());
builder.setDecoder(new DefaultLwM2mDecoder()); builder.setDecoder(new DefaultLwM2mDecoder());
/* Use a magic converter to support bad type send by the UI. */ /* Use a magic converter to support bad type send by the UI. */
builder.setEncoder(new DefaultLwM2mEncoder(LwM2mValueConverterImpl.getInstance())); builder.setEncoder(new DefaultLwM2mEncoder(LwM2MValueConverterImpl.getInstance()));
/* Create CoAP Config */ /* Create CoAP Config */
builder.setCoapConfig(getCoapConfig(config.getPort(), config.getSecurePort(), config)); builder.setCoapConfig(getCoapConfig(config.getPort(), config.getSecurePort(), config));
/* Define model provider (Create Models )*/ /* Define model provider (Create Models )*/
LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.lwM2mClientContext, this.helper, this.context); LwM2mModelProvider modelProvider = new LwM2MVersionedModelProvider(this.lwM2mClientContext, this.helper, this.context);
config.setModelProvider(modelProvider); config.setModelProvider(modelProvider);
builder.setObjectModelProvider(modelProvider); builder.setObjectModelProvider(modelProvider);

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mNetworkConfig.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MNetworkConfig.java

@ -21,7 +21,7 @@ import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import static org.eclipse.californium.core.network.config.NetworkConfigDefaults.DEFAULT_BLOCKWISE_STATUS_LIFETIME; import static org.eclipse.californium.core.network.config.NetworkConfigDefaults.DEFAULT_BLOCKWISE_STATUS_LIFETIME;
public class LwM2mNetworkConfig { public class LwM2MNetworkConfig {
public static NetworkConfig getCoapConfig(Integer serverPortNoSec, Integer serverSecurePort, LwM2MTransportServerConfig config) { public static NetworkConfig getCoapConfig(Integer serverPortNoSec, Integer serverSecurePort, LwM2MTransportServerConfig config) {
NetworkConfig coapConfig = new NetworkConfig(); NetworkConfig coapConfig = new NetworkConfig();

27
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mOperationType.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MOperationType.java

@ -20,7 +20,7 @@ import lombok.Getter;
/** /**
* Define the behavior of a write request. * Define the behavior of a write request.
*/ */
public enum LwM2mOperationType { public enum LwM2MOperationType {
READ(0, "Read", true), READ(0, "Read", true),
READ_COMPOSITE(1, "ReadComposite", false, true), READ_COMPOSITE(1, "ReadComposite", false, true),
@ -50,16 +50,13 @@ public enum LwM2mOperationType {
WRITE_COMPOSITE(14, "WriteComposite", false, true), WRITE_COMPOSITE(14, "WriteComposite", false, true),
WRITE_ATTRIBUTES(15, "WriteAttributes", true), WRITE_ATTRIBUTES(15, "WriteAttributes", true),
DELETE(16, "Delete", true), DELETE(16, "Delete", true),
CREATE(17, "Create", true);
// only for RPC // only for RPC - future
FW_UPDATE(17, "FirmwareUpdate", false), // FW_UPDATE(18, "FirmwareUpdate", false),
// FW_READ_INFO(18, "FirmwareReadInfo", false), // FW_READ_INFO(19, "FirmwareReadInfo", false),
SW_UPDATE(19, "SoftwareUpdate", false), // SW_UPDATE(20, "SoftwareUpdate", false),
// SW_READ_INFO(20, "SoftwareReadInfo", false), // SW_READ_INFO(21, "SoftwareReadInfo", false),
SW_UNINSTALL(21, "SoftwareUninstall", false), // SW_UNINSTALL(22, "SoftwareUninstall", false);
CREATE(11, "Create", true);
@Getter @Getter
@ -72,11 +69,11 @@ public enum LwM2mOperationType {
@Getter @Getter
private final boolean composite; private final boolean composite;
LwM2mOperationType(int code, String type, boolean hasObjectId) { LwM2MOperationType(int code, String type, boolean hasObjectId) {
this(code, type, hasObjectId, false); this(code, type, hasObjectId, false);
} }
LwM2mOperationType(int code, String type, boolean hasObjectId, boolean composite) { LwM2MOperationType(int code, String type, boolean hasObjectId, boolean composite) {
this.code = code; this.code = code;
this.type = type; this.type = type;
this.hasObjectId = hasObjectId; this.hasObjectId = hasObjectId;
@ -86,8 +83,8 @@ public enum LwM2mOperationType {
} }
} }
public static LwM2mOperationType fromType(String type) { public static LwM2MOperationType fromType(String type) {
for (LwM2mOperationType to : LwM2mOperationType.values()) { for (LwM2MOperationType to : LwM2MOperationType.values()) {
if (to.type.equals(type)) { if (to.type.equals(type)) {
return to; return to;
} }

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mOtaConvert.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MOtaConvert.java

@ -19,7 +19,7 @@ import lombok.Data;
import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.model.ResourceModel;
@Data @Data
public class LwM2mOtaConvert { public class LwM2MOtaConvert {
private ResourceModel.Type currentType; private ResourceModel.Type currentType;
private Object value; private Object value;
} }

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mQueuedRequest.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MQueuedRequest.java

@ -15,6 +15,6 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server; package org.thingsboard.server.transport.lwm2m.server;
public interface LwM2mQueuedRequest { public interface LwM2MQueuedRequest {
void send(); void send();
} }

14
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mServerListener.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MServerListener.java

@ -23,18 +23,18 @@ import org.eclipse.leshan.server.queue.PresenceListener;
import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.Registration;
import org.eclipse.leshan.server.registration.RegistrationListener; import org.eclipse.leshan.server.registration.RegistrationListener;
import org.eclipse.leshan.server.registration.RegistrationUpdate; import org.eclipse.leshan.server.registration.RegistrationUpdate;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
import java.util.Collection; import java.util.Collection;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertObjectIdToVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertObjectIdToVersionedId;
@Slf4j @Slf4j
public class LwM2mServerListener { public class LwM2MServerListener {
private final LwM2mUplinkMsgHandler service; private final LwM2MUplinkMsgHandler service;
public LwM2mServerListener(LwM2mUplinkMsgHandler service) { public LwM2MServerListener(LwM2MUplinkMsgHandler service) {
this.service = service; this.service = service;
} }
@ -98,7 +98,9 @@ public class LwM2mServerListener {
@Override @Override
public void onError(Observation observation, Registration registration, Exception error) { public void onError(Observation observation, Registration registration, Exception error) {
log.error("Unable to handle notification of [{}:{}] [{}]", observation.getRegistrationId(), observation.getPath(), error.getMessage()); if (error != null) {
log.debug("Unable to handle notification of [{}:{}] [{}]", observation.getRegistrationId(), observation.getPath(), error.getMessage());
}
} }
@Override @Override

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mSessionMsgListener.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MSessionMsgListener.java

@ -34,15 +34,15 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcResponseM
import org.thingsboard.server.gen.transport.TransportProtos.ToTransportUpdateCredentialsProto; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportUpdateCredentialsProto;
import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService; import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService;
import org.thingsboard.server.transport.lwm2m.server.rpc.LwM2MRpcRequestHandler; import org.thingsboard.server.transport.lwm2m.server.rpc.LwM2MRpcRequestHandler;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? super Void>>, SessionMsgListener { public class LwM2MSessionMsgListener implements GenericFutureListener<Future<? super Void>>, SessionMsgListener {
private final LwM2mUplinkMsgHandler handler; private final LwM2MUplinkMsgHandler handler;
private final LwM2MAttributesService attributesService; private final LwM2MAttributesService attributesService;
private final LwM2MRpcRequestHandler rpcHandler; private final LwM2MRpcRequestHandler rpcHandler;
private final TransportProtos.SessionInfoProto sessionInfo; private final TransportProtos.SessionInfoProto sessionInfo;

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportCoapResource.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportCoapResource.java

@ -36,12 +36,12 @@ import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaU
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_UPDATE_COAP_RESOURCE; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_UPDATE_COAP_RESOURCE;
@Slf4j @Slf4j
public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource { public class LwM2MTransportCoapResource extends AbstractLwM2MTransportResource {
private final ConcurrentMap<String, ObserveRelation> tokenToObserveRelationMap = new ConcurrentHashMap<>(); private final ConcurrentMap<String, ObserveRelation> tokenToObserveRelationMap = new ConcurrentHashMap<>();
private final ConcurrentMap<String, AtomicInteger> tokenToObserveNotificationSeqMap = new ConcurrentHashMap<>(); private final ConcurrentMap<String, AtomicInteger> tokenToObserveNotificationSeqMap = new ConcurrentHashMap<>();
private final OtaPackageDataCache otaPackageDataCache; private final OtaPackageDataCache otaPackageDataCache;
public LwM2mTransportCoapResource(OtaPackageDataCache otaPackageDataCache, String name) { public LwM2MTransportCoapResource(OtaPackageDataCache otaPackageDataCache, String name) {
super(name); super(name);
this.otaPackageDataCache = otaPackageDataCache; this.otaPackageDataCache = otaPackageDataCache;
this.setObservable(true); // enable observing this.setObservable(true); // enable observing

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContext.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportContext.java

@ -24,7 +24,7 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
@Component @Component
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
public class LwM2mTransportContext extends TransportContext { public class LwM2MTransportContext extends TransportContext {
@Getter @Setter @Getter @Setter
private LeshanServer server; private LeshanServer server;

12
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerHelper.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MTransportServerHelper.java

@ -48,10 +48,10 @@ import static org.thingsboard.server.gen.transport.TransportProtos.KeyValueType.
@Component @Component
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
@RequiredArgsConstructor @RequiredArgsConstructor
public class LwM2mTransportServerHelper { public class LwM2MTransportServerHelper {
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final static JsonParser JSON_PARSER = new JsonParser();; private final static JsonParser JSON_PARSER = new JsonParser();
public void sendParametersOnThingsboardAttribute(List<TransportProtos.KeyValueProto> result, SessionInfoProto sessionInfo) { public void sendParametersOnThingsboardAttribute(List<TransportProtos.KeyValueProto> result, SessionInfoProto sessionInfo) {
PostAttributeMsg.Builder request = PostAttributeMsg.newBuilder(); PostAttributeMsg.Builder request = PostAttributeMsg.newBuilder();
@ -231,7 +231,11 @@ public class LwM2mTransportServerHelper {
case STRING_V: case STRING_V:
return kv.getStringV(); return kv.getStringV();
case JSON_V: case JSON_V:
return JSON_PARSER.parse(kv.getJsonV()); try {
return JSON_PARSER.parse(kv.getJsonV());
} catch (Exception e) {
return null;
}
} }
return null; return null;
} }

10
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mVersionedModelProvider.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2MVersionedModelProvider.java

@ -25,7 +25,7 @@ import org.eclipse.leshan.server.model.LwM2mModelProvider;
import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.Registration;
import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.TbResource;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
@ -38,7 +38,7 @@ import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPA
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class LwM2mVersionedModelProvider implements LwM2mModelProvider { public class LwM2MVersionedModelProvider implements LwM2mModelProvider {
/** /**
* int objectId * int objectId
@ -46,9 +46,9 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
* Key = objectId + "##" + version * Key = objectId + "##" + version
* Value = TenantId * Value = TenantId
*/ */
private final LwM2mClientContext lwM2mClientContext; private final LwM2MClientContext lwM2mClientContext;
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private String getKeyIdVer(Integer objectId, String version) { private String getKeyIdVer(Integer objectId, String version) {
return objectId != null ? objectId + LWM2M_SEPARATOR_KEY + ((version == null || version.isEmpty()) ? ObjectModel.DEFAULT_VERSION : version) : null; return objectId != null ? objectId + LWM2M_SEPARATOR_KEY + ((version == null || version.isEmpty()) ? ObjectModel.DEFAULT_VERSION : version) : null;

72
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/attributes/DefaultLwM2MAttributesService.java

@ -18,7 +18,6 @@ package org.thingsboard.server.transport.lwm2m.server.attributes;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture; import com.google.common.util.concurrent.SettableFuture;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.model.ResourceModel; import org.eclipse.leshan.core.model.ResourceModel;
@ -32,18 +31,17 @@ import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeResponseMsg;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportServerHelper;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil; import org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2mDownlinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2MDownlinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteResponseCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteResponseCallback;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService;
import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MOtaUpdateService; import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MOtaUpdateService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; import org.thingsboard.server.transport.lwm2m.utils.LwM2MValueConverterImpl;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -55,7 +53,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE; import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE;
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper.getValueFromKvProto; import static org.thingsboard.server.transport.lwm2m.server.LwM2MTransportServerHelper.getValueFromKvProto;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_TAG; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_TAG;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_TITLE; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_TITLE;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_URL; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_URL;
@ -64,11 +62,11 @@ import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaU
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_TITLE; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_TITLE;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_URL; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_URL;
import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_VERSION; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_VERSION;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_ERROR; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_ERROR;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_WARN; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_WARN;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.compareAttNameKeyOta; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.compareAttNameKeyOta;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertMultiResourceValuesFromJson; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromJson;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fromVersionedIdToObjectId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId;
@Slf4j @Slf4j
@Service @Service
@ -81,16 +79,16 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
private final Map<Integer, SettableFuture<List<TransportProtos.TsKvProto>>> futures; private final Map<Integer, SettableFuture<List<TransportProtos.TsKvProto>>> futures;
private final TransportService transportService; private final TransportService transportService;
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
private final LwM2mClientContext clientContext; private final LwM2MClientContext clientContext;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2mUplinkMsgHandler uplinkHandler; private final LwM2MUplinkMsgHandler uplinkHandler;
private final LwM2mDownlinkMsgHandler downlinkHandler; private final LwM2MDownlinkMsgHandler downlinkHandler;
private final LwM2MTelemetryLogService logService; private final LwM2MTelemetryLogService logService;
private final LwM2MOtaUpdateService otaUpdateService; private final LwM2MOtaUpdateService otaUpdateService;
@Override @Override
public ListenableFuture<List<TransportProtos.TsKvProto>> getSharedAttributes(LwM2mClient client, Collection<String> keys) { public ListenableFuture<List<TransportProtos.TsKvProto>> getSharedAttributes(LwM2MClient client, Collection<String> keys) {
SettableFuture<List<TransportProtos.TsKvProto>> future = SettableFuture.create(); SettableFuture<List<TransportProtos.TsKvProto>> future = SettableFuture.create();
int requestId = reqIdSeq.incrementAndGet(); int requestId = reqIdSeq.incrementAndGet();
futures.put(requestId, future); futures.put(requestId, future);
@ -133,7 +131,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
*/ */
@Override @Override
public void onAttributesUpdate(TransportProtos.AttributeUpdateNotificationMsg msg, TransportProtos.SessionInfoProto sessionInfo) { public void onAttributesUpdate(TransportProtos.AttributeUpdateNotificationMsg msg, TransportProtos.SessionInfoProto sessionInfo) {
LwM2mClient lwM2MClient = clientContext.getClientBySessionInfo(sessionInfo); LwM2MClient lwM2MClient = clientContext.getClientBySessionInfo(sessionInfo);
if (msg.getSharedUpdatedCount() > 0 && lwM2MClient != null) { if (msg.getSharedUpdatedCount() > 0 && lwM2MClient != null) {
String newFirmwareTitle = null; String newFirmwareTitle = null;
String newFirmwareVersion = null; String newFirmwareVersion = null;
@ -190,12 +188,12 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
* #2.1 if there is not a difference in values between the current resource values and the shared attribute values * #2.1 if there is not a difference in values between the current resource values and the shared attribute values
*/ */
@Override @Override
public void onAttributesUpdate(LwM2mClient lwM2MClient, List<TransportProtos.TsKvProto> tsKvProtos, boolean logFailedUpdateOfNonChangedValue) { public void onAttributesUpdate(LwM2MClient lwM2MClient, List<TransportProtos.TsKvProto> tsKvProtos, boolean logFailedUpdateOfNonChangedValue) {
log.trace("[{}] onAttributesUpdate [{}]", lwM2MClient.getEndpoint(), tsKvProtos); log.trace("[{}] onAttributesUpdate [{}]", lwM2MClient.getEndpoint(), tsKvProtos);
Map <String, TransportProtos.TsKvProto> attributesUpdate = new ConcurrentHashMap<>(); Map <String, TransportProtos.TsKvProto> attributesUpdate = new ConcurrentHashMap<>();
tsKvProtos.forEach(tsKvProto -> { tsKvProtos.forEach(tsKvProto -> {
try { try {
String pathIdVer = clientContext.getObjectIdByKeyNameFromProfile(lwM2MClient, tsKvProto.getKv().getKey(), false); String pathIdVer = clientContext.getObjectIdByKeyNameFromProfile(lwM2MClient, tsKvProto.getKv().getKey());
if (pathIdVer != null) { if (pathIdVer != null) {
// #1.1 // #1.1
if (lwM2MClient.getSharedAttributes().containsKey(pathIdVer)) { if (lwM2MClient.getSharedAttributes().containsKey(pathIdVer)) {
@ -224,13 +222,20 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
if (!resourceModel.multiple || !(newValProto instanceof JsonElement)) { if (!resourceModel.multiple || !(newValProto instanceof JsonElement)) {
this.pushUpdateToClientIfNeeded(lwM2MClient, oldResourceValue, newValProto, pathIdVer, logFailedUpdateOfNonChangedValue, resourceModel.type); this.pushUpdateToClientIfNeeded(lwM2MClient, oldResourceValue, newValProto, pathIdVer, logFailedUpdateOfNonChangedValue, resourceModel.type);
} else { } else {
pushUpdateMultiToClientIfNeeded(lwM2MClient, resourceModel, (JsonElement) newValProto, try {
(Map<Integer, LwM2mResourceInstance>) oldResourceValue, pathIdVer); pushUpdateMultiToClientIfNeeded(lwM2MClient, resourceModel, (JsonElement) newValProto,
(Map<Integer, LwM2mResourceInstance>) oldResourceValue, pathIdVer, logFailedUpdateOfNonChangedValue);
} catch (Exception e){
log.error("Failed update resource ["+lwM2MClient.getEndpoint()+"] onAttributesUpdate:", e);
String logMsg = String.format("%s: Failed update resource onAttributesUpdate %s.",
LOG_LWM2M_ERROR, e.getMessage());
logService.log(lwM2MClient, logMsg);
}
} }
}); });
} }
private void pushUpdateToClientIfNeeded(LwM2mClient lwM2MClient, Object valueOld, Object newValue, private void pushUpdateToClientIfNeeded(LwM2MClient lwM2MClient, Object valueOld, Object newValue,
String versionedId, boolean logFailedUpdateOfNonChangedValue, ResourceModel.Type type) { String versionedId, boolean logFailedUpdateOfNonChangedValue, ResourceModel.Type type) {
if (newValue == null) { if (newValue == null) {
String logMsg = String.format("%s: Failed update resource versionedId - %s value - %s. New value is bad", String logMsg = String.format("%s: Failed update resource versionedId - %s value - %s. New value is bad",
@ -250,9 +255,10 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
} }
} }
private void pushUpdateMultiToClientIfNeeded(LwM2mClient client, ResourceModel resourceModel, JsonElement newValProto, private void pushUpdateMultiToClientIfNeeded(LwM2MClient client, ResourceModel resourceModel, JsonElement newValProto,
Map<Integer, LwM2mResourceInstance> valueOld, String versionedId) { Map<Integer, LwM2mResourceInstance> valueOld, String versionedId,
Map newValues = convertMultiResourceValuesFromJson((JsonObject) newValProto, resourceModel.type, versionedId); boolean logFailedUpdateOfNonChangedValue) throws Exception {
Map newValues = convertMultiResourceValuesFromJson(newValProto, resourceModel.type, versionedId);
if (newValues.size() > 0 && valueOld != null && valueOld.size() > 0) { if (newValues.size() > 0 && valueOld != null && valueOld.size() > 0) {
valueOld.values().stream().forEach((v) -> { valueOld.values().stream().forEach((v) -> {
if (newValues.containsKey(v.getId())) { if (newValues.containsKey(v.getId())) {
@ -272,7 +278,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
if (newValues.size() > 0) { if (newValues.size() > 0) {
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId).value(newValues).timeout(this.config.getTimeout()).build(); TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId).value(newValues).timeout(this.config.getTimeout()).build();
downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, versionedId)); downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, versionedId));
} else { } else if (logFailedUpdateOfNonChangedValue) {
log.warn("Didn't update resource [{}] [{}]", versionedId, newValProto); log.warn("Didn't update resource [{}] [{}]", versionedId, newValProto);
String logMsg = String.format("%s: Didn't update resource versionedId - %s value - %s. Value is not changed", String logMsg = String.format("%s: Didn't update resource versionedId - %s value - %s. Value is not changed",
LOG_LWM2M_WARN, versionedId, newValProto); LOG_LWM2M_WARN, versionedId, newValProto);
@ -284,13 +290,13 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
* @param pathIdVer - path resource * @param pathIdVer - path resource
* @return - value of Resource into format KvProto or null * @return - value of Resource into format KvProto or null
*/ */
private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) { private Object getResourceValueFormatKv(LwM2MClient lwM2MClient, String pathIdVer) {
LwM2mResource resourceValue = LwM2mTransportUtil.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer); LwM2mResource resourceValue = LwM2MTransportUtil.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer);
if (resourceValue != null) { if (resourceValue != null) {
ResourceModel.Type currentType = resourceValue.getType(); ResourceModel.Type currentType = resourceValue.getType();
ResourceModel.Type expectedType = helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer); ResourceModel.Type expectedType = helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
if (!resourceValue.isMultiInstances()) { if (!resourceValue.isMultiInstances()) {
return LwM2mValueConverterImpl.getInstance().convertValue(resourceValue.getValue(), currentType, expectedType, return LwM2MValueConverterImpl.getInstance().convertValue(resourceValue.getValue(), currentType, expectedType,
new LwM2mPath(fromVersionedIdToObjectId(pathIdVer))); new LwM2mPath(fromVersionedIdToObjectId(pathIdVer)));
} else if (resourceValue.getInstances().size() > 0) { } else if (resourceValue.getInstances().size() > 0) {
return resourceValue.getInstances(); return resourceValue.getInstances();

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/attributes/LwM2MAttributesService.java

@ -17,18 +17,18 @@ package org.thingsboard.server.transport.lwm2m.server.attributes;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
public interface LwM2MAttributesService { public interface LwM2MAttributesService {
ListenableFuture<List<TransportProtos.TsKvProto>> getSharedAttributes(LwM2mClient client, Collection<String> keys); ListenableFuture<List<TransportProtos.TsKvProto>> getSharedAttributes(LwM2MClient client, Collection<String> keys);
void onGetAttributesResponse(TransportProtos.GetAttributeResponseMsg getAttributesResponse, TransportProtos.SessionInfoProto sessionInfo); void onGetAttributesResponse(TransportProtos.GetAttributeResponseMsg getAttributesResponse, TransportProtos.SessionInfoProto sessionInfo);
void onAttributesUpdate(TransportProtos.AttributeUpdateNotificationMsg attributeUpdateNotification, TransportProtos.SessionInfoProto sessionInfo); void onAttributesUpdate(TransportProtos.AttributeUpdateNotificationMsg attributeUpdateNotification, TransportProtos.SessionInfoProto sessionInfo);
void onAttributesUpdate(LwM2mClient lwM2MClient, List<TransportProtos.TsKvProto> tsKvProtos, boolean logFailedUpdateOfNonChangedValue); void onAttributesUpdate(LwM2MClient lwM2MClient, List<TransportProtos.TsKvProto> tsKvProtos, boolean logFailedUpdateOfNonChangedValue);
} }

80
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClient.java

@ -46,7 +46,6 @@ import java.io.Serializable;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
@ -62,16 +61,15 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH; import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_PATH;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LWM2M_OBJECT_VERSION_DEFAULT; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromRpcBody;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertMultiResourceValuesFromRpcBody; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertObjectIdToVersionedId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertObjectIdToVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.equalsResourceTypeGetSimpleName;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.equalsResourceTypeGetSimpleName; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fromVersionedIdToObjectId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getVerFromPathIdVerOrId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.getVerFromPathIdVerOrId;
@Slf4j @Slf4j
@EqualsAndHashCode(of = {"endpoint"}) @EqualsAndHashCode(of = {"endpoint"})
public class LwM2mClient implements Serializable { public class LwM2MClient implements Serializable {
private static final long serialVersionUID = 8793482946289222623L; private static final long serialVersionUID = 8793482946289222623L;
@ -106,7 +104,6 @@ public class LwM2mClient implements Serializable {
@Getter @Getter
private Long pagingTransmissionWindow; private Long pagingTransmissionWindow;
@Getter @Getter
@Setter
private Long edrxCycle; private Long edrxCycle;
@Getter @Getter
private Registration registration; private Registration registration;
@ -122,9 +119,9 @@ public class LwM2mClient implements Serializable {
private boolean firstEdrxDownlink = true; private boolean firstEdrxDownlink = true;
@Getter @Getter
Set<ContentFormat> clientSupportContentFormats; private Set<ContentFormat> clientSupportContentFormats;
@Getter @Getter
ContentFormat defaultContentFormat; private ContentFormat defaultContentFormat;
@Getter @Getter
private final AtomicInteger retryAttempts; private final AtomicInteger retryAttempts;
@ -132,7 +129,7 @@ public class LwM2mClient implements Serializable {
return super.clone(); return super.clone();
} }
public LwM2mClient(String nodeId, String endpoint) { public LwM2MClient(String nodeId, String endpoint) {
this.nodeId = nodeId; this.nodeId = nodeId;
this.endpoint = endpoint; this.endpoint = endpoint;
this.sharedAttributes = new ConcurrentHashMap<>(); this.sharedAttributes = new ConcurrentHashMap<>();
@ -279,7 +276,7 @@ public class LwM2mClient implements Serializable {
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(pathIdVer)); LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(pathIdVer));
String verSupportedObject = registration.getSupportedObject().get(pathIds.getObjectId()); String verSupportedObject = registration.getSupportedObject().get(pathIds.getObjectId());
String verRez = getVerFromPathIdVerOrId(pathIdVer); String verRez = getVerFromPathIdVerOrId(pathIdVer);
return verRez == null || verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration) return verRez != null && verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration)
.getResourceModel(pathIds.getObjectId(), pathIds.getResourceId()) : null; .getResourceModel(pathIds.getObjectId(), pathIds.getResourceId()) : null;
} }
@ -296,7 +293,7 @@ public class LwM2mClient implements Serializable {
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(pathIdVer)); LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(pathIdVer));
String verSupportedObject = registration.getSupportedObject().get(pathIds.getObjectId()); String verSupportedObject = registration.getSupportedObject().get(pathIds.getObjectId());
String verRez = getVerFromPathIdVerOrId(pathIdVer); String verRez = getVerFromPathIdVerOrId(pathIdVer);
return verRez == null || verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration) return verRez != null && verRez.equals(verSupportedObject) ? modelProvider.getObjectModel(registration)
.getObjectModel(pathIds.getObjectId()) : null; .getObjectModel(pathIds.getObjectId()) : null;
} }
@ -327,18 +324,22 @@ public class LwM2mClient implements Serializable {
Collection<LwM2mResource> resources = ConcurrentHashMap.newKeySet(); Collection<LwM2mResource> resources = ConcurrentHashMap.newKeySet();
Map<Integer, ResourceModel> resourceModels = modelProvider.getObjectModel(registration) Map<Integer, ResourceModel> resourceModels = modelProvider.getObjectModel(registration)
.getObjectModel(pathIds.getObjectId()).resources; .getObjectModel(pathIds.getObjectId()).resources;
if (params != null) { if (params != null && params instanceof Map && ((Map<?, ?>) params).size() > 0) {
Map paramsMap = (Map) params;
resourceModels.forEach((resourceId, resourceModel) -> { resourceModels.forEach((resourceId, resourceModel) -> {
if (((Map) params).containsKey(String.valueOf(resourceId))) { if (paramsMap.containsKey(String.valueOf(resourceId))) {
Object value = ((Map) params).get((String.valueOf(resourceId))); Object value = paramsMap.get((String.valueOf(resourceId)));
LwM2mResource resource = null; LwM2mResource resource;
if (resourceModel.multiple) { if (resourceModel.multiple) {
if (value instanceof LinkedHashMap) { try {
Map values = convertMultiResourceValuesFromRpcBody((LinkedHashMap) value, resourceModel.type, pathRezIdVer); Map values = convertMultiResourceValuesFromRpcBody(value, resourceModel.type, pathRezIdVer);
resource = LwM2mMultipleResource.newResource(resourceId, (Map<Integer, ?>) values, resourceModel.type); resource = LwM2mMultipleResource.newResource(resourceId, (Map<Integer, ?>) values, resourceModel.type);
} catch (Exception e) {
throw new IllegalArgumentException("Resource id=" + resourceId + ", class = " +
value.getClass().getSimpleName() + ", value = " + value + " is bad. Value of Multi-Instance Resource must be in Json format!");
} }
} else { } else {
Object valueRez = value.getClass().getSimpleName().equals("Integer") ? ((Integer) value).longValue() : value; Object valueRez = value instanceof Integer ? ((Integer) value).longValue() : value;
resource = LwM2mSingleResource.newResource(resourceId, resource = LwM2mSingleResource.newResource(resourceId,
converter.convertValue(valueRez, equalsResourceTypeGetSimpleName(value), resourceModel.type, pathIds), resourceModel.type); converter.convertValue(valueRez, equalsResourceTypeGetSimpleName(value), resourceModel.type, pathIds), resourceModel.type);
} }
@ -347,14 +348,14 @@ public class LwM2mClient implements Serializable {
} else if (resourceModel.operations.isWritable() && resourceModel.mandatory) { } else if (resourceModel.operations.isWritable() && resourceModel.mandatory) {
throw new IllegalArgumentException("Resource id=" + resourceId + " is mandatory. The value of this resource must not be null."); throw new IllegalArgumentException("Resource id=" + resourceId + " is mandatory. The value of this resource must not be null.");
} }
} } else if (resourceModel.operations.isWritable() && resourceModel.mandatory) {
else if (resourceModel.operations.isWritable() && resourceModel.mandatory) {
throw new IllegalArgumentException("Resource id=" + resourceId + " is mandatory. The value of this resource must not be null."); throw new IllegalArgumentException("Resource id=" + resourceId + " is mandatory. The value of this resource must not be null.");
} }
}); });
} } else if (params == null) {
else {
throw new IllegalArgumentException("The value of this resource must not be null."); throw new IllegalArgumentException("The value of this resource must not be null.");
} else {
throw new IllegalArgumentException("The value of this resource must be in Map format and size > 0");
} }
return resources; return resources;
} }
@ -366,8 +367,7 @@ public class LwM2mClient implements Serializable {
return String.format("Specified object id %s absent in the list supported objects of the client or is security object!", pathIds.getObjectId()); return String.format("Specified object id %s absent in the list supported objects of the client or is security object!", pathIds.getObjectId());
} else { } else {
String verRez = getVerFromPathIdVerOrId(path); String verRez = getVerFromPathIdVerOrId(path);
if ((verRez != null && !verRez.equals(verSupportedObject)) || if (verRez == null || !verRez.equals(verSupportedObject)) {
(verRez == null && !LWM2M_OBJECT_VERSION_DEFAULT.equals(verSupportedObject))) {
return String.format("Specified resource id %s is not valid version! Must be version: %s", path, verSupportedObject); return String.format("Specified resource id %s is not valid version! Must be version: %s", path, verSupportedObject);
} }
} }
@ -421,23 +421,17 @@ public class LwM2mClient implements Serializable {
} }
} }
private Set<ContentFormat> clientSupportContentFormat(Registration registration) { static private Set<ContentFormat> clientSupportContentFormat(Registration registration) {
Set<ContentFormat> contentFormats = new HashSet<>(); Set<ContentFormat> contentFormats = new HashSet<>();
if (registration == null) { contentFormats.add(ContentFormat.DEFAULT);
contentFormats.add(ContentFormat.DEFAULT); String code = Arrays.stream(registration.getObjectLinks()).filter(link -> link.getUrl().equals("/")).findFirst().get().getAttributes().get("ct");
} else { if (code != null) {
String code = Arrays.stream(registration.getObjectLinks()).filter(link -> link.getUrl().equals("/")). Set<ContentFormat> codes = Stream.of(code.replaceAll("\"", "").split(" ", -1))
findFirst().get().getAttributes().get("ct"); .map(String::trim)
if (code != null) { .map(Integer::parseInt)
Set<ContentFormat> codes = Stream.of(code.replaceAll("\"", "").split(" ", -1)) .map(ContentFormat::fromCode)
.map(String::trim) .collect(Collectors.toSet());
.map(Integer::parseInt) contentFormats.addAll(codes);
.map(ContentFormat::fromCode)
.collect(Collectors.toSet());
contentFormats.addAll(codes);
} else {
contentFormats.add(ContentFormat.DEFAULT);
}
} }
return contentFormats; return contentFormats;
} }

37
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContext.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClientContext.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.client; package org.thingsboard.server.transport.lwm2m.server.client;
import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.Registration;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
@ -27,19 +26,19 @@ import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
public interface LwM2mClientContext { public interface LwM2MClientContext {
LwM2mClient getClientByEndpoint(String endpoint); LwM2MClient getClientByEndpoint(String endpoint);
LwM2mClient getClientBySessionInfo(TransportProtos.SessionInfoProto sessionInfo); LwM2MClient getClientBySessionInfo(TransportProtos.SessionInfoProto sessionInfo);
Optional<TransportProtos.SessionInfoProto> register(LwM2mClient lwM2MClient, Registration registration) throws LwM2MClientStateException; Optional<TransportProtos.SessionInfoProto> register(LwM2MClient lwM2MClient, Registration registration) throws LwM2MClientStateException;
void updateRegistration(LwM2mClient client, Registration registration) throws LwM2MClientStateException; void updateRegistration(LwM2MClient client, Registration registration) throws LwM2MClientStateException;
void unregister(LwM2mClient client, Registration registration) throws LwM2MClientStateException; void unregister(LwM2MClient client, Registration registration) throws LwM2MClientStateException;
Collection<LwM2mClient> getLwM2mClients(); Collection<LwM2MClient> getLwM2mClients();
//TODO: replace UUID with DeviceProfileId //TODO: replace UUID with DeviceProfileId
Lwm2mDeviceProfileTransportConfiguration getProfile(UUID profileUuId); Lwm2mDeviceProfileTransportConfiguration getProfile(UUID profileUuId);
@ -48,30 +47,28 @@ public interface LwM2mClientContext {
Lwm2mDeviceProfileTransportConfiguration profileUpdate(DeviceProfile deviceProfile); Lwm2mDeviceProfileTransportConfiguration profileUpdate(DeviceProfile deviceProfile);
Set<String> getSupportedIdVerInClient(LwM2mClient registration); Set<String> getSupportedIdVerInClient(LwM2MClient registration);
LwM2mClient getClientByDeviceId(UUID deviceId); LwM2MClient getClientByDeviceId(UUID deviceId);
String getObjectIdByKeyNameFromProfile(LwM2mClient lwM2mClient, String keyName, boolean isCompositeOperation); String getObjectIdByKeyNameFromProfile(LwM2MClient lwM2mClient, String keyName);
void registerClient(Registration registration, ValidateDeviceCredentialsResponse credentials); void registerClient(Registration registration, ValidateDeviceCredentialsResponse credentials);
void update(LwM2mClient lwM2MClient); void update(LwM2MClient lwM2MClient);
void removeCredentials(TransportProtos.SessionInfoProto sessionInfo); void removeCredentials(TransportProtos.SessionInfoProto sessionInfo);
void sendMsgsAfterSleeping(LwM2mClient lwM2MClient); void sendMsgsAfterSleeping(LwM2MClient lwM2MClient);
ContentFormat getContentFormatComposite(LwM2mClient client); void onUplink(LwM2MClient client);
void onUplink(LwM2mClient client); Long getRequestTimeout(LwM2MClient client);
Long getRequestTimeout(LwM2mClient client); boolean asleep(LwM2MClient client);
boolean asleep(LwM2mClient client); boolean awake(LwM2MClient client);
boolean awake(LwM2mClient client); boolean isDownlinkAllowed(LwM2MClient client);
boolean isDownlinkAllowed(LwM2mClient client);
} }

90
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2MClientContextImpl.java

@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.SecurityMode; import org.eclipse.leshan.core.SecurityMode;
import org.eclipse.leshan.core.node.LwM2mPath; import org.eclipse.leshan.core.node.LwM2mPath;
import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.server.registration.Registration; import org.eclipse.leshan.server.registration.Registration;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
@ -37,13 +36,13 @@ import org.thingsboard.server.queue.util.AfterStartUp;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo; import org.thingsboard.server.transport.lwm2m.secure.TbLwM2MSecurityInfo;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportContext;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil;
import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MOtaUpdateService; import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MOtaUpdateService;
import org.thingsboard.server.transport.lwm2m.server.session.LwM2MSessionManager; import org.thingsboard.server.transport.lwm2m.server.session.LwM2MSessionManager;
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MClientStore; import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MClientStore;
import org.thingsboard.server.transport.lwm2m.server.store.TbMainSecurityStore; import org.thingsboard.server.transport.lwm2m.server.store.TbMainSecurityStore;
import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2MUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.DefaultLwM2MUplinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -57,16 +56,15 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Predicate; import java.util.function.Predicate;
import static org.eclipse.leshan.core.SecurityMode.NO_SEC; import static org.eclipse.leshan.core.SecurityMode.NO_SEC;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertObjectIdToVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertObjectIdToVersionedId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.getMsgException;
@Slf4j @Slf4j
@Service @Service
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
@RequiredArgsConstructor @RequiredArgsConstructor
public class LwM2mClientContextImpl implements LwM2mClientContext { public class LwM2MClientContextImpl implements LwM2MClientContext {
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final TbMainSecurityStore securityStore; private final TbMainSecurityStore securityStore;
private final TbLwM2MClientStore clientStore; private final TbLwM2MClientStore clientStore;
@ -80,14 +78,14 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
@Lazy @Lazy
private LwM2MOtaUpdateService otaUpdateService; private LwM2MOtaUpdateService otaUpdateService;
private final Map<String, LwM2mClient> lwM2mClientsByEndpoint = new ConcurrentHashMap<>(); private final Map<String, LwM2MClient> lwM2mClientsByEndpoint = new ConcurrentHashMap<>();
private final Map<String, LwM2mClient> lwM2mClientsByRegistrationId = new ConcurrentHashMap<>(); private final Map<String, LwM2MClient> lwM2mClientsByRegistrationId = new ConcurrentHashMap<>();
private final Map<UUID, Lwm2mDeviceProfileTransportConfiguration> profiles = new ConcurrentHashMap<>(); private final Map<UUID, Lwm2mDeviceProfileTransportConfiguration> profiles = new ConcurrentHashMap<>();
@AfterStartUp @AfterStartUp
public void init() { public void init() {
String nodeId = context.getNodeId(); String nodeId = context.getNodeId();
Set<LwM2mClient> fetchedClients = clientStore.getAll(); Set<LwM2MClient> fetchedClients = clientStore.getAll();
log.debug("Fetched clients from store: {}", fetchedClients); log.debug("Fetched clients from store: {}", fetchedClients);
fetchedClients.forEach(client -> { fetchedClients.forEach(client -> {
lwM2mClientsByEndpoint.put(client.getEndpoint(), client); lwM2mClientsByEndpoint.put(client.getEndpoint(), client);
@ -101,13 +99,13 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public LwM2mClient getClientByEndpoint(String endpoint) { public LwM2MClient getClientByEndpoint(String endpoint) {
return lwM2mClientsByEndpoint.computeIfAbsent(endpoint, ep -> { return lwM2mClientsByEndpoint.computeIfAbsent(endpoint, ep -> {
LwM2mClient client = clientStore.get(ep); LwM2MClient client = clientStore.get(ep);
String nodeId = context.getNodeId(); String nodeId = context.getNodeId();
if (client == null) { if (client == null) {
log.info("[{}] initialized new client.", endpoint); log.info("[{}] initialized new client.", endpoint);
client = new LwM2mClient(nodeId, ep); client = new LwM2MClient(nodeId, ep);
} else { } else {
log.debug("[{}] fetched client from store: {}", endpoint, client); log.debug("[{}] fetched client from store: {}", endpoint, client);
updateFetchedClient(nodeId, client); updateFetchedClient(nodeId, client);
@ -116,7 +114,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
}); });
} }
private void updateFetchedClient(String nodeId, LwM2mClient client) { private void updateFetchedClient(String nodeId, LwM2MClient client) {
boolean updated = false; boolean updated = false;
if (client.getRegistration() != null) { if (client.getRegistration() != null) {
lwM2mClientsByRegistrationId.put(client.getRegistration().getId(), client); lwM2mClientsByRegistrationId.put(client.getRegistration().getId(), client);
@ -132,7 +130,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public Optional<TransportProtos.SessionInfoProto> register(LwM2mClient client, Registration registration) throws LwM2MClientStateException { public Optional<TransportProtos.SessionInfoProto> register(LwM2MClient client, Registration registration) throws LwM2MClientStateException {
TransportProtos.SessionInfoProto oldSession; TransportProtos.SessionInfoProto oldSession;
client.lock(); client.lock();
try { try {
@ -174,7 +172,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public boolean asleep(LwM2mClient client) { public boolean asleep(LwM2MClient client) {
boolean changed = compareAndSetSleepFlag(client, true); boolean changed = compareAndSetSleepFlag(client, true);
if (changed) { if (changed) {
log.debug("[{}] client is sleeping", client.getEndpoint()); log.debug("[{}] client is sleeping", client.getEndpoint());
@ -184,7 +182,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public boolean awake(LwM2mClient client) { public boolean awake(LwM2MClient client) {
onUplink(client); onUplink(client);
boolean changed = compareAndSetSleepFlag(client, false); boolean changed = compareAndSetSleepFlag(client, false);
if (changed) { if (changed) {
@ -195,7 +193,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
return changed; return changed;
} }
private boolean compareAndSetSleepFlag(LwM2mClient client, boolean sleeping) { private boolean compareAndSetSleepFlag(LwM2MClient client, boolean sleeping) {
if (sleeping == client.isAsleep()) { if (sleeping == client.isAsleep()) {
log.trace("[{}] Client is already at sleeping: {}, ignoring event: {}", client.getEndpoint(), client.isAsleep(), sleeping); log.trace("[{}] Client is already at sleeping: {}, ignoring event: {}", client.getEndpoint(), client.isAsleep(), sleeping);
return false; return false;
@ -222,7 +220,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public void updateRegistration(LwM2mClient client, Registration registration) throws LwM2MClientStateException { public void updateRegistration(LwM2MClient client, Registration registration) throws LwM2MClientStateException {
client.lock(); client.lock();
try { try {
if (!LwM2MClientState.REGISTERED.equals(client.getState())) { if (!LwM2MClientState.REGISTERED.equals(client.getState())) {
@ -241,7 +239,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public void unregister(LwM2mClient client, Registration registration) throws LwM2MClientStateException { public void unregister(LwM2MClient client, Registration registration) throws LwM2MClientStateException {
client.lock(); client.lock();
try { try {
if (!LwM2MClientState.REGISTERED.equals(client.getState())) { if (!LwM2MClientState.REGISTERED.equals(client.getState())) {
@ -257,7 +255,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
clientStore.remove(client.getEndpoint()); clientStore.remove(client.getEndpoint());
UUID profileId = client.getProfileId(); UUID profileId = client.getProfileId();
if (profileId != null) { if (profileId != null) {
Optional<LwM2mClient> otherClients = lwM2mClientsByRegistrationId.values().stream().filter(e -> e.getProfileId().equals(profileId)).findFirst(); Optional<LwM2MClient> otherClients = lwM2mClientsByRegistrationId.values().stream().filter(e -> e.getProfileId().equals(profileId)).findFirst();
if (otherClients.isEmpty()) { if (otherClients.isEmpty()) {
profiles.remove(profileId); profiles.remove(profileId);
} }
@ -271,10 +269,10 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public LwM2mClient getClientBySessionInfo(TransportProtos.SessionInfoProto sessionInfo) { public LwM2MClient getClientBySessionInfo(TransportProtos.SessionInfoProto sessionInfo) {
LwM2mClient lwM2mClient = null; LwM2MClient lwM2mClient = null;
UUID sessionId = new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()); UUID sessionId = new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB());
Predicate<LwM2mClient> isClientFilter = c -> Predicate<LwM2MClient> isClientFilter = c ->
sessionId.equals((new UUID(c.getSession().getSessionIdMSB(), c.getSession().getSessionIdLSB()))); sessionId.equals((new UUID(c.getSession().getSessionIdMSB(), c.getSession().getSessionIdLSB())));
if (this.lwM2mClientsByEndpoint.size() > 0) { if (this.lwM2mClientsByEndpoint.size() > 0) {
lwM2mClient = this.lwM2mClientsByEndpoint.values().stream().filter(isClientFilter).findAny().orElse(null); lwM2mClient = this.lwM2mClientsByEndpoint.values().stream().filter(isClientFilter).findAny().orElse(null);
@ -289,14 +287,16 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public String getObjectIdByKeyNameFromProfile(LwM2mClient client, String keyName, boolean isCompositeOperation) { public String getObjectIdByKeyNameFromProfile(LwM2MClient client, String keyName) {
Lwm2mDeviceProfileTransportConfiguration profile = getProfile(client.getProfileId()); Lwm2mDeviceProfileTransportConfiguration profile = getProfile(client.getProfileId());
Set<String> msgException = ConcurrentHashMap.newKeySet(); for (Map.Entry<String, String> entry : profile.getObserveAttr().getKeyName().entrySet()) {
msgException.add(""); String k = entry.getKey();
return profile.getObserveAttr().getKeyName().entrySet().stream() String v = entry.getValue();
.filter(e -> e.getValue().equals(keyName) && (isCompositeOperation || !msgException.add(client.isValidObjectVersion(e.getKey())))).findFirst().orElseThrow( if (v.equals(keyName) && client.isValidObjectVersion(k).isEmpty()) {
() -> new IllegalArgumentException(getMsgException (keyName, msgException)) return k;
).getKey(); }
}
throw new IllegalArgumentException(keyName + " is not configured in the device profile!");
} }
public Registration getRegistration(String registrationId) { public Registration getRegistration(String registrationId) {
@ -305,14 +305,14 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
@Override @Override
public void registerClient(Registration registration, ValidateDeviceCredentialsResponse credentials) { public void registerClient(Registration registration, ValidateDeviceCredentialsResponse credentials) {
LwM2mClient client = getClientByEndpoint(registration.getEndpoint()); LwM2MClient client = getClientByEndpoint(registration.getEndpoint());
client.init(credentials, UUID.randomUUID()); client.init(credentials, UUID.randomUUID());
lwM2mClientsByRegistrationId.put(registration.getId(), client); lwM2mClientsByRegistrationId.put(registration.getId(), client);
profileUpdate(credentials.getDeviceProfile()); profileUpdate(credentials.getDeviceProfile());
} }
@Override @Override
public void update(LwM2mClient client) { public void update(LwM2MClient client) {
client.lock(); client.lock();
try { try {
if (client.getState().equals(LwM2MClientState.REGISTERED)) { if (client.getState().equals(LwM2MClientState.REGISTERED)) {
@ -331,7 +331,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public void sendMsgsAfterSleeping(LwM2mClient lwM2MClient) { public void sendMsgsAfterSleeping(LwM2MClient lwM2MClient) {
if (LwM2MClientState.REGISTERED.equals(lwM2MClient.getState())) { if (LwM2MClientState.REGISTERED.equals(lwM2MClient.getState())) {
PowerMode powerMode = getPowerMode(lwM2MClient); PowerMode powerMode = getPowerMode(lwM2MClient);
if (PowerMode.PSM.equals(powerMode) || PowerMode.E_DRX.equals(powerMode)) { if (PowerMode.PSM.equals(powerMode) || PowerMode.E_DRX.equals(powerMode)) {
@ -347,7 +347,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
} }
private PowerMode getPowerMode(LwM2mClient lwM2MClient) { private PowerMode getPowerMode(LwM2MClient lwM2MClient) {
PowerMode powerMode = lwM2MClient.getPowerMode(); PowerMode powerMode = lwM2MClient.getPowerMode();
if (powerMode == null) { if (powerMode == null) {
Lwm2mDeviceProfileTransportConfiguration deviceProfile = getProfile(lwM2MClient.getProfileId()); Lwm2mDeviceProfileTransportConfiguration deviceProfile = getProfile(lwM2MClient.getProfileId());
@ -357,7 +357,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public Collection<LwM2mClient> getLwM2mClients() { public Collection<LwM2MClient> getLwM2mClients() {
return lwM2mClientsByEndpoint.values(); return lwM2mClientsByEndpoint.values();
} }
@ -388,13 +388,13 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
@Override @Override
public Lwm2mDeviceProfileTransportConfiguration profileUpdate(DeviceProfile deviceProfile) { public Lwm2mDeviceProfileTransportConfiguration profileUpdate(DeviceProfile deviceProfile) {
Lwm2mDeviceProfileTransportConfiguration clientProfile = LwM2mTransportUtil.toLwM2MClientProfile(deviceProfile); Lwm2mDeviceProfileTransportConfiguration clientProfile = LwM2MTransportUtil.toLwM2MClientProfile(deviceProfile);
profiles.put(deviceProfile.getUuidId(), clientProfile); profiles.put(deviceProfile.getUuidId(), clientProfile);
return clientProfile; return clientProfile;
} }
@Override @Override
public Set<String> getSupportedIdVerInClient(LwM2mClient client) { public Set<String> getSupportedIdVerInClient(LwM2MClient client) {
Set<String> clientObjects = ConcurrentHashMap.newKeySet(); Set<String> clientObjects = ConcurrentHashMap.newKeySet();
Arrays.stream(client.getRegistration().getObjectLinks()).forEach(link -> { Arrays.stream(client.getRegistration().getObjectLinks()).forEach(link -> {
LwM2mPath pathIds = new LwM2mPath(link.getUrl()); LwM2mPath pathIds = new LwM2mPath(link.getUrl());
@ -406,18 +406,12 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public LwM2mClient getClientByDeviceId(UUID deviceId) { public LwM2MClient getClientByDeviceId(UUID deviceId) {
return lwM2mClientsByRegistrationId.values().stream().filter(e -> deviceId.equals(e.getDeviceId())).findFirst().orElse(null); return lwM2mClientsByRegistrationId.values().stream().filter(e -> deviceId.equals(e.getDeviceId())).findFirst().orElse(null);
} }
@Override @Override
public ContentFormat getContentFormatComposite(LwM2mClient client) { public boolean isDownlinkAllowed(LwM2MClient client) {
return client.getClientSupportContentFormats().contains(ContentFormat.SENML_JSON) ? ContentFormat.SENML_JSON :
client.getClientSupportContentFormats().contains(ContentFormat.SENML_CBOR) ? ContentFormat.SENML_CBOR : null;
}
@Override
public boolean isDownlinkAllowed(LwM2mClient client) {
PowerMode powerMode = client.getPowerMode(); PowerMode powerMode = client.getPowerMode();
OtherConfiguration profileSettings = null; OtherConfiguration profileSettings = null;
if (powerMode == null) { if (powerMode == null) {
@ -466,7 +460,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public void onUplink(LwM2mClient client) { public void onUplink(LwM2MClient client) {
PowerMode powerMode = client.getPowerMode(); PowerMode powerMode = client.getPowerMode();
OtherConfiguration profileSettings = null; OtherConfiguration profileSettings = null;
if (powerMode == null) { if (powerMode == null) {
@ -524,7 +518,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext {
} }
@Override @Override
public Long getRequestTimeout(LwM2mClient client) { public Long getRequestTimeout(LwM2MClient client) {
Long timeout = null; Long timeout = null;
if (PowerMode.E_DRX.equals(client.getPowerMode()) && client.getEdrxCycle() != null) { if (PowerMode.E_DRX.equals(client.getPowerMode()) && client.getEdrxCycle() != null) {
timeout = client.getEdrxCycle(); timeout = client.getEdrxCycle();

12
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/AbstractTbLwM2MRequestCallback.java

@ -16,18 +16,18 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_WARN; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_ERROR;
@Slf4j @Slf4j
public abstract class AbstractTbLwM2MRequestCallback<R, T> implements DownlinkRequestCallback<R, T> { public abstract class AbstractTbLwM2MRequestCallback<R, T> implements DownlinkRequestCallback<R, T> {
protected final LwM2MTelemetryLogService logService; protected final LwM2MTelemetryLogService logService;
protected final LwM2mClient client; protected final LwM2MClient client;
protected AbstractTbLwM2MRequestCallback(LwM2MTelemetryLogService logService, LwM2mClient client) { protected AbstractTbLwM2MRequestCallback(LwM2MTelemetryLogService logService, LwM2MClient client) {
this.logService = logService; this.logService = logService;
this.client = client; this.client = client;
} }
@ -35,12 +35,12 @@ public abstract class AbstractTbLwM2MRequestCallback<R, T> implements DownlinkRe
@Override @Override
public void onValidationError(String params, String msg) { public void onValidationError(String params, String msg) {
log.trace("[{}] Request [{}] validation failed. Reason: {}", client.getEndpoint(), params, msg); log.trace("[{}] Request [{}] validation failed. Reason: {}", client.getEndpoint(), params, msg);
logService.log(client, String.format("[%s]: Request [%s] validation failed. Reason: %s", LOG_LWM2M_WARN, params, msg)); logService.log(client, String.format("[%s]: Request [%s] validation failed. Reason: %s", LOG_LWM2M_ERROR, params, msg));
} }
@Override @Override
public void onError(String params, Exception e) { public void onError(String params, Exception e) {
log.trace("[{}] Request [{}] processing failed", client.getEndpoint(), params, e); log.trace("[{}] Request [{}] processing failed", client.getEndpoint(), params, e);
logService.log(client, String.format("[%s]: Request [%s] processing failed. Reason: %s", LOG_LWM2M_WARN, params, e)); logService.log(client, String.format("[%s]: Request [%s] processing failed. Reason: %s", LOG_LWM2M_ERROR, params, e));
} }
} }

264
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/DefaultLwM2mDownlinkMsgHandler.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/DefaultLwM2MDownlinkMsgHandler.java

@ -19,7 +19,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.Link; import org.eclipse.leshan.core.Link;
import org.eclipse.leshan.core.LwM2m; import org.eclipse.leshan.core.LwM2m;
import org.eclipse.leshan.core.ResponseCode;
import org.eclipse.leshan.core.attributes.Attribute; import org.eclipse.leshan.core.attributes.Attribute;
import org.eclipse.leshan.core.attributes.AttributeSet; import org.eclipse.leshan.core.attributes.AttributeSet;
import org.eclipse.leshan.core.model.LwM2mModel; import org.eclipse.leshan.core.model.LwM2mModel;
@ -65,21 +64,20 @@ import org.springframework.stereotype.Service;
import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes; import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportContext;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.common.LwM2MExecutorAwareService; import org.thingsboard.server.transport.lwm2m.server.common.LwM2MExecutorAwareService;
import org.thingsboard.server.transport.lwm2m.server.downlink.composite.TbLwM2MReadCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.composite.TbLwM2MReadCompositeRequest;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; import org.thingsboard.server.transport.lwm2m.utils.LwM2MValueConverterImpl;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -96,29 +94,29 @@ import static org.eclipse.leshan.core.attributes.Attribute.MINIMUM_PERIOD;
import static org.eclipse.leshan.core.attributes.Attribute.STEP; import static org.eclipse.leshan.core.attributes.Attribute.STEP;
import static org.eclipse.leshan.core.model.ResourceModel.Type.OBJLNK; import static org.eclipse.leshan.core.model.ResourceModel.Type.OBJLNK;
import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE; import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertMultiResourceValuesFromRpcBody; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromRpcBody;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.createModelsDefault; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.createModelsDefault;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fromVersionedIdToObjectId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.getVerFromPathIdVerOrId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getVerFromPathIdVerOrId;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.validateVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.validateVersionedId;
@Slf4j @Slf4j
@Service @Service
@TbLwM2mTransportComponent @TbLwM2mTransportComponent
@RequiredArgsConstructor @RequiredArgsConstructor
public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService implements LwM2mDownlinkMsgHandler { public class DefaultLwM2MDownlinkMsgHandler extends LwM2MExecutorAwareService implements LwM2MDownlinkMsgHandler {
public LwM2mValueConverterImpl converter; public LwM2MValueConverterImpl converter;
private final LwM2mTransportContext context; private final LwM2MTransportContext context;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2MTelemetryLogService logService; private final LwM2MTelemetryLogService logService;
private final LwM2mClientContext clientContext; private final LwM2MClientContext clientContext;
@PostConstruct @PostConstruct
public void init() { public void init() {
super.init(); super.init();
this.converter = LwM2mValueConverterImpl.getInstance(); this.converter = LwM2MValueConverterImpl.getInstance();
} }
@PreDestroy @PreDestroy
@ -137,7 +135,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendReadRequest(LwM2mClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback) { public void sendReadRequest(LwM2MClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback) {
try { try {
validateVersionedId(client, request); validateVersionedId(client, request);
ReadRequest downlink = new ReadRequest(getReadRequestContentFormat(client, request, this.config.getModelProvider()), request.getObjectId()); ReadRequest downlink = new ReadRequest(getReadRequestContentFormat(client, request, this.config.getModelProvider()), request.getObjectId());
@ -148,10 +146,10 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendReadCompositeRequest(LwM2mClient client, TbLwM2MReadCompositeRequest request, public void sendReadCompositeRequest(LwM2MClient client, TbLwM2MReadCompositeRequest request,
DownlinkRequestCallback<ReadCompositeRequest, ReadCompositeResponse> callback, ContentFormat contentFormatComposite) { DownlinkRequestCallback<ReadCompositeRequest, ReadCompositeResponse> callback, ContentFormat compositeContentFormat) {
try { try {
ReadCompositeRequest downlink = new ReadCompositeRequest(contentFormatComposite, contentFormatComposite, request.getObjectIds()); ReadCompositeRequest downlink = new ReadCompositeRequest(compositeContentFormat, compositeContentFormat, request.getObjectIds());
sendCompositeRequest(client, downlink, this.config.getTimeout(), callback); sendCompositeRequest(client, downlink, this.config.getTimeout(), callback);
} catch (InvalidRequestException e) { } catch (InvalidRequestException e) {
callback.onValidationError(request.toString(), e.getMessage()); callback.onValidationError(request.toString(), e.getMessage());
@ -159,7 +157,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendObserveRequest(LwM2mClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback) { public void sendObserveRequest(LwM2MClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback) {
try { try {
validateVersionedId(client, request); validateVersionedId(client, request);
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
@ -185,19 +183,19 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendObserveAllRequest(LwM2mClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback) { public void sendObserveAllRequest(LwM2MClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback) {
Set<Observation> observations = context.getServer().getObservationService().getObservations(client.getRegistration()); Set<Observation> observations = context.getServer().getObservationService().getObservations(client.getRegistration());
Set<String> paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet()); Set<String> paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet());
callback.onSuccess(request, paths); callback.onSuccess(request, paths);
} }
@Override @Override
public void sendDiscoverAllRequest(LwM2mClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback) { public void sendDiscoverAllRequest(LwM2MClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback) {
callback.onSuccess(request, Arrays.asList(client.getRegistration().getSortedObjectLinks())); callback.onSuccess(request, Arrays.asList(client.getRegistration().getSortedObjectLinks()));
} }
@Override @Override
public void sendExecuteRequest(LwM2mClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback) { public void sendExecuteRequest(LwM2MClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback) {
try { try {
validateVersionedId(client, request); validateVersionedId(client, request);
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(request.getVersionedId())); LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(request.getVersionedId()));
@ -209,19 +207,19 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
if (resourceModelExecute == null) { if (resourceModelExecute == null) {
callback.onValidationError(request.toString(), "ResourceModel with " + request.getVersionedId() + " is absent in system. Need ddd Lwm2m Model with id=" + callback.onValidationError(request.toString(), "ResourceModel with " + request.getVersionedId() +
pathIds.getObjectId() + " ver=" + getVerFromPathIdVerOrId(request.getVersionedId()) + " to profile."); " is absent in system. Need ddd Lwm2m Model with id=" + pathIds.getObjectId() + " ver=" +
} getVerFromPathIdVerOrId(request.getVersionedId()) + " to profile.");
else if (resourceModelExecute.operations.isExecutable()) { } else if (resourceModelExecute.operations.isExecutable()) {
ExecuteRequest downlink; ExecuteRequest downlink;
if (request.getParams() != null && !resourceModelExecute.multiple) { if (request.getParams() != null && !resourceModelExecute.multiple) {
downlink = new ExecuteRequest(request.getObjectId(), (String) this.converter.convertValue(request.getParams(), resourceModelExecute.type, ResourceModel.Type.STRING, new LwM2mPath(request.getObjectId()))); downlink = new ExecuteRequest(request.getObjectId(), (String) this.converter.convertValue(request.getParams(),
resourceModelExecute.type, ResourceModel.Type.STRING, new LwM2mPath(request.getObjectId())));
} else { } else {
downlink = new ExecuteRequest(request.getObjectId()); downlink = new ExecuteRequest(request.getObjectId());
} }
sendSimpleRequest(client, downlink, request.getTimeout(), callback); sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} } else {
else {
callback.onValidationError(request.toString(), "Resource with " + request.getVersionedId() + " is not executable."); callback.onValidationError(request.toString(), "Resource with " + request.getVersionedId() + " is not executable.");
} }
} catch (InvalidRequestException e) { } catch (InvalidRequestException e) {
@ -230,7 +228,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendDeleteRequest(LwM2mClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback) { public void sendDeleteRequest(LwM2MClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback) {
try { try {
validateVersionedId(client, request); validateVersionedId(client, request);
sendSimpleRequest(client, new DeleteRequest(request.getObjectId()), request.getTimeout(), callback); sendSimpleRequest(client, new DeleteRequest(request.getObjectId()), request.getTimeout(), callback);
@ -240,20 +238,20 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendCancelObserveRequest(LwM2mClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) { public void sendCancelObserveRequest(LwM2MClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) {
validateVersionedId(client, request); validateVersionedId(client, request);
int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration(), request.getObjectId()); int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration(), request.getObjectId());
callback.onSuccess(request, observeCancelCnt); callback.onSuccess(request, observeCancelCnt);
} }
@Override @Override
public void sendCancelAllRequest(LwM2mClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) { public void sendCancelAllRequest(LwM2MClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) {
int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration()); int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration());
callback.onSuccess(request, observeCancelCnt); callback.onSuccess(request, observeCancelCnt);
} }
@Override @Override
public void sendDiscoverRequest(LwM2mClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) { public void sendDiscoverRequest(LwM2MClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) {
validateVersionedId(client, request); validateVersionedId(client, request);
sendSimpleRequest(client, new DiscoverRequest(request.getObjectId()), request.getTimeout(), callback); sendSimpleRequest(client, new DiscoverRequest(request.getObjectId()), request.getTimeout(), callback);
} }
@ -271,7 +269,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
* addAttribute(attributes, OBJECT_VERSION, params.getVer(), StringUtils::isNotEmpty, Function.identity()); * addAttribute(attributes, OBJECT_VERSION, params.getVer(), StringUtils::isNotEmpty, Function.identity());
*/ */
@Override @Override
public void sendWriteAttributesRequest(LwM2mClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback) { public void sendWriteAttributesRequest(LwM2MClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback) {
try { try {
validateVersionedId(client, request); validateVersionedId(client, request);
if (request.getAttributes() == null) { if (request.getAttributes() == null) {
@ -292,7 +290,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendWriteReplaceRequest(LwM2mClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { public void sendWriteReplaceRequest(LwM2MClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) {
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
if (resultIds.isResource() || resultIds.isResourceInstance()) { if (resultIds.isResource() || resultIds.isResourceInstance()) {
validateVersionedId(client, request); validateVersionedId(client, request);
@ -301,12 +299,15 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider()); ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
try { try {
WriteRequest downlink = null; WriteRequest downlink = null;
String msgError = "";
if (resourceModelWrite.multiple) { if (resourceModelWrite.multiple) {
if (request.getValue() instanceof Map && ((Map) request.getValue()).size() > 0) { try {
Map value = convertMultiResourceValuesFromRpcBody(request.getValue(), resourceModelWrite.type, request.getObjectId());
downlink = new WriteRequest(contentFormat, resultIds.getObjectId(), resultIds.getObjectInstanceId(), resultIds.getResourceId(), downlink = new WriteRequest(contentFormat, resultIds.getObjectId(), resultIds.getObjectInstanceId(), resultIds.getResourceId(),
(Map<Integer, ?>) request.getValue(), resourceModelWrite.type); value, resourceModelWrite.type);
} else { } catch (Exception e) {
callback.onValidationError(toString(request), "Resource value is: " + request.getValue().getClass().getSimpleName() + ". Value of Multi-Instance Resource must be in Json format!"); msgError = "Resource id=" + resultIds.toString() + ", value = " + request.getValue() +
", class = " + request.getValue().getClass().getSimpleName() + "is bad. Value of Multi-Instance Resource must be in Json format!";
} }
} else { } else {
downlink = this.getWriteRequestSingleResource(resourceModelWrite.type, contentFormat, downlink = this.getWriteRequestSingleResource(resourceModelWrite.type, contentFormat,
@ -315,7 +316,10 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
if (downlink != null) { if (downlink != null) {
sendSimpleRequest(client, downlink, request.getTimeout(), callback); sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} else { } else {
callback.onValidationError(toString(request), "WriteRequest is null."); if (msgError.isEmpty()) {
msgError = "WriteRequest is null.";
}
callback.onValidationError(toString(request), msgError);
} }
} catch (Exception e) { } catch (Exception e) {
callback.onError(toString(request), e); callback.onError(toString(request), e);
@ -330,7 +334,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendWriteCompositeRequest(LwM2mClient client, RpcWriteCompositeRequest rpcWriteCompositeRequest, public void sendWriteCompositeRequest(LwM2MClient client, RpcWriteCompositeRequest rpcWriteCompositeRequest,
DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback, ContentFormat contentFormatComposite) { DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback, ContentFormat contentFormatComposite) {
try { try {
WriteCompositeRequest downlink = new WriteCompositeRequest(contentFormatComposite, rpcWriteCompositeRequest.getNodes()); WriteCompositeRequest downlink = new WriteCompositeRequest(contentFormatComposite, rpcWriteCompositeRequest.getNodes());
@ -344,110 +348,121 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
@Override @Override
public void sendWriteUpdateRequest(LwM2mClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { public void sendWriteUpdateRequest(LwM2MClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) {
try { try {
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
if (resultIds.isObjectInstance() || resultIds.isResource()) { if (resultIds.isObjectInstance() || resultIds.isResource()) {
validateVersionedId(client, request); validateVersionedId(client, request);
WriteRequest downlink = null; WriteRequest downlink = null;
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider()); ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
if (resultIds.isObjectInstance()) { String msgError = "";
/* if (resultIds.isObjectInstance()) {
* params = "{\"id\":0,\"value\":[{\"id\":14,\"value\":\"+5\"},{\"id\":15,\"value\":\"+9\"}]}" /*
* int rscId = resultIds.getObjectInstanceId(); * params = "{\"id\":0,\"value\":[{\"id\":14,\"value\":\"+5\"},{\"id\":15,\"value\":\"+9\"}]}"
* contentFormat – Format of the payload (TLV or JSON). * int rscId = resultIds.getObjectInstanceId();
*/ * contentFormat – Format of the payload (TLV or JSON).
Collection<LwM2mResource> resources = client.getNewResourcesForInstance(request.getVersionedId(), request.getValue(), this.config.getModelProvider(), this.converter); */
if (resources.size() > 0) { Collection<LwM2mResource> resources = client.getNewResourcesForInstance(request.getVersionedId(),
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), resultIds.getObjectInstanceId(), resources); request.getValue(), this.config.getModelProvider(), this.converter);
} else { if (resources.size() > 0) {
callback.onValidationError(toString(request), "No resources to update!"); downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(),
} resultIds.getObjectInstanceId(), resources);
} else {
msgError = " No resources to update!";
} }
else if (resultIds.isResource()) { } else if (resultIds.isResource()) {
ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider()); ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider());
if (resourceModelWrite != null) { if (resourceModelWrite != null) {
if (resourceModelWrite.multiple) { if (resourceModelWrite.multiple) {
if (request.getValue() instanceof Map && ((Map) request.getValue()).size() > 0) { try {
Map value = convertMultiResourceValuesFromRpcBody((LinkedHashMap) request.getValue(), resourceModelWrite.type, request.getObjectId()); Map value = convertMultiResourceValuesFromRpcBody(request.getValue(), resourceModelWrite.type, request.getObjectId());
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), resultIds.getObjectInstanceId(), resultIds.getResourceId(), downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(),
value, resourceModelWrite.type); resultIds.getObjectInstanceId(), resultIds.getResourceId(),
} else { value, resourceModelWrite.type);
callback.onValidationError(toString(request), "Resource value is bad. Format: " + request.getValue().getClass().getSimpleName() + ". Value of Multi-Instance Resource must be in Json format!"); } catch (Exception e1) {
} msgError = " Resource id=" + resultIds.toString() +
", class = " + request.getValue().getClass().getSimpleName() +
", value = " + request.getValue() + " is bad. " +
"Value of Multi-Instance Resource must be in Json format!";
} }
} else {
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + " is not configured in the device profile!");
} }
}
if (downlink != null) {
sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} else { } else {
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + ". This operation can only be used for ObjectInstance or Multi-Instance Resource !"); msgError = " Resource " + request.getVersionedId() + " is not configured in the device profile!";
} }
} }
else { if (downlink != null) {
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + ". This operation can only be used for ObjectInstance or Resource (multiple)"); sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} else {
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() +
". This operation can only be used for ObjectInstance or Multi-Instance Resource !" + msgError);
}
} else {
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() +
". This operation can only be used for ObjectInstance or Resource (multiple)");
} }
} catch (Exception e) { } catch (Exception e) {
callback.onValidationError(toString(request), e.getMessage()); callback.onValidationError(toString(request), e.getMessage());
} }
} }
public void sendCreateRequest(LwM2mClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback) { public void sendCreateRequest(LwM2MClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback) {
validateVersionedId(client, request); validateVersionedId(client, request);
CreateRequest downlink = null; CreateRequest downlink = null;
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
ObjectModel objectModel = client.getObjectModel(request.getObjectId(), this.config.getModelProvider()); ObjectModel objectModel = client.getObjectModel(request.getVersionedId(), this.config.getModelProvider());
// POST /{Object ID}/{Object Instance ID} && Resources is Mandatory // POST /{Object ID}/{Object Instance ID} && Resources is Mandatory
if (objectModel.multiple) { if (objectModel != null) {
// LwM2M CBOR, SenML CBOR, SenML JSON, or TLV (see [LwM2M-CORE]) if (objectModel.multiple) {
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
if (resultIds.isObject() || resultIds.isObjectInstance()) { // LwM2M CBOR, SenML CBOR, SenML JSON, or TLV (see [LwM2M-CORE])
Collection<LwM2mResource> resources; ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
if (resultIds.isObject()) { if (resultIds.isObject() || resultIds.isObjectInstance()) {
// contentFormat = ContentFormat.TLV; Collection<LwM2mResource> resources;
if (request.getValue() != null) { if (resultIds.isObject()) {
if (request.getValue() != null) {
resources = client.getNewResourcesForInstance(request.getVersionedId(), request.getValue(), this.config.getModelProvider(), this.converter);
downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), resources);
} else if (request.getNodes() != null && request.getNodes().size() > 0) {
Set<LwM2mObjectInstance> instances = ConcurrentHashMap.newKeySet();
request.getNodes().forEach((key, value) -> {
Collection<LwM2mResource> resourcesForInstance = client.getNewResourcesForInstance(request.getVersionedId(), value, this.config.getModelProvider(), this.converter);
LwM2mObjectInstance instance = new LwM2mObjectInstance(Integer.parseInt(key), resourcesForInstance);
instances.add(instance);
});
LwM2mObjectInstance[] instanceArrays = instances.toArray(new LwM2mObjectInstance[instances.size()]);
downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), instanceArrays);
}
} else {
resources = client.getNewResourcesForInstance(request.getVersionedId(), request.getValue(), this.config.getModelProvider(), this.converter); resources = client.getNewResourcesForInstance(request.getVersionedId(), request.getValue(), this.config.getModelProvider(), this.converter);
downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), resources); LwM2mObjectInstance instance = new LwM2mObjectInstance(resultIds.getObjectInstanceId(), resources);
} else if (request.getNodes() != null && request.getNodes().size() > 0) { downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), instance);
Set<LwM2mObjectInstance> instances = ConcurrentHashMap.newKeySet();
request.getNodes().forEach((key, value) -> {
Collection<LwM2mResource> resourcesForInstance = client.getNewResourcesForInstance(request.getVersionedId(), value, this.config.getModelProvider(), this.converter);
LwM2mObjectInstance instance = new LwM2mObjectInstance(Integer.parseInt(key), resourcesForInstance);
instances.add(instance);
});
LwM2mObjectInstance[] instanceArrays = instances.toArray(new LwM2mObjectInstance[instances.size()]);
downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), instanceArrays);
} }
}
if (downlink != null) {
sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} else { } else {
resources = client.getNewResourcesForInstance(request.getVersionedId(), request.getValue(), this.config.getModelProvider(), this.converter); callback.onValidationError(toString(request), "Path " + request.getVersionedId() +
LwM2mObjectInstance instance = new LwM2mObjectInstance(resultIds.getObjectInstanceId(), resources); ". Object must be Multiple !");
downlink = new CreateRequest(contentFormat, resultIds.getObjectId(), instance);
} }
}
if (downlink != null) {
sendSimpleRequest(client, downlink, request.getTimeout(), callback);
} else { } else {
callback.onValidationError(toString(request), "Path " + request.getVersionedId() + throw new IllegalArgumentException("Path " + request.getVersionedId() + ". Object must be Multiple !");
". This operation can only be used for created new ObjectInstance !");
} }
} else { } else {
throw new IllegalArgumentException("Path " + request.getVersionedId() + callback.onValidationError(toString(request), "Resource " + request.getVersionedId() +
". Object must be Multiple !"); " is not configured in the device profile!");
} }
} }
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendSimpleRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendSimpleRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) {
sendRequest(client, request, timeoutInMs, callback, r -> request.getPath().toString()); sendRequest(client, request, timeoutInMs, callback, r -> request.getPath().toString());
} }
private <R extends CompositeDownlinkRequest<T>, T extends LwM2mResponse> void sendCompositeRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { private <R extends CompositeDownlinkRequest<T>, T extends LwM2mResponse> void sendCompositeRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) {
sendRequest(client, request, timeoutInMs, callback, r -> request.getPaths().toString()); sendRequest(client, request, timeoutInMs, callback, r -> request.getPaths().toString());
} }
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void sendRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback, Function<R, String> pathToStringFunction) { private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void sendRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback, Function<R, String> pathToStringFunction) {
if (!clientContext.isDownlinkAllowed(client)) { if (!clientContext.isDownlinkAllowed(client)) {
log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint()); log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint());
return; return;
@ -472,7 +487,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendWriteCompositeRequest(LwM2mClient client, WriteCompositeRequest request, long timeoutInMs, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback) { private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendWriteCompositeRequest(LwM2MClient client, WriteCompositeRequest request, long timeoutInMs, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback) {
if (!clientContext.isDownlinkAllowed(client)) { if (!clientContext.isDownlinkAllowed(client)) {
log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint()); log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint());
return; return;
@ -500,7 +515,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void handleDownlinkError(LwM2mClient client, R request, DownlinkRequestCallback<R, T> callback, Exception e) { private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void handleDownlinkError(LwM2MClient client, R request, DownlinkRequestCallback<R, T> callback, Exception e) {
log.trace("[{}] Received downlink error: {}.", client.getEndpoint(), e); log.trace("[{}] Received downlink error: {}.", client.getEndpoint(), e);
executor.submit(() -> { executor.submit(() -> {
if (e instanceof TimeoutException || e instanceof ClientSleepingException) { if (e instanceof TimeoutException || e instanceof ClientSleepingException) {
@ -556,7 +571,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private static <T extends HasContentFormat & HasVersionedId> ContentFormat getReadRequestContentFormat(LwM2mClient client, T request, LwM2mModelProvider modelProvider) { private static <T extends HasContentFormat & HasVersionedId> ContentFormat getReadRequestContentFormat(LwM2MClient client, T request, LwM2mModelProvider modelProvider) {
if (request.getRequestContentFormat().isPresent()) { if (request.getRequestContentFormat().isPresent()) {
return request.getRequestContentFormat().get(); return request.getRequestContentFormat().get();
} else { } else {
@ -564,7 +579,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private static ContentFormat getWriteRequestContentFormat(LwM2mClient client, TbLwM2MDownlinkRequest request, LwM2mModelProvider modelProvider) { private static ContentFormat getWriteRequestContentFormat(LwM2MClient client, TbLwM2MDownlinkRequest request, LwM2mModelProvider modelProvider) {
if (request instanceof TbLwM2MWriteReplaceRequest && ((TbLwM2MWriteReplaceRequest) request).getContentFormat() != null) { if (request instanceof TbLwM2MWriteReplaceRequest && ((TbLwM2MWriteReplaceRequest) request).getContentFormat() != null) {
return ((TbLwM2MWriteReplaceRequest) request).getContentFormat(); return ((TbLwM2MWriteReplaceRequest) request).getContentFormat();
} else if (request instanceof TbLwM2MWriteUpdateRequest && ((TbLwM2MWriteUpdateRequest) request).getObjectContentFormat() != null) { } else if (request instanceof TbLwM2MWriteUpdateRequest && ((TbLwM2MWriteUpdateRequest) request).getObjectContentFormat() != null) {
@ -582,20 +597,11 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private static ContentFormat getRequestContentFormat(LwM2mClient client, String versionedId, LwM2mModelProvider modelProvider) { private static ContentFormat getRequestContentFormat(LwM2MClient client, String versionedId, LwM2mModelProvider modelProvider) {
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(versionedId)); LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(versionedId));
if (pathIds.isResourceInstance()) { if (pathIds.isResource() || pathIds.isResourceInstance()) {
ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider);
if (OBJLNK.equals(resourceModel.type)) {
return ContentFormat.LINK;
} else if (OPAQUE.equals(resourceModel.type)) {
return ContentFormat.OPAQUE;
} else {
return findFirst(client.getClientSupportContentFormats(), client.getDefaultContentFormat(), ContentFormat.CBOR, ContentFormat.SENML_CBOR, ContentFormat.SENML_JSON);
}
} else if (pathIds.isResource()) {
ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider); ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider);
if (resourceModel!= null && !resourceModel.multiple) { if (resourceModel!= null && (pathIds.isResourceInstance() || (pathIds.isResource() && !resourceModel.multiple))) {
if (OBJLNK.equals(resourceModel.type)) { if (OBJLNK.equals(resourceModel.type)) {
return ContentFormat.LINK; return ContentFormat.LINK;
} else if (OPAQUE.equals(resourceModel.type)) { } else if (OPAQUE.equals(resourceModel.type)) {
@ -611,7 +617,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
} }
} }
private static ContentFormat getContentFormatForComplex(LwM2mClient client) { private static ContentFormat getContentFormatForComplex(LwM2MClient client) {
if (LwM2m.Version.V1_0.equals(client.getRegistration().getLwM2mVersion())) { if (LwM2m.Version.V1_0.equals(client.getRegistration().getLwM2mVersion())) {
return ContentFormat.TLV; return ContentFormat.TLV;
} else if (LwM2m.Version.V1_1.equals(client.getRegistration().getLwM2mVersion())) { } else if (LwM2m.Version.V1_1.equals(client.getRegistration().getLwM2mVersion())) {
@ -639,7 +645,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
try { try {
return request != null ? request.toString() : ""; return request != null ? request.toString() : "";
} catch (Exception e) { } catch (Exception e) {
log.trace("Failed to convert request to string", e); log.debug("Failed to convert request to string", e);
return request.getClass().getSimpleName(); return request.getClass().getSimpleName();
} }
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/HasVersionedId.java

@ -15,14 +15,14 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil; import org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil;
public interface HasVersionedId { public interface HasVersionedId {
String getVersionedId(); String getVersionedId();
default String getObjectId(){ default String getObjectId(){
return LwM2mTransportUtil.fromVersionedIdToObjectId(getVersionedId()); return LwM2MTransportUtil.fromVersionedIdToObjectId(getVersionedId());
} }
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/HasVersionedIds.java

@ -15,7 +15,7 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil; import org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -27,7 +27,7 @@ public interface HasVersionedIds {
default String[] getObjectIds() { default String[] getObjectIds() {
Set<String> objectIds = ConcurrentHashMap.newKeySet(); Set<String> objectIds = ConcurrentHashMap.newKeySet();
for (String versionedId : getVersionedIds()) { for (String versionedId : getVersionedIds()) {
objectIds.add(LwM2mTransportUtil.fromVersionedIdToObjectId(versionedId)); objectIds.add(LwM2MTransportUtil.fromVersionedIdToObjectId(versionedId));
} }
return objectIds.toArray(String[]::new); return objectIds.toArray(String[]::new);
} }

34
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/LwM2mDownlinkMsgHandler.java → common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/LwM2MDownlinkMsgHandler.java

@ -37,43 +37,43 @@ import org.eclipse.leshan.core.response.ReadResponse;
import org.eclipse.leshan.core.response.WriteAttributesResponse; import org.eclipse.leshan.core.response.WriteAttributesResponse;
import org.eclipse.leshan.core.response.WriteCompositeResponse; import org.eclipse.leshan.core.response.WriteCompositeResponse;
import org.eclipse.leshan.core.response.WriteResponse; import org.eclipse.leshan.core.response.WriteResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.composite.TbLwM2MReadCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.composite.TbLwM2MReadCompositeRequest;
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
public interface LwM2mDownlinkMsgHandler { public interface LwM2MDownlinkMsgHandler {
void sendReadRequest(LwM2mClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback); void sendReadRequest(LwM2MClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback);
void sendReadCompositeRequest(LwM2mClient client, TbLwM2MReadCompositeRequest request, DownlinkRequestCallback<ReadCompositeRequest, ReadCompositeResponse> callback, ContentFormat contentFormatComposite); void sendReadCompositeRequest(LwM2MClient client, TbLwM2MReadCompositeRequest request, DownlinkRequestCallback<ReadCompositeRequest, ReadCompositeResponse> callback, ContentFormat contentFormatComposite);
void sendObserveRequest(LwM2mClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback); void sendObserveRequest(LwM2MClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback);
void sendObserveAllRequest(LwM2mClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback); void sendObserveAllRequest(LwM2MClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback);
void sendExecuteRequest(LwM2mClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback); void sendExecuteRequest(LwM2MClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback);
void sendDeleteRequest(LwM2mClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback); void sendDeleteRequest(LwM2MClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback);
void sendCancelObserveRequest(LwM2mClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback); void sendCancelObserveRequest(LwM2MClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback);
void sendCancelAllRequest(LwM2mClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback); void sendCancelAllRequest(LwM2MClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback);
void sendDiscoverRequest(LwM2mClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback); void sendDiscoverRequest(LwM2MClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback);
void sendDiscoverAllRequest(LwM2mClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback); void sendDiscoverAllRequest(LwM2MClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback);
void sendWriteAttributesRequest(LwM2mClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback); void sendWriteAttributesRequest(LwM2MClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback);
void sendWriteReplaceRequest(LwM2mClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback); void sendWriteReplaceRequest(LwM2MClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback);
void sendWriteCompositeRequest(LwM2mClient client, RpcWriteCompositeRequest nodes, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback, ContentFormat contentFormatComposite); void sendWriteCompositeRequest(LwM2MClient client, RpcWriteCompositeRequest nodes, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback, ContentFormat contentFormatComposite);
void sendWriteUpdateRequest(LwM2mClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback); void sendWriteUpdateRequest(LwM2MClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback);
void sendCreateRequest(LwM2mClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback); void sendCreateRequest(LwM2MClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelAllObserveCallback.java

@ -16,15 +16,15 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_INFO; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
@Slf4j @Slf4j
public class TbLwM2MCancelAllObserveCallback extends AbstractTbLwM2MRequestCallback<TbLwM2MCancelAllRequest, Integer> { public class TbLwM2MCancelAllObserveCallback extends AbstractTbLwM2MRequestCallback<TbLwM2MCancelAllRequest, Integer> {
public TbLwM2MCancelAllObserveCallback(LwM2MTelemetryLogService logService, LwM2mClient client) { public TbLwM2MCancelAllObserveCallback(LwM2MTelemetryLogService logService, LwM2MClient client) {
super(logService, client); super(logService, client);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelAllRequest.java

@ -17,7 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MCancelAllRequest implements TbLwM2MDownlinkRequest<Integer> { public class TbLwM2MCancelAllRequest implements TbLwM2MDownlinkRequest<Integer> {
@ -30,8 +30,8 @@ public class TbLwM2MCancelAllRequest implements TbLwM2MDownlinkRequest<Integer>
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.OBSERVE_CANCEL_ALL; return LwM2MOperationType.OBSERVE_CANCEL_ALL;
} }
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelObserveCallback.java

@ -16,17 +16,17 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_INFO; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
@Slf4j @Slf4j
public class TbLwM2MCancelObserveCallback extends AbstractTbLwM2MRequestCallback<TbLwM2MCancelObserveRequest, Integer> { public class TbLwM2MCancelObserveCallback extends AbstractTbLwM2MRequestCallback<TbLwM2MCancelObserveRequest, Integer> {
private final String versionedId; private final String versionedId;
public TbLwM2MCancelObserveCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String versionedId) { public TbLwM2MCancelObserveCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String versionedId) {
super(logService, client); super(logService, client);
this.versionedId = versionedId; this.versionedId = versionedId;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCancelObserveRequest.java

@ -16,7 +16,7 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MCancelObserveRequest extends AbstractTbLwM2MTargetedDownlinkRequest<Integer> { public class TbLwM2MCancelObserveRequest extends AbstractTbLwM2MTargetedDownlinkRequest<Integer> {
@ -26,8 +26,8 @@ public class TbLwM2MCancelObserveRequest extends AbstractTbLwM2MTargetedDownlink
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.OBSERVE_CANCEL; return LwM2MOperationType.OBSERVE_CANCEL;
} }

11
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCreateRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.CreateResponse; import org.eclipse.leshan.core.response.CreateResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import java.util.Map; import java.util.Map;
@ -30,7 +30,7 @@ public class TbLwM2MCreateRequest extends AbstractTbLwM2MTargetedDownlinkRequest
@Getter @Getter
private final ContentFormat objectContentFormat; private final ContentFormat objectContentFormat;
@Getter @Getter
private final Map<String, Object> nodes;; private final Map<String, Object> nodes;
@Builder @Builder
private TbLwM2MCreateRequest(String versionedId, long timeout, Object value, ContentFormat objectContentFormat, Map<String, Object> nodes) { private TbLwM2MCreateRequest(String versionedId, long timeout, Object value, ContentFormat objectContentFormat, Map<String, Object> nodes) {
@ -41,10 +41,7 @@ public class TbLwM2MCreateRequest extends AbstractTbLwM2MTargetedDownlinkRequest
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.CREATE; return LwM2MOperationType.CREATE;
} }
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MCreateResponseCallback.java

@ -17,13 +17,13 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.eclipse.leshan.core.request.CreateRequest; import org.eclipse.leshan.core.request.CreateRequest;
import org.eclipse.leshan.core.response.CreateResponse; import org.eclipse.leshan.core.response.CreateResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
public class TbLwM2MCreateResponseCallback extends TbLwM2MUplinkTargetedCallback<CreateRequest, CreateResponse> { public class TbLwM2MCreateResponseCallback extends TbLwM2MUplinkTargetedCallback<CreateRequest, CreateResponse> {
public TbLwM2MCreateResponseCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MCreateResponseCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(handler, logService, client, targetId); super(handler, logService, client, targetId);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDeleteCallback.java

@ -17,12 +17,12 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.eclipse.leshan.core.request.DeleteRequest; import org.eclipse.leshan.core.request.DeleteRequest;
import org.eclipse.leshan.core.response.DeleteResponse; import org.eclipse.leshan.core.response.DeleteResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
public class TbLwM2MDeleteCallback extends TbLwM2MTargetedCallback<DeleteRequest, DeleteResponse> { public class TbLwM2MDeleteCallback extends TbLwM2MTargetedCallback<DeleteRequest, DeleteResponse> {
public TbLwM2MDeleteCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MDeleteCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(logService, client, targetId); super(logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDeleteRequest.java

@ -17,7 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import org.eclipse.leshan.core.response.ReadResponse; import org.eclipse.leshan.core.response.ReadResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MDeleteRequest extends AbstractTbLwM2MTargetedDownlinkRequest<ReadResponse> { public class TbLwM2MDeleteRequest extends AbstractTbLwM2MTargetedDownlinkRequest<ReadResponse> {
@ -27,8 +27,8 @@ public class TbLwM2MDeleteRequest extends AbstractTbLwM2MTargetedDownlinkRequest
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.DELETE; return LwM2MOperationType.DELETE;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverAllRequest.java

@ -17,7 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MDiscoverAllRequest implements TbLwM2MDownlinkRequest<String> { public class TbLwM2MDiscoverAllRequest implements TbLwM2MDownlinkRequest<String> {
@ -30,8 +30,8 @@ public class TbLwM2MDiscoverAllRequest implements TbLwM2MDownlinkRequest<String>
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.DISCOVER_ALL; return LwM2MOperationType.DISCOVER_ALL;
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverCallback.java

@ -17,12 +17,12 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.eclipse.leshan.core.request.DiscoverRequest; import org.eclipse.leshan.core.request.DiscoverRequest;
import org.eclipse.leshan.core.response.DiscoverResponse; import org.eclipse.leshan.core.response.DiscoverResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
public class TbLwM2MDiscoverCallback extends TbLwM2MTargetedCallback<DiscoverRequest, DiscoverResponse> { public class TbLwM2MDiscoverCallback extends TbLwM2MTargetedCallback<DiscoverRequest, DiscoverResponse> {
public TbLwM2MDiscoverCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MDiscoverCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(logService, client, targetId); super(logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDiscoverRequest.java

@ -17,7 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import org.eclipse.leshan.core.response.DiscoverResponse; import org.eclipse.leshan.core.response.DiscoverResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MDiscoverRequest extends AbstractTbLwM2MTargetedDownlinkRequest<DiscoverResponse> { public class TbLwM2MDiscoverRequest extends AbstractTbLwM2MTargetedDownlinkRequest<DiscoverResponse> {
@ -27,8 +27,8 @@ public class TbLwM2MDiscoverRequest extends AbstractTbLwM2MTargetedDownlinkReque
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.DISCOVER; return LwM2MOperationType.DISCOVER;
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MDownlinkRequest.java

@ -15,11 +15,11 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public interface TbLwM2MDownlinkRequest<T> { public interface TbLwM2MDownlinkRequest<T> {
LwM2mOperationType getType(); LwM2MOperationType getType();
long getTimeout(); long getTimeout();

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MExecuteCallback.java

@ -17,12 +17,12 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.eclipse.leshan.core.request.ExecuteRequest; import org.eclipse.leshan.core.request.ExecuteRequest;
import org.eclipse.leshan.core.response.ExecuteResponse; import org.eclipse.leshan.core.response.ExecuteResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
public class TbLwM2MExecuteCallback extends TbLwM2MTargetedCallback<ExecuteRequest, ExecuteResponse> { public class TbLwM2MExecuteCallback extends TbLwM2MTargetedCallback<ExecuteRequest, ExecuteResponse> {
public TbLwM2MExecuteCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MExecuteCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(logService, client, targetId); super(logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MExecuteRequest.java

@ -18,7 +18,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.response.ReadResponse; import org.eclipse.leshan.core.response.ReadResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MExecuteRequest extends AbstractTbLwM2MTargetedDownlinkRequest<ReadResponse> { public class TbLwM2MExecuteRequest extends AbstractTbLwM2MTargetedDownlinkRequest<ReadResponse> {
@ -32,8 +32,8 @@ public class TbLwM2MExecuteRequest extends AbstractTbLwM2MTargetedDownlinkReques
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.EXECUTE; return LwM2MOperationType.EXECUTE;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveAllRequest.java

@ -17,7 +17,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import java.util.Set; import java.util.Set;
@ -32,8 +32,8 @@ public class TbLwM2MObserveAllRequest implements TbLwM2MDownlinkRequest<Set<Stri
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.OBSERVE_READ_ALL; return LwM2MOperationType.OBSERVE_READ_ALL;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveCallback.java

@ -18,14 +18,14 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.request.ObserveRequest; import org.eclipse.leshan.core.request.ObserveRequest;
import org.eclipse.leshan.core.response.ObserveResponse; import org.eclipse.leshan.core.response.ObserveResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
public class TbLwM2MObserveCallback extends TbLwM2MUplinkTargetedCallback<ObserveRequest, ObserveResponse> { public class TbLwM2MObserveCallback extends TbLwM2MUplinkTargetedCallback<ObserveRequest, ObserveResponse> {
public TbLwM2MObserveCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MObserveCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(handler, logService, client, targetId); super(handler, logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MObserveRequest.java

@ -18,7 +18,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.ObserveResponse; import org.eclipse.leshan.core.response.ObserveResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import java.util.Optional; import java.util.Optional;
@ -33,8 +33,8 @@ public class TbLwM2MObserveRequest extends AbstractTbLwM2MTargetedDownlinkReques
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.OBSERVE; return LwM2MOperationType.OBSERVE;
} }

26
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MReadCallback.java

@ -16,23 +16,43 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.node.LwM2mSingleResource;
import org.eclipse.leshan.core.request.ReadRequest; import org.eclipse.leshan.core.request.ReadRequest;
import org.eclipse.leshan.core.response.ReadResponse; import org.eclipse.leshan.core.response.ReadResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.eclipse.leshan.core.util.Hex;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
public class TbLwM2MReadCallback extends TbLwM2MUplinkTargetedCallback<ReadRequest, ReadResponse> { public class TbLwM2MReadCallback extends TbLwM2MUplinkTargetedCallback<ReadRequest, ReadResponse> {
public TbLwM2MReadCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MReadCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(handler, logService, client, targetId); super(handler, logService, client, targetId);
} }
@Override @Override
public void onSuccess(ReadRequest request, ReadResponse response) { public void onSuccess(ReadRequest request, ReadResponse response) {
logForBadResponse(response.getCode().getCode(), responseToString (response), request.getClass().getSimpleName());
super.onSuccess(request, response); super.onSuccess(request, response);
handler.onUpdateValueAfterReadResponse(client.getRegistration(), versionedId, response); handler.onUpdateValueAfterReadResponse(client.getRegistration(), versionedId, response);
} }
private String responseToString (ReadResponse response) {
if (response.getContent() instanceof LwM2mSingleResource) {
if (((LwM2mSingleResource) response.getContent()).getType().name().equals("OPAQUE")) {
if (((byte[])((LwM2mSingleResource) response.getContent()).getValue()).length > 0) {
int len = ((byte[])((LwM2mSingleResource) response.getContent()).getValue()).length;
String valueReplace = len + "Bytes";
String valueStr = Hex.encodeHexString((byte[]) (((LwM2mSingleResource) response.getContent()).getValue()));
return response.toString().replace(valueReplace, valueStr);
}
}
return response.toString();
}
else {
return response.toString();
}
}
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MReadRequest.java

@ -18,7 +18,7 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.Builder; import lombok.Builder;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.ReadResponse; import org.eclipse.leshan.core.response.ReadResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import java.util.Optional; import java.util.Optional;
@ -33,8 +33,8 @@ public class TbLwM2MReadRequest extends AbstractTbLwM2MTargetedDownlinkRequest<R
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.READ; return LwM2MOperationType.READ;
} }

57
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MTargetedCallback.java

@ -17,17 +17,14 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.ResponseCode; import org.eclipse.leshan.core.ResponseCode;
import org.eclipse.leshan.core.node.LwM2mSingleResource;
import org.eclipse.leshan.core.response.LwM2mResponse; import org.eclipse.leshan.core.response.LwM2mResponse;
import org.eclipse.leshan.core.response.ReadResponse; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.eclipse.leshan.core.util.Hex;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import java.util.Arrays; import java.util.Arrays;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_ERROR; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_ERROR;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_INFO; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_INFO;
@Slf4j @Slf4j
public abstract class TbLwM2MTargetedCallback<R, T> extends AbstractTbLwM2MRequestCallback<R, T> { public abstract class TbLwM2MTargetedCallback<R, T> extends AbstractTbLwM2MRequestCallback<R, T> {
@ -35,13 +32,13 @@ public abstract class TbLwM2MTargetedCallback<R, T> extends AbstractTbLwM2MReque
protected final String versionedId; protected final String versionedId;
protected final String[] versionedIds; protected final String[] versionedIds;
public TbLwM2MTargetedCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String versionedId) { public TbLwM2MTargetedCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String versionedId) {
super(logService, client); super(logService, client);
this.versionedId = versionedId; this.versionedId = versionedId;
this.versionedIds = null; this.versionedIds = null;
} }
public TbLwM2MTargetedCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String[] versionedIds) { public TbLwM2MTargetedCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String[] versionedIds) {
super(logService, client); super(logService, client);
this.versionedId = null; this.versionedId = null;
this.versionedIds = versionedIds; this.versionedIds = versionedIds;
@ -50,40 +47,22 @@ public abstract class TbLwM2MTargetedCallback<R, T> extends AbstractTbLwM2MReque
@Override @Override
public void onSuccess(R request, T response) { public void onSuccess(R request, T response) {
//TODO convert camelCase to "camel case" using .split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])") //TODO convert camelCase to "camel case" using .split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")
String requestName = request.getClass().getSimpleName(); if (response instanceof LwM2mResponse) {
String responseStr = response.toString(); logForBadResponse(((LwM2mResponse) response).getCode().getCode(), response.toString(), request.getClass().getSimpleName());
int code = 0;
if (response instanceof ReadResponse) {
responseStr = responseToString ((ReadResponse) response);
code = ((ReadResponse) response).getCode().getCode();
}
else if (response instanceof LwM2mResponse) {
code = ((LwM2mResponse) response).getCode().getCode();
}
if (code >= ResponseCode.BAD_REQUEST.getCode()) {
log.error("[{}] [{}] [{}] failed to process successful response [{}] ", client.getEndpoint(), requestName, versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr);
logService.log(client, String.format("[%s]: %s [%s] failed to process successful. Result: %s", LOG_LWM2M_ERROR, requestName, versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr));
}
else {
log.trace("[{}] {} [{}] successful: {}", client.getEndpoint(), requestName, versionedId != null ? versionedId : versionedIds, responseStr);
logService.log(client, String.format("[%s]: %s [%s] successful. Result: %s", LOG_LWM2M_INFO, requestName, versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr));
} }
} }
private String responseToString (ReadResponse response) { public void logForBadResponse(int code, String responseStr, String requestName) {
if (response.getContent() instanceof LwM2mSingleResource) { if (code > ResponseCode.CONTENT_CODE) {
if (((LwM2mSingleResource) response.getContent()).getType().name().equals("OPAQUE")) { log.error("[{}] [{}] [{}] failed to process successful response [{}] ", client.getEndpoint(), requestName,
if (((byte[])((LwM2mSingleResource) response.getContent()).getValue()).length > 0) { versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr);
int len = ((byte[])((LwM2mSingleResource) response.getContent()).getValue()).length; logService.log(client, String.format("[%s]: %s [%s] failed to process successful. Result: %s", LOG_LWM2M_ERROR,
String valueReplace = len + "Bytes"; requestName, versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr));
String valueStr = Hex.encodeHexString((byte[]) (((LwM2mSingleResource) response.getContent()).getValue())); } else {
return response.toString().replace(valueReplace, valueStr); log.trace("[{}] {} [{}] successful: {}", client.getEndpoint(), requestName, versionedId != null ?
} versionedId : versionedIds, responseStr);
} logService.log(client, String.format("[%s]: %s [%s] successful. Result: %s", LOG_LWM2M_INFO, requestName,
return response.toString(); versionedId != null ? versionedId : Arrays.toString(versionedIds), responseStr));
}
else {
return response.toString();
} }
} }
} }

10
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MUplinkTargetedCallback.java

@ -16,21 +16,21 @@
package org.thingsboard.server.transport.lwm2m.server.downlink; package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
public abstract class TbLwM2MUplinkTargetedCallback<R, T> extends TbLwM2MTargetedCallback<R, T> { public abstract class TbLwM2MUplinkTargetedCallback<R, T> extends TbLwM2MTargetedCallback<R, T> {
protected LwM2mUplinkMsgHandler handler; protected LwM2MUplinkMsgHandler handler;
public TbLwM2MUplinkTargetedCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String versionedId) { public TbLwM2MUplinkTargetedCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String versionedId) {
super(logService, client, versionedId); super(logService, client, versionedId);
this.handler = handler; this.handler = handler;
} }
public TbLwM2MUplinkTargetedCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String[] versionedIds) { public TbLwM2MUplinkTargetedCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String[] versionedIds) {
super(logService, client, versionedIds); super(logService, client, versionedIds);
this.handler = handler; this.handler = handler;
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteAttributesCallback.java

@ -17,12 +17,12 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import org.eclipse.leshan.core.request.WriteAttributesRequest; import org.eclipse.leshan.core.request.WriteAttributesRequest;
import org.eclipse.leshan.core.response.WriteAttributesResponse; import org.eclipse.leshan.core.response.WriteAttributesResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
public class TbLwM2MWriteAttributesCallback extends TbLwM2MTargetedCallback<WriteAttributesRequest, WriteAttributesResponse> { public class TbLwM2MWriteAttributesCallback extends TbLwM2MTargetedCallback<WriteAttributesRequest, WriteAttributesResponse> {
public TbLwM2MWriteAttributesCallback(LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MWriteAttributesCallback(LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(logService, client, targetId); super(logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteAttributesRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.response.WriteAttributesResponse; import org.eclipse.leshan.core.response.WriteAttributesResponse;
import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes; import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MWriteAttributesRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteAttributesResponse> { public class TbLwM2MWriteAttributesRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteAttributesResponse> {
@ -33,8 +33,8 @@ public class TbLwM2MWriteAttributesRequest extends AbstractTbLwM2MTargetedDownli
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.WRITE_ATTRIBUTES; return LwM2MOperationType.WRITE_ATTRIBUTES;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteReplaceRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.WriteResponse; import org.eclipse.leshan.core.response.WriteResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MWriteReplaceRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteResponse> { public class TbLwM2MWriteReplaceRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteResponse> {
@ -36,8 +36,8 @@ public class TbLwM2MWriteReplaceRequest extends AbstractTbLwM2MTargetedDownlinkR
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.WRITE_REPLACE; return LwM2MOperationType.WRITE_REPLACE;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteResponseCallback.java

@ -18,14 +18,14 @@ package org.thingsboard.server.transport.lwm2m.server.downlink;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.request.WriteRequest; import org.eclipse.leshan.core.request.WriteRequest;
import org.eclipse.leshan.core.response.WriteResponse; import org.eclipse.leshan.core.response.WriteResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
public class TbLwM2MWriteResponseCallback extends TbLwM2MUplinkTargetedCallback<WriteRequest, WriteResponse> { public class TbLwM2MWriteResponseCallback extends TbLwM2MUplinkTargetedCallback<WriteRequest, WriteResponse> {
public TbLwM2MWriteResponseCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MWriteResponseCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(handler, logService, client, targetId); super(handler, logService, client, targetId);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/TbLwM2MWriteUpdateRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.WriteResponse; import org.eclipse.leshan.core.response.WriteResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
public class TbLwM2MWriteUpdateRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteResponse> { public class TbLwM2MWriteUpdateRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteResponse> {
@ -36,8 +36,8 @@ public class TbLwM2MWriteUpdateRequest extends AbstractTbLwM2MTargetedDownlinkRe
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.WRITE_UPDATE; return LwM2MOperationType.WRITE_UPDATE;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MReadCompositeCallback.java

@ -18,15 +18,15 @@ package org.thingsboard.server.transport.lwm2m.server.downlink.composite;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.request.ReadCompositeRequest; import org.eclipse.leshan.core.request.ReadCompositeRequest;
import org.eclipse.leshan.core.response.ReadCompositeResponse; import org.eclipse.leshan.core.response.ReadCompositeResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MUplinkTargetedCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MUplinkTargetedCallback;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
public class TbLwM2MReadCompositeCallback extends TbLwM2MUplinkTargetedCallback<ReadCompositeRequest, ReadCompositeResponse> { public class TbLwM2MReadCompositeCallback extends TbLwM2MUplinkTargetedCallback<ReadCompositeRequest, ReadCompositeResponse> {
public TbLwM2MReadCompositeCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String[] versionedIds) { public TbLwM2MReadCompositeCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String[] versionedIds) {
super(handler, logService, client, versionedIds); super(handler, logService, client, versionedIds);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MReadCompositeRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.ReadCompositeResponse; import org.eclipse.leshan.core.response.ReadCompositeResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import org.thingsboard.server.transport.lwm2m.server.downlink.HasContentFormat; import org.thingsboard.server.transport.lwm2m.server.downlink.HasContentFormat;
import java.util.Optional; import java.util.Optional;
@ -40,8 +40,8 @@ public class TbLwM2MReadCompositeRequest extends AbstractTbLwM2MTargetedDownlink
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.READ_COMPOSITE; return LwM2MOperationType.READ_COMPOSITE;
} }
@Override @Override

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MWriteCompositeRequest.java

@ -19,7 +19,7 @@ import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import org.eclipse.leshan.core.request.ContentFormat; import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.response.WriteCompositeResponse; import org.eclipse.leshan.core.response.WriteCompositeResponse;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import org.thingsboard.server.transport.lwm2m.server.downlink.AbstractTbLwM2MTargetedDownlinkRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.AbstractTbLwM2MTargetedDownlinkRequest;
public class TbLwM2MWriteCompositeRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteCompositeResponse> { public class TbLwM2MWriteCompositeRequest extends AbstractTbLwM2MTargetedDownlinkRequest<WriteCompositeResponse> {
@ -37,8 +37,8 @@ public class TbLwM2MWriteCompositeRequest extends AbstractTbLwM2MTargetedDownlin
} }
@Override @Override
public LwM2mOperationType getType() { public LwM2MOperationType getType() {
return LwM2mOperationType.WRITE_REPLACE; return LwM2MOperationType.WRITE_REPLACE;
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/downlink/composite/TbLwM2MWriteResponseCompositeCallback.java

@ -17,14 +17,14 @@ package org.thingsboard.server.transport.lwm2m.server.downlink.composite;
import org.eclipse.leshan.core.request.WriteCompositeRequest; import org.eclipse.leshan.core.request.WriteCompositeRequest;
import org.eclipse.leshan.core.response.WriteCompositeResponse; import org.eclipse.leshan.core.response.WriteCompositeResponse;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MUplinkTargetedCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MUplinkTargetedCallback;
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
public class TbLwM2MWriteResponseCompositeCallback extends TbLwM2MUplinkTargetedCallback<WriteCompositeRequest, WriteCompositeResponse> { public class TbLwM2MWriteResponseCompositeCallback extends TbLwM2MUplinkTargetedCallback<WriteCompositeRequest, WriteCompositeResponse> {
public TbLwM2MWriteResponseCompositeCallback(LwM2mUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2mClient client, String targetId) { public TbLwM2MWriteResponseCompositeCallback(LwM2MUplinkMsgHandler handler, LwM2MTelemetryLogService logService, LwM2MClient client, String targetId) {
super(handler, logService, client, targetId); super(handler, logService, client, targetId);
} }

10
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/log/DefaultLwM2MTelemetryLogService.java

@ -19,10 +19,10 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportServerHelper;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_TELEMETRY; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_TELEMETRY;
@Slf4j @Slf4j
@Service @Service
@ -30,10 +30,10 @@ import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LO
@RequiredArgsConstructor @RequiredArgsConstructor
public class DefaultLwM2MTelemetryLogService implements LwM2MTelemetryLogService { public class DefaultLwM2MTelemetryLogService implements LwM2MTelemetryLogService {
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
@Override @Override
public void log(LwM2mClient client, String logMsg) { public void log(LwM2MClient client, String logMsg) {
if (logMsg != null && client != null && client.getSession() != null) { if (logMsg != null && client != null && client.getSession() != null) {
if (logMsg.length() > 1024) { if (logMsg.length() > 1024) {
logMsg = logMsg.substring(0, 1024); logMsg = logMsg.substring(0, 1024);

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/log/LwM2MTelemetryLogService.java

@ -15,10 +15,10 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.log; package org.thingsboard.server.transport.lwm2m.server.log;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
public interface LwM2MTelemetryLogService { public interface LwM2MTelemetryLogService {
void log(LwM2mClient client, String msg); void log(LwM2MClient client, String msg);
} }

84
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/DefaultLwM2MOtaUpdateService.java

@ -34,12 +34,12 @@ import org.thingsboard.server.common.transport.TransportServiceCallback;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper; import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportServerHelper;
import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService; import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.common.LwM2MExecutorAwareService; import org.thingsboard.server.transport.lwm2m.server.common.LwM2MExecutorAwareService;
import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2mDownlinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2MDownlinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteCallback;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MExecuteRequest;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteReplaceRequest;
@ -55,7 +55,7 @@ import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MSoftwareU
import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateResult; import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateResult;
import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateState; import org.thingsboard.server.transport.lwm2m.server.ota.software.SoftwareUpdateState;
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MClientOtaInfoStore; import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MClientOtaInfoStore;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
@ -74,8 +74,8 @@ import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDA
import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING; import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING;
import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.VERIFIED; import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.VERIFIED;
import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey; import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.LOG_LWM2M_TELEMETRY; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.LOG_LWM2M_TELEMETRY;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertObjectIdToVersionedId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertObjectIdToVersionedId;
@Slf4j @Slf4j
@Service @Service
@ -124,13 +124,13 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
private final Map<String, LwM2MClientSwOtaInfo> swStates = new ConcurrentHashMap<>(); private final Map<String, LwM2MClientSwOtaInfo> swStates = new ConcurrentHashMap<>();
private final TransportService transportService; private final TransportService transportService;
private final LwM2mClientContext clientContext; private final LwM2MClientContext clientContext;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2mUplinkMsgHandler uplinkHandler; private final LwM2MUplinkMsgHandler uplinkHandler;
private final LwM2mDownlinkMsgHandler downlinkHandler; private final LwM2MDownlinkMsgHandler downlinkHandler;
private final OtaPackageDataCache otaPackageDataCache; private final OtaPackageDataCache otaPackageDataCache;
private final LwM2MTelemetryLogService logService; private final LwM2MTelemetryLogService logService;
private final LwM2mTransportServerHelper helper; private final LwM2MTransportServerHelper helper;
private final TbLwM2MClientOtaInfoStore otaInfoStore; private final TbLwM2MClientOtaInfoStore otaInfoStore;
@Autowired @Autowired
@ -158,7 +158,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void init(LwM2mClient client) { public void init(LwM2MClient client) {
//TODO: add locks by client fwInfo. //TODO: add locks by client fwInfo.
//TODO: check that the client supports FW and SW by checking the supported objects in the model. //TODO: check that the client supports FW and SW by checking the supported objects in the model.
List<String> attributesToFetch = new ArrayList<>(); List<String> attributesToFetch = new ArrayList<>();
@ -213,7 +213,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void forceFirmwareUpdate(LwM2mClient client) { public void forceFirmwareUpdate(LwM2MClient client) {
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.setRetryAttempts(0); fwInfo.setRetryAttempts(0);
fwInfo.setFailedPackageId(null); fwInfo.setFailedPackageId(null);
@ -221,7 +221,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onTargetFirmwareUpdate(LwM2mClient client, String newFirmwareTitle, String newFirmwareVersion, Optional<String> newFirmwareUrl, Optional<String> newFirmwareTag) { public void onTargetFirmwareUpdate(LwM2MClient client, String newFirmwareTitle, String newFirmwareVersion, Optional<String> newFirmwareUrl, Optional<String> newFirmwareTag) {
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.updateTarget(newFirmwareTitle, newFirmwareVersion, newFirmwareUrl, newFirmwareTag); fwInfo.updateTarget(newFirmwareTitle, newFirmwareVersion, newFirmwareUrl, newFirmwareTag);
update(fwInfo); update(fwInfo);
@ -229,19 +229,19 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onCurrentFirmwareNameUpdate(LwM2mClient client, String name) { public void onCurrentFirmwareNameUpdate(LwM2MClient client, String name) {
log.debug("[{}] Current fw name: {}", client.getEndpoint(), name); log.debug("[{}] Current fw name: {}", client.getEndpoint(), name);
getOrInitFwInfo(client).setCurrentName(name); getOrInitFwInfo(client).setCurrentName(name);
} }
@Override @Override
public void onCurrentSoftwareNameUpdate(LwM2mClient client, String name) { public void onCurrentSoftwareNameUpdate(LwM2MClient client, String name) {
log.debug("[{}] Current sw name: {}", client.getEndpoint(), name); log.debug("[{}] Current sw name: {}", client.getEndpoint(), name);
getOrInitSwInfo(client).setCurrentName(name); getOrInitSwInfo(client).setCurrentName(name);
} }
@Override @Override
public void onFirmwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) { public void onFirmwareStrategyUpdate(LwM2MClient client, OtherConfiguration configuration) {
log.debug("[{}] Current fw strategy: {}", client.getEndpoint(), configuration.getFwUpdateStrategy()); log.debug("[{}] Current fw strategy: {}", client.getEndpoint(), configuration.getFwUpdateStrategy());
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.setStrategy(LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(configuration.getFwUpdateStrategy())); fwInfo.setStrategy(LwM2MFirmwareUpdateStrategy.fromStrategyFwByCode(configuration.getFwUpdateStrategy()));
@ -250,7 +250,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onCurrentSoftwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration) { public void onCurrentSoftwareStrategyUpdate(LwM2MClient client, OtherConfiguration configuration) {
log.debug("[{}] Current sw strategy: {}", client.getEndpoint(), configuration.getSwUpdateStrategy()); log.debug("[{}] Current sw strategy: {}", client.getEndpoint(), configuration.getSwUpdateStrategy());
LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client); LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
swInfo.setStrategy(LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(configuration.getSwUpdateStrategy())); swInfo.setStrategy(LwM2MSoftwareUpdateStrategy.fromStrategySwByCode(configuration.getSwUpdateStrategy()));
@ -259,21 +259,21 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onCurrentFirmwareVersion3Update(LwM2mClient client, String version) { public void onCurrentFirmwareVersion3Update(LwM2MClient client, String version) {
log.debug("[{}] Current fw version(3): {}", client.getEndpoint(), version); log.debug("[{}] Current fw version(3): {}", client.getEndpoint(), version);
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.setCurrentVersion3(version); fwInfo.setCurrentVersion3(version);
} }
@Override @Override
public void onCurrentFirmwareVersionUpdate(LwM2mClient client, String version) { public void onCurrentFirmwareVersionUpdate(LwM2MClient client, String version) {
log.debug("[{}] Current fw version(5): {}", client.getEndpoint(), version); log.debug("[{}] Current fw version(5): {}", client.getEndpoint(), version);
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.setCurrentVersion(version); fwInfo.setCurrentVersion(version);
} }
@Override @Override
public void onCurrentFirmwareStateUpdate(LwM2mClient client, Long stateCode) { public void onCurrentFirmwareStateUpdate(LwM2MClient client, Long stateCode) {
log.debug("[{}] Current fw state: {}", client.getEndpoint(), stateCode); log.debug("[{}] Current fw state: {}", client.getEndpoint(), stateCode);
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
FirmwareUpdateState state = FirmwareUpdateState.fromStateFwByCode(stateCode.intValue()); FirmwareUpdateState state = FirmwareUpdateState.fromStateFwByCode(stateCode.intValue());
@ -297,7 +297,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onCurrentFirmwareResultUpdate(LwM2mClient client, Long code) { public void onCurrentFirmwareResultUpdate(LwM2MClient client, Long code) {
log.debug("[{}] Current fw result: {}", client.getEndpoint(), code); log.debug("[{}] Current fw result: {}", client.getEndpoint(), code);
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
FirmwareUpdateResult result = FirmwareUpdateResult.fromUpdateResultFwByCode(code.intValue()); FirmwareUpdateResult result = FirmwareUpdateResult.fromUpdateResultFwByCode(code.intValue());
@ -325,26 +325,26 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient client, Long value) { public void onCurrentFirmwareDeliveryMethodUpdate(LwM2MClient client, Long value) {
log.debug("[{}] Current fw delivery method: {}", client.getEndpoint(), value); log.debug("[{}] Current fw delivery method: {}", client.getEndpoint(), value);
LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client); LwM2MClientFwOtaInfo fwInfo = getOrInitFwInfo(client);
fwInfo.setDeliveryMethod(value.intValue()); fwInfo.setDeliveryMethod(value.intValue());
} }
@Override @Override
public void onCurrentSoftwareVersion3Update(LwM2mClient client, String version) { public void onCurrentSoftwareVersion3Update(LwM2MClient client, String version) {
log.debug("[{}] Current sw version(3): {}", client.getEndpoint(), version); log.debug("[{}] Current sw version(3): {}", client.getEndpoint(), version);
getOrInitSwInfo(client).setCurrentVersion3(version); getOrInitSwInfo(client).setCurrentVersion3(version);
} }
@Override @Override
public void onCurrentSoftwareVersionUpdate(LwM2mClient client, String version) { public void onCurrentSoftwareVersionUpdate(LwM2MClient client, String version) {
log.debug("[{}] Current sw version(9): {}", client.getEndpoint(), version); log.debug("[{}] Current sw version(9): {}", client.getEndpoint(), version);
getOrInitSwInfo(client).setCurrentVersion(version); getOrInitSwInfo(client).setCurrentVersion(version);
} }
@Override @Override
public void onCurrentSoftwareStateUpdate(LwM2mClient client, Long stateCode) { public void onCurrentSoftwareStateUpdate(LwM2MClient client, Long stateCode) {
log.debug("[{}] Current sw state: {}", client.getEndpoint(), stateCode); log.debug("[{}] Current sw state: {}", client.getEndpoint(), stateCode);
LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client); LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
SoftwareUpdateState state = SoftwareUpdateState.fromUpdateStateSwByCode(stateCode.intValue()); SoftwareUpdateState state = SoftwareUpdateState.fromUpdateStateSwByCode(stateCode.intValue());
@ -362,7 +362,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
@Override @Override
public void onCurrentSoftwareResultUpdate(LwM2mClient client, Long code) { public void onCurrentSoftwareResultUpdate(LwM2MClient client, Long code) {
log.debug("[{}] Current sw result: {}", client.getEndpoint(), code); log.debug("[{}] Current sw result: {}", client.getEndpoint(), code);
LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client); LwM2MClientSwOtaInfo swInfo = getOrInitSwInfo(client);
SoftwareUpdateResult result = SoftwareUpdateResult.fromUpdateResultSwByCode(code.intValue()); SoftwareUpdateResult result = SoftwareUpdateResult.fromUpdateResultSwByCode(code.intValue());
@ -379,14 +379,14 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
@Override @Override
public void onTargetSoftwareUpdate(LwM2mClient client, String newSoftwareTitle, String newSoftwareVersion, Optional<String> newSoftwareUrl, Optional<String> newSoftwareTag) { public void onTargetSoftwareUpdate(LwM2MClient client, String newSoftwareTitle, String newSoftwareVersion, Optional<String> newSoftwareUrl, Optional<String> newSoftwareTag) {
LwM2MClientSwOtaInfo fwInfo = getOrInitSwInfo(client); LwM2MClientSwOtaInfo fwInfo = getOrInitSwInfo(client);
fwInfo.updateTarget(newSoftwareTitle, newSoftwareVersion, newSoftwareUrl, newSoftwareTag); fwInfo.updateTarget(newSoftwareTitle, newSoftwareVersion, newSoftwareUrl, newSoftwareTag);
update(fwInfo); update(fwInfo);
startSoftwareUpdateIfNeeded(client, fwInfo); startSoftwareUpdateIfNeeded(client, fwInfo);
} }
private void startFirmwareUpdateIfNeeded(LwM2mClient client, LwM2MClientFwOtaInfo fwInfo) { private void startFirmwareUpdateIfNeeded(LwM2MClient client, LwM2MClientFwOtaInfo fwInfo) {
try { try {
if (!fwInfo.isSupported() && fwInfo.isAssigned()) { if (!fwInfo.isSupported() && fwInfo.isAssigned()) {
log.debug("[{}] Fw update is not supported: {}", client.getEndpoint(), fwInfo); log.debug("[{}] Fw update is not supported: {}", client.getEndpoint(), fwInfo);
@ -406,7 +406,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
} }
private void startSoftwareUpdateIfNeeded(LwM2mClient client, LwM2MClientSwOtaInfo swInfo) { private void startSoftwareUpdateIfNeeded(LwM2MClient client, LwM2MClientSwOtaInfo swInfo) {
try { try {
if (!swInfo.isSupported() && swInfo.isAssigned()) { if (!swInfo.isSupported() && swInfo.isAssigned()) {
log.debug("[{}] Sw update is not supported: {}", client.getEndpoint(), swInfo); log.debug("[{}] Sw update is not supported: {}", client.getEndpoint(), swInfo);
@ -431,7 +431,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
} }
public void startUpdateUsingBinary(LwM2mClient client, LwM2MClientSwOtaInfo swInfo) { public void startUpdateUsingBinary(LwM2MClient client, LwM2MClientSwOtaInfo swInfo) {
this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), swInfo.getType().name()), this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), swInfo.getType().name()),
new TransportServiceCallback<>() { new TransportServiceCallback<>() {
@Override @Override
@ -446,13 +446,13 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
}); });
} }
private void startUpdateUsingUrl(LwM2mClient client, String id, String url) { private void startUpdateUsingUrl(LwM2MClient client, String id, String url) {
String targetIdVer = convertObjectIdToVersionedId(id, client.getRegistration()); String targetIdVer = convertObjectIdToVersionedId(id, client.getRegistration());
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(targetIdVer).value(url).timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, targetIdVer)); downlinkHandler.sendWriteReplaceRequest(client, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, client, targetIdVer));
} }
public void startUpdateUsingBinary(LwM2mClient client, LwM2MClientFwOtaInfo fwInfo) { public void startUpdateUsingBinary(LwM2MClient client, LwM2MClientFwOtaInfo fwInfo) {
this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), fwInfo.getType().name()), this.transportService.process(client.getSession(), createOtaPackageRequestMsg(client.getSession(), fwInfo.getType().name()),
new TransportServiceCallback<>() { new TransportServiceCallback<>() {
@Override @Override
@ -467,7 +467,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
}); });
} }
private void doUpdateFirmwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientFwOtaInfo info, LwM2mClient client) { private void doUpdateFirmwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientFwOtaInfo info, LwM2MClient client) {
if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) { if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()); UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
LwM2MFirmwareUpdateStrategy strategy; LwM2MFirmwareUpdateStrategy strategy;
@ -494,7 +494,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
} }
private void doUpdateSoftwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientSwOtaInfo info, LwM2mClient client) { private void doUpdateSoftwareUsingBinary(TransportProtos.GetOtaPackageResponseMsg response, LwM2MClientSwOtaInfo info, LwM2MClient client) {
if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) { if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus())) {
UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB()); UUID otaPackageId = new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB());
LwM2MSoftwareUpdateStrategy strategy = info.getStrategy(); LwM2MSoftwareUpdateStrategy strategy = info.getStrategy();
@ -513,7 +513,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
} }
} }
private void startUpdateUsingBinary(LwM2mClient client, String versionedId, UUID otaPackageId) { private void startUpdateUsingBinary(LwM2MClient client, String versionedId, UUID otaPackageId) {
byte[] firmwareChunk = otaPackageDataCache.get(otaPackageId.toString(), 0, 0); byte[] firmwareChunk = otaPackageDataCache.get(otaPackageId.toString(), 0, 0);
TbLwM2MWriteReplaceRequest writeRequest = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId) TbLwM2MWriteReplaceRequest writeRequest = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId)
.value(firmwareChunk).contentFormat(ContentFormat.OPAQUE) .value(firmwareChunk).contentFormat(ContentFormat.OPAQUE)
@ -531,17 +531,17 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
.build(); .build();
} }
private void executeFwUpdate(LwM2mClient client) { private void executeFwUpdate(LwM2MClient client) {
TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(FW_EXECUTE_ID).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(FW_EXECUTE_ID).timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, FW_EXECUTE_ID)); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, FW_EXECUTE_ID));
} }
private void executeSwInstall(LwM2mClient client) { private void executeSwInstall(LwM2MClient client) {
TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_INSTALL_ID).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_INSTALL_ID).timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID)); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID));
} }
private void executeSwUninstallForUpdate(LwM2mClient client) { private void executeSwUninstallForUpdate(LwM2MClient client) {
TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_UN_INSTALL_ID).params("1").timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MExecuteRequest request = TbLwM2MExecuteRequest.builder().versionedId(SW_UN_INSTALL_ID).params("1").timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID)); downlinkHandler.sendExecuteRequest(client, request, new TbLwM2MExecuteCallback(logService, client, SW_INSTALL_ID));
} }
@ -559,7 +559,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
return Optional.empty(); return Optional.empty();
} }
private LwM2MClientFwOtaInfo getOrInitFwInfo(LwM2mClient client) { private LwM2MClientFwOtaInfo getOrInitFwInfo(LwM2MClient client) {
return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> { return this.fwStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
LwM2MClientFwOtaInfo info = otaInfoStore.getFw(endpoint); LwM2MClientFwOtaInfo info = otaInfoStore.getFw(endpoint);
if (info == null) { if (info == null) {
@ -572,7 +572,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
}); });
} }
private LwM2MClientSwOtaInfo getOrInitSwInfo(LwM2mClient client) { private LwM2MClientSwOtaInfo getOrInitSwInfo(LwM2MClient client) {
return this.swStates.computeIfAbsent(client.getEndpoint(), endpoint -> { return this.swStates.computeIfAbsent(client.getEndpoint(), endpoint -> {
LwM2MClientSwOtaInfo info = otaInfoStore.getSw(endpoint); LwM2MClientSwOtaInfo info = otaInfoStore.getSw(endpoint);
if (info == null) { if (info == null) {
@ -593,7 +593,7 @@ public class DefaultLwM2MOtaUpdateService extends LwM2MExecutorAwareService impl
otaInfoStore.putSw(info); otaInfoStore.putSw(info);
} }
private void sendStateUpdateToTelemetry(LwM2mClient client, LwM2MClientOtaInfo<?, ?, ?> fwInfo, OtaPackageUpdateStatus status, String log) { private void sendStateUpdateToTelemetry(LwM2MClient client, LwM2MClientOtaInfo<?, ?, ?> fwInfo, OtaPackageUpdateStatus status, String log) {
List<TransportProtos.KeyValueProto> result = new ArrayList<>(); List<TransportProtos.KeyValueProto> result = new ArrayList<>();
TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(getAttributeKey(fwInfo.getType(), STATE)); TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(getAttributeKey(fwInfo.getType(), STATE));
kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV(status.name()); kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV(status.name());

36
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/ota/LwM2MOtaUpdateService.java

@ -16,43 +16,43 @@
package org.thingsboard.server.transport.lwm2m.server.ota; package org.thingsboard.server.transport.lwm2m.server.ota;
import org.thingsboard.server.common.data.device.data.lwm2m.OtherConfiguration; import org.thingsboard.server.common.data.device.data.lwm2m.OtherConfiguration;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import java.util.Optional; import java.util.Optional;
public interface LwM2MOtaUpdateService { public interface LwM2MOtaUpdateService {
void init(LwM2mClient client); void init(LwM2MClient client);
void forceFirmwareUpdate(LwM2mClient client); void forceFirmwareUpdate(LwM2MClient client);
void onTargetFirmwareUpdate(LwM2mClient client, String newFwTitle, String newFwVersion, Optional<String> newFwUrl, Optional<String> newFwTag); void onTargetFirmwareUpdate(LwM2MClient client, String newFwTitle, String newFwVersion, Optional<String> newFwUrl, Optional<String> newFwTag);
void onTargetSoftwareUpdate(LwM2mClient client, String newSwTitle, String newSwVersion, Optional<String> newSwUrl, Optional<String> newSwTag); void onTargetSoftwareUpdate(LwM2MClient client, String newSwTitle, String newSwVersion, Optional<String> newSwUrl, Optional<String> newSwTag);
void onCurrentFirmwareNameUpdate(LwM2mClient client, String name); void onCurrentFirmwareNameUpdate(LwM2MClient client, String name);
void onFirmwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration); void onFirmwareStrategyUpdate(LwM2MClient client, OtherConfiguration configuration);
void onCurrentSoftwareStrategyUpdate(LwM2mClient client, OtherConfiguration configuration); void onCurrentSoftwareStrategyUpdate(LwM2MClient client, OtherConfiguration configuration);
void onCurrentFirmwareVersion3Update(LwM2mClient client, String version); void onCurrentFirmwareVersion3Update(LwM2MClient client, String version);
void onCurrentFirmwareVersionUpdate(LwM2mClient client, String version); void onCurrentFirmwareVersionUpdate(LwM2MClient client, String version);
void onCurrentFirmwareStateUpdate(LwM2mClient client, Long state); void onCurrentFirmwareStateUpdate(LwM2MClient client, Long state);
void onCurrentFirmwareResultUpdate(LwM2mClient client, Long result); void onCurrentFirmwareResultUpdate(LwM2MClient client, Long result);
void onCurrentFirmwareDeliveryMethodUpdate(LwM2mClient lwM2MClient, Long value); void onCurrentFirmwareDeliveryMethodUpdate(LwM2MClient lwM2MClient, Long value);
void onCurrentSoftwareNameUpdate(LwM2mClient lwM2MClient, String name); void onCurrentSoftwareNameUpdate(LwM2MClient lwM2MClient, String name);
void onCurrentSoftwareVersion3Update(LwM2mClient lwM2MClient, String version); void onCurrentSoftwareVersion3Update(LwM2MClient lwM2MClient, String version);
void onCurrentSoftwareVersionUpdate(LwM2mClient client, String version); void onCurrentSoftwareVersionUpdate(LwM2MClient client, String version);
void onCurrentSoftwareStateUpdate(LwM2mClient lwM2MClient, Long value); void onCurrentSoftwareStateUpdate(LwM2MClient lwM2MClient, Long value);
void onCurrentSoftwareResultUpdate(LwM2mClient client, Long result); void onCurrentSoftwareResultUpdate(LwM2MClient client, Long result);
} }

132
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java

@ -15,6 +15,8 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.rpc; package org.thingsboard.server.transport.lwm2m.server.rpc;
import com.google.gson.JsonElement;
import com.google.gson.JsonSyntaxException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.ResponseCode; import org.eclipse.leshan.core.ResponseCode;
@ -25,13 +27,14 @@ import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.common.transport.util.JsonUtils;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
import org.thingsboard.server.transport.lwm2m.server.LwM2mOperationType; import org.thingsboard.server.transport.lwm2m.server.LwM2MOperationType;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext;
import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2mDownlinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.downlink.LwM2MDownlinkMsgHandler;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllObserveCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllObserveCallback;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllRequest;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelObserveCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelObserveCallback;
@ -62,7 +65,7 @@ import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogServic
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcReadCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcReadCompositeRequest;
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcReadResponseCompositeCallback; import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcReadResponseCompositeCallback;
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest; import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@ -70,8 +73,8 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertMultiResourceValuesFromRpcBody; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromRpcBody;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fromVersionedIdToObjectId; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId;
@Slf4j @Slf4j
@Service @Service
@ -80,21 +83,21 @@ import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fr
public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler { public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
private final TransportService transportService; private final TransportService transportService;
private final LwM2mClientContext clientContext; private final LwM2MClientContext clientContext;
private final LwM2MTransportServerConfig config; private final LwM2MTransportServerConfig config;
private final LwM2mUplinkMsgHandler uplinkHandler; private final LwM2MUplinkMsgHandler uplinkHandler;
private final LwM2mDownlinkMsgHandler downlinkHandler; private final LwM2MDownlinkMsgHandler downlinkHandler;
private final LwM2MTelemetryLogService logService; private final LwM2MTelemetryLogService logService;
@Override @Override
public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg rpcRequest, TransportProtos.SessionInfoProto sessionInfo) { public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg rpcRequest, TransportProtos.SessionInfoProto sessionInfo) {
log.debug("Received params: {}", rpcRequest.getParams()); log.debug("Received params: {}", rpcRequest.getParams());
LwM2mOperationType operationType = LwM2mOperationType.fromType(rpcRequest.getMethodName()); LwM2MOperationType operationType = LwM2MOperationType.fromType(rpcRequest.getMethodName());
if (operationType == null) { if (operationType == null) {
this.sendErrorRpcResponse(sessionInfo, rpcRequest.getRequestId(), ResponseCode.METHOD_NOT_ALLOWED, "Unsupported operation type: " + rpcRequest.getMethodName()); this.sendErrorRpcResponse(sessionInfo, rpcRequest.getRequestId(), ResponseCode.METHOD_NOT_ALLOWED, "Unsupported operation type: " + rpcRequest.getMethodName());
return; return;
} }
LwM2mClient client = clientContext.getClientBySessionInfo(sessionInfo); LwM2MClient client = clientContext.getClientBySessionInfo(sessionInfo);
if (client.getRegistration() == null) { if (client.getRegistration() == null) {
this.sendErrorRpcResponse(sessionInfo, rpcRequest.getRequestId(), ResponseCode.INTERNAL_SERVER_ERROR, "Registration is empty"); this.sendErrorRpcResponse(sessionInfo, rpcRequest.getRequestId(), ResponseCode.INTERNAL_SERVER_ERROR, "Registration is empty");
return; return;
@ -103,10 +106,6 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
if (operationType.isHasObjectId()) { if (operationType.isHasObjectId()) {
LwM2MRpcRequestHeader header = JacksonUtil.fromString(rpcRequest.getParams(), LwM2MRpcRequestHeader.class); LwM2MRpcRequestHeader header = JacksonUtil.fromString(rpcRequest.getParams(), LwM2MRpcRequestHeader.class);
String objectId = getIdFromParameters(client, header); String objectId = getIdFromParameters(client, header);
ContentFormat contentFormat = null;
if (StringUtils.isNotEmpty(header.getContentFormat())) {
contentFormat = ContentFormat.fromName(header.getContentFormat());
}
switch (operationType) { switch (operationType) {
case READ: case READ:
sendReadRequest(client, rpcRequest, objectId); sendReadRequest(client, rpcRequest, objectId);
@ -142,7 +141,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
throw new IllegalArgumentException("Unsupported operation: " + operationType.name()); throw new IllegalArgumentException("Unsupported operation: " + operationType.name());
} }
} else if (operationType.isComposite()) { } else if (operationType.isComposite()) {
ContentFormat contentFormatComposite = clientContext.getContentFormatComposite(client); ContentFormat contentFormatComposite = this.getCompositeContentFormat(client);
if (contentFormatComposite != null) { if (contentFormatComposite != null) {
switch (operationType) { switch (operationType) {
case READ_COMPOSITE: case READ_COMPOSITE:
@ -169,8 +168,6 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
case DISCOVER_ALL: case DISCOVER_ALL:
sendDiscoverAllRequest(client, rpcRequest); sendDiscoverAllRequest(client, rpcRequest);
break; break;
case FW_UPDATE:
//TODO: implement and add break statement
default: default:
throw new IllegalArgumentException("Unsupported operation: " + operationType.name()); throw new IllegalArgumentException("Unsupported operation: " + operationType.name());
} }
@ -180,14 +177,14 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
} }
} }
private void sendReadRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendReadRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MReadRequest request = TbLwM2MReadRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MReadRequest request = TbLwM2MReadRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MReadCallback(uplinkHandler, logService, client, versionedId); var mainCallback = new TbLwM2MReadCallback(uplinkHandler, logService, client, versionedId);
var rpcCallback = new RpcReadResponseCallback<>(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcReadResponseCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendReadRequest(client, request, rpcCallback); downlinkHandler.sendReadRequest(client, request, rpcCallback);
} }
private void sendReadCompositeRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, ContentFormat contentFormatComposite) { private void sendReadCompositeRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, ContentFormat contentFormatComposite) {
String[] versionedIds = getIdsFromParameters(client, requestMsg); String[] versionedIds = getIdsFromParameters(client, requestMsg);
TbLwM2MReadCompositeRequest request = TbLwM2MReadCompositeRequest.builder().versionedIds(versionedIds).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MReadCompositeRequest request = TbLwM2MReadCompositeRequest.builder().versionedIds(versionedIds).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MReadCompositeCallback(uplinkHandler, logService, client, versionedIds); var mainCallback = new TbLwM2MReadCompositeCallback(uplinkHandler, logService, client, versionedIds);
@ -195,38 +192,38 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
downlinkHandler.sendReadCompositeRequest(client, request, rpcCallback, contentFormatComposite); downlinkHandler.sendReadCompositeRequest(client, request, rpcCallback, contentFormatComposite);
} }
private void sendObserveRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendObserveRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MObserveRequest request = TbLwM2MObserveRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MObserveRequest request = TbLwM2MObserveRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MObserveCallback(uplinkHandler, logService, client, versionedId); var mainCallback = new TbLwM2MObserveCallback(uplinkHandler, logService, client, versionedId);
var rpcCallback = new RpcReadResponseCallback<>(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcReadResponseCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendObserveRequest(client, request, rpcCallback); downlinkHandler.sendObserveRequest(client, request, rpcCallback);
} }
private void sendObserveAllRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) { private void sendObserveAllRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) {
TbLwM2MObserveAllRequest request = TbLwM2MObserveAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MObserveAllRequest request = TbLwM2MObserveAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendObserveAllRequest(client, request, new RpcLinkSetCallback<>(transportService, client, requestMsg, null)); downlinkHandler.sendObserveAllRequest(client, request, new RpcLinkSetCallback<>(transportService, client, requestMsg, null));
} }
private void sendDiscoverAllRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) { private void sendDiscoverAllRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) {
TbLwM2MDiscoverAllRequest request = TbLwM2MDiscoverAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MDiscoverAllRequest request = TbLwM2MDiscoverAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build();
downlinkHandler.sendDiscoverAllRequest(client, request, new RpcLinkSetCallback<>(transportService, client, requestMsg, null)); downlinkHandler.sendDiscoverAllRequest(client, request, new RpcLinkSetCallback<>(transportService, client, requestMsg, null));
} }
private void sendDiscoverRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendDiscoverRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MDiscoverRequest request = TbLwM2MDiscoverRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MDiscoverRequest request = TbLwM2MDiscoverRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MDiscoverCallback(logService, client, versionedId); var mainCallback = new TbLwM2MDiscoverCallback(logService, client, versionedId);
var rpcCallback = new RpcDiscoverCallback(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcDiscoverCallback(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendDiscoverRequest(client, request, rpcCallback); downlinkHandler.sendDiscoverRequest(client, request, rpcCallback);
} }
private void sendExecuteRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendExecuteRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MExecuteRequest downlink = TbLwM2MExecuteRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MExecuteRequest downlink = TbLwM2MExecuteRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MExecuteCallback(logService, client, versionedId); var mainCallback = new TbLwM2MExecuteCallback(logService, client, versionedId);
var rpcCallback = new RpcEmptyResponseCallback<>(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcEmptyResponseCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendExecuteRequest(client, downlink, rpcCallback); downlinkHandler.sendExecuteRequest(client, downlink, rpcCallback);
} }
private void sendWriteAttributesRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendWriteAttributesRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
RpcWriteAttributesRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteAttributesRequest.class); RpcWriteAttributesRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteAttributesRequest.class);
TbLwM2MWriteAttributesRequest request = TbLwM2MWriteAttributesRequest.builder().versionedId(versionedId) TbLwM2MWriteAttributesRequest request = TbLwM2MWriteAttributesRequest.builder().versionedId(versionedId)
.attributes(requestBody.getAttributes()) .attributes(requestBody.getAttributes())
@ -236,7 +233,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
downlinkHandler.sendWriteAttributesRequest(client, request, rpcCallback); downlinkHandler.sendWriteAttributesRequest(client, request, rpcCallback);
} }
private void sendWriteUpdateRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendWriteUpdateRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
RpcWriteUpdateRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteUpdateRequest.class); RpcWriteUpdateRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteUpdateRequest.class);
TbLwM2MWriteUpdateRequest.TbLwM2MWriteUpdateRequestBuilder builder = TbLwM2MWriteUpdateRequest.builder().versionedId(versionedId); TbLwM2MWriteUpdateRequest.TbLwM2MWriteUpdateRequestBuilder builder = TbLwM2MWriteUpdateRequest.builder().versionedId(versionedId);
builder.value(requestBody.getValue()).timeout(clientContext.getRequestTimeout(client)); builder.value(requestBody.getValue()).timeout(clientContext.getRequestTimeout(client));
@ -245,7 +242,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
downlinkHandler.sendWriteUpdateRequest(client, builder.build(), rpcCallback); downlinkHandler.sendWriteUpdateRequest(client, builder.build(), rpcCallback);
} }
private void sendCreateRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendCreateRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
RpcCreateRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcCreateRequest.class); RpcCreateRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcCreateRequest.class);
TbLwM2MCreateRequest.TbLwM2MCreateRequestBuilder builder = TbLwM2MCreateRequest.builder().versionedId(versionedId); TbLwM2MCreateRequest.TbLwM2MCreateRequestBuilder builder = TbLwM2MCreateRequest.builder().versionedId(versionedId);
builder.value(requestBody.getValue()).nodes(requestBody.getNodes()).timeout(clientContext.getRequestTimeout(client)); builder.value(requestBody.getValue()).nodes(requestBody.getNodes()).timeout(clientContext.getRequestTimeout(client));
@ -254,14 +251,19 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
downlinkHandler.sendCreateRequest(client, builder.build(), rpcCallback); downlinkHandler.sendCreateRequest(client, builder.build(), rpcCallback);
} }
private void sendWriteReplaceRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendWriteReplaceRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
RpcWriteReplaceRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteReplaceRequest.class); RpcWriteReplaceRequest requestBody = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteReplaceRequest.class);
LwM2mPath path = new LwM2mPath(fromVersionedIdToObjectId(versionedId)); LwM2mPath path = new LwM2mPath(fromVersionedIdToObjectId(versionedId));
if (path.isResource() && requestBody.getValue() instanceof LinkedHashMap) { if (path.isResource()) {
ResourceModel resourceModel = client.getResourceModel(versionedId, this.config.getModelProvider()); ResourceModel resourceModel = client.getResourceModel(versionedId, this.config.getModelProvider());
if (resourceModel != null && resourceModel.multiple) { if (resourceModel != null && resourceModel.multiple) {
Map value = convertMultiResourceValuesFromRpcBody((LinkedHashMap) requestBody.getValue(), resourceModel.type, versionedId); try {
requestBody.setValue(value); Map value = convertMultiResourceValuesFromRpcBody(requestBody.getValue(), resourceModel.type, versionedId);
requestBody.setValue(value);
} catch (Exception e) {
throw new IllegalArgumentException("Resource id=" + versionedId + ", class = " +
requestBody.getValue().getClass().getSimpleName() + ", value = " + requestBody.getValue() + " is bad. Value of Multi-Instance Resource must be in Json format!");
}
} }
} }
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId) TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId)
@ -280,7 +282,7 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
* nodes.put("/1/0/2", 100); * nodes.put("/1/0/2", 100);
* nodes.put("/5/0/1", "coap://localhost:5685"); * nodes.put("/5/0/1", "coap://localhost:5685");
*/ */
private void sendWriteCompositeRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, ContentFormat contentFormatComposite) { private void sendWriteCompositeRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, ContentFormat contentFormatComposite) {
RpcWriteCompositeRequest rpcWriteCompositeRequest = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteCompositeRequest.class); RpcWriteCompositeRequest rpcWriteCompositeRequest = JacksonUtil.fromString(requestMsg.getParams(), RpcWriteCompositeRequest.class);
Map validNodes = validateNodes(client, rpcWriteCompositeRequest.getNodes()); Map validNodes = validateNodes(client, rpcWriteCompositeRequest.getNodes());
if (validNodes.size() > 0) { if (validNodes.size() > 0) {
@ -293,53 +295,67 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
} }
} }
private Map validateNodes(LwM2mClient client, Map nodes) { private Map validateNodes(LwM2MClient client, Map nodes) {
Map newNodes = new LinkedHashMap(); Map newNodes = new LinkedHashMap();
nodes.forEach((key, value) -> { nodes.forEach((key, value) -> {
String versionedId; String versionedId;
try { try {
// validate key.toString() // validate key.toString()
new LwM2mPath(fromVersionedIdToObjectId(key.toString())); LwM2mPath path = new LwM2mPath(fromVersionedIdToObjectId(key.toString()));
versionedId = key.toString(); if (path.isResource() || path.isResourceInstance()) {
versionedId = key.toString();
}
else {
throw new IllegalArgumentException(String.format("nodes: %s is not validate value. " +
"The WriteComposite operation is only used for SingleResources or/and ResourceInstance.", nodes.toString()));
}
} catch (Exception e) { } catch (Exception e) {
versionedId = clientContext.getObjectIdByKeyNameFromProfile(client, key.toString(), true); versionedId = clientContext.getObjectIdByKeyNameFromProfile(client, key.toString());
} }
// validate value. Must be only primitive, not Json // validate value. Must be only primitive, not JsonObject or JsonArray
if (value instanceof LinkedHashMap) { try {
throw new IllegalArgumentException(String.format("nodes: %s is not validate value. " + JsonElement element = JsonUtils.parse(value.toString());
"The WriteComposite operation is only used for SingleResources or/and ResourceInstance.", nodes.toString())); if (!element.isJsonNull() && !element.isJsonPrimitive()) {
} else { throw new IllegalArgumentException(String.format("nodes: %s is not validate value. " +
newNodes.put(fromVersionedIdToObjectId(versionedId), value); "The WriteComposite operation is only used for SingleResources or/and ResourceInstance.", nodes.toString()));
}
else if (versionedId != null) {
newNodes.put(fromVersionedIdToObjectId(versionedId), value);
}
} catch (JsonSyntaxException jse) {
if (versionedId != null) {
newNodes.put(fromVersionedIdToObjectId(versionedId), value);
}
} }
}); });
return newNodes; return newNodes;
} }
private void sendCancelObserveRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendCancelObserveRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MCancelObserveRequest downlink = TbLwM2MCancelObserveRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MCancelObserveRequest downlink = TbLwM2MCancelObserveRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MCancelObserveCallback(logService, client, versionedId); var mainCallback = new TbLwM2MCancelObserveCallback(logService, client, versionedId);
var rpcCallback = new RpcCancelObserveCallback(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcCancelObserveCallback(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendCancelObserveRequest(client, downlink, rpcCallback); downlinkHandler.sendCancelObserveRequest(client, downlink, rpcCallback);
} }
private void sendDeleteRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) { private void sendDeleteRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, String versionedId) {
TbLwM2MDeleteRequest downlink = TbLwM2MDeleteRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MDeleteRequest downlink = TbLwM2MDeleteRequest.builder().versionedId(versionedId).timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MDeleteCallback(logService, client, versionedId); var mainCallback = new TbLwM2MDeleteCallback(logService, client, versionedId);
var rpcCallback = new RpcEmptyResponseCallback<>(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcEmptyResponseCallback<>(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendDeleteRequest(client, downlink, rpcCallback); downlinkHandler.sendDeleteRequest(client, downlink, rpcCallback);
} }
private void sendCancelAllObserveRequest(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) { private void sendCancelAllObserveRequest(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg) {
TbLwM2MCancelAllRequest downlink = TbLwM2MCancelAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build(); TbLwM2MCancelAllRequest downlink = TbLwM2MCancelAllRequest.builder().timeout(clientContext.getRequestTimeout(client)).build();
var mainCallback = new TbLwM2MCancelAllObserveCallback(logService, client); var mainCallback = new TbLwM2MCancelAllObserveCallback(logService, client);
var rpcCallback = new RpcCancelAllObserveCallback(transportService, client, requestMsg, mainCallback); var rpcCallback = new RpcCancelAllObserveCallback(transportService, client, requestMsg, mainCallback);
downlinkHandler.sendCancelAllRequest(client, downlink, rpcCallback); downlinkHandler.sendCancelAllRequest(client, downlink, rpcCallback);
} }
private String getIdFromParameters(LwM2mClient client, LwM2MRpcRequestHeader header) { private String getIdFromParameters(LwM2MClient client, LwM2MRpcRequestHeader header) {
String targetId; String targetId;
if (StringUtils.isNotEmpty(header.getKey())) { if (StringUtils.isNotEmpty(header.getKey())) {
targetId = clientContext.getObjectIdByKeyNameFromProfile(client, header.getKey(), false); targetId = clientContext.getObjectIdByKeyNameFromProfile(client, header.getKey());
} else if (StringUtils.isNotEmpty(header.getId())) { } else if (StringUtils.isNotEmpty(header.getId())) {
targetId = header.getId(); targetId = header.getId();
} else { } else {
@ -348,12 +364,12 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
return targetId; return targetId;
} }
private String[] getIdsFromParameters(LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg rpcRequst) { private String[] getIdsFromParameters(LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg rpcRequest) {
RpcReadCompositeRequest requestParams = JacksonUtil.fromString(rpcRequst.getParams(), RpcReadCompositeRequest.class); RpcReadCompositeRequest requestParams = JacksonUtil.fromString(rpcRequest.getParams(), RpcReadCompositeRequest.class);
if (requestParams.getKeys() != null && requestParams.getKeys().length > 0) { if (requestParams.getKeys() != null && requestParams.getKeys().length > 0) {
Set<String> targetIds = ConcurrentHashMap.newKeySet(); Set<String> targetIds = ConcurrentHashMap.newKeySet();
for (String key : requestParams.getKeys()) { for (String key : requestParams.getKeys()) {
String targetId = clientContext.getObjectIdByKeyNameFromProfile(client, key, true); String targetId = clientContext.getObjectIdByKeyNameFromProfile(client, key);
if (targetId != null) { if (targetId != null) {
targetIds.add(targetId); targetIds.add(targetId);
} }
@ -381,4 +397,16 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler {
public void onToServerRpcResponse(TransportProtos.ToServerRpcResponseMsg toServerResponse) { public void onToServerRpcResponse(TransportProtos.ToServerRpcResponseMsg toServerResponse) {
log.info("[{}] toServerRpcResponse", toServerResponse); log.info("[{}] toServerRpcResponse", toServerResponse);
} }
private ContentFormat getCompositeContentFormat(LwM2MClient client) {
if (client.getClientSupportContentFormats().contains(ContentFormat.SENML_JSON)) {
return ContentFormat.SENML_JSON;
}
else if (client.getClientSupportContentFormats().contains(ContentFormat.SENML_CBOR)) {
return ContentFormat.SENML_CBOR;
}
else {
return null;
}
}
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCancelAllObserveCallback.java

@ -18,13 +18,13 @@ package org.thingsboard.server.transport.lwm2m.server.rpc;
import org.eclipse.leshan.core.ResponseCode; import org.eclipse.leshan.core.ResponseCode;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelAllRequest;
public class RpcCancelAllObserveCallback extends RpcDownlinkRequestCallbackProxy<TbLwM2MCancelAllRequest, Integer> { public class RpcCancelAllObserveCallback extends RpcDownlinkRequestCallbackProxy<TbLwM2MCancelAllRequest, Integer> {
public RpcCancelAllObserveCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) { public RpcCancelAllObserveCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCancelObserveCallback.java

@ -18,13 +18,13 @@ package org.thingsboard.server.transport.lwm2m.server.rpc;
import org.eclipse.leshan.core.ResponseCode; import org.eclipse.leshan.core.ResponseCode;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelObserveRequest; import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MCancelObserveRequest;
public class RpcCancelObserveCallback extends RpcDownlinkRequestCallbackProxy<TbLwM2MCancelObserveRequest, Integer> { public class RpcCancelObserveCallback extends RpcDownlinkRequestCallbackProxy<TbLwM2MCancelObserveRequest, Integer> {
public RpcCancelObserveCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) { public RpcCancelObserveCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcCreateResponseCallback.java

@ -19,14 +19,14 @@ import org.eclipse.leshan.core.request.LwM2mRequest;
import org.eclipse.leshan.core.response.CreateResponse; import org.eclipse.leshan.core.response.CreateResponse;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.Optional; import java.util.Optional;
public class RpcCreateResponseCallback<R extends LwM2mRequest<T>, T extends CreateResponse> extends RpcLwM2MDownlinkCallback<R, T> { public class RpcCreateResponseCallback<R extends LwM2mRequest<T>, T extends CreateResponse> extends RpcLwM2MDownlinkCallback<R, T> {
public RpcCreateResponseCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcCreateResponseCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDiscoverCallback.java

@ -20,14 +20,14 @@ import org.eclipse.leshan.core.request.DiscoverRequest;
import org.eclipse.leshan.core.response.DiscoverResponse; import org.eclipse.leshan.core.response.DiscoverResponse;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.Optional; import java.util.Optional;
public class RpcDiscoverCallback extends RpcLwM2MDownlinkCallback<DiscoverRequest, DiscoverResponse> { public class RpcDiscoverCallback extends RpcLwM2MDownlinkCallback<DiscoverRequest, DiscoverResponse> {
public RpcDiscoverCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) { public RpcDiscoverCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java

@ -23,7 +23,7 @@ import org.thingsboard.server.common.data.rpc.RpcStatus;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.common.transport.TransportServiceCallback; import org.thingsboard.server.common.transport.TransportServiceCallback;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
@ -34,9 +34,9 @@ public abstract class RpcDownlinkRequestCallbackProxy<R, T> implements DownlinkR
private final TransportProtos.ToDeviceRpcRequestMsg request; private final TransportProtos.ToDeviceRpcRequestMsg request;
private final DownlinkRequestCallback<R, T> callback; private final DownlinkRequestCallback<R, T> callback;
protected final LwM2mClient client; protected final LwM2MClient client;
public RpcDownlinkRequestCallbackProxy(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcDownlinkRequestCallbackProxy(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
this.transportService = transportService; this.transportService = transportService;
this.client = client; this.client = client;
this.request = requestMsg; this.request = requestMsg;

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcEmptyResponseCallback.java

@ -19,14 +19,14 @@ import org.eclipse.leshan.core.request.LwM2mRequest;
import org.eclipse.leshan.core.response.LwM2mResponse; import org.eclipse.leshan.core.response.LwM2mResponse;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.Optional; import java.util.Optional;
public class RpcEmptyResponseCallback<R extends LwM2mRequest<T>, T extends LwM2mResponse> extends RpcLwM2MDownlinkCallback<R, T> { public class RpcEmptyResponseCallback<R extends LwM2mRequest<T>, T extends LwM2mResponse> extends RpcLwM2MDownlinkCallback<R, T> {
public RpcEmptyResponseCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcEmptyResponseCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcLinkSetCallback.java

@ -19,12 +19,12 @@ import org.eclipse.leshan.core.ResponseCode;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
public class RpcLinkSetCallback<R, T> extends RpcDownlinkRequestCallbackProxy<R, T> { public class RpcLinkSetCallback<R, T> extends RpcDownlinkRequestCallbackProxy<R, T> {
public RpcLinkSetCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcLinkSetCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

4
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcLwM2MDownlinkCallback.java

@ -20,14 +20,14 @@ import org.eclipse.leshan.core.response.LwM2mResponse;
import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.StringUtils;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.Optional; import java.util.Optional;
public abstract class RpcLwM2MDownlinkCallback<R extends LwM2mRequest<T>, T extends LwM2mResponse> extends RpcDownlinkRequestCallbackProxy<R, T> { public abstract class RpcLwM2MDownlinkCallback<R extends LwM2mRequest<T>, T extends LwM2mResponse> extends RpcDownlinkRequestCallbackProxy<R, T> {
public RpcLwM2MDownlinkCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcLwM2MDownlinkCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcReadResponseCallback.java

@ -19,16 +19,16 @@ import org.eclipse.leshan.core.request.LwM2mRequest;
import org.eclipse.leshan.core.response.ReadResponse; import org.eclipse.leshan.core.response.ReadResponse;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import java.util.Optional; import java.util.Optional;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.contentToString; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.contentToString;
public class RpcReadResponseCallback<R extends LwM2mRequest<T>, T extends ReadResponse> extends RpcLwM2MDownlinkCallback<R, T> { public class RpcReadResponseCallback<R extends LwM2mRequest<T>, T extends ReadResponse> extends RpcLwM2MDownlinkCallback<R, T> {
public RpcReadResponseCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcReadResponseCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

6
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/composite/RpcReadResponseCompositeCallback.java

@ -19,17 +19,17 @@ import org.eclipse.leshan.core.request.LwM2mRequest;
import org.eclipse.leshan.core.response.ReadCompositeResponse; import org.eclipse.leshan.core.response.ReadCompositeResponse;
import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback; import org.thingsboard.server.transport.lwm2m.server.downlink.DownlinkRequestCallback;
import org.thingsboard.server.transport.lwm2m.server.rpc.RpcLwM2MDownlinkCallback; import org.thingsboard.server.transport.lwm2m.server.rpc.RpcLwM2MDownlinkCallback;
import java.util.Optional; import java.util.Optional;
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.contentToString; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.contentToString;
public class RpcReadResponseCompositeCallback<R extends LwM2mRequest<T>, T extends ReadCompositeResponse> extends RpcLwM2MDownlinkCallback<R, T> { public class RpcReadResponseCompositeCallback<R extends LwM2mRequest<T>, T extends ReadCompositeResponse> extends RpcLwM2MDownlinkCallback<R, T> {
public RpcReadResponseCompositeCallback(TransportService transportService, LwM2mClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) { public RpcReadResponseCompositeCallback(TransportService transportService, LwM2MClient client, TransportProtos.ToDeviceRpcRequestMsg requestMsg, DownlinkRequestCallback<R, T> callback) {
super(transportService, client, requestMsg, callback); super(transportService, client, requestMsg, callback);
} }

10
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/session/DefaultLwM2MSessionManager.java

@ -22,10 +22,10 @@ import org.thingsboard.server.common.transport.TransportService;
import org.thingsboard.server.common.transport.service.DefaultTransportService; import org.thingsboard.server.common.transport.service.DefaultTransportService;
import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos;
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener; import org.thingsboard.server.transport.lwm2m.server.LwM2MSessionMsgListener;
import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService; import org.thingsboard.server.transport.lwm2m.server.attributes.LwM2MAttributesService;
import org.thingsboard.server.transport.lwm2m.server.rpc.LwM2MRpcRequestHandler; import org.thingsboard.server.transport.lwm2m.server.rpc.LwM2MRpcRequestHandler;
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mUplinkMsgHandler; import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2MUplinkMsgHandler;
@Slf4j @Slf4j
@Service @Service
@ -35,12 +35,12 @@ public class DefaultLwM2MSessionManager implements LwM2MSessionManager {
private final TransportService transportService; private final TransportService transportService;
private final LwM2MAttributesService attributesService; private final LwM2MAttributesService attributesService;
private final LwM2MRpcRequestHandler rpcHandler; private final LwM2MRpcRequestHandler rpcHandler;
private final LwM2mUplinkMsgHandler uplinkHandler; private final LwM2MUplinkMsgHandler uplinkHandler;
public DefaultLwM2MSessionManager(TransportService transportService, public DefaultLwM2MSessionManager(TransportService transportService,
@Lazy LwM2MAttributesService attributesService, @Lazy LwM2MAttributesService attributesService,
@Lazy LwM2MRpcRequestHandler rpcHandler, @Lazy LwM2MRpcRequestHandler rpcHandler,
@Lazy LwM2mUplinkMsgHandler uplinkHandler) { @Lazy LwM2MUplinkMsgHandler uplinkHandler) {
this.transportService = transportService; this.transportService = transportService;
this.attributesService = attributesService; this.attributesService = attributesService;
this.rpcHandler = rpcHandler; this.rpcHandler = rpcHandler;
@ -49,7 +49,7 @@ public class DefaultLwM2MSessionManager implements LwM2MSessionManager {
@Override @Override
public void register(TransportProtos.SessionInfoProto sessionInfo) { public void register(TransportProtos.SessionInfoProto sessionInfo) {
transportService.registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(uplinkHandler, attributesService, rpcHandler, sessionInfo, transportService)); transportService.registerAsyncSession(sessionInfo, new LwM2MSessionMsgListener(uplinkHandler, attributesService, rpcHandler, sessionInfo, transportService));
TransportProtos.TransportToDeviceActorMsg msg = TransportProtos.TransportToDeviceActorMsg.newBuilder() TransportProtos.TransportToDeviceActorMsg msg = TransportProtos.TransportToDeviceActorMsg.newBuilder()
.setSessionInfo(sessionInfo) .setSessionInfo(sessionInfo)
.setSessionEvent(DefaultTransportService.getSessionEventMsg(TransportProtos.SessionEvent.OPEN)) .setSessionEvent(DefaultTransportService.getSessionEventMsg(TransportProtos.SessionEvent.OPEN))

8
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/store/TbDummyLwM2MClientStore.java

@ -15,24 +15,24 @@
*/ */
package org.thingsboard.server.transport.lwm2m.server.store; package org.thingsboard.server.transport.lwm2m.server.store;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
public class TbDummyLwM2MClientStore implements TbLwM2MClientStore { public class TbDummyLwM2MClientStore implements TbLwM2MClientStore {
@Override @Override
public LwM2mClient get(String endpoint) { public LwM2MClient get(String endpoint) {
return null; return null;
} }
@Override @Override
public Set<LwM2mClient> getAll() { public Set<LwM2MClient> getAll() {
return Collections.emptySet(); return Collections.emptySet();
} }
@Override @Override
public void put(LwM2mClient client) { public void put(LwM2MClient client) {
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save