Commit bacf822f156cb526ee3cf76d22db1e945831e071

Authored by nickAS21
Committed by Andrew Shvayka
1 parent cf405be4

Lwm2m: add Write_Update example #1

... ... @@ -33,7 +33,6 @@ import org.eclipse.leshan.core.request.ContentFormat;
33 33 import org.eclipse.leshan.core.request.WriteRequest;
34 34 import org.eclipse.leshan.core.response.ReadResponse;
35 35 import org.eclipse.leshan.core.util.NamedThreadFactory;
36   -import org.eclipse.leshan.server.californium.LeshanServer;
37 36 import org.eclipse.leshan.server.registration.Registration;
38 37 import org.springframework.context.annotation.Lazy;
39 38 import org.springframework.stereotype.Service;
... ... @@ -102,7 +101,6 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
102 101 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LwM2mTypeOper.READ;
103 102 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LwM2mTypeOper.WRITE_ATTRIBUTES;
104 103 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LwM2mTypeOper.WRITE_REPLACE;
105   -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.LwM2mTypeOper.WRITE_UPDATE;
106 104 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.SERVICE_CHANNEL;
107 105 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.convertJsonArrayToSet;
108 106 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil.convertPathFromIdVerToObjectId;
... ... @@ -490,15 +488,17 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
490 488 if (OBSERVE_READ_ALL != lwm2mClientRpcRequest.getTypeOper() && lwm2mClientRpcRequest.getTargetIdVer() == null) {
491 489 lwm2mClientRpcRequest.setErrorMsg(lwm2mClientRpcRequest.targetIdVerKey + " and " +
492 490 lwm2mClientRpcRequest.keyNameKey + " is null or bad format");
493   - } else if ((EXECUTE == lwm2mClientRpcRequest.getTypeOper()
  491 + }
  492 + /**
  493 + * EXECUTE && WRITE_REPLACE - only for Resource or ResourceInstance
  494 + */
  495 + else if ((EXECUTE == lwm2mClientRpcRequest.getTypeOper()
494 496 || WRITE_REPLACE == lwm2mClientRpcRequest.getTypeOper())
495 497 && lwm2mClientRpcRequest.getTargetIdVer() != null
496 498 && !(new LwM2mPath(convertPathFromIdVerToObjectId(lwm2mClientRpcRequest.getTargetIdVer())).isResource()
497 499 || new LwM2mPath(convertPathFromIdVerToObjectId(lwm2mClientRpcRequest.getTargetIdVer())).isResourceInstance())) {
498 500 lwm2mClientRpcRequest.setErrorMsg("Invalid parameter " + lwm2mClientRpcRequest.targetIdVerKey
499 501 + ". Only Resource or ResourceInstance can be this operation");
500   - } else if (WRITE_UPDATE == lwm2mClientRpcRequest.getTypeOper()) {
501   - lwm2mClientRpcRequest.setErrorMsg("Procedures In Development...");
502 502 }
503 503 } else {
504 504 lwm2mClientRpcRequest.setErrorMsg("Params of request is bad Json format.");
... ... @@ -930,7 +930,15 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
930 930 * @param request -
931 931 */
932 932 public void onWriteResponseOk(Registration registration, String path, WriteRequest request) {
933   - this.updateResourcesValue(registration, ((LwM2mResource) request.getNode()), path);
  933 + if (request.getNode() instanceof LwM2mResource) {
  934 + this.updateResourcesValue(registration, ((LwM2mResource) request.getNode()), path);
  935 + }
  936 + else if (request.getNode() instanceof LwM2mObjectInstance) {
  937 + ((LwM2mObjectInstance) request.getNode()).getResources().forEach((resId, resource) -> {
  938 + this.updateResourcesValue(registration, resource, path+ "/" + resId);
  939 + });
  940 + }
  941 +
934 942 }
935 943
936 944 /**
... ...
... ... @@ -16,13 +16,13 @@
16 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
18 18 import lombok.RequiredArgsConstructor;
19   -import lombok.SneakyThrows;
20 19 import lombok.extern.slf4j.Slf4j;
21 20 import org.eclipse.californium.core.coap.CoAP;
22 21 import org.eclipse.californium.core.coap.Response;
23 22 import org.eclipse.leshan.core.model.ResourceModel;
24 23 import org.eclipse.leshan.core.node.LwM2mNode;
25 24 import org.eclipse.leshan.core.node.LwM2mPath;
  25 +import org.eclipse.leshan.core.node.LwM2mResource;
26 26 import org.eclipse.leshan.core.node.LwM2mSingleResource;
27 27 import org.eclipse.leshan.core.node.ObjectLink;
28 28 import org.eclipse.leshan.core.observation.Observation;
... ... @@ -46,10 +46,8 @@ import org.eclipse.leshan.core.response.WriteAttributesResponse;
46 46 import org.eclipse.leshan.core.response.WriteResponse;
47 47 import org.eclipse.leshan.core.util.Hex;
48 48 import org.eclipse.leshan.core.util.NamedThreadFactory;
49   -import org.eclipse.leshan.server.californium.LeshanServer;
50 49 import org.eclipse.leshan.server.registration.Registration;
51 50 import org.springframework.stereotype.Service;
52   -import org.thingsboard.server.common.transport.TransportService;
53 51 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
54 52 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
55 53 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
... ... @@ -59,6 +57,7 @@ import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
59 57
60 58 import javax.annotation.PostConstruct;
61 59 import java.util.Arrays;
  60 +import java.util.Collection;
62 61 import java.util.Date;
63 62 import java.util.Set;
64 63 import java.util.concurrent.ExecutorService;
... ... @@ -111,7 +110,7 @@ public class LwM2mTransportRequest {
111 110 * @param typeOper -
112 111 * @param contentFormatName -
113 112 */
114   - @SneakyThrows
  113 +
115 114 public void sendAllRequest(Registration registration, String targetIdVer, LwM2mTypeOper typeOper,
116 115 String contentFormatName, Object params, long timeoutInMs, Lwm2mClientRpcRequest rpcRequest) {
117 116 try {
... ... @@ -160,8 +159,7 @@ public class LwM2mTransportRequest {
160 159 break;
161 160 case WRITE_REPLACE:
162 161 // Request to write a <b>String Single-Instance Resource</b> using the TLV content format.
163   - resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config
164   - .getModelProvider());
  162 + resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider());
165 163 if (contentFormat.equals(ContentFormat.TLV)) {
166 164 request = this.getWriteRequestSingleResource(null, resultIds.getObjectId(),
167 165 resultIds.getObjectInstanceId(), resultIds.getResourceId(), params, resourceModel.type,
... ... @@ -175,15 +173,31 @@ public class LwM2mTransportRequest {
175 173 }
176 174 break;
177 175 case WRITE_UPDATE:
178   -// LwM2mNode node = null;
179   -// if (resultIds.isObjectInstance()) {
180   -// node = new LwM2mObjectInstance(resultIds.getObjectInstanceId(), lwM2MClient.
181   -// getNewResourcesForInstance(targetIdVer, this.lwM2mTransportContextServer.getLwM2MTransportConfigServer().getModelProvider(),
182   -// this.converter));
183   -// request = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, target, node);
184   -// } else if (resultIds.getObjectId() >= 0) {
185   -// request = new ObserveRequest(resultIds.getObjectId());
186   -// }
  176 + if (resultIds.isResource()) {
  177 + /**
  178 + * send request: path = '/3/0' node == wM2mObjectInstance
  179 + * with params == "\"resources\": {15: resource:{id:15. value:'+01'...}}
  180 + **/
  181 + Collection<LwM2mResource> resources = lwM2MClient.getNewResourcesForInstance(
  182 + targetIdVer, params,
  183 + this.config.getModelProvider(),
  184 + this.converter);
  185 + request = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(),
  186 + resultIds.getObjectInstanceId(), resources);
  187 + }
  188 +
  189 + /**
  190 + * params = "{\"id\":0,\"resources\":[{\"id\":14,\"value\":\"+5\"},{\"id\":15,\"value\":\"+9\"}]}"
  191 + *
  192 + * int rscId = resultIds.getObjectInstanceId();
  193 + */
  194 +
  195 + else if (resultIds.isObjectInstance()) {
  196 + String content = (String) params;
  197 +// node = Gson.fromJson((content, LwM2mNode.class);
  198 + } else if (resultIds.getObjectId() >= 0) {
  199 + request = new ObserveRequest(resultIds.getObjectId());
  200 + }
187 201 break;
188 202 case WRITE_ATTRIBUTES:
189 203 request = createWriteAttributeRequest(target, params);
... ... @@ -236,7 +250,11 @@ public class LwM2mTransportRequest {
236 250 String msg = String.format("%s: type operation %s %s", LOG_LW2M_ERROR,
237 251 typeOper.name(), e.getMessage());
238 252 serviceImpl.sendLogsToThingsboard(msg, registration.getId());
239   - throw new Exception(e);
  253 + try {
  254 + throw new Exception(e);
  255 + } catch (Exception exception) {
  256 + exception.printStackTrace();
  257 + }
240 258 }
241 259 }
242 260
... ... @@ -248,6 +266,7 @@ public class LwM2mTransportRequest {
248 266
249 267 @SuppressWarnings("unchecked")
250 268 private void sendRequest(Registration registration, LwM2mClient lwM2MClient, DownlinkRequest request, long timeoutInMs, Lwm2mClientRpcRequest rpcRequest) {
  269 +
251 270 context.getServer().send(registration, request, timeoutInMs, (ResponseCallback<?>) response -> {
252 271 if (!lwM2MClient.isInit()) {
253 272 lwM2MClient.initReadValue(this.serviceImpl, convertPathFromObjectIdToIdVer(request.getPath().toString(), registration));
... ...
... ... @@ -117,9 +117,7 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
117 117
118 118 private ObjectModel getObjectModelDynamic(Integer objectId, String version) {
119 119 String key = getKeyIdVer(objectId, version);
120   -
121 120 Optional<TbResource> tbResource = context.getTransportResourceCache().get(this.tenantId, LWM2M_MODEL, key);
122   -
123 121 return tbResource.map(resource -> helper.parseFromXmlToObjectModel(
124 122 Base64.getDecoder().decode(resource.getData()),
125 123 key + ".xml",
... ...
... ... @@ -26,8 +26,8 @@ import org.eclipse.leshan.server.registration.Registration;
26 26 import org.eclipse.leshan.server.security.SecurityInfo;
27 27 import org.thingsboard.server.gen.transport.TransportProtos;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
29   -import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest;
30 29 import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2MTransportMsgHandler;
  30 +import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest;
31 31 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
32 32
33 33 import java.util.Collection;
... ... @@ -111,15 +111,17 @@ public class LwM2mClient implements Cloneable {
111 111 .getResourceModel(pathIds.getObjectId(), pathIds.getResourceId()) : null;
112 112 }
113 113
114   - public Collection<LwM2mResource> getNewResourcesForInstance(String pathRezIdVer, LwM2mModelProvider modelProvider,
  114 + public Collection<LwM2mResource> getNewResourcesForInstance(String pathRezIdVer, Object params, LwM2mModelProvider modelProvider,
115 115 LwM2mValueConverterImpl converter) {
116 116 LwM2mPath pathIds = new LwM2mPath(convertPathFromIdVerToObjectId(pathRezIdVer));
117 117 Collection<LwM2mResource> resources = ConcurrentHashMap.newKeySet();
118 118 Map<Integer, ResourceModel> resourceModels = modelProvider.getObjectModel(registration)
119 119 .getObjectModel(pathIds.getObjectId()).resources;
120   - resourceModels.forEach((k, resourceModel) -> {
121   - resources.add(LwM2mSingleResource.newResource(k, converter.convertValue("0", ResourceModel.Type.STRING, resourceModel.type, pathIds), resourceModel.type));
122   - });
  120 + resourceModels.forEach((resId, resourceModel) -> {
  121 + if (resId == pathIds.getResourceId()) {
  122 + resources.add(LwM2mSingleResource.newResource(resId, converter.convertValue(params, ResourceModel.Type.STRING, resourceModel.type, pathIds), resourceModel.type));
  123 +
  124 + }});
123 125 return resources;
124 126 }
125 127
... ...
... ... @@ -60,11 +60,14 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter {
60 60 case INTEGER:
61 61 switch (currentType) {
62 62 case FLOAT:
63   - log.debug("Trying to convert float value [{}] to integer", value);
  63 + log.debug("Trying to convert float value [{}] to Integer", value);
64 64 Long longValue = ((Double) value).longValue();
65 65 if ((double) value == longValue.doubleValue()) {
66 66 return longValue;
67 67 }
  68 + case STRING:
  69 + log.debug("Trying to convert String value [{}] to Integer", value);
  70 + return Long.parseLong((String) value);
68 71 default:
69 72 break;
70 73 }
... ... @@ -77,6 +80,9 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter {
77 80 if ((long) value == floatValue.longValue()) {
78 81 return floatValue;
79 82 }
  83 + case STRING:
  84 + log.debug("Trying to convert String value [{}] to Float", value);
  85 + return Float.valueOf((String) value);
80 86 default:
81 87 break;
82 88 }
... ...