Showing
8 changed files
with
204 additions
and
116 deletions
@@ -196,8 +196,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -196,8 +196,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
196 | .setSubscribeToRPC(TransportProtos.SubscribeToRPCMsg.newBuilder().build()) | 196 | .setSubscribeToRPC(TransportProtos.SubscribeToRPCMsg.newBuilder().build()) |
197 | .build(); | 197 | .build(); |
198 | transportService.process(msg, null); | 198 | transportService.process(msg, null); |
199 | - this.getInfoFirmwareUpdate(lwM2MClient); | ||
200 | - this.getInfoSoftwareUpdate(lwM2MClient); | 199 | + this.getInfoFirmwareUpdate(lwM2MClient, null); |
200 | + this.getInfoSoftwareUpdate(lwM2MClient, null); | ||
201 | this.initLwM2mFromClientValue(registration, lwM2MClient); | 201 | this.initLwM2mFromClientValue(registration, lwM2MClient); |
202 | this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration.getId()); | 202 | this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration.getId()); |
203 | } else { | 203 | } else { |
@@ -285,7 +285,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -285,7 +285,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
285 | @Override | 285 | @Override |
286 | public void setCancelObservationsAll(Registration registration) { | 286 | public void setCancelObservationsAll(Registration registration) { |
287 | if (registration != null) { | 287 | if (registration != null) { |
288 | - lwM2mTransportRequest.sendAllRequest(registration, null, OBSERVE_CANCEL_ALL, | 288 | + this.lwM2mTransportRequest.sendAllRequest(registration, null, OBSERVE_CANCEL_ALL, |
289 | null, null, this.config.getTimeout(), null); | 289 | null, null, this.config.getTimeout(), null); |
290 | } | 290 | } |
291 | } | 291 | } |
@@ -334,7 +334,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -334,7 +334,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
334 | READ, pathIdVer, value); | 334 | READ, pathIdVer, value); |
335 | this.sendLogsToThingsboard(msg, registration.getId()); | 335 | this.sendLogsToThingsboard(msg, registration.getId()); |
336 | rpcRequest.setValueMsg(String.format("%s", value)); | 336 | rpcRequest.setValueMsg(String.format("%s", value)); |
337 | - this.sentRpcRequest(rpcRequest, response.getCode().getName(), (String) value, LOG_LW2M_VALUE); | 337 | + this.sentRpcResponse(rpcRequest, response.getCode().getName(), (String) value, LOG_LW2M_VALUE); |
338 | } | 338 | } |
339 | 339 | ||
340 | /** | 340 | /** |
@@ -351,7 +351,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -351,7 +351,8 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
351 | @Override | 351 | @Override |
352 | public void onAttributeUpdate(AttributeUpdateNotificationMsg msg, TransportProtos.SessionInfoProto sessionInfo) { | 352 | public void onAttributeUpdate(AttributeUpdateNotificationMsg msg, TransportProtos.SessionInfoProto sessionInfo) { |
353 | LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo); | 353 | LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo); |
354 | - if (msg.getSharedUpdatedCount() > 0) { | 354 | + if (msg.getSharedUpdatedCount() > 0 && lwM2MClient != null) { |
355 | + log.warn ("2) OnAttributeUpdate, SharedUpdatedList() [{}]", msg.getSharedUpdatedList()); | ||
355 | msg.getSharedUpdatedList().forEach(tsKvProto -> { | 356 | msg.getSharedUpdatedList().forEach(tsKvProto -> { |
356 | String pathName = tsKvProto.getKv().getKey(); | 357 | String pathName = tsKvProto.getKv().getKey(); |
357 | String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName); | 358 | String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName); |
@@ -360,12 +361,12 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -360,12 +361,12 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
360 | && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentVersion()))) | 361 | && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentVersion()))) |
361 | || (OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.TITLE).equals(pathName) | 362 | || (OtaPackageUtil.getAttributeKey(OtaPackageType.FIRMWARE, OtaPackageKey.TITLE).equals(pathName) |
362 | && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentTitle())))) { | 363 | && (!valueNew.equals(lwM2MClient.getFwUpdate().getCurrentTitle())))) { |
363 | - this.getInfoFirmwareUpdate(lwM2MClient); | 364 | + this.getInfoFirmwareUpdate(lwM2MClient, null); |
364 | } else if ((OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.VERSION).equals(pathName) | 365 | } else if ((OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.VERSION).equals(pathName) |
365 | && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentVersion()))) | 366 | && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentVersion()))) |
366 | || (OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.TITLE).equals(pathName) | 367 | || (OtaPackageUtil.getAttributeKey(OtaPackageType.SOFTWARE, OtaPackageKey.TITLE).equals(pathName) |
367 | && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentTitle())))) { | 368 | && (!valueNew.equals(lwM2MClient.getSwUpdate().getCurrentTitle())))) { |
368 | - this.getInfoSoftwareUpdate(lwM2MClient); | 369 | + this.getInfoSoftwareUpdate(lwM2MClient, null); |
369 | } | 370 | } |
370 | if (pathIdVer != null) { | 371 | if (pathIdVer != null) { |
371 | ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.config | 372 | ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.config |
@@ -386,7 +387,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -386,7 +387,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
386 | } | 387 | } |
387 | 388 | ||
388 | }); | 389 | }); |
389 | - } else if (msg.getSharedDeletedCount() > 0) { | 390 | + } else if (msg.getSharedDeletedCount() > 0 && lwM2MClient != null) { |
390 | msg.getSharedUpdatedList().forEach(tsKvProto -> { | 391 | msg.getSharedUpdatedList().forEach(tsKvProto -> { |
391 | String pathName = tsKvProto.getKv().getKey(); | 392 | String pathName = tsKvProto.getKv().getKey(); |
392 | Object valueNew = getValueFromKvProto(tsKvProto.getKv()); | 393 | Object valueNew = getValueFromKvProto(tsKvProto.getKv()); |
@@ -396,6 +397,9 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -396,6 +397,9 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
396 | }); | 397 | }); |
397 | log.info("[{}] delete [{}] onAttributeUpdate", msg.getSharedDeletedList(), sessionInfo); | 398 | log.info("[{}] delete [{}] onAttributeUpdate", msg.getSharedDeletedList(), sessionInfo); |
398 | } | 399 | } |
400 | + else if (lwM2MClient == null) { | ||
401 | + log.error ("OnAttributeUpdate, lwM2MClient is null"); | ||
402 | + } | ||
399 | } | 403 | } |
400 | 404 | ||
401 | /** | 405 | /** |
@@ -442,6 +446,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -442,6 +446,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
442 | public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg toDeviceRpcRequestMsg, SessionInfoProto sessionInfo) { | 446 | public void onToDeviceRpcRequest(TransportProtos.ToDeviceRpcRequestMsg toDeviceRpcRequestMsg, SessionInfoProto sessionInfo) { |
443 | // #1 | 447 | // #1 |
444 | this.checkRpcRequestTimeout(); | 448 | this.checkRpcRequestTimeout(); |
449 | + log.warn ("4) toDeviceRpcRequestMsg: [{}], sessionUUID: [{}]", toDeviceRpcRequestMsg, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())); | ||
445 | String bodyParams = StringUtils.trimToNull(toDeviceRpcRequestMsg.getParams()) != null ? toDeviceRpcRequestMsg.getParams() : "null"; | 450 | String bodyParams = StringUtils.trimToNull(toDeviceRpcRequestMsg.getParams()) != null ? toDeviceRpcRequestMsg.getParams() : "null"; |
446 | LwM2mTypeOper lwM2mTypeOper = setValidTypeOper(toDeviceRpcRequestMsg.getMethodName()); | 451 | LwM2mTypeOper lwM2mTypeOper = setValidTypeOper(toDeviceRpcRequestMsg.getMethodName()); |
447 | UUID requestUUID = new UUID(toDeviceRpcRequestMsg.getRequestIdMSB(), toDeviceRpcRequestMsg.getRequestIdLSB()); | 452 | UUID requestUUID = new UUID(toDeviceRpcRequestMsg.getRequestIdMSB(), toDeviceRpcRequestMsg.getRequestIdLSB()); |
@@ -478,7 +483,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -478,7 +483,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
478 | rpcSubscriptionsToRemove.forEach(rpcSubscriptions::remove); | 483 | rpcSubscriptionsToRemove.forEach(rpcSubscriptions::remove); |
479 | } | 484 | } |
480 | 485 | ||
481 | - public void sentRpcRequest(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) { | 486 | + public void sentRpcResponse(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) { |
482 | rpcRequest.setResponseCode(requestCode); | 487 | rpcRequest.setResponseCode(requestCode); |
483 | if (LOG_LW2M_ERROR.equals(typeMsg)) { | 488 | if (LOG_LW2M_ERROR.equals(typeMsg)) { |
484 | rpcRequest.setInfoMsg(null); | 489 | rpcRequest.setInfoMsg(null); |
@@ -501,6 +506,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -501,6 +506,7 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
501 | 506 | ||
502 | @Override | 507 | @Override |
503 | public void onToDeviceRpcResponse(TransportProtos.ToDeviceRpcResponseMsg toDeviceResponse, SessionInfoProto sessionInfo) { | 508 | public void onToDeviceRpcResponse(TransportProtos.ToDeviceRpcResponseMsg toDeviceResponse, SessionInfoProto sessionInfo) { |
509 | + log.warn ("5) onToDeviceRpcResponse: [{}], sessionUUID: [{}]", toDeviceResponse, new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())); | ||
504 | transportService.process(sessionInfo, toDeviceResponse, null); | 510 | transportService.process(sessionInfo, toDeviceResponse, null); |
505 | } | 511 | } |
506 | 512 | ||
@@ -881,10 +887,16 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -881,10 +887,16 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
881 | */ | 887 | */ |
882 | private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) { | 888 | private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) { |
883 | LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer); | 889 | LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer); |
884 | - ResourceModel.Type currentType = resourceValue.getType(); | ||
885 | - ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer); | ||
886 | - return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType, | ||
887 | - new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer))); | 890 | + if (resourceValue != null) { |
891 | + ResourceModel.Type currentType = resourceValue.getType(); | ||
892 | + ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer); | ||
893 | + return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType, | ||
894 | + new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer))); | ||
895 | + } | ||
896 | + | ||
897 | + else { | ||
898 | + return null; | ||
899 | + } | ||
888 | } | 900 | } |
889 | 901 | ||
890 | /** | 902 | /** |
@@ -1245,22 +1257,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -1245,22 +1257,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
1245 | */ | 1257 | */ |
1246 | public void updateAttributeFromThingsboard(List<TransportProtos.TsKvProto> tsKvProtos, TransportProtos.SessionInfoProto sessionInfo) { | 1258 | public void updateAttributeFromThingsboard(List<TransportProtos.TsKvProto> tsKvProtos, TransportProtos.SessionInfoProto sessionInfo) { |
1247 | LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo); | 1259 | LwM2mClient lwM2MClient = clientContext.getClient(sessionInfo); |
1248 | - tsKvProtos.forEach(tsKvProto -> { | ||
1249 | - String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, tsKvProto.getKv().getKey()); | ||
1250 | - if (pathIdVer != null) { | ||
1251 | - // #1.1 | ||
1252 | - if (lwM2MClient.getDelayedRequests().containsKey(pathIdVer) && tsKvProto.getTs() > lwM2MClient.getDelayedRequests().get(pathIdVer).getTs()) { | ||
1253 | - lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto); | ||
1254 | - } else if (!lwM2MClient.getDelayedRequests().containsKey(pathIdVer)) { | ||
1255 | - lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto); | 1260 | + if (lwM2MClient != null) { |
1261 | + log.warn("1) UpdateAttributeFromThingsboard, tsKvProtos [{}]", tsKvProtos); | ||
1262 | + tsKvProtos.forEach(tsKvProto -> { | ||
1263 | + String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, tsKvProto.getKv().getKey()); | ||
1264 | + if (pathIdVer != null) { | ||
1265 | + // #1.1 | ||
1266 | + if (lwM2MClient.getDelayedRequests().containsKey(pathIdVer) && tsKvProto.getTs() > lwM2MClient.getDelayedRequests().get(pathIdVer).getTs()) { | ||
1267 | + lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto); | ||
1268 | + } else if (!lwM2MClient.getDelayedRequests().containsKey(pathIdVer)) { | ||
1269 | + lwM2MClient.getDelayedRequests().put(pathIdVer, tsKvProto); | ||
1270 | + } | ||
1256 | } | 1271 | } |
1257 | - } | ||
1258 | - }); | ||
1259 | - // #2.1 | ||
1260 | - lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> { | ||
1261 | - this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), | ||
1262 | - getValueFromKvProto(tsKvProto.getKv()), pathIdVer); | ||
1263 | - }); | 1272 | + }); |
1273 | + // #2.1 | ||
1274 | + lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> { | ||
1275 | + this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), | ||
1276 | + getValueFromKvProto(tsKvProto.getKv()), pathIdVer); | ||
1277 | + }); | ||
1278 | + } | ||
1279 | + else { | ||
1280 | + log.error("UpdateAttributeFromThingsboard, lwM2MClient is null"); | ||
1281 | + } | ||
1264 | } | 1282 | } |
1265 | 1283 | ||
1266 | /** | 1284 | /** |
@@ -1339,20 +1357,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -1339,20 +1357,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
1339 | } | 1357 | } |
1340 | } | 1358 | } |
1341 | 1359 | ||
1342 | - public void getInfoFirmwareUpdate(LwM2mClient lwM2MClient) { | 1360 | + public void getInfoFirmwareUpdate(LwM2mClient lwM2MClient, Lwm2mClientRpcRequest rpcRequest) { |
1343 | if (lwM2MClient.getRegistration().getSupportedVersion(FW_ID) != null) { | 1361 | if (lwM2MClient.getRegistration().getSupportedVersion(FW_ID) != null) { |
1344 | SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient); | 1362 | SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient); |
1345 | if (sessionInfo != null) { | 1363 | if (sessionInfo != null) { |
1346 | - transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.FIRMWARE.name()), | 1364 | + DefaultLwM2MTransportMsgHandler handler = this; |
1365 | + this.transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.FIRMWARE.name()), | ||
1347 | new TransportServiceCallback<>() { | 1366 | new TransportServiceCallback<>() { |
1348 | @Override | 1367 | @Override |
1349 | public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) { | 1368 | public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) { |
1350 | if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus()) | 1369 | if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus()) |
1351 | && response.getType().equals(OtaPackageType.FIRMWARE.name())) { | 1370 | && response.getType().equals(OtaPackageType.FIRMWARE.name())) { |
1371 | + log.warn ("7) firmware start with ver: [{}]", response.getVersion()); | ||
1372 | + lwM2MClient.getFwUpdate().setRpcRequest(rpcRequest); | ||
1352 | lwM2MClient.getFwUpdate().setCurrentVersion(response.getVersion()); | 1373 | lwM2MClient.getFwUpdate().setCurrentVersion(response.getVersion()); |
1353 | lwM2MClient.getFwUpdate().setCurrentTitle(response.getTitle()); | 1374 | lwM2MClient.getFwUpdate().setCurrentTitle(response.getTitle()); |
1354 | lwM2MClient.getFwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId()); | 1375 | lwM2MClient.getFwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId()); |
1355 | - lwM2MClient.getFwUpdate().sendReadObserveInfo(lwM2mTransportRequest); | 1376 | + if (rpcRequest == null) { |
1377 | + lwM2MClient.getFwUpdate().sendReadObserveInfo(lwM2mTransportRequest); | ||
1378 | + } | ||
1379 | + else { | ||
1380 | + lwM2MClient.getFwUpdate().writeFwSwWare(handler, lwM2mTransportRequest); | ||
1381 | + } | ||
1356 | } else { | 1382 | } else { |
1357 | log.trace("OtaPackage [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString()); | 1383 | log.trace("OtaPackage [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString()); |
1358 | } | 1384 | } |
@@ -1367,21 +1393,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | @@ -1367,21 +1393,28 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler | ||
1367 | } | 1393 | } |
1368 | } | 1394 | } |
1369 | 1395 | ||
1370 | - public void getInfoSoftwareUpdate(LwM2mClient lwM2MClient) { | 1396 | + public void getInfoSoftwareUpdate(LwM2mClient lwM2MClient, Lwm2mClientRpcRequest rpcRequest) { |
1371 | if (lwM2MClient.getRegistration().getSupportedVersion(SW_ID) != null) { | 1397 | if (lwM2MClient.getRegistration().getSupportedVersion(SW_ID) != null) { |
1372 | SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient); | 1398 | SessionInfoProto sessionInfo = this.getSessionInfoOrCloseSession(lwM2MClient); |
1373 | if (sessionInfo != null) { | 1399 | if (sessionInfo != null) { |
1374 | - DefaultLwM2MTransportMsgHandler serviceImpl = this; | 1400 | + DefaultLwM2MTransportMsgHandler handler = this; |
1375 | transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.SOFTWARE.name()), | 1401 | transportService.process(sessionInfo, createOtaPackageRequestMsg(sessionInfo, OtaPackageType.SOFTWARE.name()), |
1376 | new TransportServiceCallback<>() { | 1402 | new TransportServiceCallback<>() { |
1377 | @Override | 1403 | @Override |
1378 | public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) { | 1404 | public void onSuccess(TransportProtos.GetOtaPackageResponseMsg response) { |
1379 | if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus()) | 1405 | if (TransportProtos.ResponseStatus.SUCCESS.equals(response.getResponseStatus()) |
1380 | && response.getType().equals(OtaPackageType.SOFTWARE.name())) { | 1406 | && response.getType().equals(OtaPackageType.SOFTWARE.name())) { |
1407 | + lwM2MClient.getSwUpdate().setRpcRequest(rpcRequest); | ||
1381 | lwM2MClient.getSwUpdate().setCurrentVersion(response.getVersion()); | 1408 | lwM2MClient.getSwUpdate().setCurrentVersion(response.getVersion()); |
1382 | lwM2MClient.getSwUpdate().setCurrentTitle(response.getTitle()); | 1409 | lwM2MClient.getSwUpdate().setCurrentTitle(response.getTitle()); |
1383 | lwM2MClient.getSwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId()); | 1410 | lwM2MClient.getSwUpdate().setCurrentId(new OtaPackageId(new UUID(response.getOtaPackageIdMSB(), response.getOtaPackageIdLSB())).getId()); |
1384 | lwM2MClient.getSwUpdate().sendReadObserveInfo(lwM2mTransportRequest); | 1411 | lwM2MClient.getSwUpdate().sendReadObserveInfo(lwM2mTransportRequest); |
1412 | + if (rpcRequest == null) { | ||
1413 | + lwM2MClient.getSwUpdate().sendReadObserveInfo(lwM2mTransportRequest); | ||
1414 | + } | ||
1415 | + else { | ||
1416 | + lwM2MClient.getSwUpdate().writeFwSwWare(handler, lwM2mTransportRequest); | ||
1417 | + } | ||
1385 | } else { | 1418 | } else { |
1386 | log.trace("Software [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString()); | 1419 | log.trace("Software [{}] [{}]", lwM2MClient.getDeviceName(), response.getResponseStatus().toString()); |
1387 | } | 1420 | } |
@@ -82,10 +82,8 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.L | @@ -82,10 +82,8 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.L | ||
82 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LW2M_VALUE; | 82 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LW2M_VALUE; |
83 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper; | 83 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper; |
84 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER; | 84 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER; |
85 | -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER_ALL; | ||
86 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE; | 85 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE; |
87 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL; | 86 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL; |
88 | -import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL_ALL; | ||
89 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL; | 87 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL; |
90 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES; | 88 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES; |
91 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_REPLACE; | 89 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_REPLACE; |
@@ -134,7 +132,7 @@ public class LwM2mTransportRequest { | @@ -134,7 +132,7 @@ public class LwM2mTransportRequest { | ||
134 | ContentFormat contentFormat = contentFormatName != null ? ContentFormat.fromName(contentFormatName.toUpperCase()) : ContentFormat.DEFAULT; | 132 | ContentFormat contentFormat = contentFormatName != null ? ContentFormat.fromName(contentFormatName.toUpperCase()) : ContentFormat.DEFAULT; |
135 | LwM2mClient lwM2MClient = this.lwM2mClientContext.getOrRegister(registration); | 133 | LwM2mClient lwM2MClient = this.lwM2mClientContext.getOrRegister(registration); |
136 | LwM2mPath resultIds = target != null ? new LwM2mPath(target) : null; | 134 | LwM2mPath resultIds = target != null ? new LwM2mPath(target) : null; |
137 | - if (!OBSERVE_READ_ALL.name().equals(typeOper.name()) && resultIds != null && registration != null && resultIds.getObjectId() >= 0 && lwM2MClient != null) { | 135 | + if (!OBSERVE_CANCEL.name().equals(typeOper.name()) && resultIds != null && registration != null && resultIds.getObjectId() >= 0 && lwM2MClient != null) { |
138 | if (lwM2MClient.isValidObjectVersion(targetIdVer)) { | 136 | if (lwM2MClient.isValidObjectVersion(targetIdVer)) { |
139 | timeoutInMs = timeoutInMs > 0 ? timeoutInMs : DEFAULT_TIMEOUT; | 137 | timeoutInMs = timeoutInMs > 0 ? timeoutInMs : DEFAULT_TIMEOUT; |
140 | DownlinkRequest request = createRequest(registration, lwM2MClient, typeOper, contentFormat, target, | 138 | DownlinkRequest request = createRequest(registration, lwM2MClient, typeOper, contentFormat, target, |
@@ -153,47 +151,66 @@ public class LwM2mTransportRequest { | @@ -153,47 +151,66 @@ public class LwM2mTransportRequest { | ||
153 | } else if (WRITE_UPDATE.name().equals(typeOper.name())) { | 151 | } else if (WRITE_UPDATE.name().equals(typeOper.name())) { |
154 | if (lwm2mClientRpcRequest != null) { | 152 | if (lwm2mClientRpcRequest != null) { |
155 | String errorMsg = String.format("Path %s params is not valid", targetIdVer); | 153 | String errorMsg = String.format("Path %s params is not valid", targetIdVer); |
156 | - handler.sentRpcRequest(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); | 154 | + handler.sentRpcResponse(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); |
157 | } | 155 | } |
158 | } else if (WRITE_REPLACE.name().equals(typeOper.name()) || EXECUTE.name().equals(typeOper.name())) { | 156 | } else if (WRITE_REPLACE.name().equals(typeOper.name()) || EXECUTE.name().equals(typeOper.name())) { |
159 | if (lwm2mClientRpcRequest != null) { | 157 | if (lwm2mClientRpcRequest != null) { |
160 | String errorMsg = String.format("Path %s object model is absent", targetIdVer); | 158 | String errorMsg = String.format("Path %s object model is absent", targetIdVer); |
161 | - handler.sentRpcRequest(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); | 159 | + handler.sentRpcResponse(lwm2mClientRpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); |
162 | } | 160 | } |
163 | } else if (!OBSERVE_CANCEL.name().equals(typeOper.name())) { | 161 | } else if (!OBSERVE_CANCEL.name().equals(typeOper.name())) { |
164 | log.error("[{}], [{}] - [{}] error SendRequest", registration.getEndpoint(), typeOper.name(), targetIdVer); | 162 | log.error("[{}], [{}] - [{}] error SendRequest", registration.getEndpoint(), typeOper.name(), targetIdVer); |
165 | if (lwm2mClientRpcRequest != null) { | 163 | if (lwm2mClientRpcRequest != null) { |
166 | ResourceModel resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); | 164 | ResourceModel resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); |
167 | String errorMsg = resourceModel == null ? String.format("Path %s not found in object version", targetIdVer) : "SendRequest - null"; | 165 | String errorMsg = resourceModel == null ? String.format("Path %s not found in object version", targetIdVer) : "SendRequest - null"; |
168 | - this.handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); | 166 | + this.handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); |
169 | } | 167 | } |
170 | } | 168 | } |
171 | } else if (lwm2mClientRpcRequest != null) { | 169 | } else if (lwm2mClientRpcRequest != null) { |
172 | String errorMsg = String.format("Path %s not found in object version", targetIdVer); | 170 | String errorMsg = String.format("Path %s not found in object version", targetIdVer); |
173 | - this.handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); | 171 | + this.handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); |
174 | } | 172 | } |
175 | - } else if (OBSERVE_READ_ALL.name().equals(typeOper.name()) || DISCOVER_ALL.name().equals(typeOper.name())) { | ||
176 | - Set<String> paths; | ||
177 | - if (OBSERVE_READ_ALL.name().equals(typeOper.name())) { | ||
178 | - Set<Observation> observations = context.getServer().getObservationService().getObservations(registration); | ||
179 | - paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet()); | ||
180 | - } else { | ||
181 | - assert registration != null; | ||
182 | - Link[] objectLinks = registration.getSortedObjectLinks(); | ||
183 | - paths = Arrays.stream(objectLinks).map(Link::toString).collect(Collectors.toUnmodifiableSet()); | ||
184 | - } | ||
185 | - String msg = String.format("%s: type operation %s paths - %s", LOG_LW2M_INFO, | ||
186 | - typeOper.name(), paths); | ||
187 | - this.handler.sendLogsToThingsboard(msg, registration.getId()); | ||
188 | - if (lwm2mClientRpcRequest != null) { | ||
189 | - String valueMsg = String.format("Paths - %s", paths); | ||
190 | - this.handler.sentRpcRequest(lwm2mClientRpcRequest, CONTENT.name(), valueMsg, LOG_LW2M_VALUE); | 173 | + } else { |
174 | + switch (typeOper) { | ||
175 | + case OBSERVE_READ_ALL: | ||
176 | + case DISCOVER_ALL: | ||
177 | + Set<String> paths; | ||
178 | + if (OBSERVE_READ_ALL.name().equals(typeOper.name())) { | ||
179 | + Set<Observation> observations = context.getServer().getObservationService().getObservations(registration); | ||
180 | + paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet()); | ||
181 | + } else { | ||
182 | + assert registration != null; | ||
183 | + Link[] objectLinks = registration.getSortedObjectLinks(); | ||
184 | + paths = Arrays.stream(objectLinks).map(Link::toString).collect(Collectors.toUnmodifiableSet()); | ||
185 | + } | ||
186 | + String msg = String.format("%s: type operation %s paths - %s", LOG_LW2M_INFO, | ||
187 | + typeOper.name(), paths); | ||
188 | + this.handler.sendLogsToThingsboard(msg, registration.getId()); | ||
189 | + if (lwm2mClientRpcRequest != null) { | ||
190 | + String valueMsg = String.format("Paths - %s", paths); | ||
191 | + this.handler.sentRpcResponse(lwm2mClientRpcRequest, CONTENT.name(), valueMsg, LOG_LW2M_VALUE); | ||
192 | + } | ||
193 | + break; | ||
194 | + case OBSERVE_CANCEL: | ||
195 | + case OBSERVE_CANCEL_ALL: | ||
196 | + int observeCancelCnt = 0; | ||
197 | + String observeCancelMsg = null; | ||
198 | + if (OBSERVE_CANCEL.name().equals(typeOper)) { | ||
199 | + observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration, target); | ||
200 | + observeCancelMsg = String.format("%s: type operation %s paths: %s count: %d", LOG_LW2M_INFO, | ||
201 | + OBSERVE_CANCEL.name(), target, observeCancelCnt); | ||
202 | + } else { | ||
203 | + observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration); | ||
204 | + observeCancelMsg = String.format("%s: type operation %s paths: All count: %d", LOG_LW2M_INFO, | ||
205 | + OBSERVE_CANCEL.name(), observeCancelCnt); | ||
206 | + } | ||
207 | + this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsg, lwm2mClientRpcRequest); | ||
208 | + break; | ||
209 | + // lwm2mClientRpcRequest != null | ||
210 | + case FW_UPDATE: | ||
211 | + this.handler.getInfoFirmwareUpdate(lwM2MClient, lwm2mClientRpcRequest); | ||
212 | + break; | ||
191 | } | 213 | } |
192 | - } else if (OBSERVE_CANCEL_ALL.name().equals(typeOper.name())) { | ||
193 | - int observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration); | ||
194 | - String observeCancelMsgAll = String.format("%s: type operation %s paths: All count: %d", LOG_LW2M_INFO, | ||
195 | - OBSERVE_CANCEL.name(), observeCancelCnt); | ||
196 | - this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsgAll, lwm2mClientRpcRequest); | ||
197 | } | 214 | } |
198 | } catch (Exception e) { | 215 | } catch (Exception e) { |
199 | String msg = String.format("%s: type operation %s %s", LOG_LW2M_ERROR, | 216 | String msg = String.format("%s: type operation %s %s", LOG_LW2M_ERROR, |
@@ -201,7 +218,7 @@ public class LwM2mTransportRequest { | @@ -201,7 +218,7 @@ public class LwM2mTransportRequest { | ||
201 | handler.sendLogsToThingsboard(msg, registration.getId()); | 218 | handler.sendLogsToThingsboard(msg, registration.getId()); |
202 | if (lwm2mClientRpcRequest != null) { | 219 | if (lwm2mClientRpcRequest != null) { |
203 | String errorMsg = String.format("Path %s type operation %s %s", targetIdVer, typeOper.name(), e.getMessage()); | 220 | String errorMsg = String.format("Path %s type operation %s %s", targetIdVer, typeOper.name(), e.getMessage()); |
204 | - handler.sentRpcRequest(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); | 221 | + handler.sentRpcResponse(lwm2mClientRpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); |
205 | } | 222 | } |
206 | } | 223 | } |
207 | } | 224 | } |
@@ -234,17 +251,6 @@ public class LwM2mTransportRequest { | @@ -234,17 +251,6 @@ public class LwM2mTransportRequest { | ||
234 | request = new ObserveRequest(contentFormat, resultIds.getObjectId()); | 251 | request = new ObserveRequest(contentFormat, resultIds.getObjectId()); |
235 | } | 252 | } |
236 | break; | 253 | break; |
237 | - case OBSERVE_CANCEL: | ||
238 | - /* | ||
239 | - lwM2MTransportRequest.sendAllRequest(lwServer, registration, path, POST_TYPE_OPER_OBSERVE_CANCEL, null, null, null, null, context.getTimeout()); | ||
240 | - At server side this will not remove the observation from the observation store, to do it you need to use | ||
241 | - {@code ObservationService#cancelObservation()} | ||
242 | - */ | ||
243 | - int observeCancelCnt = context.getServer().getObservationService().cancelObservations(registration, target); | ||
244 | - String observeCancelMsg = String.format("%s: type operation %s paths: %s count: %d", LOG_LW2M_INFO, | ||
245 | - OBSERVE_CANCEL.name(), target, observeCancelCnt); | ||
246 | - this.afterObserveCancel(registration, observeCancelCnt, observeCancelMsg, rpcRequest); | ||
247 | - break; | ||
248 | case EXECUTE: | 254 | case EXECUTE: |
249 | ResourceModel resourceModelExecute = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); | 255 | ResourceModel resourceModelExecute = lwM2MClient.getResourceModel(targetIdVer, this.config.getModelProvider()); |
250 | if (resourceModelExecute != null) { | 256 | if (resourceModelExecute != null) { |
@@ -343,7 +349,7 @@ public class LwM2mTransportRequest { | @@ -343,7 +349,7 @@ public class LwM2mTransportRequest { | ||
343 | } | 349 | } |
344 | /** Not Found */ | 350 | /** Not Found */ |
345 | if (rpcRequest != null) { | 351 | if (rpcRequest != null) { |
346 | - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), response.getErrorMessage(), LOG_LW2M_ERROR); | 352 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), response.getErrorMessage(), LOG_LW2M_ERROR); |
347 | } | 353 | } |
348 | /** Not Found | 354 | /** Not Found |
349 | set setClient_fw_info... = empty | 355 | set setClient_fw_info... = empty |
@@ -385,7 +391,7 @@ public class LwM2mTransportRequest { | @@ -385,7 +391,7 @@ public class LwM2mTransportRequest { | ||
385 | handler.sendLogsToThingsboard(msg, registration.getId()); | 391 | handler.sendLogsToThingsboard(msg, registration.getId()); |
386 | log.error("[{}] [{}] - [{}] error SendRequest", request.getClass().getName().toString(), request.getPath().toString(), e.toString()); | 392 | log.error("[{}] [{}] - [{}] error SendRequest", request.getClass().getName().toString(), request.getPath().toString(), e.toString()); |
387 | if (rpcRequest != null) { | 393 | if (rpcRequest != null) { |
388 | - handler.sentRpcRequest(rpcRequest, CoAP.CodeClass.ERROR_RESPONSE.name(), e.getMessage(), LOG_LW2M_ERROR); | 394 | + handler.sentRpcResponse(rpcRequest, CoAP.CodeClass.ERROR_RESPONSE.name(), e.getMessage(), LOG_LW2M_ERROR); |
389 | } | 395 | } |
390 | }); | 396 | }); |
391 | } | 397 | } |
@@ -431,7 +437,7 @@ public class LwM2mTransportRequest { | @@ -431,7 +437,7 @@ public class LwM2mTransportRequest { | ||
431 | log.error("Path: [{}] type: [{}] value: [{}] errorMsg: [{}]]", patn, type, value, e.toString()); | 437 | log.error("Path: [{}] type: [{}] value: [{}] errorMsg: [{}]]", patn, type, value, e.toString()); |
432 | if (rpcRequest != null) { | 438 | if (rpcRequest != null) { |
433 | String errorMsg = String.format("NumberFormatException: Resource path - %s type - %s value - %s", patn, type, value); | 439 | String errorMsg = String.format("NumberFormatException: Resource path - %s type - %s value - %s", patn, type, value); |
434 | - handler.sentRpcRequest(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); | 440 | + handler.sentRpcResponse(rpcRequest, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR); |
435 | } | 441 | } |
436 | return null; | 442 | return null; |
437 | } | 443 | } |
@@ -462,44 +468,48 @@ public class LwM2mTransportRequest { | @@ -462,44 +468,48 @@ public class LwM2mTransportRequest { | ||
462 | if (response instanceof ReadResponse) { | 468 | if (response instanceof ReadResponse) { |
463 | handler.onUpdateValueAfterReadResponse(registration, pathIdVer, (ReadResponse) response, rpcRequest); | 469 | handler.onUpdateValueAfterReadResponse(registration, pathIdVer, (ReadResponse) response, rpcRequest); |
464 | } else if (response instanceof DeleteResponse) { | 470 | } else if (response instanceof DeleteResponse) { |
465 | - log.warn("[{}] Path [{}] DeleteResponse 5_Send", pathIdVer, response); | 471 | + log.warn("11) [{}] Path [{}] DeleteResponse", pathIdVer, response); |
472 | + if (rpcRequest != null) { | ||
473 | + rpcRequest.setInfoMsg(null); | ||
474 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), null, null); | ||
475 | + } | ||
466 | } else if (response instanceof DiscoverResponse) { | 476 | } else if (response instanceof DiscoverResponse) { |
467 | - String discoverValue = Link.serialize(((DiscoverResponse)response).getObjectLinks()); | 477 | + String discoverValue = Link.serialize(((DiscoverResponse) response).getObjectLinks()); |
468 | msgLog = String.format("%s: type operation: %s path: %s value: %s", | 478 | msgLog = String.format("%s: type operation: %s path: %s value: %s", |
469 | LOG_LW2M_INFO, DISCOVER.name(), request.getPath().toString(), discoverValue); | 479 | LOG_LW2M_INFO, DISCOVER.name(), request.getPath().toString(), discoverValue); |
470 | handler.sendLogsToThingsboard(msgLog, registration.getId()); | 480 | handler.sendLogsToThingsboard(msgLog, registration.getId()); |
471 | log.warn("DiscoverResponse: [{}]", (DiscoverResponse) response); | 481 | log.warn("DiscoverResponse: [{}]", (DiscoverResponse) response); |
472 | if (rpcRequest != null) { | 482 | if (rpcRequest != null) { |
473 | - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), discoverValue, LOG_LW2M_VALUE); | 483 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), discoverValue, LOG_LW2M_VALUE); |
474 | } | 484 | } |
475 | } else if (response instanceof ExecuteResponse) { | 485 | } else if (response instanceof ExecuteResponse) { |
476 | - log.warn("[{}] Path [{}] ExecuteResponse 7_Send", pathIdVer, response); | 486 | + msgLog = String.format("%s: type operation: %s path: %s", |
487 | + LOG_LW2M_INFO, EXECUTE.name(), request.getPath().toString()); | ||
488 | + log.warn("9) [{}] ", msgLog); | ||
489 | + handler.sendLogsToThingsboard(msgLog, registration.getId()); | ||
490 | + if (rpcRequest != null) { | ||
491 | + msgLog = String.format("Start %s path: %S. Preparation finished: %s", EXECUTE.name(), path, rpcRequest.getInfoMsg()); | ||
492 | + rpcRequest.setInfoMsg(msgLog); | ||
493 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), path, LOG_LW2M_INFO); | ||
494 | + } | ||
495 | + | ||
477 | } else if (response instanceof WriteAttributesResponse) { | 496 | } else if (response instanceof WriteAttributesResponse) { |
478 | msgLog = String.format("%s: type operation: %s path: %s value: %s", | 497 | msgLog = String.format("%s: type operation: %s path: %s value: %s", |
479 | LOG_LW2M_INFO, WRITE_ATTRIBUTES.name(), request.getPath().toString(), ((WriteAttributesRequest) request).getAttributes().toString()); | 498 | LOG_LW2M_INFO, WRITE_ATTRIBUTES.name(), request.getPath().toString(), ((WriteAttributesRequest) request).getAttributes().toString()); |
480 | handler.sendLogsToThingsboard(msgLog, registration.getId()); | 499 | handler.sendLogsToThingsboard(msgLog, registration.getId()); |
481 | - log.warn("[{}] Path [{}] WriteAttributesResponse 8_Send", pathIdVer, response); | 500 | + log.warn("12) [{}] Path [{}] WriteAttributesResponse", pathIdVer, response); |
482 | if (rpcRequest != null) { | 501 | if (rpcRequest != null) { |
483 | - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), response.toString(), LOG_LW2M_VALUE); | 502 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), response.toString(), LOG_LW2M_VALUE); |
484 | } | 503 | } |
485 | } else if (response instanceof WriteResponse) { | 504 | } else if (response instanceof WriteResponse) { |
486 | - log.warn("[{}] Path [{}] WriteResponse 9_Send", pathIdVer, response); | ||
487 | - this.infoWriteResponse(registration, response, request); | 505 | + msgLog = String.format("Type operation: Write path: %s", pathIdVer); |
506 | + log.warn("10) [{}] response: [{}]", msgLog, response); | ||
507 | + this.infoWriteResponse(registration, response, request, rpcRequest); | ||
488 | handler.onWriteResponseOk(registration, pathIdVer, (WriteRequest) request); | 508 | handler.onWriteResponseOk(registration, pathIdVer, (WriteRequest) request); |
489 | } | 509 | } |
490 | - if (rpcRequest != null) { | ||
491 | - if (response instanceof ExecuteResponse | ||
492 | - || response instanceof WriteAttributesResponse | ||
493 | - || response instanceof DeleteResponse) { | ||
494 | - rpcRequest.setInfoMsg(null); | ||
495 | - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), null, null); | ||
496 | - } else if (response instanceof WriteResponse) { | ||
497 | - handler.sentRpcRequest(rpcRequest, response.getCode().getName(), null, LOG_LW2M_INFO); | ||
498 | - } | ||
499 | - } | ||
500 | } | 510 | } |
501 | 511 | ||
502 | - private void infoWriteResponse(Registration registration, LwM2mResponse response, DownlinkRequest request) { | 512 | + private void infoWriteResponse(Registration registration, LwM2mResponse response, DownlinkRequest request, Lwm2mClientRpcRequest rpcRequest) { |
503 | try { | 513 | try { |
504 | LwM2mNode node = ((WriteRequest) request).getNode(); | 514 | LwM2mNode node = ((WriteRequest) request).getNode(); |
505 | String msg = null; | 515 | String msg = null; |
@@ -517,12 +527,12 @@ public class LwM2mTransportRequest { | @@ -517,12 +527,12 @@ public class LwM2mTransportRequest { | ||
517 | if (singleResource.getType() == ResourceModel.Type.STRING) { | 527 | if (singleResource.getType() == ResourceModel.Type.STRING) { |
518 | valueLength = ((String) singleResource.getValue()).length(); | 528 | valueLength = ((String) singleResource.getValue()).length(); |
519 | value = ((String) singleResource.getValue()) | 529 | value = ((String) singleResource.getValue()) |
520 | - .substring(Math.min(valueLength, config.getLogMaxLength())); | 530 | + .substring(Math.min(valueLength, config.getLogMaxLength())).trim(); |
521 | 531 | ||
522 | } else { | 532 | } else { |
523 | valueLength = ((byte[]) singleResource.getValue()).length; | 533 | valueLength = ((byte[]) singleResource.getValue()).length; |
524 | value = new String(Arrays.copyOf(((byte[]) singleResource.getValue()), | 534 | value = new String(Arrays.copyOf(((byte[]) singleResource.getValue()), |
525 | - Math.min(valueLength, config.getLogMaxLength()))); | 535 | + Math.min(valueLength, config.getLogMaxLength()))).trim(); |
526 | } | 536 | } |
527 | value = valueLength > config.getLogMaxLength() ? value + "..." : value; | 537 | value = valueLength > config.getLogMaxLength() ? value + "..." : value; |
528 | msg = String.format("%s: Update finished successfully: Lwm2m code - %d Resource path: %s length: %s value: %s", | 538 | msg = String.format("%s: Update finished successfully: Lwm2m code - %d Resource path: %s length: %s value: %s", |
@@ -538,6 +548,12 @@ public class LwM2mTransportRequest { | @@ -538,6 +548,12 @@ public class LwM2mTransportRequest { | ||
538 | handler.sendLogsToThingsboard(msg, registration.getId()); | 548 | handler.sendLogsToThingsboard(msg, registration.getId()); |
539 | if (request.getPath().toString().equals(FW_PACKAGE_ID) || request.getPath().toString().equals(SW_PACKAGE_ID)) { | 549 | if (request.getPath().toString().equals(FW_PACKAGE_ID) || request.getPath().toString().equals(SW_PACKAGE_ID)) { |
540 | this.afterWriteSuccessFwSwUpdate(registration, request); | 550 | this.afterWriteSuccessFwSwUpdate(registration, request); |
551 | + if (rpcRequest != null) { | ||
552 | + rpcRequest.setInfoMsg(msg); | ||
553 | + } | ||
554 | + } | ||
555 | + else if (rpcRequest != null) { | ||
556 | + handler.sentRpcResponse(rpcRequest, response.getCode().getName(), msg, LOG_LW2M_INFO); | ||
541 | } | 557 | } |
542 | } | 558 | } |
543 | } catch (Exception e) { | 559 | } catch (Exception e) { |
@@ -558,7 +574,7 @@ public class LwM2mTransportRequest { | @@ -558,7 +574,7 @@ public class LwM2mTransportRequest { | ||
558 | } | 574 | } |
559 | if (request.getPath().toString().equals(SW_PACKAGE_ID) && lwM2MClient.getSwUpdate() != null) { | 575 | if (request.getPath().toString().equals(SW_PACKAGE_ID) && lwM2MClient.getSwUpdate() != null) { |
560 | lwM2MClient.getSwUpdate().setStateUpdate(DOWNLOADED.name()); | 576 | lwM2MClient.getSwUpdate().setStateUpdate(DOWNLOADED.name()); |
561 | - lwM2MClient.getSwUpdate().sendLogs(this.handler,WRITE_REPLACE.name(), LOG_LW2M_INFO, null); | 577 | + lwM2MClient.getSwUpdate().sendLogs(this.handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null); |
562 | } | 578 | } |
563 | } | 579 | } |
564 | 580 | ||
@@ -592,7 +608,7 @@ public class LwM2mTransportRequest { | @@ -592,7 +608,7 @@ public class LwM2mTransportRequest { | ||
592 | log.warn("[{}]", observeCancelMsg); | 608 | log.warn("[{}]", observeCancelMsg); |
593 | if (rpcRequest != null) { | 609 | if (rpcRequest != null) { |
594 | rpcRequest.setInfoMsg(String.format("Count: %d", observeCancelCnt)); | 610 | rpcRequest.setInfoMsg(String.format("Count: %d", observeCancelCnt)); |
595 | - handler.sentRpcRequest(rpcRequest, CONTENT.name(), null, LOG_LW2M_INFO); | 611 | + handler.sentRpcResponse(rpcRequest, CONTENT.name(), null, LOG_LW2M_INFO); |
596 | } | 612 | } |
597 | } | 613 | } |
598 | } | 614 | } |
@@ -53,6 +53,8 @@ import java.io.ByteArrayInputStream; | @@ -53,6 +53,8 @@ import java.io.ByteArrayInputStream; | ||
53 | import java.io.IOException; | 53 | import java.io.IOException; |
54 | import java.util.ArrayList; | 54 | import java.util.ArrayList; |
55 | import java.util.List; | 55 | import java.util.List; |
56 | +import java.util.concurrent.TimeUnit; | ||
57 | +import java.util.concurrent.atomic.AtomicInteger; | ||
56 | 58 | ||
57 | import static org.thingsboard.server.gen.transport.TransportProtos.KeyValueType.BOOLEAN_V; | 59 | import static org.thingsboard.server.gen.transport.TransportProtos.KeyValueType.BOOLEAN_V; |
58 | 60 | ||
@@ -64,6 +66,13 @@ public class LwM2mTransportServerHelper { | @@ -64,6 +66,13 @@ public class LwM2mTransportServerHelper { | ||
64 | 66 | ||
65 | private final LwM2mTransportContext context; | 67 | private final LwM2mTransportContext context; |
66 | private final LwM2MJsonAdaptor adaptor; | 68 | private final LwM2MJsonAdaptor adaptor; |
69 | + private final AtomicInteger atomicTs = new AtomicInteger(0); | ||
70 | + | ||
71 | + | ||
72 | + public long getTS() { | ||
73 | + int addTs = atomicTs.getAndIncrement() >= 1000 ? atomicTs.getAndSet(0) : atomicTs.get(); | ||
74 | + return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()) * 1000L + addTs; | ||
75 | + } | ||
67 | 76 | ||
68 | /** | 77 | /** |
69 | * send to Thingsboard Attribute || Telemetry | 78 | * send to Thingsboard Attribute || Telemetry |
@@ -96,7 +105,7 @@ public class LwM2mTransportServerHelper { | @@ -96,7 +105,7 @@ public class LwM2mTransportServerHelper { | ||
96 | public void sendParametersOnThingsboardTelemetry(List<TransportProtos.KeyValueProto> result, SessionInfoProto sessionInfo) { | 105 | public void sendParametersOnThingsboardTelemetry(List<TransportProtos.KeyValueProto> result, SessionInfoProto sessionInfo) { |
97 | PostTelemetryMsg.Builder request = PostTelemetryMsg.newBuilder(); | 106 | PostTelemetryMsg.Builder request = PostTelemetryMsg.newBuilder(); |
98 | TransportProtos.TsKvListProto.Builder builder = TransportProtos.TsKvListProto.newBuilder(); | 107 | TransportProtos.TsKvListProto.Builder builder = TransportProtos.TsKvListProto.newBuilder(); |
99 | - builder.setTs(System.currentTimeMillis()); | 108 | + builder.setTs(this.getTS()); |
100 | builder.addAllKv(result); | 109 | builder.addAllKv(result); |
101 | request.addTsKvList(builder.build()); | 110 | request.addTsKvList(builder.build()); |
102 | PostTelemetryMsg postTelemetryMsg = request.build(); | 111 | PostTelemetryMsg postTelemetryMsg = request.build(); |
@@ -229,11 +229,12 @@ public class LwM2mTransportUtil { | @@ -229,11 +229,12 @@ public class LwM2mTransportUtil { | ||
229 | */ | 229 | */ |
230 | WRITE_UPDATE(9, "WriteUpdate"), | 230 | WRITE_UPDATE(9, "WriteUpdate"), |
231 | WRITE_ATTRIBUTES(10, "WriteAttributes"), | 231 | WRITE_ATTRIBUTES(10, "WriteAttributes"), |
232 | - DELETE(11, "Delete"); | 232 | + DELETE(11, "Delete"), |
233 | 233 | ||
234 | // only for RPC | 234 | // only for RPC |
235 | + FW_UPDATE(12,"FirmwareUpdate"); | ||
235 | // FW_READ_INFO(12, "FirmwareReadInfo"), | 236 | // FW_READ_INFO(12, "FirmwareReadInfo"), |
236 | -// FW_UPDATE(13, "FirmwareUpdate"), | 237 | + |
237 | // SW_READ_INFO(15, "SoftwareReadInfo"), | 238 | // SW_READ_INFO(15, "SoftwareReadInfo"), |
238 | // SW_UPDATE(16, "SoftwareUpdate"), | 239 | // SW_UPDATE(16, "SoftwareUpdate"), |
239 | // SW_UNINSTALL(18, "SoftwareUninstall"); | 240 | // SW_UNINSTALL(18, "SoftwareUninstall"); |
@@ -83,11 +83,17 @@ public class LwM2mClientContextImpl implements LwM2mClientContext { | @@ -83,11 +83,17 @@ public class LwM2mClientContextImpl implements LwM2mClientContext { | ||
83 | 83 | ||
84 | @Override | 84 | @Override |
85 | public LwM2mClient getClient(TransportProtos.SessionInfoProto sessionInfo) { | 85 | public LwM2mClient getClient(TransportProtos.SessionInfoProto sessionInfo) { |
86 | - return lwM2mClientsByEndpoint.values().stream().filter(c -> | 86 | + LwM2mClient lwM2mClient = lwM2mClientsByEndpoint.values().stream().filter(c -> |
87 | (new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())) | 87 | (new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())) |
88 | .equals((new UUID(c.getSession().getSessionIdMSB(), c.getSession().getSessionIdLSB()))) | 88 | .equals((new UUID(c.getSession().getSessionIdMSB(), c.getSession().getSessionIdLSB()))) |
89 | 89 | ||
90 | ).findAny().get(); | 90 | ).findAny().get(); |
91 | + if (lwM2mClient == null) { | ||
92 | + log.warn("Device TimeOut? lwM2mClient is null."); | ||
93 | + log.warn("SessionInfo input [{}], lwM2mClientsByEndpoint size: [{}]", sessionInfo, lwM2mClientsByEndpoint.values().size()); | ||
94 | + log.error("", new RuntimeException()); | ||
95 | + } | ||
96 | + return lwM2mClient; | ||
91 | } | 97 | } |
92 | 98 | ||
93 | @Override | 99 | @Override |
@@ -37,6 +37,7 @@ import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; | @@ -37,6 +37,7 @@ import static org.thingsboard.server.common.data.ota.OtaPackageType.FIRMWARE; | ||
37 | import static org.thingsboard.server.common.data.ota.OtaPackageType.SOFTWARE; | 37 | import static org.thingsboard.server.common.data.ota.OtaPackageType.SOFTWARE; |
38 | import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING; | 38 | import static org.thingsboard.server.common.data.ota.OtaPackageUpdateStatus.UPDATING; |
39 | import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey; | 39 | import static org.thingsboard.server.common.data.ota.OtaPackageUtil.getAttributeKey; |
40 | +import static org.eclipse.californium.core.coap.CoAP.ResponseCode.CONTENT; | ||
40 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_NAME_ID; | 41 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_NAME_ID; |
41 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_PACKAGE_ID; | 42 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_PACKAGE_ID; |
42 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_RESULT_ID; | 43 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.FW_RESULT_ID; |
@@ -103,6 +104,9 @@ public class LwM2mFwSwUpdate { | @@ -103,6 +104,9 @@ public class LwM2mFwSwUpdate { | ||
103 | @Getter | 104 | @Getter |
104 | @Setter | 105 | @Setter |
105 | private final List<String> pendingInfoRequestsStart; | 106 | private final List<String> pendingInfoRequestsStart; |
107 | + @Getter | ||
108 | + @Setter | ||
109 | + private volatile Lwm2mClientRpcRequest rpcRequest; | ||
106 | 110 | ||
107 | public LwM2mFwSwUpdate(LwM2mClient lwM2MClient, OtaPackageType type) { | 111 | public LwM2mFwSwUpdate(LwM2mClient lwM2MClient, OtaPackageType type) { |
108 | this.lwM2MClient = lwM2MClient; | 112 | this.lwM2MClient = lwM2MClient; |
@@ -153,16 +157,30 @@ public class LwM2mFwSwUpdate { | @@ -153,16 +157,30 @@ public class LwM2mFwSwUpdate { | ||
153 | * Send FsSw to Lwm2mClient: | 157 | * Send FsSw to Lwm2mClient: |
154 | * before operation Write: fw_state = DOWNLOADING | 158 | * before operation Write: fw_state = DOWNLOADING |
155 | */ | 159 | */ |
156 | - private void writeFwSwWare(DefaultLwM2MTransportMsgHandler handler, LwM2mTransportRequest request) { | ||
157 | - this.stateUpdate = OtaPackageUpdateStatus.DOWNLOADING.name(); | ||
158 | -// this.observeStateUpdate(); | ||
159 | - this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null); | ||
160 | - int chunkSize = 0; | ||
161 | - int chunk = 0; | ||
162 | - byte[] firmwareChunk = handler.otaPackageDataCache.get(this.currentId.toString(), chunkSize, chunk); | ||
163 | - String targetIdVer = convertPathFromObjectIdToIdVer(this.pathPackageId, this.lwM2MClient.getRegistration()); | ||
164 | - request.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(), | ||
165 | - firmwareChunk, handler.config.getTimeout(), null); | 160 | + public void writeFwSwWare(DefaultLwM2MTransportMsgHandler handler, LwM2mTransportRequest request) { |
161 | + if (this.currentId != null) { | ||
162 | + this.stateUpdate = OtaPackageUpdateStatus.DOWNLOADING.name(); | ||
163 | + this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_INFO, null); | ||
164 | + int chunkSize = 0; | ||
165 | + int chunk = 0; | ||
166 | + byte[] firmwareChunk = handler.otaPackageDataCache.get(this.currentId.toString(), chunkSize, chunk); | ||
167 | + String targetIdVer = convertPathFromObjectIdToIdVer(this.pathPackageId, this.lwM2MClient.getRegistration()); | ||
168 | + String fwMsg = String.format("%s: Start type operation %s paths: %s", LOG_LW2M_INFO, | ||
169 | + LwM2mTransportUtil.LwM2mTypeOper.FW_UPDATE.name(), FW_PACKAGE_ID); | ||
170 | + handler.sendLogsToThingsboard(fwMsg, lwM2MClient.getRegistration().getId()); | ||
171 | + log.warn("8) Start firmware Update. Send save to: [{}] ver: [{}] path: [{}]", this.lwM2MClient.getDeviceName(), this.currentVersion, targetIdVer); | ||
172 | + request.sendAllRequest(this.lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(), | ||
173 | + firmwareChunk, handler.config.getTimeout(), this.rpcRequest); | ||
174 | + } | ||
175 | + else { | ||
176 | + String msgError = "FirmWareId is null."; | ||
177 | + log.warn("6) [{}]", msgError); | ||
178 | + if (this.rpcRequest != null) { | ||
179 | + handler.sentRpcResponse(this.rpcRequest, CONTENT.name(), msgError, LOG_LW2M_ERROR); | ||
180 | + } | ||
181 | + log.error (msgError); | ||
182 | + this.sendLogs(handler, WRITE_REPLACE.name(), LOG_LW2M_ERROR, msgError); | ||
183 | + } | ||
166 | } | 184 | } |
167 | 185 | ||
168 | public void sendLogs(DefaultLwM2MTransportMsgHandler handler, String typeOper, String typeInfo, String msgError) { | 186 | public void sendLogs(DefaultLwM2MTransportMsgHandler handler, String typeOper, String typeInfo, String msgError) { |
@@ -185,7 +203,7 @@ public class LwM2mFwSwUpdate { | @@ -185,7 +203,7 @@ public class LwM2mFwSwUpdate { | ||
185 | this.setStateUpdate(UPDATING.name()); | 203 | this.setStateUpdate(UPDATING.name()); |
186 | this.sendLogs(handler, EXECUTE.name(), LOG_LW2M_INFO, null); | 204 | this.sendLogs(handler, EXECUTE.name(), LOG_LW2M_INFO, null); |
187 | request.sendAllRequest(this.lwM2MClient.getRegistration(), this.pathInstallId, EXECUTE, ContentFormat.TLV.getName(), | 205 | request.sendAllRequest(this.lwM2MClient.getRegistration(), this.pathInstallId, EXECUTE, ContentFormat.TLV.getName(), |
188 | - null, 0, null); | 206 | + null, 0, this.rpcRequest); |
189 | } | 207 | } |
190 | 208 | ||
191 | /** | 209 | /** |
@@ -347,7 +365,7 @@ public class LwM2mFwSwUpdate { | @@ -347,7 +365,7 @@ public class LwM2mFwSwUpdate { | ||
347 | this.pathResultId, this.lwM2MClient.getRegistration())); | 365 | this.pathResultId, this.lwM2MClient.getRegistration())); |
348 | this.pendingInfoRequestsStart.forEach(pathIdVer -> { | 366 | this.pendingInfoRequestsStart.forEach(pathIdVer -> { |
349 | request.sendAllRequest(this.lwM2MClient.getRegistration(), pathIdVer, OBSERVE, ContentFormat.TLV.getName(), | 367 | request.sendAllRequest(this.lwM2MClient.getRegistration(), pathIdVer, OBSERVE, ContentFormat.TLV.getName(), |
350 | - null, 0, null); | 368 | + null, 0, this.rpcRequest); |
351 | }); | 369 | }); |
352 | 370 | ||
353 | } | 371 | } |
@@ -39,6 +39,7 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.K | @@ -39,6 +39,7 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.K | ||
39 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper; | 39 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper; |
40 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER_ALL; | 40 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.DISCOVER_ALL; |
41 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE; | 41 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.EXECUTE; |
42 | +import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.FW_UPDATE; | ||
42 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL; | 43 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_CANCEL; |
43 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL; | 44 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.OBSERVE_READ_ALL; |
44 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES; | 45 | import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES; |
@@ -140,7 +141,8 @@ public class Lwm2mClientRpcRequest { | @@ -140,7 +141,8 @@ public class Lwm2mClientRpcRequest { | ||
140 | if (this.getTargetIdVer() == null | 141 | if (this.getTargetIdVer() == null |
141 | && !(OBSERVE_READ_ALL == this.getTypeOper() | 142 | && !(OBSERVE_READ_ALL == this.getTypeOper() |
142 | || DISCOVER_ALL == this.getTypeOper() | 143 | || DISCOVER_ALL == this.getTypeOper() |
143 | - || OBSERVE_CANCEL == this.getTypeOper())) { | 144 | + || OBSERVE_CANCEL == this.getTypeOper() |
145 | + || FW_UPDATE == this.getTypeOper())) { | ||
144 | this.setErrorMsg(TARGET_ID_VER_KEY + " and " + | 146 | this.setErrorMsg(TARGET_ID_VER_KEY + " and " + |
145 | KEY_NAME_KEY + " is null or bad format"); | 147 | KEY_NAME_KEY + " is null or bad format"); |
146 | } | 148 | } |
@@ -43,6 +43,9 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter { | @@ -43,6 +43,9 @@ public class LwM2mValueConverterImpl implements LwM2mValueConverter { | ||
43 | @Override | 43 | @Override |
44 | public Object convertValue(Object value, Type currentType, Type expectedType, LwM2mPath resourcePath) | 44 | public Object convertValue(Object value, Type currentType, Type expectedType, LwM2mPath resourcePath) |
45 | throws CodecException { | 45 | throws CodecException { |
46 | + if (value == null) { | ||
47 | + return null; | ||
48 | + } | ||
46 | if (expectedType == null) { | 49 | if (expectedType == null) { |
47 | /** unknown resource, trusted value */ | 50 | /** unknown resource, trusted value */ |
48 | return value; | 51 | return value; |