|
|
@ -15,7 +15,6 @@ |
|
|
*/ |
|
|
*/ |
|
|
package org.thingsboard.server.actors.device; |
|
|
package org.thingsboard.server.actors.device; |
|
|
|
|
|
|
|
|
import akka.actor.ActorContext; |
|
|
|
|
|
import com.google.common.util.concurrent.FutureCallback; |
|
|
import com.google.common.util.concurrent.FutureCallback; |
|
|
import com.google.common.util.concurrent.Futures; |
|
|
import com.google.common.util.concurrent.Futures; |
|
|
import com.google.common.util.concurrent.ListenableFuture; |
|
|
import com.google.common.util.concurrent.ListenableFuture; |
|
|
@ -27,6 +26,7 @@ import org.thingsboard.rule.engine.api.RpcError; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; |
|
|
import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; |
|
|
import org.thingsboard.server.actors.ActorSystemContext; |
|
|
import org.thingsboard.server.actors.ActorSystemContext; |
|
|
|
|
|
import org.thingsboard.server.actors.TbActorCtx; |
|
|
import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; |
|
|
import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; |
|
|
import org.thingsboard.server.common.data.Device; |
|
|
import org.thingsboard.server.common.data.Device; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
@ -127,7 +127,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void processRpcRequest(ActorContext context, ToDeviceRpcRequestActorMsg msg) { |
|
|
void processRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg) { |
|
|
ToDeviceRpcRequest request = msg.getMsg(); |
|
|
ToDeviceRpcRequest request = msg.getMsg(); |
|
|
ToDeviceRpcRequestBody body = request.getBody(); |
|
|
ToDeviceRpcRequestBody body = request.getBody(); |
|
|
ToDeviceRpcRequestMsg rpcRequest = ToDeviceRpcRequestMsg.newBuilder().setRequestId( |
|
|
ToDeviceRpcRequestMsg rpcRequest = ToDeviceRpcRequestMsg.newBuilder().setRequestId( |
|
|
@ -162,13 +162,13 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void registerPendingRpcRequest(ActorContext context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) { |
|
|
private void registerPendingRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) { |
|
|
toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent)); |
|
|
toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent)); |
|
|
DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout); |
|
|
DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout); |
|
|
scheduleMsgWithDelay(context, timeoutMsg, timeoutMsg.getTimeout()); |
|
|
scheduleMsgWithDelay(context, timeoutMsg, timeoutMsg.getTimeout()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void processServerSideRpcTimeout(ActorContext context, DeviceActorServerSideRpcTimeoutMsg msg) { |
|
|
void processServerSideRpcTimeout(TbActorCtx context, DeviceActorServerSideRpcTimeoutMsg msg) { |
|
|
ToDeviceRpcRequestMetadata requestMd = toDeviceRpcPendingMap.remove(msg.getId()); |
|
|
ToDeviceRpcRequestMetadata requestMd = toDeviceRpcPendingMap.remove(msg.getId()); |
|
|
if (requestMd != null) { |
|
|
if (requestMd != null) { |
|
|
log.debug("[{}] RPC request [{}] timeout detected!", deviceId, msg.getId()); |
|
|
log.debug("[{}] RPC request [{}] timeout detected!", deviceId, msg.getId()); |
|
|
@ -177,7 +177,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void sendPendingRequests(ActorContext context, UUID sessionId, SessionInfoProto sessionInfo) { |
|
|
private void sendPendingRequests(TbActorCtx context, UUID sessionId, SessionInfoProto sessionInfo) { |
|
|
SessionType sessionType = getSessionType(sessionId); |
|
|
SessionType sessionType = getSessionType(sessionId); |
|
|
if (!toDeviceRpcPendingMap.isEmpty()) { |
|
|
if (!toDeviceRpcPendingMap.isEmpty()) { |
|
|
log.debug("[{}] Pushing {} pending RPC messages to new async session [{}]", deviceId, toDeviceRpcPendingMap.size(), sessionId); |
|
|
log.debug("[{}] Pushing {} pending RPC messages to new async session [{}]", deviceId, toDeviceRpcPendingMap.size(), sessionId); |
|
|
@ -198,7 +198,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
sentOneWayIds.forEach(toDeviceRpcPendingMap::remove); |
|
|
sentOneWayIds.forEach(toDeviceRpcPendingMap::remove); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private Consumer<Map.Entry<Integer, ToDeviceRpcRequestMetadata>> processPendingRpc(ActorContext context, UUID sessionId, String nodeId, Set<Integer> sentOneWayIds) { |
|
|
private Consumer<Map.Entry<Integer, ToDeviceRpcRequestMetadata>> processPendingRpc(TbActorCtx context, UUID sessionId, String nodeId, Set<Integer> sentOneWayIds) { |
|
|
return entry -> { |
|
|
return entry -> { |
|
|
ToDeviceRpcRequest request = entry.getValue().getMsg().getMsg(); |
|
|
ToDeviceRpcRequest request = entry.getValue().getMsg().getMsg(); |
|
|
ToDeviceRpcRequestBody body = request.getBody(); |
|
|
ToDeviceRpcRequestBody body = request.getBody(); |
|
|
@ -212,7 +212,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
}; |
|
|
}; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void process(ActorContext context, TransportToDeviceActorMsgWrapper wrapper) { |
|
|
void process(TbActorCtx context, TransportToDeviceActorMsgWrapper wrapper) { |
|
|
TransportToDeviceActorMsg msg = wrapper.getMsg(); |
|
|
TransportToDeviceActorMsg msg = wrapper.getMsg(); |
|
|
TbCallback callback = wrapper.getCallback(); |
|
|
TbCallback callback = wrapper.getCallback(); |
|
|
if (msg.hasSessionEvent()) { |
|
|
if (msg.hasSessionEvent()) { |
|
|
@ -239,7 +239,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
callback.onSuccess(); |
|
|
callback.onSuccess(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void handleClaimDeviceMsg(ActorContext context, SessionInfoProto sessionInfo, TransportProtos.ClaimDeviceMsg msg) { |
|
|
private void handleClaimDeviceMsg(TbActorCtx context, SessionInfoProto sessionInfo, TransportProtos.ClaimDeviceMsg msg) { |
|
|
DeviceId deviceId = new DeviceId(new UUID(msg.getDeviceIdMSB(), msg.getDeviceIdLSB())); |
|
|
DeviceId deviceId = new DeviceId(new UUID(msg.getDeviceIdMSB(), msg.getDeviceIdLSB())); |
|
|
systemContext.getClaimDevicesService().registerClaimingInfo(tenantId, deviceId, msg.getSecretKey(), msg.getDurationMs()); |
|
|
systemContext.getClaimDevicesService().registerClaimingInfo(tenantId, deviceId, msg.getSecretKey(), msg.getDurationMs()); |
|
|
} |
|
|
} |
|
|
@ -252,7 +252,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
systemContext.getDeviceStateService().onDeviceDisconnect(deviceId); |
|
|
systemContext.getDeviceStateService().onDeviceDisconnect(deviceId); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void handleGetAttributesRequest(ActorContext context, SessionInfoProto sessionInfo, GetAttributeRequestMsg request) { |
|
|
private void handleGetAttributesRequest(TbActorCtx context, SessionInfoProto sessionInfo, GetAttributeRequestMsg request) { |
|
|
int requestId = request.getRequestId(); |
|
|
int requestId = request.getRequestId(); |
|
|
Futures.addCallback(getAttributesKvEntries(request), new FutureCallback<List<List<AttributeKvEntry>>>() { |
|
|
Futures.addCallback(getAttributesKvEntries(request), new FutureCallback<List<List<AttributeKvEntry>>>() { |
|
|
@Override |
|
|
@Override |
|
|
@ -310,7 +310,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
return sessions.containsKey(sessionId) ? SessionType.ASYNC : SessionType.SYNC; |
|
|
return sessions.containsKey(sessionId) ? SessionType.ASYNC : SessionType.SYNC; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void processAttributesUpdate(ActorContext context, DeviceAttributesEventNotificationMsg msg) { |
|
|
void processAttributesUpdate(TbActorCtx context, DeviceAttributesEventNotificationMsg msg) { |
|
|
if (attributeSubscriptions.size() > 0) { |
|
|
if (attributeSubscriptions.size() > 0) { |
|
|
boolean hasNotificationData = false; |
|
|
boolean hasNotificationData = false; |
|
|
AttributeUpdateNotificationMsg.Builder notification = AttributeUpdateNotificationMsg.newBuilder(); |
|
|
AttributeUpdateNotificationMsg.Builder notification = AttributeUpdateNotificationMsg.newBuilder(); |
|
|
@ -349,7 +349,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void processRpcResponses(ActorContext context, SessionInfoProto sessionInfo, ToDeviceRpcResponseMsg responseMsg) { |
|
|
private void processRpcResponses(TbActorCtx context, SessionInfoProto sessionInfo, ToDeviceRpcResponseMsg responseMsg) { |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
log.debug("[{}] Processing rpc command response [{}]", deviceId, sessionId); |
|
|
log.debug("[{}] Processing rpc command response [{}]", deviceId, sessionId); |
|
|
ToDeviceRpcRequestMetadata requestMd = toDeviceRpcPendingMap.remove(responseMsg.getRequestId()); |
|
|
ToDeviceRpcRequestMetadata requestMd = toDeviceRpcPendingMap.remove(responseMsg.getRequestId()); |
|
|
@ -362,7 +362,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void processSubscriptionCommands(ActorContext context, SessionInfoProto sessionInfo, SubscribeToAttributeUpdatesMsg subscribeCmd) { |
|
|
private void processSubscriptionCommands(TbActorCtx context, SessionInfoProto sessionInfo, SubscribeToAttributeUpdatesMsg subscribeCmd) { |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
if (subscribeCmd.getUnsubscribe()) { |
|
|
if (subscribeCmd.getUnsubscribe()) { |
|
|
log.debug("[{}] Canceling attributes subscription for session [{}]", deviceId, sessionId); |
|
|
log.debug("[{}] Canceling attributes subscription for session [{}]", deviceId, sessionId); |
|
|
@ -383,7 +383,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
return new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()); |
|
|
return new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void processSubscriptionCommands(ActorContext context, SessionInfoProto sessionInfo, SubscribeToRPCMsg subscribeCmd) { |
|
|
private void processSubscriptionCommands(TbActorCtx context, SessionInfoProto sessionInfo, SubscribeToRPCMsg subscribeCmd) { |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
UUID sessionId = getSessionId(sessionInfo); |
|
|
if (subscribeCmd.getUnsubscribe()) { |
|
|
if (subscribeCmd.getUnsubscribe()) { |
|
|
log.debug("[{}] Canceling rpc subscription for session [{}]", deviceId, sessionId); |
|
|
log.debug("[{}] Canceling rpc subscription for session [{}]", deviceId, sessionId); |
|
|
@ -433,7 +433,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private void handleSessionActivity(ActorContext context, SessionInfoProto sessionInfoProto, SubscriptionInfoProto subscriptionInfo) { |
|
|
private void handleSessionActivity(TbActorCtx context, SessionInfoProto sessionInfoProto, SubscriptionInfoProto subscriptionInfo) { |
|
|
UUID sessionId = getSessionId(sessionInfoProto); |
|
|
UUID sessionId = getSessionId(sessionInfoProto); |
|
|
SessionInfoMetaData sessionMD = sessions.computeIfAbsent(sessionId, |
|
|
SessionInfoMetaData sessionMD = sessions.computeIfAbsent(sessionId, |
|
|
id -> new SessionInfoMetaData(new SessionInfo(SessionType.ASYNC, sessionInfoProto.getNodeId()), 0L)); |
|
|
id -> new SessionInfoMetaData(new SessionInfo(SessionType.ASYNC, sessionInfoProto.getNodeId()), 0L)); |
|
|
@ -612,8 +612,8 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { |
|
|
.addAllSessions(sessionsList).build().toByteArray()); |
|
|
.addAllSessions(sessionsList).build().toByteArray()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void initSessionTimeout(ActorContext context) { |
|
|
void initSessionTimeout(TbActorCtx ctx) { |
|
|
schedulePeriodicMsgWithDelay(context, SessionTimeoutCheckMsg.instance(), systemContext.getSessionInactivityTimeout(), systemContext.getSessionInactivityTimeout()); |
|
|
schedulePeriodicMsgWithDelay(ctx, SessionTimeoutCheckMsg.instance(), systemContext.getSessionInactivityTimeout(), systemContext.getSessionInactivityTimeout()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void checkSessionsTimeout() { |
|
|
void checkSessionsTimeout() { |
|
|
|