Пример #1
0
        /// <summary>
        /// Asynchronously send out message
        /// <seealso cref=""/>
        /// <see cref=""/>
        /// </summary>
        /// <param name="message">message to send</param>
        /// <permission cref="">This method can be called by: Every User</permission>
        /// <exception cref="StatusReadDeniedException"></exception>
        public async Task <int> SendAsync(CoapMessage message, ICoapEndpoint endpoint = null)
        {
            if (message.Id == 0)
            {
                message.Id = messageId++;
            }

            if (message.Type == CoapMessageType.Confirmable)
            {
                messageReponses.TryAdd(message.Id, new TaskCompletionSource <CoapMessage>());
            }

            await transport.SendAsync(new CoapPayload { Payload = message.Serialise(), MessageId = message.Id, m_Endpoint = endpoint });

            return(message.Id);
        }
Пример #2
0
        /// <summary>
        /// Create Listening point
        /// </summary>
        /// <exception cref=""></exception>
        /// <remarks>N/a</remarks>
        /// <seealso cref=""/>
        /// <see cref=""/>
        /// <permission cref="">This method can be called by: every user</permission>
        public void Listen()
        {
            if (IsListening)
            {
                return;
            }

            receiveCancellationToken = new CancellationTokenSource();

            Task.Factory.StartNew(() =>
            {
                var token = receiveCancellationToken.Token;

                while (!token.IsCancellationRequested)
                {
                    try
                    {
                        var payload = transport.ReceiveAsync();
                        payload.Wait(token);
                        if (!payload.IsCompleted || payload.Result == null)
                        {
                            continue;
                        }

                        var message = new CoapMessage(transport.IsMulticast);
                        try
                        {
                            message.Deserialise(payload.Result.Payload);
                        }
                        catch (CoapMessageFormatException)
                        {
                            if (message.Type == CoapMessageType.Confirmable &&
                                !transport.IsMulticast)
                            {
                                Task.Run(() => SendAsync(new CoapMessage
                                {
                                    Id   = message.Id,
                                    Type = CoapMessageType.Reset
                                }, payload.Result.m_Endpoint));
                            }
                            continue;
                        }

                        if (messageReponses.ContainsKey(message.Id))
                        {
                            messageReponses[message.Id].TrySetResult(message);
                        }

                        OnMessageReceived?.Invoke(this, new CoapMessageReceivedEventArgs
                        {
                            m_Message  = message,
                            m_Endpoint = payload.Result.m_Endpoint
                        });
                    }
                    catch (CoapEndpointException)
                    {
                        receiveCancellationToken.Cancel();
                    }
                }
                OnClosed?.Invoke(this, new EventArgs());
            });
        }