added power mode to lwm2m-device-profile-transport-configuration
This commit is contained in:
parent
ba507e9910
commit
a665b2cbe6
@ -41,6 +41,8 @@ import org.thingsboard.server.common.data.TbResource;
|
||||
import org.thingsboard.server.common.data.TenantProfile;
|
||||
import org.thingsboard.server.common.data.device.credentials.BasicMqttCredentials;
|
||||
import org.thingsboard.server.common.data.device.credentials.ProvisionDeviceCredentialsData;
|
||||
import org.thingsboard.server.common.data.device.data.Lwm2mDeviceTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.device.data.PowerMode;
|
||||
import org.thingsboard.server.common.data.device.profile.ProvisionDeviceProfileCredentials;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
@ -459,6 +461,13 @@ public class DefaultTransportApiService implements TransportApiService {
|
||||
}
|
||||
|
||||
private DeviceInfoProto getDeviceInfoProto(Device device) throws JsonProcessingException {
|
||||
PowerMode powerMode = null;
|
||||
switch (device.getDeviceData().getTransportConfiguration().getType()) {
|
||||
case LWM2M:
|
||||
powerMode = ((Lwm2mDeviceTransportConfiguration) device.getDeviceData().getTransportConfiguration()).getPowerMode();
|
||||
break;
|
||||
}
|
||||
|
||||
return DeviceInfoProto.newBuilder()
|
||||
.setTenantIdMSB(device.getTenantId().getId().getMostSignificantBits())
|
||||
.setTenantIdLSB(device.getTenantId().getId().getLeastSignificantBits())
|
||||
@ -471,6 +480,7 @@ public class DefaultTransportApiService implements TransportApiService {
|
||||
.setDeviceProfileIdMSB(device.getDeviceProfileId().getId().getMostSignificantBits())
|
||||
.setDeviceProfileIdLSB(device.getDeviceProfileId().getId().getLeastSignificantBits())
|
||||
.setAdditionalInfo(mapper.writeValueAsString(device.getAdditionalInfo()))
|
||||
.setPowerMode(powerMode != null ? powerMode.name() : null)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@ -20,9 +20,6 @@ import com.fasterxml.jackson.annotation.JsonAnySetter;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.BootstrapConfiguration;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.OtherConfiguration;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.TelemetryMappingConfiguration;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -30,6 +27,8 @@ import java.util.Map;
|
||||
@Data
|
||||
public class Lwm2mDeviceTransportConfiguration implements DeviceTransportConfiguration {
|
||||
|
||||
private PowerMode powerMode;
|
||||
|
||||
@JsonIgnore
|
||||
private Map<String, Object> properties = new HashMap<>();
|
||||
|
||||
|
||||
@ -115,6 +115,7 @@ message DeviceInfoProto {
|
||||
int64 deviceProfileIdLSB = 9;
|
||||
int64 customerIdMSB = 10;
|
||||
int64 customerIdLSB = 11;
|
||||
string powerMode = 12;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -44,7 +44,6 @@ import org.thingsboard.server.common.data.device.profile.DeviceProfileTransportC
|
||||
import org.thingsboard.server.common.data.device.profile.JsonTransportPayloadConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.ProtoTransportPayloadConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.TransportPayloadTypeConfiguration;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.data.security.DeviceTokenCredentials;
|
||||
import org.thingsboard.server.common.msg.session.FeatureType;
|
||||
import org.thingsboard.server.common.msg.session.SessionMsgType;
|
||||
@ -515,23 +514,7 @@ public class CoapTransportResource extends AbstractCoapTransportResource {
|
||||
exchange.respond(CoAP.ResponseCode.INTERNAL_SERVER_ERROR);
|
||||
successful = false;
|
||||
}
|
||||
if (msg.getPersisted()) {
|
||||
RpcStatus status;
|
||||
if (!successful) {
|
||||
status = RpcStatus.FAILED;
|
||||
} else if (msg.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg responseMsg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(msg.getRequestId())
|
||||
.setRequestIdLSB(msg.getRequestIdLSB())
|
||||
.setRequestIdMSB(msg.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
coapTransportResource.transportService.process(sessionInfo, responseMsg, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
coapTransportResource.transportService.process(sessionInfo, msg, !successful, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -406,21 +406,7 @@ public class DeviceApiController implements TbTransportService {
|
||||
@Override
|
||||
public void onToDeviceRpcRequest(ToDeviceRpcRequestMsg msg) {
|
||||
responseWriter.setResult(new ResponseEntity<>(JsonConverter.toJson(msg, true).toString(), HttpStatus.OK));
|
||||
if (msg.getPersisted()) {
|
||||
RpcStatus status;
|
||||
if (msg.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg responseMsg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(msg.getRequestId())
|
||||
.setRequestIdLSB(msg.getRequestIdLSB())
|
||||
.setRequestIdMSB(msg.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
transportService.process(sessionInfo, responseMsg, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
transportService.process(sessionInfo, msg, false, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -33,6 +33,7 @@ import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
|
||||
import org.thingsboard.server.transport.lwm2m.secure.credentials.LwM2MCredentials;
|
||||
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
|
||||
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
|
||||
import org.thingsboard.server.transport.lwm2m.server.uplink.LwM2mTypeServer;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -84,7 +85,14 @@ public class LwM2mCredentialsSecurityInfoValidator {
|
||||
} catch (InterruptedException e) {
|
||||
log.error("Failed to await credentials!", e);
|
||||
}
|
||||
return resultSecurityStore[0];
|
||||
|
||||
TbLwM2MSecurityInfo securityInfo = resultSecurityStore[0];
|
||||
|
||||
if (securityInfo.getSecurityMode() == null) {
|
||||
throw new LwM2MAuthException();
|
||||
}
|
||||
|
||||
return securityInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.transport.lwm2m.secure;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.eclipse.leshan.core.request.Identity;
|
||||
import org.eclipse.leshan.core.request.UplinkRequest;
|
||||
import org.eclipse.leshan.server.registration.Registration;
|
||||
@ -24,14 +25,15 @@ import org.eclipse.leshan.server.security.SecurityChecker;
|
||||
import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
|
||||
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MAuthException;
|
||||
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
|
||||
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MDtlsSessionStore;
|
||||
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2mSecurityStore;
|
||||
import org.thingsboard.server.transport.lwm2m.server.store.TbSecurityStore;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@TbLwM2mTransportComponent
|
||||
@Slf4j
|
||||
public class TbLwM2MAuthorizer implements Authorizer {
|
||||
|
||||
private final TbLwM2MDtlsSessionStore sessionStorage;
|
||||
@ -57,7 +59,12 @@ public class TbLwM2MAuthorizer implements Authorizer {
|
||||
}
|
||||
SecurityInfo expectedSecurityInfo = null;
|
||||
if (securityStore != null) {
|
||||
expectedSecurityInfo = securityStore.getByEndpoint(registration.getEndpoint());
|
||||
try {
|
||||
expectedSecurityInfo = securityStore.getByEndpoint(registration.getEndpoint());
|
||||
} catch (LwM2MAuthException e) {
|
||||
log.warn("Registration failed: FORBIDDEN, endpointId: [{}]", registration.getEndpoint());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (securityChecker.checkSecurityInfo(registration.getEndpoint(), senderIdentity, expectedSecurityInfo)) {
|
||||
return registration;
|
||||
|
||||
@ -23,7 +23,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.ResourceType;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.transport.SessionMsgListener;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.TransportServiceCallback;
|
||||
@ -58,7 +57,7 @@ public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? s
|
||||
@Override
|
||||
public void onAttributeUpdate(AttributeUpdateNotificationMsg attributeUpdateNotification) {
|
||||
this.attributesService.onAttributesUpdate(attributeUpdateNotification, this.sessionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRemoteSessionCloseCommand(UUID sessionId, SessionCloseNotificationProto sessionCloseNotification) {
|
||||
@ -83,21 +82,7 @@ public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? s
|
||||
@Override
|
||||
public void onToDeviceRpcRequest(ToDeviceRpcRequestMsg toDeviceRequest) {
|
||||
this.rpcHandler.onToDeviceRpcRequest(toDeviceRequest, this.sessionInfo);
|
||||
if (toDeviceRequest.getPersisted()) {
|
||||
RpcStatus status;
|
||||
if (toDeviceRequest.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg responseMsg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(toDeviceRequest.getRequestId())
|
||||
.setRequestIdLSB(toDeviceRequest.getRequestIdLSB())
|
||||
.setRequestIdMSB(toDeviceRequest.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
transportService.process(sessionInfo, responseMsg, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
transportService.process(sessionInfo, toDeviceRequest, false, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -0,0 +1,22 @@
|
||||
/**
|
||||
* Copyright © 2016-2021 The Thingsboard Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package org.thingsboard.server.transport.lwm2m.server.client;
|
||||
|
||||
public class LwM2MAuthException extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = 4202690897971364044L;
|
||||
|
||||
}
|
||||
@ -32,6 +32,8 @@ import org.eclipse.leshan.server.registration.Registration;
|
||||
import org.eclipse.leshan.server.security.SecurityInfo;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.device.data.Lwm2mDeviceTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.device.data.PowerMode;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
|
||||
@ -79,6 +81,9 @@ public class LwM2mClient implements Cloneable {
|
||||
@Getter
|
||||
private String deviceProfileName;
|
||||
|
||||
@Getter
|
||||
private PowerMode powerMode;
|
||||
|
||||
@Getter
|
||||
private String identity;
|
||||
@Getter
|
||||
@ -121,6 +126,7 @@ public class LwM2mClient implements Cloneable {
|
||||
this.profileId = new UUID(session.getDeviceProfileIdMSB(), session.getDeviceProfileIdLSB());
|
||||
this.deviceName = session.getDeviceName();
|
||||
this.deviceProfileName = session.getDeviceType();
|
||||
this.powerMode = credentials.getDeviceInfo().getPowerMode();
|
||||
}
|
||||
|
||||
public void lock() {
|
||||
@ -140,6 +146,7 @@ public class LwM2mClient implements Cloneable {
|
||||
builder.setDeviceName(deviceName);
|
||||
deviceProfileOpt.ifPresent(deviceProfile -> updateSession(deviceProfile, builder));
|
||||
this.session = builder.build();
|
||||
this.powerMode = ((Lwm2mDeviceTransportConfiguration) device.getDeviceData().getTransportConfiguration()).getPowerMode();
|
||||
}
|
||||
|
||||
public void onDeviceProfileUpdate(DeviceProfile deviceProfile) {
|
||||
|
||||
@ -37,10 +37,10 @@ import org.eclipse.leshan.server.registration.Registration;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.thingsboard.common.util.DonAsynchron;
|
||||
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
||||
import org.thingsboard.server.common.data.Device;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.StringUtils;
|
||||
import org.thingsboard.server.common.data.device.data.PowerMode;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.OtherConfiguration;
|
||||
import org.thingsboard.server.common.data.device.data.lwm2m.TelemetryMappingConfiguration;
|
||||
@ -83,8 +83,6 @@ import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteAttrib
|
||||
import org.thingsboard.server.transport.lwm2m.server.downlink.TbLwM2MWriteAttributesRequest;
|
||||
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService;
|
||||
import org.thingsboard.server.transport.lwm2m.server.ota.LwM2MOtaUpdateService;
|
||||
import org.thingsboard.server.transport.lwm2m.server.ota.firmware.LwM2MFirmwareUpdateStrategy;
|
||||
import org.thingsboard.server.transport.lwm2m.server.ota.software.LwM2MSoftwareUpdateStrategy;
|
||||
import org.thingsboard.server.transport.lwm2m.server.rpc.LwM2MRpcRequestHandler;
|
||||
import org.thingsboard.server.transport.lwm2m.server.store.TbLwM2MDtlsSessionStore;
|
||||
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
|
||||
@ -203,30 +201,25 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
|
||||
executor.submit(() -> {
|
||||
LwM2mClient lwM2MClient = this.clientContext.getClientByEndpoint(registration.getEndpoint());
|
||||
try {
|
||||
log.warn("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId());
|
||||
if (lwM2MClient != null) {
|
||||
Optional<SessionInfoProto> oldSessionInfo = this.clientContext.register(lwM2MClient, registration);
|
||||
if (oldSessionInfo.isPresent()) {
|
||||
log.info("[{}] Closing old session: {}", registration.getEndpoint(), new UUID(oldSessionInfo.get().getSessionIdMSB(), oldSessionInfo.get().getSessionIdLSB()));
|
||||
closeSession(oldSessionInfo.get());
|
||||
}
|
||||
logService.log(lwM2MClient, LOG_LWM2M_INFO + ": Client registered with registration id: " + registration.getId());
|
||||
SessionInfoProto sessionInfo = lwM2MClient.getSession();
|
||||
transportService.registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(this, attributesService, rpcHandler, sessionInfo, transportService));
|
||||
log.warn("40) sessionId [{}] Registering rpc subscription after Registration client", new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()));
|
||||
TransportProtos.TransportToDeviceActorMsg msg = TransportProtos.TransportToDeviceActorMsg.newBuilder()
|
||||
.setSessionInfo(sessionInfo)
|
||||
.setSessionEvent(DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN))
|
||||
.setSubscribeToAttributes(TransportProtos.SubscribeToAttributeUpdatesMsg.newBuilder().setSessionType(TransportProtos.SessionType.ASYNC).build())
|
||||
.setSubscribeToRPC(TransportProtos.SubscribeToRPCMsg.newBuilder().setSessionType(TransportProtos.SessionType.ASYNC).build())
|
||||
.build();
|
||||
transportService.process(msg, null);
|
||||
this.initClientTelemetry(lwM2MClient);
|
||||
this.initAttributes(lwM2MClient);
|
||||
otaService.init(lwM2MClient);
|
||||
} else {
|
||||
log.error("Client: [{}] onRegistered [{}] name [{}] lwM2MClient ", registration.getId(), registration.getEndpoint(), null);
|
||||
log.debug("[{}] [{{}] Client: create after Registration", registration.getEndpoint(), registration.getId());
|
||||
Optional<SessionInfoProto> oldSessionInfo = this.clientContext.register(lwM2MClient, registration);
|
||||
if (oldSessionInfo.isPresent()) {
|
||||
log.info("[{}] Closing old session: {}", registration.getEndpoint(), new UUID(oldSessionInfo.get().getSessionIdMSB(), oldSessionInfo.get().getSessionIdLSB()));
|
||||
closeSession(oldSessionInfo.get());
|
||||
}
|
||||
logService.log(lwM2MClient, LOG_LWM2M_INFO + ": Client registered with registration id: " + registration.getId());
|
||||
SessionInfoProto sessionInfo = lwM2MClient.getSession();
|
||||
transportService.registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(this, attributesService, rpcHandler, sessionInfo, transportService));
|
||||
TransportProtos.TransportToDeviceActorMsg msg = TransportProtos.TransportToDeviceActorMsg.newBuilder()
|
||||
.setSessionInfo(sessionInfo)
|
||||
.setSessionEvent(DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN))
|
||||
.setSubscribeToAttributes(TransportProtos.SubscribeToAttributeUpdatesMsg.newBuilder().setSessionType(TransportProtos.SessionType.ASYNC).build())
|
||||
.setSubscribeToRPC(TransportProtos.SubscribeToRPCMsg.newBuilder().setSessionType(TransportProtos.SessionType.ASYNC).build())
|
||||
.build();
|
||||
transportService.process(msg, null);
|
||||
this.initClientTelemetry(lwM2MClient);
|
||||
this.initAttributes(lwM2MClient);
|
||||
otaService.init(lwM2MClient);
|
||||
} catch (LwM2MClientStateException stateException) {
|
||||
if (LwM2MClientState.UNREGISTERED.equals(stateException.getState())) {
|
||||
log.info("[{}] retry registration due to race condition: [{}].", registration.getEndpoint(), stateException.getState());
|
||||
@ -410,6 +403,27 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
|
||||
log.trace("[{}] [{}] Received endpoint Awake version event", registration.getId(), registration.getEndpoint());
|
||||
logService.log(clientContext.getClientByEndpoint(registration.getEndpoint()), LOG_LWM2M_INFO + ": Client is awake!");
|
||||
//TODO: associate endpointId with device information.
|
||||
|
||||
LwM2mClient lwM2MClient = this.clientContext.getClientByEndpoint(registration.getEndpoint());
|
||||
|
||||
if (LwM2MClientState.REGISTERED.equals(lwM2MClient.getState())) {
|
||||
Lwm2mDeviceProfileTransportConfiguration deviceProfile = clientContext.getProfile(lwM2MClient.getProfileId());
|
||||
|
||||
PowerMode powerMode = lwM2MClient.getPowerMode();
|
||||
if (powerMode == null) {
|
||||
powerMode = deviceProfile.getClientLwM2mSettings().getPowerMode();
|
||||
}
|
||||
|
||||
if (powerMode.equals(PowerMode.PSM) || powerMode.equals(PowerMode.E_DRX)) {
|
||||
initAttributes(lwM2MClient);
|
||||
TransportProtos.TransportToDeviceActorMsg toDeviceActorMsg = TransportProtos.TransportToDeviceActorMsg
|
||||
.newBuilder()
|
||||
.setSessionInfo(lwM2MClient.getSession())
|
||||
.setSendPendingRPC(TransportProtos.SendPendingRPCMsg.newBuilder().build())
|
||||
.build();
|
||||
transportService.process(toDeviceActorMsg, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -709,7 +723,6 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
|
||||
this.updateResourcesValue(client, resource, path + "/" + resId);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//TODO: review and optimize the logic to minimize number of the requests to device.
|
||||
@ -920,16 +933,6 @@ public class DefaultLwM2MUplinkMsgHandler extends LwM2MExecutorAwareService impl
|
||||
}
|
||||
}
|
||||
|
||||
private TransportProtos.GetOtaPackageRequestMsg createOtaPackageRequestMsg(SessionInfoProto sessionInfo, String nameFwSW) {
|
||||
return TransportProtos.GetOtaPackageRequestMsg.newBuilder()
|
||||
.setDeviceIdMSB(sessionInfo.getDeviceIdMSB())
|
||||
.setDeviceIdLSB(sessionInfo.getDeviceIdLSB())
|
||||
.setTenantIdMSB(sessionInfo.getTenantIdMSB())
|
||||
.setTenantIdLSB(sessionInfo.getTenantIdLSB())
|
||||
.setType(nameFwSW)
|
||||
.build();
|
||||
}
|
||||
|
||||
private Map<String, String> getNamesFromProfileForSharedAttributes(LwM2mClient lwM2MClient) {
|
||||
Lwm2mDeviceProfileTransportConfiguration profile = clientContext.getProfile(lwM2MClient.getProfileId());
|
||||
return profile.getObserveAttr().getKeyName();
|
||||
|
||||
@ -50,7 +50,6 @@ import org.thingsboard.server.common.data.TransportPayloadType;
|
||||
import org.thingsboard.server.common.data.device.profile.MqttTopics;
|
||||
import org.thingsboard.server.common.data.id.OtaPackageId;
|
||||
import org.thingsboard.server.common.data.ota.OtaPackageType;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.msg.EncryptionUtil;
|
||||
import org.thingsboard.server.common.msg.tools.TbRateLimitsException;
|
||||
import org.thingsboard.server.common.transport.SessionMsgListener;
|
||||
@ -819,25 +818,10 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
|
||||
.ifPresent(payload -> {
|
||||
ChannelFuture channelFuture = deviceSessionCtx.getChannel().writeAndFlush(payload);
|
||||
if (rpcRequest.getPersisted()) {
|
||||
channelFuture.addListener(future -> {
|
||||
RpcStatus status;
|
||||
Throwable t = future.cause();
|
||||
if (t != null) {
|
||||
log.error("Failed delivering RPC command to device!", t);
|
||||
status = RpcStatus.FAILED;
|
||||
} else if (rpcRequest.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg msg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(rpcRequest.getRequestId())
|
||||
.setRequestIdLSB(rpcRequest.getRequestIdLSB())
|
||||
.setRequestIdMSB(rpcRequest.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
transportService.process(deviceSessionCtx.getSessionInfo(), msg, TransportServiceCallback.EMPTY);
|
||||
});
|
||||
channelFuture.addListener(future ->
|
||||
transportService.process(deviceSessionCtx.getSessionInfo(), rpcRequest,
|
||||
future.cause() != null, TransportServiceCallback.EMPTY)
|
||||
);
|
||||
}
|
||||
});
|
||||
} catch (Exception e) {
|
||||
|
||||
@ -18,7 +18,6 @@ package org.thingsboard.server.transport.mqtt.session;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.transport.SessionMsgListener;
|
||||
import org.thingsboard.server.common.transport.TransportService;
|
||||
import org.thingsboard.server.common.transport.TransportServiceCallback;
|
||||
@ -100,25 +99,9 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple
|
||||
payload -> {
|
||||
ChannelFuture channelFuture = parent.writeAndFlush(payload);
|
||||
if (request.getPersisted()) {
|
||||
channelFuture.addListener(future -> {
|
||||
RpcStatus status;
|
||||
Throwable t = future.cause();
|
||||
if (t != null) {
|
||||
log.error("Failed delivering RPC command to device!", t);
|
||||
status = RpcStatus.FAILED;
|
||||
} else if (request.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg msg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(request.getRequestId())
|
||||
.setRequestIdLSB(request.getRequestIdLSB())
|
||||
.setRequestIdMSB(request.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
transportService.process(getSessionInfo(), msg, TransportServiceCallback.EMPTY);
|
||||
});
|
||||
channelFuture.addListener(future ->
|
||||
transportService.process(getSessionInfo(), request, future.cause() != null, TransportServiceCallback.EMPTY)
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
@ -26,7 +26,6 @@ import org.thingsboard.server.common.data.DeviceProfile;
|
||||
import org.thingsboard.server.common.data.device.data.SnmpDeviceTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.device.profile.SnmpDeviceProfileTransportConfiguration;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.transport.SessionMsgListener;
|
||||
import org.thingsboard.server.common.transport.TransportServiceCallback;
|
||||
import org.thingsboard.server.common.transport.session.DeviceAwareSessionContext;
|
||||
@ -140,22 +139,8 @@ public class DeviceSessionContext extends DeviceAwareSessionContext implements S
|
||||
|
||||
@Override
|
||||
public void onToDeviceRpcRequest(ToDeviceRpcRequestMsg toDeviceRequest) {
|
||||
snmpTransportContext.getSnmpTransportService().onToDeviceRpcRequest(this, toDeviceRequest);
|
||||
if (toDeviceRequest.getPersisted()) {
|
||||
RpcStatus status;
|
||||
if (toDeviceRequest.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg responseMsg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(toDeviceRequest.getRequestId())
|
||||
.setRequestIdLSB(toDeviceRequest.getRequestIdLSB())
|
||||
.setRequestIdMSB(toDeviceRequest.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
snmpTransportContext.getTransportService().process(getSessionInfo(), responseMsg, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
snmpTransportContext.getSnmpTransportService().onToDeviceRpcRequest(this, toDeviceRequest);
|
||||
snmpTransportContext.getTransportService().process(getSessionInfo(), toDeviceRequest, false, TransportServiceCallback.EMPTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -21,7 +21,6 @@ import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGateway
|
||||
import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
|
||||
import org.thingsboard.server.common.transport.service.SessionMetaData;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetDeviceCredentialsRequestMsg;
|
||||
@ -30,9 +29,9 @@ import org.thingsboard.server.gen.transport.TransportProtos.GetDeviceRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetDeviceResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetOtaPackageRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetOtaPackageResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetResourceRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetResourceResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.GetSnmpDevicesRequestMsg;
|
||||
@ -50,8 +49,8 @@ import org.thingsboard.server.gen.transport.TransportProtos.SubscribeToRPCMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.SubscriptionInfoProto;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToDeviceRpcResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ToServerRpcRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateBasicMqttCredRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg;
|
||||
import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg;
|
||||
@ -110,7 +109,7 @@ public interface TransportService {
|
||||
|
||||
void process(SessionInfoProto sessionInfo, ToServerRpcRequestMsg msg, TransportServiceCallback<Void> callback);
|
||||
|
||||
void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.ToDevicePersistedRpcResponseMsg msg, TransportServiceCallback<Void> callback);
|
||||
void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.ToDeviceRpcRequestMsg msg, boolean isFailedRpc, TransportServiceCallback<Void> callback);
|
||||
|
||||
void process(SessionInfoProto sessionInfo, SubscriptionInfoProto msg, TransportServiceCallback<Void> callback);
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package org.thingsboard.server.common.transport.auth;
|
||||
|
||||
import lombok.Data;
|
||||
import org.thingsboard.server.common.data.device.data.PowerMode;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
||||
@ -30,6 +31,7 @@ public class TransportDeviceInfo {
|
||||
private DeviceId deviceId;
|
||||
private String deviceName;
|
||||
private String deviceType;
|
||||
private PowerMode powerMode;
|
||||
private String additionalInfo;
|
||||
|
||||
}
|
||||
|
||||
@ -35,6 +35,7 @@ import org.thingsboard.server.common.data.DeviceTransportType;
|
||||
import org.thingsboard.server.common.data.EntityType;
|
||||
import org.thingsboard.server.common.data.ResourceType;
|
||||
import org.thingsboard.server.common.data.Tenant;
|
||||
import org.thingsboard.server.common.data.device.data.PowerMode;
|
||||
import org.thingsboard.server.common.data.id.CustomerId;
|
||||
import org.thingsboard.server.common.data.id.DeviceId;
|
||||
import org.thingsboard.server.common.data.id.DeviceProfileId;
|
||||
@ -42,6 +43,7 @@ import org.thingsboard.server.common.data.id.EntityId;
|
||||
import org.thingsboard.server.common.data.id.RuleChainId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.id.TenantProfileId;
|
||||
import org.thingsboard.server.common.data.rpc.RpcStatus;
|
||||
import org.thingsboard.server.common.msg.TbMsg;
|
||||
import org.thingsboard.server.common.msg.TbMsgMetaData;
|
||||
import org.thingsboard.server.common.msg.queue.ServiceQueue;
|
||||
@ -439,6 +441,9 @@ public class DefaultTransportService implements TransportService {
|
||||
tdi.setAdditionalInfo(di.getAdditionalInfo());
|
||||
tdi.setDeviceName(di.getDeviceName());
|
||||
tdi.setDeviceType(di.getDeviceType());
|
||||
if (di.getPowerMode() != null) {
|
||||
tdi.setPowerMode(PowerMode.valueOf(di.getPowerMode()));
|
||||
}
|
||||
return tdi;
|
||||
}
|
||||
|
||||
@ -558,11 +563,30 @@ public class DefaultTransportService implements TransportService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.ToDevicePersistedRpcResponseMsg msg, TransportServiceCallback<Void> callback) {
|
||||
if (checkLimits(sessionInfo, msg, callback)) {
|
||||
reportActivityInternal(sessionInfo);
|
||||
sendToDeviceActor(sessionInfo, TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setPersistedRpcResponseMsg(msg).build(),
|
||||
new ApiStatsProxyCallback<>(getTenantId(sessionInfo), getCustomerId(sessionInfo), 1, callback));
|
||||
public void process(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.ToDeviceRpcRequestMsg msg, boolean isFailedRpc, TransportServiceCallback<Void> callback) {
|
||||
if (msg.getPersisted()) {
|
||||
RpcStatus status;
|
||||
|
||||
if (isFailedRpc) {
|
||||
status = RpcStatus.FAILED;
|
||||
} else if (msg.getOneway()) {
|
||||
status = RpcStatus.SUCCESSFUL;
|
||||
} else {
|
||||
status = RpcStatus.DELIVERED;
|
||||
}
|
||||
|
||||
TransportProtos.ToDevicePersistedRpcResponseMsg responseMsg = TransportProtos.ToDevicePersistedRpcResponseMsg.newBuilder()
|
||||
.setRequestId(msg.getRequestId())
|
||||
.setRequestIdLSB(msg.getRequestIdLSB())
|
||||
.setRequestIdMSB(msg.getRequestIdMSB())
|
||||
.setStatus(status.name())
|
||||
.build();
|
||||
|
||||
if (checkLimits(sessionInfo, responseMsg, callback)) {
|
||||
reportActivityInternal(sessionInfo);
|
||||
sendToDeviceActor(sessionInfo, TransportToDeviceActorMsg.newBuilder().setSessionInfo(sessionInfo).setPersistedRpcResponseMsg(responseMsg).build(),
|
||||
new ApiStatsProxyCallback<>(getTenantId(sessionInfo), getCustomerId(sessionInfo), 1, TransportServiceCallback.EMPTY));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -151,13 +151,12 @@
|
||||
</mat-form-field>
|
||||
</fieldset>
|
||||
<fieldset class="fields-group">
|
||||
<legend class="group-title" translate>device-profile.lwm2m.power-mode</legend>
|
||||
<legend class="group-title" translate>device-profile.power-saving-mode</legend>
|
||||
<mat-form-field class="mat-block" fxFlex>
|
||||
<mat-label> </mat-label>
|
||||
<mat-select formControlName="powerMode">
|
||||
<mat-option *ngFor="let powerMode of powerModeLwM2MTypes"
|
||||
[value]="powerMode">
|
||||
{{ powerModeLwM2MNamesMap.get(powerModeLwM2MType[powerMode]) }}
|
||||
<mat-option *ngFor="let powerMod of powerMods" [value]="powerMod">
|
||||
{{ powerModeTranslationMap.get(powerMod) | translate}}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
|
||||
@ -32,7 +32,7 @@ import {
|
||||
ModelValue,
|
||||
ObjectLwM2M,
|
||||
OBSERVE,
|
||||
OBSERVE_ATTR_TELEMETRY, powerMode, powerModeNames,
|
||||
OBSERVE_ATTR_TELEMETRY, PowerMode, PowerModeTranslationMap,
|
||||
RESOURCES,
|
||||
TELEMETRY
|
||||
} from './lwm2m-profile-config.models';
|
||||
@ -72,9 +72,8 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
|
||||
sortFunction: (key: string, value: object) => object;
|
||||
isFwUpdateStrategy: boolean;
|
||||
isSwUpdateStrategy: boolean;
|
||||
powerModeLwM2MType = powerMode;
|
||||
powerModeLwM2MTypes = Object.keys(powerMode);
|
||||
powerModeLwM2MNamesMap = powerModeNames;
|
||||
powerMods = Object.values(PowerMode);
|
||||
powerModeTranslationMap = PowerModeTranslationMap;
|
||||
|
||||
get required(): boolean {
|
||||
return this.requiredValue;
|
||||
@ -208,7 +207,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
|
||||
private updateWriteValue = (value: ModelValue): void => {
|
||||
const fwResource = isDefinedAndNotNull(this.configurationValue.clientLwM2mSettings.fwUpdateResource) ?
|
||||
this.configurationValue.clientLwM2mSettings.fwUpdateResource : '';
|
||||
const swResource = isDefinedAndNotNull(this.configurationValue.clientLwM2mSettings.fwUpdateResource) ?
|
||||
const swResource = isDefinedAndNotNull(this.configurationValue.clientLwM2mSettings.swUpdateResource) ?
|
||||
this.configurationValue.clientLwM2mSettings.swUpdateResource : '';
|
||||
this.lwm2mDeviceProfileFormGroup.patchValue({
|
||||
objectIds: value,
|
||||
|
||||
@ -128,17 +128,17 @@ export const securityConfigModeNames = new Map<securityConfigMode, string>(
|
||||
]
|
||||
);
|
||||
|
||||
export enum powerMode {
|
||||
export enum PowerMode {
|
||||
PSM = 'PSM',
|
||||
DRX = 'DRX',
|
||||
E_DRX = 'E_DRX'
|
||||
}
|
||||
|
||||
export const powerModeNames = new Map<powerMode, string>(
|
||||
export const PowerModeTranslationMap = new Map<PowerMode, string>(
|
||||
[
|
||||
[powerMode.PSM, 'Power Saving Mode (PSM)'],
|
||||
[powerMode.DRX, 'Discontinuous Reception (DRX)'],
|
||||
[powerMode.E_DRX, 'Extended Discontinuous Reception (eDRX)']
|
||||
[PowerMode.PSM, 'device-profile.power-saving-mode-type.psm'],
|
||||
[PowerMode.DRX, 'device-profile.power-saving-mode-type.drx'],
|
||||
[PowerMode.E_DRX, 'device-profile.power-saving-mode-type.edrx']
|
||||
]
|
||||
);
|
||||
|
||||
@ -187,7 +187,7 @@ export interface ClientLwM2mSettings {
|
||||
swUpdateStrategy: number;
|
||||
fwUpdateResource: string;
|
||||
swUpdateResource: string;
|
||||
powerMode: powerMode;
|
||||
powerMode: PowerMode;
|
||||
}
|
||||
|
||||
export interface ObservableAttributes {
|
||||
@ -260,7 +260,7 @@ function getDefaultProfileClientLwM2mSettingsConfig(): ClientLwM2mSettings {
|
||||
swUpdateStrategy: 1,
|
||||
fwUpdateResource: DEFAULT_FW_UPDATE_RESOURCE,
|
||||
swUpdateResource: DEFAULT_SW_UPDATE_RESOURCE,
|
||||
powerMode: powerMode.DRX
|
||||
powerMode: PowerMode.DRX
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -29,12 +29,12 @@
|
||||
formControlName="configuration">
|
||||
</tb-mqtt-device-transport-configuration>
|
||||
</ng-template>
|
||||
<!--ng-template [ngSwitchCase]="deviceTransportType.LWM2M">
|
||||
<ng-template [ngSwitchCase]="deviceTransportType.LWM2M">
|
||||
<tb-lwm2m-device-transport-configuration
|
||||
[required]="required"
|
||||
formControlName="configuration">
|
||||
</tb-lwm2m-device-transport-configuration>
|
||||
</ng-template-->
|
||||
</ng-template>
|
||||
<ng-template [ngSwitchCase]="deviceTransportType.COAP">
|
||||
<tb-coap-device-transport-configuration
|
||||
[required]="required"
|
||||
|
||||
@ -16,9 +16,13 @@
|
||||
|
||||
-->
|
||||
<form [formGroup]="lwm2mDeviceTransportConfigurationFormGroup" style="padding-bottom: 16px;">
|
||||
<!--tb-json-object-edit
|
||||
[required]="required"
|
||||
label="{{ 'device-profile.transport-type-lwm2m' | translate }}"
|
||||
formControlName="configuration">
|
||||
</tb-json-object-edit-->
|
||||
<mat-form-field class="mat-block" fxFlex>
|
||||
<mat-label translate>device-profile.power-saving-mode</mat-label>
|
||||
<mat-select formControlName="powerMode">
|
||||
<mat-option [value]="null">{{ "device-profile.power-saving-mode-type.default" | translate }}</mat-option>
|
||||
<mat-option *ngFor="let powerMod of powerMods" [value]="powerMod">
|
||||
{{ powerModeTranslationMap.get(powerMod) | translate }}
|
||||
</mat-option>
|
||||
</mat-select>
|
||||
</mat-form-field>
|
||||
</form>
|
||||
|
||||
@ -23,6 +23,7 @@ import {
|
||||
DeviceTransportConfiguration,
|
||||
DeviceTransportType, Lwm2mDeviceTransportConfiguration
|
||||
} from '@shared/models/device.models';
|
||||
import {PowerMode, PowerModeTranslationMap} from "@home/components/profile/device/lwm2m/lwm2m-profile-config.models";
|
||||
|
||||
@Component({
|
||||
selector: 'tb-lwm2m-device-transport-configuration',
|
||||
@ -37,6 +38,8 @@ import {
|
||||
export class Lwm2mDeviceTransportConfigurationComponent implements ControlValueAccessor, OnInit {
|
||||
|
||||
lwm2mDeviceTransportConfigurationFormGroup: FormGroup;
|
||||
powerMods = Object.values(PowerMode);
|
||||
powerModeTranslationMap = PowerModeTranslationMap;
|
||||
|
||||
private requiredValue: boolean;
|
||||
get required(): boolean {
|
||||
@ -65,7 +68,7 @@ export class Lwm2mDeviceTransportConfigurationComponent implements ControlValueA
|
||||
|
||||
ngOnInit() {
|
||||
this.lwm2mDeviceTransportConfigurationFormGroup = this.fb.group({
|
||||
configuration: [null, Validators.required]
|
||||
powerMode: [null]
|
||||
});
|
||||
this.lwm2mDeviceTransportConfigurationFormGroup.valueChanges.subscribe(() => {
|
||||
this.updateModel();
|
||||
@ -82,13 +85,13 @@ export class Lwm2mDeviceTransportConfigurationComponent implements ControlValueA
|
||||
}
|
||||
|
||||
writeValue(value: Lwm2mDeviceTransportConfiguration | null): void {
|
||||
this.lwm2mDeviceTransportConfigurationFormGroup.patchValue({configuration: value}, {emitEvent: false});
|
||||
this.lwm2mDeviceTransportConfigurationFormGroup.patchValue(value, {emitEvent: false});
|
||||
}
|
||||
|
||||
private updateModel() {
|
||||
let configuration: DeviceTransportConfiguration = null;
|
||||
if (this.lwm2mDeviceTransportConfigurationFormGroup.valid) {
|
||||
configuration = this.lwm2mDeviceTransportConfigurationFormGroup.getRawValue().configuration;
|
||||
configuration = this.lwm2mDeviceTransportConfigurationFormGroup.getRawValue();
|
||||
// configuration.type = DeviceTransportType.LWM2M;
|
||||
}
|
||||
this.propagateChange(configuration);
|
||||
|
||||
@ -200,7 +200,7 @@ export const deviceTransportTypeConfigurationInfoMap = new Map<DeviceTransportTy
|
||||
DeviceTransportType.LWM2M,
|
||||
{
|
||||
hasProfileConfiguration: true,
|
||||
hasDeviceConfiguration: false,
|
||||
hasDeviceConfiguration: true,
|
||||
}
|
||||
],
|
||||
[
|
||||
|
||||
@ -1213,6 +1213,13 @@
|
||||
"export-failed-error": "Unable to export device profile: {{error}}",
|
||||
"device-profile-file": "Device profile file",
|
||||
"invalid-device-profile-file-error": "Unable to import device profile: Invalid device profile data structure.",
|
||||
"power-saving-mode": "Power Saving Mode",
|
||||
"power-saving-mode-type": {
|
||||
"default": "Use device profile power saving mode",
|
||||
"psm": "Power Saving Mode (PSM)",
|
||||
"drx": "Discontinuous Reception (DRX)",
|
||||
"edrx": "Extended Discontinuous Reception (eDRX)"
|
||||
},
|
||||
"lwm2m": {
|
||||
"object-list": "Object list",
|
||||
"object-list-empty": "No objects selected.",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user