예제 #1
0
        /// <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);
        }
예제 #2
0
        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();
            }
        }