Commit 830d02ef6a360ba93cca3c1629f5313303b4bac1
1 parent
2e148f6b
Fix for HTTP and CoAP device activity
Showing
3 changed files
with
46 additions
and
3 deletions
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java
... | ... | @@ -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 | } | ... | ... |