|
|
@ -492,36 +492,37 @@ public class CoapTransportResource extends AbstractCoapTransportResource { |
|
|
@Override |
|
|
@Override |
|
|
public void onToDeviceRpcRequest(UUID sessionId, TransportProtos.ToDeviceRpcRequestMsg msg) { |
|
|
public void onToDeviceRpcRequest(UUID sessionId, TransportProtos.ToDeviceRpcRequestMsg msg) { |
|
|
log.trace("[{}] Received RPC command to device", sessionId); |
|
|
log.trace("[{}] Received RPC command to device", sessionId); |
|
|
|
|
|
boolean sent = false; |
|
|
try { |
|
|
try { |
|
|
Response response = coapTransportAdaptor.convertToPublish(isConRequest(), msg, rpcRequestDynamicMessageBuilder); |
|
|
Response response = coapTransportAdaptor.convertToPublish(isConRequest(), msg, rpcRequestDynamicMessageBuilder); |
|
|
int requestId = getNextMsgId(); |
|
|
int requestId = getNextMsgId(); |
|
|
response.setMID(requestId); |
|
|
response.setMID(requestId); |
|
|
|
|
|
|
|
|
if (msg.getPersisted()) { |
|
|
if (msg.getPersisted() && isConRequest()) { |
|
|
if (isConRequest()) { |
|
|
transportContext.getRpcAwaitingAck().put(requestId, msg); |
|
|
transportContext.getRpcAwaitingAck().put(requestId, msg); |
|
|
transportContext.getScheduler().schedule(() -> { |
|
|
transportContext.getScheduler().schedule(() -> { |
|
|
TransportProtos.ToDeviceRpcRequestMsg awaitingAckMsg = transportContext.getRpcAwaitingAck().remove(requestId); |
|
|
TransportProtos.ToDeviceRpcRequestMsg awaitingAckMsg = transportContext.getRpcAwaitingAck().remove(requestId); |
|
|
if (awaitingAckMsg != null) { |
|
|
if (awaitingAckMsg != null) { |
|
|
transportService.process(sessionInfo, msg, true, TransportServiceCallback.EMPTY); |
|
|
transportService.process(sessionInfo, msg, true, TransportServiceCallback.EMPTY); |
|
|
} |
|
|
} |
|
|
}, Math.max(0, msg.getExpirationTime() - System.currentTimeMillis()), TimeUnit.MILLISECONDS); |
|
|
}, Math.max(0, msg.getExpirationTime() - System.currentTimeMillis()), TimeUnit.MILLISECONDS); |
|
|
response.addMessageObserver(new TbCoapMessageObserver(requestId, id -> { |
|
|
response.addMessageObserver(new TbCoapMessageObserver(requestId, id -> { |
|
|
TransportProtos.ToDeviceRpcRequestMsg rpcRequestMsg = transportContext.getRpcAwaitingAck().remove(id); |
|
|
TransportProtos.ToDeviceRpcRequestMsg rpcRequestMsg = transportContext.getRpcAwaitingAck().remove(id); |
|
|
if (rpcRequestMsg != null) { |
|
|
if (rpcRequestMsg != null) { |
|
|
transportService.process(sessionInfo, rpcRequestMsg, false, TransportServiceCallback.EMPTY); |
|
|
transportService.process(sessionInfo, rpcRequestMsg, false, TransportServiceCallback.EMPTY); |
|
|
} |
|
|
} |
|
|
})); |
|
|
})); |
|
|
|
|
|
} else { |
|
|
|
|
|
transportService.process(sessionInfo, msg, false, TransportServiceCallback.EMPTY); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
exchange.respond(response); |
|
|
exchange.respond(response); |
|
|
|
|
|
sent = true; |
|
|
} catch (AdaptorException e) { |
|
|
} catch (AdaptorException e) { |
|
|
log.trace("Failed to reply due to error", e); |
|
|
log.trace("Failed to reply due to error", e); |
|
|
closeObserveRelationAndNotify(sessionId, CoAP.ResponseCode.INTERNAL_SERVER_ERROR); |
|
|
closeObserveRelationAndNotify(sessionId, CoAP.ResponseCode.INTERNAL_SERVER_ERROR); |
|
|
closeAndDeregister(); |
|
|
closeAndDeregister(); |
|
|
|
|
|
} finally { |
|
|
|
|
|
if (msg.getPersisted() && !isConRequest()) { |
|
|
|
|
|
transportService.process(sessionInfo, msg, sent, TransportServiceCallback.EMPTY); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|