lwm2m: fix bug WriteUpdate & updateAttributes after sleep
This commit is contained in:
parent
be5ec4fce9
commit
4b74d2bde1
@ -57,7 +57,6 @@ 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.LwM2mTransportUtil.LOG_LWM2M_ERROR;
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LWM2M_ERROR;
|
||||||
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LWM2M_INFO;
|
|
||||||
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LWM2M_WARN;
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LOG_LWM2M_WARN;
|
||||||
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertMultiResourceValuesFromJson;
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertMultiResourceValuesFromJson;
|
||||||
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.fromVersionedIdToObjectId;
|
import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.fromVersionedIdToObjectId;
|
||||||
@ -212,7 +211,7 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
|
|||||||
Object newValProto = getValueFromKvProto(tsKvProto.getKv());
|
Object newValProto = getValueFromKvProto(tsKvProto.getKv());
|
||||||
Object oldResourceValue = this.getResourceValueFormatKv(lwM2MClient, pathIdVer);
|
Object oldResourceValue = this.getResourceValueFormatKv(lwM2MClient, pathIdVer);
|
||||||
if (!resourceModel.multiple || !(newValProto instanceof JsonElement)) {
|
if (!resourceModel.multiple || !(newValProto instanceof JsonElement)) {
|
||||||
this.pushUpdateToClientIfNeeded(lwM2MClient, oldResourceValue, newValProto, pathIdVer, logFailedUpdateOfNonChangedValue);
|
this.pushUpdateToClientIfNeeded(lwM2MClient, oldResourceValue, newValProto, pathIdVer, logFailedUpdateOfNonChangedValue, resourceModel.type);
|
||||||
} else {
|
} else {
|
||||||
pushUpdateMultiToClientIfNeeded(lwM2MClient, resourceModel, (JsonElement) newValProto,
|
pushUpdateMultiToClientIfNeeded(lwM2MClient, resourceModel, (JsonElement) newValProto,
|
||||||
(Map<Integer, LwM2mResourceInstance>) oldResourceValue, pathIdVer);
|
(Map<Integer, LwM2mResourceInstance>) oldResourceValue, pathIdVer);
|
||||||
@ -221,23 +220,23 @@ public class DefaultLwM2MAttributesService implements LwM2MAttributesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void pushUpdateToClientIfNeeded(LwM2mClient lwM2MClient, Object valueOld, Object newValue,
|
private void pushUpdateToClientIfNeeded(LwM2mClient lwM2MClient, Object valueOld, Object newValue,
|
||||||
String versionedId, boolean logFailedUpdateOfNonChangedValue) {
|
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",
|
||||||
LOG_LWM2M_ERROR, versionedId, "null");
|
LOG_LWM2M_ERROR, versionedId, "null");
|
||||||
logService.log(lwM2MClient, logMsg);
|
logService.log(lwM2MClient, logMsg);
|
||||||
log.error("Failed update resource [{}] [{}]", versionedId, "null");
|
log.error("Failed update resource [{}] [{}]", versionedId, "null");
|
||||||
} else if (newValue.toString().equals(valueOld.toString())){
|
} else if ((valueOld == null) ||
|
||||||
if (logFailedUpdateOfNonChangedValue) {
|
((OPAQUE.equals(type) && !Arrays.equals((byte[]) newValue, (byte[]) valueOld)) ||
|
||||||
|
!newValue.equals(valueOld))) {
|
||||||
|
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId).value(newValue).timeout(clientContext.getRequestTimeout(lwM2MClient)).build();
|
||||||
|
downlinkHandler.sendWriteReplaceRequest(lwM2MClient, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, lwM2MClient, versionedId));
|
||||||
|
} else if (logFailedUpdateOfNonChangedValue) {
|
||||||
String logMsg = String.format("%s: Didn't update the versionedId resource - %s value - %s. Value is not changed",
|
String logMsg = String.format("%s: Didn't update the versionedId resource - %s value - %s. Value is not changed",
|
||||||
LOG_LWM2M_WARN, versionedId, newValue);
|
LOG_LWM2M_WARN, versionedId, newValue);
|
||||||
logService.log(lwM2MClient, logMsg);
|
logService.log(lwM2MClient, logMsg);
|
||||||
log.warn("Didn't update resource [{}] [{}]. Value is not changed", versionedId, newValue);
|
log.warn("Didn't update resource [{}] [{}]. Value is not changed", versionedId, newValue);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
TbLwM2MWriteReplaceRequest request = TbLwM2MWriteReplaceRequest.builder().versionedId(versionedId).value(newValue).timeout(clientContext.getRequestTimeout(lwM2MClient)).build();
|
|
||||||
downlinkHandler.sendWriteReplaceRequest(lwM2MClient, request, new TbLwM2MWriteResponseCallback(uplinkHandler, logService, lwM2MClient, versionedId));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pushUpdateMultiToClientIfNeeded(LwM2mClient client, ResourceModel resourceModel, JsonElement newValProto,
|
private void pushUpdateMultiToClientIfNeeded(LwM2mClient client, ResourceModel resourceModel, JsonElement newValProto,
|
||||||
|
|||||||
@ -345,9 +345,13 @@ 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 {
|
||||||
validateVersionedId(client, request);
|
|
||||||
WriteRequest downlink = null;
|
|
||||||
LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
|
LwM2mPath resultIds = new LwM2mPath(request.getObjectId());
|
||||||
|
if (resultIds.isObjectInstance() || resultIds.isResource()) {
|
||||||
|
validateVersionedId(client, request);
|
||||||
|
ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider());
|
||||||
|
if (resourceModelWrite != null) {
|
||||||
|
WriteRequest downlink = null;
|
||||||
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
|
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider());
|
||||||
if (resultIds.isObjectInstance()) {
|
if (resultIds.isObjectInstance()) {
|
||||||
/*
|
/*
|
||||||
@ -362,7 +366,6 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
|
|||||||
callback.onValidationError(toString(request), "No resources to update!");
|
callback.onValidationError(toString(request), "No resources to update!");
|
||||||
}
|
}
|
||||||
} else if (resultIds.isResource()) {
|
} else if (resultIds.isResource()) {
|
||||||
ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider());
|
|
||||||
if (resourceModelWrite.multiple) {
|
if (resourceModelWrite.multiple) {
|
||||||
if (request.getValue() instanceof Map && ((Map) request.getValue()).size() > 0) {
|
if (request.getValue() instanceof Map && ((Map) request.getValue()).size() > 0) {
|
||||||
Map value = convertMultiResourceValuesFromRpcBody((LinkedHashMap) request.getValue(), resourceModelWrite.type, request.getObjectId());
|
Map value = convertMultiResourceValuesFromRpcBody((LinkedHashMap) request.getValue(), resourceModelWrite.type, request.getObjectId());
|
||||||
@ -378,6 +381,21 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
|
|||||||
} else {
|
} else {
|
||||||
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + ". This operation can only be used for ObjectInstance or Multi-Instance Resource !");
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + ". This operation can only be used for ObjectInstance or Multi-Instance Resource !");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + " is not configured in the device profile!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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());
|
||||||
}
|
}
|
||||||
@ -585,7 +603,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im
|
|||||||
}
|
}
|
||||||
} else if (pathIds.isResource()) {
|
} else if (pathIds.isResource()) {
|
||||||
ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider);
|
ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider);
|
||||||
if (!resourceModel.multiple) {
|
if (resourceModel!= null && !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)) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user