public async Task <CoapMessage> ObserveAsync(CoapMessage message)
        {
            if (!message.Observe.HasValue)
            {
                //RST because GET needs to be observe/unobserve
                await logger?.LogWarningAsync($"CoAP observe received without Observe flag and will return RST for {session.Identity}");

                await logger?.LogDebugAsync($"Returning RST because GET needs to be observe/unobserve for {session.Identity}");

                return(new CoapResponse(message.MessageId, ResponseMessageType.Reset, ResponseCodeType.EmptyMessage));
            }

            CoapUri             uri = new CoapUri(message.ResourceUri.ToString());
            ResponseMessageType rmt = message.MessageType == CoapMessageType.Confirmable ? ResponseMessageType.Acknowledgement : ResponseMessageType.NonConfirmable;

            ValidatorResult result = EventValidator.Validate(false, uri.Resource, channel, graphManager);

            if (!result.Validated)
            {
                await logger?.LogErrorAsync($"{result.ErrorMessage} for {session.Identity}");

                return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Unauthorized, message.Token));
            }

            if (!message.Observe.Value)
            {
                //unsubscribe
                await logger?.LogInformationAsync($"CoAP unobserve '{message.ResourceUri.ToString()}' for {session.Identity}.");

                await adapter.UnsubscribeAsync(uri.Resource);

                await logger?.LogDebugAsync($"CoAP unsubscribed '{message.ResourceUri.ToString()} for {session.Identity}'.");

                coapObserved.Remove(uri.Resource);
            }
            else
            {
                //subscribe
                SubscriptionMetadata metadata = new SubscriptionMetadata()
                {
                    IsEphemeral = true,
                    Identity    = session.Identity,
                    Indexes     = session.Indexes
                };

                await logger?.LogInformationAsync($"CoAP subscribed '{message.ResourceUri.ToString()}' for {session.Identity}");

                string subscriptionUriString = await adapter.SubscribeAsync(uri.Resource, metadata);


                if (!coapObserved.ContainsKey(uri.Resource)) //add resource to observed list
                {
                    coapObserved.Add(uri.Resource, message.Token);
                    await logger?.LogDebugAsync("Key added to observable resource.");
                }
            }

            return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Valid, message.Token));
        }
Пример #2
0
        public async Task <CoapMessage> ObserveAsync(CoapMessage message)
        {
            if (!message.Observe.HasValue)
            {
                //RST because GET needs to be observe/unobserve
                Trace.TraceWarning("{0} - CoAP observe received without Observe flag set on channel '{1}', returning RST", DateTime.UtcNow.ToString("yyyy-MM-ddTHH-MM-ss.fffff"), channel.Id);
                return(new CoapResponse(message.MessageId, ResponseMessageType.Reset, ResponseCodeType.EmptyMessage));
            }

            CoapUri             uri = new CoapUri(message.ResourceUri.ToString());
            ResponseMessageType rmt = message.MessageType == CoapMessageType.Confirmable ? ResponseMessageType.Acknowledgement : ResponseMessageType.NonConfirmable;

            if (!await adapter.CanSubscribeAsync(uri.Resource, channel.IsEncrypted))
            {
                //not authorized
                Trace.TraceWarning("{0} - CoAP observe not authorized on channel '{1}'", DateTime.UtcNow.ToString("yyyy-MM-ddTHH-MM-ss.fffff"), channel.Id);
                return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Unauthorized, message.Token));
            }

            if (!message.Observe.Value)
            {
                //unsubscribe
                Trace.TraceWarning("{0} - CoAP observe with value on channel '{1}', unsubscribing.", DateTime.UtcNow.ToString("yyyy-MM-ddTHH-MM-ss.fffff"), channel.Id);
                await adapter.UnsubscribeAsync(uri.Resource);

                coapObserved.Remove(uri.Resource);
            }
            else
            {
                //subscribe
                SubscriptionMetadata metadata = new SubscriptionMetadata()
                {
                    IsEphemeral = true,
                    Identity    = session.Identity,
                    Indexes     = session.Indexes
                };

                string subscriptionUriString = await adapter.SubscribeAsync(uri.Resource, metadata);


                if (!coapObserved.ContainsKey(uri.Resource)) //add resource to observed list
                {
                    coapObserved.Add(uri.Resource, message.Token);
                }
            }

            return(new CoapResponse(message.MessageId, rmt, ResponseCodeType.Valid, message.Token));
        }
Пример #3
0
        private void Channel_OnOpen(object sender, ChannelOpenEventArgs e)
        {
            if (!Channel.IsAuthenticated)
            {
                OnError?.Invoke(this,
                                new ProtocolAdapterErrorEventArgs(Channel.Id,
                                                                  new SecurityException("Not authenticated on WSN channel")));
                Channel.CloseAsync().Ignore();
                return;
            }

            adapter            = new OrleansAdapter(identity, "WebSocket", "WSN", graphManager);
            adapter.OnObserve += Adapter_OnObserve;

            if (subscriptions != null)
            {
                foreach (var sub in subscriptions)
                {
                    SubscriptionMetadata metadata = new SubscriptionMetadata
                    {
                        Identity    = identity,
                        Indexes     = localIndexes,
                        IsEphemeral = true
                    };

                    adapter.SubscribeAsync(resource, metadata).GetAwaiter();
                }
            }
        }
