Lwm2m: front: add key to profile - refactoring-light start2

This commit is contained in:
nickAS21 2021-02-02 11:47:11 +02:00 committed by Andrew Shvayka
parent 793e43e9a8
commit c230e3fdcd
10 changed files with 157 additions and 163 deletions

View File

@ -581,7 +581,6 @@ transport:
request_pool_size: "${LWM2M_REQUEST_POOL_SIZE:100}"
request_error_pool_size: "${LWM2M_REQUEST_ERROR_POOL_SIZE:10}"
registered_pool_size: "${LWM2M_REGISTERED_POOL_SIZE:10}"
client_update_value_after_connect: "${CLIENT_UPDATE_VALUE_AFTER_CONNECT:false}"
update_registered_pool_size: "${LWM2M_UPDATE_REGISTERED_POOL_SIZE:10}"
un_registered_pool_size: "${LWM2M_UN_REGISTERED_POOL_SIZE:10}"
secure:

View File

@ -36,7 +36,7 @@ import org.nustaq.serialization.FSTConfiguration;
import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.common.data.device.profile.Lwm2mDeviceProfileTransportConfiguration;
import org.thingsboard.server.common.transport.TransportServiceCallback;
import org.thingsboard.server.transport.lwm2m.server.client.AttrTelemetryObserveValue;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientProfile;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import java.io.File;
@ -70,7 +70,8 @@ public class LwM2MTransportHandler {
public static final long DEFAULT_TIMEOUT = 2 * 60 * 1000L; // 2min in ms
public static final String OBSERVE_ATTRIBUTE_TELEMETRY = "observeAttr";
public static final String KEYNAME = "keyName";
public static final String CLIENT_LWM2M_SETTINGS = "clientLwM2mSettings";
public static final String KEY_NAME = "keyName";
public static final String OBSERVE = "observe";
public static final String BOOTSTRAP = "bootstrap";
public static final String SERVERS = "servers";
@ -187,18 +188,22 @@ public class LwM2MTransportHandler {
return null;
}
public static AttrTelemetryObserveValue getNewProfileParameters(JsonObject profilesConfigData) {
AttrTelemetryObserveValue attrTelemetryObserveValue = new AttrTelemetryObserveValue();
attrTelemetryObserveValue.setPostKeyNameProfile(profilesConfigData.get(KEYNAME).getAsJsonObject());
attrTelemetryObserveValue.setPostAttributeProfile(profilesConfigData.get(ATTRIBUTE).getAsJsonArray());
attrTelemetryObserveValue.setPostTelemetryProfile(profilesConfigData.get(TELEMETRY).getAsJsonArray());
attrTelemetryObserveValue.setPostObserveProfile(profilesConfigData.get(OBSERVE).getAsJsonArray());
return attrTelemetryObserveValue;
public static LwM2MClientProfile getNewProfileParameters(JsonObject profilesConfigData) {
LwM2MClientProfile lwM2MClientProfile = new LwM2MClientProfile();
lwM2MClientProfile.setPostClientLwM2mSettings(profilesConfigData.get(CLIENT_LWM2M_SETTINGS).getAsJsonObject());
lwM2MClientProfile.setPostKeyNameProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEY_NAME).getAsJsonObject());
lwM2MClientProfile.setPostAttributeProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(ATTRIBUTE).getAsJsonArray());
lwM2MClientProfile.setPostTelemetryProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(TELEMETRY).getAsJsonArray());
lwM2MClientProfile.setPostObserveProfile(profilesConfigData.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(OBSERVE).getAsJsonArray());
return lwM2MClientProfile;
}
/**
* @return deviceProfileBody with Observe&Attribute&Telemetry From Thingsboard
* Example: with pathResource (use only pathResource)
* Example:
* property: {"clientLwM2mSettings": {
* clientUpdateValueAfterConnect: false;
* }
* property: "observeAttr"
* {"keyName": {
* "/3/0/1": "modelNumber",
@ -209,15 +214,14 @@ public class LwM2MTransportHandler {
* "telemetry":["/1/0/1","/2/0/1","/6/0/1"],
* "observe":["/2/0","/2/0/0","/4/0/2"]}
*/
public static JsonObject getObserveAttrTelemetryFromThingsboard(DeviceProfile deviceProfile) {
public static LwM2MClientProfile getLwM2MClientProfileFromThingsboard(DeviceProfile deviceProfile) {
if (deviceProfile != null && ((Lwm2mDeviceProfileTransportConfiguration) deviceProfile.getProfileData().getTransportConfiguration()).getProperties().size() > 0) {
// Lwm2mDeviceProfileTransportConfiguration lwm2mDeviceProfileTransportConfiguration = (Lwm2mDeviceProfileTransportConfiguration) deviceProfile.getProfileData().getTransportConfiguration();
Object observeAttr = ((Lwm2mDeviceProfileTransportConfiguration) deviceProfile.getProfileData().getTransportConfiguration()).getProperties();
Object profile = ((Lwm2mDeviceProfileTransportConfiguration) deviceProfile.getProfileData().getTransportConfiguration()).getProperties();
try {
ObjectMapper mapper = new ObjectMapper();
String observeAttrStr = mapper.writeValueAsString(observeAttr);
JsonObject objectMsg = (observeAttrStr != null) ? validateJson(observeAttrStr) : null;
return (getValidateCredentialsBodyFromThingsboard(objectMsg)) ? objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject() : null;
String profileStr = mapper.writeValueAsString(profile);
JsonObject profileJson = (profileStr != null) ? validateJson(profileStr) : null;
return (getValidateCredentialsBodyFromThingsboard(profileJson)) ? LwM2MTransportHandler.getNewProfileParameters(profileJson) : null;
} catch (IOException e) {
log.error("", e);
}
@ -240,15 +244,23 @@ public class LwM2MTransportHandler {
return null;
}
public static boolean getClientUpdateValueAfterConnect (LwM2MClientProfile profile) {
return profile.getPostClientLwM2mSettings().getAsJsonObject().has("clientUpdateValueAfterConnect") &&
profile.getPostClientLwM2mSettings().getAsJsonObject().get("clientUpdateValueAfterConnect").getAsBoolean();
}
private static boolean getValidateCredentialsBodyFromThingsboard(JsonObject objectMsg) {
return (objectMsg != null &&
!objectMsg.isJsonNull() &&
objectMsg.has(CLIENT_LWM2M_SETTINGS) &&
!objectMsg.get(CLIENT_LWM2M_SETTINGS).isJsonNull() &&
objectMsg.get(CLIENT_LWM2M_SETTINGS).isJsonObject() &&
objectMsg.has(OBSERVE_ATTRIBUTE_TELEMETRY) &&
!objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).isJsonNull() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).isJsonObject() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().has(KEYNAME) &&
!objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEYNAME).isJsonNull() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEYNAME).isJsonObject() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().has(KEY_NAME) &&
!objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEY_NAME).isJsonNull() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(KEY_NAME).isJsonObject() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().has(ATTRIBUTE) &&
!objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(ATTRIBUTE).isJsonNull() &&
objectMsg.get(OBSERVE_ATTRIBUTE_TELEMETRY).getAsJsonObject().get(ATTRIBUTE).isJsonArray() &&

