Commit 830d02ef6a360ba93cca3c1629f5313303b4bac1

Authored by Andrii Shvaika
1 parent 2e148f6b

Fix for HTTP and CoAP device activity

... ... @@ -37,6 +37,7 @@ import org.thingsboard.server.gen.transport.TransportProtos;
37 37 import java.lang.reflect.Field;
38 38 import java.util.List;
39 39 import java.util.Optional;
  40 +import java.util.Set;
40 41 import java.util.UUID;
41 42 import java.util.concurrent.ConcurrentHashMap;
42 43 import java.util.concurrent.ConcurrentMap;
... ... @@ -55,6 +56,8 @@ public class CoapTransportResource extends CoapResource {
55 56 private final Field observerField;
56 57 private final long timeout;
57 58 private final ConcurrentMap<String, TransportProtos.SessionInfoProto> tokenToSessionIdMap = new ConcurrentHashMap<>();
  59 + private final Set<UUID> rpcSubscriptions = ConcurrentHashMap.newKeySet();
  60 + private final Set<UUID> attributeSubscriptions = ConcurrentHashMap.newKeySet();
58 61
59 62 public CoapTransportResource(CoapTransportContext context, String name) {
60 63 super(name);
... ... @@ -149,11 +152,13 @@ public class CoapTransportResource extends CoapResource {
149 152 transportService.process(sessionInfo,
150 153 transportContext.getAdaptor().convertToPostAttributes(sessionId, request),
151 154 new CoapOkCallback(exchange));
  155 + reportActivity(sessionId, sessionInfo);
152 156 break;
153 157 case POST_TELEMETRY_REQUEST:
154 158 transportService.process(sessionInfo,
155 159 transportContext.getAdaptor().convertToPostTelemetry(sessionId, request),
156 160 new CoapOkCallback(exchange));
  161 + reportActivity(sessionId, sessionInfo);
157 162 break;
158 163 case CLAIM_REQUEST:
159 164 transportService.process(sessionInfo,
... ... @@ -161,6 +166,7 @@ public class CoapTransportResource extends CoapResource {
161 166 new CoapOkCallback(exchange));
162 167 break;
163 168 case SUBSCRIBE_ATTRIBUTES_REQUEST:
  169 + attributeSubscriptions.add(sessionId);
164 170 advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced),
165 171 registerAsyncCoapSession(exchange, request, sessionInfo, sessionId)));
166 172 transportService.process(sessionInfo,
... ... @@ -168,6 +174,7 @@ public class CoapTransportResource extends CoapResource {
168 174 new CoapNoOpCallback(exchange));
169 175 break;
170 176 case UNSUBSCRIBE_ATTRIBUTES_REQUEST:
  177 + attributeSubscriptions.remove(sessionId);
171 178 TransportProtos.SessionInfoProto attrSession = lookupAsyncSessionInfo(request);
172 179 if (attrSession != null) {
173 180 transportService.process(attrSession,
... ... @@ -177,6 +184,7 @@ public class CoapTransportResource extends CoapResource {
177 184 }
178 185 break;
179 186 case SUBSCRIBE_RPC_COMMANDS_REQUEST:
  187 + rpcSubscriptions.add(sessionId);
180 188 advanced.setObserver(new CoapExchangeObserverProxy((ExchangeObserver) observerField.get(advanced),
181 189 registerAsyncCoapSession(exchange, request, sessionInfo, sessionId)));
182 190 transportService.process(sessionInfo,
... ... @@ -184,13 +192,13 @@ public class CoapTransportResource extends CoapResource {
184 192 new CoapNoOpCallback(exchange));
185 193 break;
186 194 case UNSUBSCRIBE_RPC_COMMANDS_REQUEST:
  195 + rpcSubscriptions.remove(sessionId);
187 196 TransportProtos.SessionInfoProto rpcSession = lookupAsyncSessionInfo(request);
188 197 if (rpcSession != null) {
189 198 transportService.process(rpcSession,
190 199 TransportProtos.SubscribeToRPCMsg.newBuilder().setUnsubscribe(true).build(),
191 200 new CoapOkCallback(exchange));
192   - transportService.process(sessionInfo, getSessionEventMsg(TransportProtos.SessionEvent.CLOSED), null);
193   - transportService.deregisterSession(rpcSession);
  201 + closeAndDeregister(sessionInfo);
194 202 }
195 203 break;
196 204 case TO_DEVICE_RPC_RESPONSE:
... ... @@ -221,6 +229,14 @@ public class CoapTransportResource extends CoapResource {
221 229 }));
222 230 }
223 231
  232 + private void reportActivity(UUID sessionId, TransportProtos.SessionInfoProto sessionInfo) {
  233 + transportContext.getTransportService().process(sessionInfo, TransportProtos.SubscriptionInfoProto.newBuilder()
  234 + .setAttributeSubscription(attributeSubscriptions.contains(sessionId))
  235 + .setRpcSubscription(rpcSubscriptions.contains(sessionId))
  236 + .setLastActivityTime(System.currentTimeMillis())
  237 + .build(), TransportServiceCallback.EMPTY);
  238 + }
  239 +
224 240 private TransportProtos.SessionInfoProto lookupAsyncSessionInfo(Request request) {
225 241 String token = request.getSource().getHostAddress() + ":" + request.getSourcePort() + ":" + request.getTokenString();
226 242 return tokenToSessionIdMap.remove(token);
... ... @@ -438,6 +454,9 @@ public class CoapTransportResource extends CoapResource {
438 454 private void closeAndDeregister(TransportProtos.SessionInfoProto session) {
439 455 transportService.process(session, getSessionEventMsg(TransportProtos.SessionEvent.CLOSED), null);
440 456 transportService.deregisterSession(session);
  457 + UUID sessionId = new UUID(session.getSessionIdMSB(), session.getSessionIdLSB());
  458 + rpcSubscriptions.remove(sessionId);
  459 + attributeSubscriptions.remove(sessionId);
441 460 }
442 461
443 462 }
... ...
... ... @@ -36,6 +36,7 @@ import org.thingsboard.server.common.transport.TransportContext;
36 36 import org.thingsboard.server.common.transport.TransportService;
37 37 import org.thingsboard.server.common.transport.TransportServiceCallback;
38 38 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
  39 +import org.thingsboard.server.gen.transport.TransportProtos;
39 40 import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
40 41 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
41 42 import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg;
... ... @@ -102,6 +103,7 @@ public class DeviceApiController {
102 103 TransportService transportService = transportContext.getTransportService();
103 104 transportService.process(sessionInfo, JsonConverter.convertToAttributesProto(new JsonParser().parse(json)),
104 105 new HttpOkCallback(responseWriter));
  106 + reportActivity(sessionInfo);
105 107 }));
106 108 return responseWriter;
107 109 }
... ... @@ -115,6 +117,7 @@ public class DeviceApiController {
115 117 TransportService transportService = transportContext.getTransportService();
116 118 transportService.process(sessionInfo, JsonConverter.convertToTelemetryProto(new JsonParser().parse(json)),
117 119 new HttpOkCallback(responseWriter));
  120 + reportActivity(sessionInfo);
118 121 }));
119 122 return responseWriter;
120 123 }
... ... @@ -274,7 +277,6 @@ public class DeviceApiController {
274 277 }
275 278 }
276 279
277   -
278 280 private static class HttpSessionListener implements SessionMsgListener {
279 281
280 282 private final DeferredResult<ResponseEntity> responseWriter;
... ... @@ -308,4 +310,13 @@ public class DeviceApiController {
308 310 responseWriter.setResult(new ResponseEntity<>(JsonConverter.toJson(msg).toString(), HttpStatus.OK));
309 311 }
310 312 }
  313 +
  314 + private void reportActivity(SessionInfoProto sessionInfo) {
  315 + transportContext.getTransportService().process(sessionInfo, TransportProtos.SubscriptionInfoProto.newBuilder()
  316 + .setAttributeSubscription(false)
  317 + .setRpcSubscription(false)
  318 + .setLastActivityTime(System.currentTimeMillis())
  319 + .build(), TransportServiceCallback.EMPTY);
  320 + }
  321 +
311 322 }
... ...
... ... @@ -20,7 +20,20 @@ package org.thingsboard.server.common.transport;
20 20 */
21 21 public interface TransportServiceCallback<T> {
22 22
  23 + TransportServiceCallback<Void> EMPTY = new TransportServiceCallback<Void>() {
  24 + @Override
  25 + public void onSuccess(Void msg) {
  26 +
  27 + }
  28 +
  29 + @Override
  30 + public void onError(Throwable e) {
  31 +
  32 + }
  33 + };
  34 +
23 35 void onSuccess(T msg);
  36 +
24 37 void onError(Throwable e);
25 38
26 39 }
... ...