public async Task <bool> TryHandleReceivedMessage(CoapMessage message) { if (message is null) { throw new ArgumentNullException(nameof(message)); } try { var observeOption = message.Options.FirstOrDefault(o => o.Number == CoapMessageOptionNumber.Observe); if (observeOption == null) { return(false); } if (!_observedResponseHandlers.TryGetValue(new CoapMessageToken(message.Token), out var responseHandler)) { await DeregisterObservation(message).ConfigureAwait(false); return(true); } if (message.Type == CoapMessageType.Confirmable) { var ackMessage = new CoapMessage { Type = CoapMessageType.Acknowledgement, Code = CoapMessageCodes.Empty, Id = message.Id }; await _client.SendAsync(ackMessage, CancellationToken.None).ConfigureAwait(false); } var payload = message.Payload; // TODO: Check if supported etc. //if (CoapClientBlockTransferReceiver.IsBlockTransfer(coapMessage)) //{ // payload = await new CoapClientBlockTransferReceiver(requestMessage, coapMessage, this, _logger).ReceiveFullPayload(CancellationToken.None).ConfigureAwait(false); //} var sequenceNumber = ((CoapMessageOptionUintValue)observeOption.Value).Value; var response = _messageToResponseConverter.Convert(message, payload); await responseHandler.HandleResponseAsync(new HandleResponseContext { SequenceNumber = sequenceNumber, Response = response }).ConfigureAwait(false); return(true); } catch (Exception exception) { _logger.Error(nameof(CoapClient), exception, "Error while handling observed message."); return(false); } }
public async Task <CoapResponse> RequestAsync(CoapRequest request, CancellationToken cancellationToken) { if (request is null) { throw new ArgumentNullException(nameof(request)); } var requestMessage = _requestToMessageConverter.Convert(request); var responseMessage = await RequestAsync(requestMessage, cancellationToken).ConfigureAwait(false); var payload = responseMessage.Payload; if (CoapClientBlockTransferReceiver.IsBlockTransfer(responseMessage)) { payload = await new CoapClientBlockTransferReceiver(requestMessage, responseMessage, this, _logger).ReceiveFullPayload(cancellationToken).ConfigureAwait(false); } return(_messageToResponseConverter.Convert(responseMessage, payload)); }
public async Task <CoapResponse> Request(CoapRequest request, CancellationToken cancellationToken) { if (request is null) { throw new ArgumentNullException(nameof(request)); } var requestMessage = _requestToMessageConverter.Convert(request); requestMessage.Id = _messageIdProvider.Next(); var requestMessageBuffer = _messageEncoder.Encode(requestMessage); await _transportLayer.SendAsync(requestMessageBuffer, cancellationToken).ConfigureAwait(false); // TODO: Add proper reqest-response matching like in MQTTnet. await _transportLayer.ReceiveAsync(_receiveBuffer, cancellationToken).ConfigureAwait(false); var responseMessage = _messageDecoder.Decode(_receiveBuffer); return(_messageToResponseConverter.Convert(responseMessage)); }