View File

@ -226,7 +226,7 @@ public class LwM2MTransportRequest {
String msg = String.format(LOG_LW2M_ERROR + ": sendRequest: Resource path - %s msg No SendRequest to Client", target);
service.sentLogsToThingsboard(msg, registration);
log.error("[{}] - [{}] No SendRequest", target);
this.handleResponseError(registration, target, lwM2MClient, isDelayedUpdate);
this.handleResponseError(registration, target, lwM2MClient, true);
}
}

View File

@ -21,11 +21,10 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.model.ResourceModel;
import org.eclipse.leshan.core.node.LwM2mMultipleResource;
import org.eclipse.leshan.core.node.LwM2mObject;
import org.eclipse.leshan.core.node.LwM2mObjectInstance;
import org.eclipse.leshan.core.node.LwM2mPath;
import org.eclipse.leshan.core.node.LwM2mSingleResource;
import org.eclipse.leshan.core.node.LwM2mResource;
import org.eclipse.leshan.core.observation.Observation;
import org.eclipse.leshan.core.request.ContentFormat;
import org.eclipse.leshan.core.request.WriteRequest;
@ -47,8 +46,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent;
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
import org.thingsboard.server.gen.transport.TransportProtos.ToTransportUpdateCredentialsProto;
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
import org.thingsboard.server.transport.lwm2m.server.client.AttrTelemetryObserveValue;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientProfile;
import org.thingsboard.server.transport.lwm2m.server.client.ResourceValue;
import org.thingsboard.server.transport.lwm2m.server.client.ResultsAnalyzerParameters;
import org.thingsboard.server.transport.lwm2m.server.secure.LwM2mInMemorySecurityStore;
@ -71,7 +70,6 @@ import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@ -153,8 +151,8 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
lwM2MClient.setLwM2MTransportServiceImpl(this);
lwM2MClient.setSessionUuid(UUID.randomUUID());
this.sentLogsToThingsboard(LOG_LW2M_INFO + ": Client Registered", registration);
this.setLwM2mFromClientValue(lwServer, registration, lwM2MClient);
lwM2MClient.setClientUpdateValueAfterConnect(this.context.getCtxServer().isClientUpdateValueAfterConnect());
LwM2MClientProfile lwM2MClientProfile = lwM2mInMemorySecurityStore.getProfile(registration.getId());
this.setLwM2mFromClientValue(lwServer, registration, lwM2MClient, lwM2MClientProfile);
SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
if (sessionInfo != null) {
lwM2MClient.setDeviceUuid(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB()));
@ -165,7 +163,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), null);
transportService.process(sessionInfo, TransportProtos.SubscribeToAttributeUpdatesMsg.newBuilder().build(), null);
this.sentLogsToThingsboard(LOG_LW2M_INFO + ": Client create after Registration", registration);
if (this.context.getCtxServer().isClientUpdateValueAfterConnect()) {
if (LwM2MTransportHandler.getClientUpdateValueAfterConnect(lwM2MClientProfile)) {
this.putDelayedUpdateResourcesThingsboard(lwM2MClient);
}
} else {
@ -255,7 +253,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* Removes a profile if not used in sessions
*/
private void syncSessionsAndProfiles() {
Map<UUID, AttrTelemetryObserveValue> profilesClone = lwM2mInMemorySecurityStore.getProfiles().entrySet()
Map<UUID, LwM2MClientProfile> profilesClone = lwM2mInMemorySecurityStore.getProfiles().entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
profilesClone.forEach((k, v) -> {
@ -285,9 +283,26 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @param registration - Registration LwM2M Client
* @param lwM2MClient - object with All parameters off client
*/
private void setLwM2mFromClientValue(LeshanServer lwServer, Registration registration, LwM2MClient lwM2MClient) {
private void setLwM2mFromClientValue(LeshanServer lwServer, Registration registration, LwM2MClient lwM2MClient, LwM2MClientProfile lwM2MClientProfile) {
// #1.1
// get all instances in client
Set<String> clientInstances = this.getAllInstancesInClient(registration);
if (clientInstances != null && LwM2MTransportHandler.getClientUpdateValueAfterConnect(lwM2MClientProfile)) {
lwM2MClient.getPendingRequests().addAll(clientInstances);
// #2
clientInstances.forEach(path -> {
lwM2MTransportRequest.sendAllRequest(lwServer, registration, path, GET_TYPE_OPER_READ, ContentFormat.TLV.getName(),
lwM2MClient, null, null, this.context.getCtxServer().getTimeout(), false);
});
} else {
// #1.2
this.onSentObserveToClient(lwServer, registration);
}
}
// get all instances in client
private Set<String> getAllInstancesInClient(Registration registration) {
Set<String> clientInstances = ConcurrentHashMap.newKeySet();
Arrays.stream(registration.getObjectLinks()).forEach(url -> {
LwM2mPath pathIds = new LwM2mPath(url.getUrl());
@ -295,27 +310,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
clientInstances.add(url.getUrl());
}
});
if (this.context.getCtxServer().isClientUpdateValueAfterConnect()) {
lwM2MClient.getPendingRequests().addAll(clientInstances);
} else {
// #1.2
UUID profileUUid = lwM2mInMemorySecurityStore.getSessions().get(registration.getId()).getProfileUuid();
JsonArray observeValue = lwM2mInMemorySecurityStore.getProfiles().get(profileUUid).getPostObserveProfile();
observeValue.forEach(path -> {
String[] resPath = path.getAsString().split("/");
String instance = "/" + resPath[1] + "/" + resPath[2];
if (clientInstances.contains(instance)) {
lwM2MClient.getPendingRequests().add(path.getAsString());
}
}
);
}
// #2
lwM2MClient.getPendingRequests().forEach(path -> {
lwM2MTransportRequest.sendAllRequest(lwServer, registration, path, GET_TYPE_OPER_READ, ContentFormat.TLV.getName(),
lwM2MClient, null, null, this.context.getCtxServer().getTimeout(), false);
});
return (clientInstances.size() > 0) ? clientInstances : null;
}
/**
@ -463,7 +458,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @return ArrayList keyNames from profile attr resources shared!!!! && IsWritable
*/
private List<String> getNamesAttrFromProfileIsWritable(LwM2MClient lwM2MClient) {
AttrTelemetryObserveValue profile = lwM2mInMemorySecurityStore.getProfile(lwM2MClient.getProfileUuid());
LwM2MClientProfile profile = lwM2mInMemorySecurityStore.getProfile(lwM2MClient.getProfileUuid());
Set attrSet = new Gson().fromJson(profile.getPostAttributeProfile(), Set.class);
ConcurrentMap<String, String> keyNamesMap = new Gson().fromJson(profile.getPostKeyNameProfile().toString(), ConcurrentHashMap.class);
@ -484,7 +479,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* #1 - get AttrName/TelemetryName with value:
* #1.1 from Client
* #1.2 from LwM2MClient:
* -- resourceId == path from AttrTelemetryObserveValue.postAttributeProfile/postTelemetryProfile/postObserveProfile
* -- resourceId == path from LwM2MClientProfile.postAttributeProfile/postTelemetryProfile/postObserveProfile
* -- AttrName/TelemetryName == resourceName from ModelObject.objectModel, value from ModelObject.instance.resource(resourceId)
* #2 - set Attribute/Telemetry
*
@ -539,8 +534,8 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* (attributes/telemetry): new {name(Attr/Telemetry):value}
*/
private void getParametersFromProfile(JsonObject attributes, JsonObject telemetry, Registration registration, Set<String> path) {
AttrTelemetryObserveValue attrTelemetryObserveValue = lwM2mInMemorySecurityStore.getProfiles().get(lwM2mInMemorySecurityStore.getSessions().get(registration.getId()).getProfileUuid());
attrTelemetryObserveValue.getPostAttributeProfile().forEach(p -> {
LwM2MClientProfile lwM2MClientProfile = lwM2mInMemorySecurityStore.getProfiles().get(lwM2mInMemorySecurityStore.getSessions().get(registration.getId()).getProfileUuid());
lwM2MClientProfile.getPostAttributeProfile().forEach(p -> {
LwM2mPath pathIds = new LwM2mPath(p.getAsString().toString());
if (pathIds.isResource()) {
if (path == null || path.contains(p.getAsString())) {
@ -548,7 +543,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
}
}
});
attrTelemetryObserveValue.getPostTelemetryProfile().forEach(p -> {
lwM2MClientProfile.getPostTelemetryProfile().forEach(p -> {
LwM2mPath pathIds = new LwM2mPath(p.getAsString().toString());
if (pathIds.isResource()) {
if (path == null || path.contains(p.getAsString())) {
@ -609,20 +604,20 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
if (lwServer.getObservationService().getObservations(registration).size() > 0) {
this.setCancelObservations(lwServer, registration);
}
UUID profileUUid = lwM2mInMemorySecurityStore.getSessions().get(registration.getId()).getProfileUuid();
AttrTelemetryObserveValue attrTelemetryObserveValue = lwM2mInMemorySecurityStore.getProfiles().get(profileUUid);
attrTelemetryObserveValue.getPostObserveProfile().forEach(p -> {
LwM2MClientProfile lwM2MClientProfile = lwM2mInMemorySecurityStore.getProfile(registration.getId());
Set<String> clientInstances = this.getAllInstancesInClient(registration);
lwM2MClientProfile.getPostObserveProfile().forEach(p -> {
// #1.1
String target = (getValidateObserve(attrTelemetryObserveValue.getPostAttributeProfile(), p.getAsString().toString())) ?
p.getAsString().toString() : (getValidateObserve(attrTelemetryObserveValue.getPostTelemetryProfile(), p.getAsString().toString())) ?
p.getAsString().toString() : null;
if (target != null) {
String target = p.getAsString().toString();
String[] resPath = target.split("/");
String instance = "/" + resPath[1] + "/" + resPath[2];
if (clientInstances.contains(instance)) {
// #2
if (this.getResourceValueToString(lwM2mInMemorySecurityStore.getSessions().get(registration.getId()), target) != null) {
lwM2MTransportRequest.sendAllRequest(lwServer, registration, target, GET_TYPE_OPER_OBSERVE,
null, null, null, null, this.context.getCtxServer().getTimeout(),
false);
}
// if (this.getResourceValueToString(lwM2mInMemorySecurityStore.getSessions().get(registration.getId()), target) != null) {
lwM2MTransportRequest.sendAllRequest(lwServer, registration, target, GET_TYPE_OPER_OBSERVE,
null, null, null, null, this.context.getCtxServer().getTimeout(),
false);
// }
}
});
}
@ -648,19 +643,19 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @param path - recourse from postObserveProfile
* @return rez - true if path observe is in attribute/telemetry
*/
private boolean getValidateObserve(JsonElement parameters, String path) {
AtomicBoolean rez = new AtomicBoolean(false);
if (parameters.isJsonArray()) {
parameters.getAsJsonArray().forEach(p -> {
if (p.getAsString().toString().equals(path)) rez.set(true);
}
);
} else if (parameters.isJsonObject()) {
rez.set((parameters.getAsJsonObject().entrySet()).stream().map(json -> json.toString())
.filter(path::equals).findAny().orElse(null) != null);
}
return rez.get();
}
// private boolean getValidateObserve(JsonElement parameters, String path) {
// AtomicBoolean rez = new AtomicBoolean(false);
// if (parameters.isJsonArray()) {
// parameters.getAsJsonArray().forEach(p -> {
// if (p.getAsString().toString().equals(path)) rez.set(true);
// }
// );
// } else if (parameters.isJsonObject()) {
// rez.set((parameters.getAsJsonObject().entrySet()).stream().map(json -> json.toString())
// .filter(path::equals).findAny().orElse(null) != null);
// }
// return rez.get();
// }
/**
* Sending observe value to thingsboard from ObservationListener.onResponse: object, instance, SingleResource or MultipleResource
@ -673,15 +668,15 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
public void onObservationResponse(Registration registration, String path, ReadResponse response) {
if (response.getContent() != null) {
if (response.getContent() instanceof LwM2mObject) {
// LwM2mObject content = (LwM2mObject) response.getContent();
LwM2mObject lwM2mObject = (LwM2mObject) response.getContent();
} else if (response.getContent() instanceof LwM2mObjectInstance) {
// LwM2mObjectInstance content = (LwM2mObjectInstance) response.getContent();
} else if (response.getContent() instanceof LwM2mSingleResource) {
LwM2mSingleResource content = (LwM2mSingleResource) response.getContent();
this.onObservationSetResourcesValue(registration, content.getValue(), null, path);
} else if (response.getContent() instanceof LwM2mMultipleResource) {
LwM2mMultipleResource content = (LwM2mMultipleResource) response.getContent();
this.onObservationSetResourcesValue(registration, null, content.getValues(), path);
LwM2mObjectInstance lwM2mObjectInstance = (LwM2mObjectInstance) response.getContent();
} else if (response.getContent() instanceof LwM2mResource) {
LwM2mResource lwM2mResource = (LwM2mResource) response.getContent();
this.onObservationSetResourcesValue(registration, lwM2mResource, path);
// } else if (response.getContent() instanceof LwM2mMultipleResource) {
// LwM2mMultipleResource resource = (LwM2mMultipleResource) response.getContent();
// this.onObservationSetResourcesValue(registration, null, resource.getValues(), path);
}
}
}
@ -692,39 +687,17 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* #2 Update new Resources (replace old Resource Value on new Resource Value)
*
* @param registration - Registration LwM2M Client
* @param value - LwM2mSingleResource response.getContent()
* @param values - LwM2mSingleResource response.getContent()
* @param - LwM2mSingleResource response.getContent()
* @param - LwM2mSingleResource response.getContent()
* @param path - resource
*/
private void onObservationSetResourcesValue(Registration registration, Object value, Map<Integer, ?> values, String path) {
boolean isChange = false;
try {
writeLock.lock();
// #1
LwM2MClient lwM2MClient = lwM2mInMemorySecurityStore.getLwM2MClientWithReg(registration, null);
LwM2mPath pathIds = new LwM2mPath(path);
ResourceModel.Type resModelType = context.getCtxServer().getResourceModelType(registration, pathIds);
ResourceValue resValueOld = lwM2MClient.getResources().get(path);
// #2
if (resValueOld.isMultiInstances() && !values.toString().equals(resValueOld.getResourceValue().toString())) {
lwM2MClient.getResources().get(path).setValues(values);
isChange = true;
} else if (!LwM2MTransportHandler.equalsResourceValue(resValueOld.getValue(), value, resModelType, pathIds)) {
lwM2MClient.getResources().get(path).setValue(value);
log.warn("upDateResize: [{}] [{}] [{}] [{}]", lwM2MClient.getEndPoint(), lwM2MClient.getResources().size(), value, path);
isChange = true;
}
} catch (Exception e) {
log.error("#1_1 Update ResourcesValue after Observation is unsuccessfully path: [{}] value: [{}] [{}]", path, value, e.toString());
} finally {
writeLock.unlock();
}
if (isChange) {
Set<String> paths = new HashSet<>();
paths.add(path);
this.updateAttrTelemetry(registration, false, paths);
}
private void onObservationSetResourcesValue(Registration registration, LwM2mResource lwM2mResource, String path) {
LwM2MClient lwM2MClient = lwM2mInMemorySecurityStore.getLwM2MClientWithReg(registration, null);
lwM2MClient.updateResourceValue(path, lwM2mResource);
log.warn("upDateResize: [{}] [{}] [{}]", lwM2MClient.getEndPoint(), lwM2MClient.getResources().size(), path);
Set<String> paths = new HashSet<>();
paths.add(path);
this.updateAttrTelemetry(registration, false, paths);
}
/**
@ -738,7 +711,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
/**
* Update - sent request in change value resources in Client
* Path to resources from profile equal keyName or from ModelObject equal name
* Only for resources: isWritable && isPresent as attribute in profile -> AttrTelemetryObserveValue (format: CamelCase)
* Only for resources: isWritable && isPresent as attribute in profile -> LwM2MClientProfile (format: CamelCase)
* Delete - nothing *
*
* @param msg -
@ -750,7 +723,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
String path = this.getPathAttributeUpdate(sessionInfo, de.getKey());
String value = de.getValue().getAsString();
LwM2MClient lwM2MClient = lwM2mInMemorySecurityStore.getSession(new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB())).entrySet().iterator().next().getValue();
AttrTelemetryObserveValue profile = lwM2mInMemorySecurityStore.getProfile(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));
LwM2MClientProfile profile = lwM2mInMemorySecurityStore.getProfile(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));
ResourceModel resourceModel = context.getCtxServer().getResourceModel(lwM2MClient.getRegistration(), new LwM2mPath(path));
if (!path.isEmpty() && (this.validatePathInAttrProfile(profile, path) || this.validatePathInTelemetryProfile(profile, path))) {
if (resourceModel != null && resourceModel.operations.isWritable()) {
@ -775,7 +748,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
/**
* Get path to resource from profile equal keyName or from ModelObject equal name
* Only for resource: isWritable && isPresent as attribute in profile -> AttrTelemetryObserveValue (format: CamelCase)
* Only for resource: isWritable && isPresent as attribute in profile -> LwM2MClientProfile (format: CamelCase)
*
* @param sessionInfo -
* @param name -
@ -792,7 +765,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @param path -
* @return true if path isPresent in postAttributeProfile
*/
private boolean validatePathInAttrProfile(AttrTelemetryObserveValue profile, String path) {
private boolean validatePathInAttrProfile(LwM2MClientProfile profile, String path) {
Set<String> attributesSet = new Gson().fromJson(profile.getPostAttributeProfile(), Set.class);
return attributesSet.stream().filter(p -> p.equals(path)).findFirst().isPresent();
}
@ -802,7 +775,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @param path -
* @return true if path isPresent in postAttributeProfile
*/
private boolean validatePathInTelemetryProfile(AttrTelemetryObserveValue profile, String path) {
private boolean validatePathInTelemetryProfile(LwM2MClientProfile profile, String path) {
Set<String> telemetriesSet = new Gson().fromJson(profile.getPostTelemetryProfile(), Set.class);
return telemetriesSet.stream().filter(p -> p.equals(path)).findFirst().isPresent();
}
@ -816,7 +789,7 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @return -
*/
private String getPathAttributeUpdateProfile(TransportProtos.SessionInfoProto sessionInfo, String name) {
AttrTelemetryObserveValue profile = lwM2mInMemorySecurityStore.getProfile(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));
LwM2MClientProfile profile = lwM2mInMemorySecurityStore.getProfile(new UUID(sessionInfo.getDeviceProfileIdMSB(), sessionInfo.getDeviceProfileIdLSB()));
return profile.getPostKeyNameProfile().getAsJsonObject().entrySet().stream()
.filter(e -> e.getValue().getAsString().equals(name)).findFirst().map(Map.Entry::getKey)
.orElse("");
@ -830,14 +803,16 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
* @param request -
*/
public void onAttributeUpdateOk(Registration registration, String path, WriteRequest request, boolean isDelayedUpdate) {
ResourceModel resource = context.getCtxServer().getResourceModel(registration, new LwM2mPath(path));
if (resource.multiple) {
this.onObservationSetResourcesValue(registration, null, ((LwM2mSingleResource) request.getNode()).getValues(), path);
} else {
this.onObservationSetResourcesValue(registration, ((LwM2mSingleResource) request.getNode()).getValue(), null, path);
// ResourceModel resource = context.getCtxServer().getResourceModel(registration, new LwM2mPath(path));
// if (resource.multiple) {
this.onObservationSetResourcesValue(registration, ((LwM2mResource) request.getNode()), path);
// } else {
// this.onObservationSetResourcesValue(registration, ((LwM2mSingleResource) request.getNode()).getValue(), null, path);
// }
if (isDelayedUpdate) {
lwM2mInMemorySecurityStore.getLwM2MClientWithReg(registration, null)
.onSuccessOrErrorDelayedRequests(request.getPath().toString());
}
if (isDelayedUpdate) lwM2mInMemorySecurityStore.getLwM2MClientWithReg(registration, null)
.onSuccessOrErrorDelayedRequests(request.getPath().toString());
}
/**
@ -909,24 +884,24 @@ public class LwM2MTransportServiceImpl implements LwM2MTransportService {
*/
private void onDeviceUpdateChangeProfile(Set<String> registrationIds, DeviceProfile deviceProfile) {
AttrTelemetryObserveValue attrTelemetryObserveValueOld = lwM2mInMemorySecurityStore.getProfiles().get(deviceProfile.getUuidId());
LwM2MClientProfile lwM2MClientProfileOld = lwM2mInMemorySecurityStore.getProfiles().get(deviceProfile.getUuidId());
if (lwM2mInMemorySecurityStore.addUpdateProfileParameters(deviceProfile)) {
// #1
JsonArray attributeOld = attrTelemetryObserveValueOld.getPostAttributeProfile();
JsonArray attributeOld = lwM2MClientProfileOld.getPostAttributeProfile();
Set attributeSetOld = new Gson().fromJson(attributeOld, Set.class);
JsonArray telemetryOld = attrTelemetryObserveValueOld.getPostTelemetryProfile();
JsonArray telemetryOld = lwM2MClientProfileOld.getPostTelemetryProfile();
Set telemetrySetOld = new Gson().fromJson(telemetryOld, Set.class);
JsonArray observeOld = attrTelemetryObserveValueOld.getPostObserveProfile();
JsonObject keyNameOld = attrTelemetryObserveValueOld.getPostKeyNameProfile();
JsonArray observeOld = lwM2MClientProfileOld.getPostObserveProfile();
JsonObject keyNameOld = lwM2MClientProfileOld.getPostKeyNameProfile();
AttrTelemetryObserveValue attrTelemetryObserveValueNew = lwM2mInMemorySecurityStore.getProfiles().get(deviceProfile.getUuidId());
JsonArray attributeNew = attrTelemetryObserveValueNew.getPostAttributeProfile();
LwM2MClientProfile lwM2MClientProfileNew = lwM2mInMemorySecurityStore.getProfiles().get(deviceProfile.getUuidId());
JsonArray attributeNew = lwM2MClientProfileNew.getPostAttributeProfile();
Set attributeSetNew = new Gson().fromJson(attributeNew, Set.class);
JsonArray telemetryNew = attrTelemetryObserveValueNew.getPostTelemetryProfile();
JsonArray telemetryNew = lwM2MClientProfileNew.getPostTelemetryProfile();
Set telemetrySetNew = new Gson().fromJson(telemetryNew, Set.class);
JsonArray observeNew = attrTelemetryObserveValueNew.getPostObserveProfile();
JsonObject keyNameNew = attrTelemetryObserveValueNew.getPostKeyNameProfile();
JsonArray observeNew = lwM2MClientProfileNew.getPostObserveProfile();
JsonObject keyNameNew = lwM2MClientProfileNew.getPostKeyNameProfile();
// #3
ResultsAnalyzerParameters sentAttrToThingsboard = new ResultsAnalyzerParameters();

View File

@ -59,7 +59,6 @@ public class LwM2MClient implements Cloneable {
private Set<Integer> delayedRequestsId;
private Map<String, LwM2mResponse> responses;
private final LwM2mValueConverterImpl converter;
private boolean clientUpdateValueAfterConnect;
public Object clone() throws CloneNotSupportedException {
return super.clone();
@ -114,7 +113,7 @@ public class LwM2MClient implements Cloneable {
if (this.responses.size() == 0) this.responses = new ConcurrentHashMap<>();
}
private void updateResourceValue(String pathRez, LwM2mResource rez) {
public void updateResourceValue(String pathRez, LwM2mResource rez) {
if (rez instanceof LwM2mMultipleResource){
this.resources.put(pathRez, new ResourceValue(rez.getValues(), null, true));
}

View File

@ -20,7 +20,14 @@ import com.google.gson.JsonObject;
import lombok.Data;
@Data
public class AttrTelemetryObserveValue {
public class LwM2MClientProfile {
/**
* {"clientLwM2mSettings": {
* clientUpdateValueAfterConnect: false;
* }
**/
JsonObject postClientLwM2mSettings;
/**
* {"keyName": {
* "/3/0/1": "modelNumber",

View File

@ -15,7 +15,6 @@
*/
package org.thingsboard.server.transport.lwm2m.server.secure;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.leshan.core.util.Hex;
import org.eclipse.leshan.server.californium.LeshanServer;
@ -32,8 +31,8 @@ import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator;
import org.thingsboard.server.transport.lwm2m.secure.ReadResultSecurityStore;
import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportHandler;
import org.thingsboard.server.transport.lwm2m.server.client.AttrTelemetryObserveValue;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient;
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientProfile;
import org.thingsboard.server.transport.lwm2m.utils.TypeServer;
import java.util.Collection;
@ -60,7 +59,7 @@ public class LwM2mInMemorySecurityStore extends InMemorySecurityStore {
private final Lock readLock = readWriteLock.readLock();
private final Lock writeLock = readWriteLock.writeLock();
private final Map<String /** registrationId */, LwM2MClient> sessions = new ConcurrentHashMap<>();
private Map<UUID /** profileUUid */, AttrTelemetryObserveValue> profiles = new ConcurrentHashMap<>();
private Map<UUID /** profileUUid */, LwM2MClientProfile> profiles = new ConcurrentHashMap<>();
private SecurityStoreListener listener;
@Autowired
@ -228,23 +227,28 @@ public class LwM2mInMemorySecurityStore extends InMemorySecurityStore {
return this.sessions;
}
public Map<UUID, AttrTelemetryObserveValue> getProfiles() {
public Map<UUID, LwM2MClientProfile> getProfiles() {
return this.profiles;
}
public AttrTelemetryObserveValue getProfile(UUID profileUuId) {
public LwM2MClientProfile getProfile(UUID profileUuId) {
return this.profiles.get(profileUuId);
}
public Map<UUID, AttrTelemetryObserveValue> setProfiles(Map<UUID, AttrTelemetryObserveValue> profiles) {
public LwM2MClientProfile getProfile(String registrationId) {
UUID profileUUid = this.getSessions().get(registrationId).getProfileUuid();
return this.getProfiles().get(profileUUid);
}
public Map<UUID, LwM2MClientProfile> setProfiles(Map<UUID, LwM2MClientProfile> profiles) {
return this.profiles = profiles;
}
public boolean addUpdateProfileParameters(DeviceProfile deviceProfile) {
JsonObject profilesConfigData = LwM2MTransportHandler.getObserveAttrTelemetryFromThingsboard(deviceProfile);
if (profilesConfigData != null) {
profiles.put(deviceProfile.getUuidId(), LwM2MTransportHandler.getNewProfileParameters(profilesConfigData));
LwM2MClientProfile lwM2MClientProfile = LwM2MTransportHandler.getLwM2MClientProfileFromThingsboard(deviceProfile);
if (lwM2MClientProfile != null) {
profiles.put(deviceProfile.getUuidId(), lwM2MClientProfile);
}
return (profilesConfigData != null);
return (lwM2MClientProfile != null);
}
}

View File

@ -118,10 +118,6 @@ public class LwM2MTransportConfigServer {
@Value("${transport.lwm2m.registered_pool_size:}")
private int registeredPoolSize;
@Getter
@Value("${transport.lwm2m.client_update_value_after_connect:}")
private boolean clientUpdateValueAfterConnect;
@Getter
@Value("${transport.lwm2m.update_registered_pool_size:}")
private int updateRegisteredPoolSize;

View File

@ -26,7 +26,9 @@
{ count: +lwm2mDeviceProfileFormGroup.get('clientUpdateValueAfterConnect').value,
value: lwm2mDeviceProfileFormGroup.get('clientUpdateValueAfterConnect').value }) | async }}"
matTooltipPosition="above">
{{ 'device-profile.lwm2m.client-update-value-after-connect' | translate }}
{{ translate.get('device-profile.lwm2m.client-update-value-after-connect',
{ count: +lwm2mDeviceProfileFormGroup.get('clientUpdateValueAfterConnect').value,
value: lwm2mDeviceProfileFormGroup.get('clientUpdateValueAfterConnect').value }) | async }}
</mat-checkbox>
</div>
<div class="mat-padding" style="padding-top: 0">

View File

@ -1103,8 +1103,8 @@
"schedule-time-to": "To",
"schedule-days-of-week-required": "At least one day of week should be selected.",
"lwm2m": {
"client-update-value-after-connect": "Query client resource values after connecting ",
"client-update-value-after-connect-tip": "{ count, plural, 1 {After connecting the Client, we get All resource values for all objects} other {Once connected to the client, requests are sent to the observer from the profile configuration.} }",
"client-update-value-after-connect": "{ count, plural, 1 {Request to the client after registration for All resource values} other {Request to the client after registration to read values only as attributes or telemetry} }",
"client-update-value-after-connect-tip": "{ count, plural, 1 {Request to the client after registration to read all resource values for all objects} other {Request to the client after registration to read the values of the resources marked as attribute or telemetry from the profile configuration.} }",
"object-list": "Object list",
"object-list-empty": "No objects selected.",
"no-objects-matching": "No objects matching '{{object}}' were found.",