/// <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); }
/// <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()); }); }