/// <summary> /// Reads in binary data that forms a CoAP message and creates a new <see cref="CoapMessage"/> /// </summary> /// <param name="payload"></param> /// <param name="isMulticast">Indicates if this message was received from a multicast endpoint.</param> /// <returns></returns> public static CoapMessage Parse(byte[] payload, bool isMulticast = false) { var message = new CoapMessage(isMulticast); message.Deserialise(payload); return(message); }
private async Task ReceiveAsyncInternal() { try { while (true) { if (Endpoint == null) { return; } var payload = await Endpoint.ReceiveAsync(); var message = new CoapMessage(Endpoint.IsMulticast); try { message.Deserialise(payload.Payload); } catch (CoapMessageFormatException) { if (message.Type == CoapMessageType.Confirmable && !Endpoint.IsMulticast) { await SendAsync(new CoapMessage { Id = message.Id, Type = CoapMessageType.Reset }, payload.Endpoint); } throw; } if (_messageResponses.ContainsKey(message.Id)) { _messageResponses[message.Id].TrySetResult(message); } lock (_receiveQueue) { _receiveQueue.Enqueue(Task.FromResult(new CoapReceiveResult(payload.Endpoint, message))); } _receiveEvent.Set(); } } catch (Exception ex) { if (ex is CoapEndpointException) { Endpoint?.Dispose(); Endpoint = null; foreach (var response in _messageResponses.Values) { response.TrySetCanceled(); } } lock (_receiveQueue) { // Gona cheat and enque that exception so it gets thrown as if this detached-infinite-loop never existed... _receiveQueue.Enqueue(Task.FromException <CoapReceiveResult>(ex)); } _receiveEvent.Set(); } }