Пример #4
0
        private Task <string> Subscribe(string resourceUriString, SubscriptionMetadata metadata)
        {
            TaskCompletionSource <string> tcs = new TaskCompletionSource <string>();
            Task t = Task.Factory.StartNew(async() =>
            {
                try
                {
                    string id = await adapter.SubscribeAsync(resourceUriString, metadata);
                    tcs.SetResult(id);
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, $"MQTT adapter Subscribe error on channel '{Channel.Id}'.");
                    tcs.SetException(ex);
                }
            });

            return(tcs.Task);
        }
Пример #5
0
        private async Task SubscribeAsync(string resourceUriString, string identity, List <KeyValuePair <string, string> > indexes)
        {
            if (await adapter.CanSubscribeAsync(resourceUriString, Channel.IsEncrypted))
            {
                SubscriptionMetadata metadata = new SubscriptionMetadata()
                {
                    Identity    = identity,
                    Indexes     = indexes,
                    IsEphemeral = true
                };

                string subscriptionUriString = await adapter.SubscribeAsync(resourceUriString, metadata);

                //await Log.LogInfoAsync("Identity {0} subscribed to resource {1} with subscription URI {2}", identity, resourceUriString, subscriptionUriString);
            }
            else
            {
                //await Log.LogErrorAsync("REST protocol cannot subscribe identity {0} to resource {1}", identity, resourceUriString);
            }
        }
Пример #6
0
        private void Channel_OnOpen(object sender, ChannelOpenEventArgs e)
        {
            if (!Channel.IsAuthenticated)
            {
                OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(Channel.Id, new SecurityException("Not authenticated on WSN channel")));
                Channel.CloseAsync().Ignore(); //shutdown channel immediately
                return;
            }

            //string uriString = HttpUtility.HtmlDecode(UriHelper.GetEncodedUrl(context.Request));

            //MessageUri uri = new MessageUri(uriString);
            //IdentityDecoder decoder = new IdentityDecoder(config.ClientIdentityNameClaimType, context, config.GetClientIndexes());
            //identity = decoder.Id;
            ////resource = uri.Resource;
            ////indexes = uri.Indexes == null ? null : new List<KeyValuePair<string, string>>(uri.Indexes);
            //var localIndexes = decoder.Indexes;

            adapter            = new OrleansAdapter(identity, "WebSocket", "WSN", graphManager);
            adapter.OnObserve += Adapter_OnObserve;

            if (subscriptions != null)
            {
                foreach (var sub in subscriptions)
                {
                    //subscribe
                    SubscriptionMetadata metadata = new SubscriptionMetadata()
                    {
                        Identity    = identity,
                        Indexes     = localIndexes,
                        IsEphemeral = true
                    };

                    adapter.SubscribeAsync(resource, metadata).GetAwaiter();
                    //SubscribeAsync(sub, metadata).GetAwaiter();
                }
            }
        }
Пример #7
0
        private void Channel_OnReceive(object sender, ChannelReceivedEventArgs e)
        {
            Exception error = null;

            if (method == "POST" && string.IsNullOrEmpty(resource))
            {
                error = new Exception("REST adapter cannot send message without resource.");
            }

            if (method == "POST" && string.IsNullOrEmpty(contentType))
            {
                error = new Exception("REST adapter cannot send message without content-type.");
            }

            if (method == "POST" && (e.Message == null || e.Message.Length == 0))
            {
                error = new Exception("REST adapter cannot send empty message.");
            }

            if (method == "GET" && (subscriptions == null || subscriptions.Count() == 0))
            {
                error = new Exception("REST adapter cannot subscribe to '0' subscriptions.");
            }

            if (error != null)
            {
                logger?.LogWarningAsync(error.Message).GetAwaiter();
                OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(channel.Id, error));
                return;
            }

            try
            {
                if (method == "POST")
                {
                    EventMessage message = new EventMessage(contentType, resource, protocolType, e.Message);
                    if (!string.IsNullOrEmpty(messageUri.CacheKey))
                    {
                        message.CacheKey = messageUri.CacheKey;
                    }

                    adapter.PublishAsync(message, indexes).GetAwaiter();
                    logger?.LogDebugAsync("REST adapter published message");
                    MessageAuditRecord record = new MessageAuditRecord(message.MessageId, identity, channel.TypeId, protocolType.ToString(), e.Message.Length, MessageDirectionType.In, true, DateTime.UtcNow);
                    messageAuditor?.WriteAuditRecordAsync(record).Ignore();
                    OnClose?.Invoke(this, new ProtocolAdapterCloseEventArgs(Channel.Id));
                }

                if (method == "GET")
                {
                    foreach (var subscription in subscriptions)
                    {
                        SubscriptionMetadata metadata = new SubscriptionMetadata()
                        {
                            Identity    = identity,
                            Indexes     = indexes,
                            IsEphemeral = true
                        };

                        adapter.SubscribeAsync(subscription, metadata).GetAwaiter();
                    }
                }
            }
            catch (Exception ex)
            {
                logger?.LogErrorAsync($"REST adapter processing error on receive - {ex.Message}");
                OnError?.Invoke(this, new ProtocolAdapterErrorEventArgs(channel.Id, ex));
            }
        }