Beispiel #1
0
        CreateObservableMQTTClient(
            IClientOptions options,
            IWillMessage willMessage = null,
            params ITopicFilter[] topicFilters)
        {
            ClientOptions = options;
            WillMessage   = willMessage;

            _wrappedClient = new MQTTClient(this, topicFilters);

            var observable = Observable.Create <IMQTTMessage>(
                obs =>
            {
                var disposableConnect = _wrappedClient.ObservableConnect
                                        .Subscribe(_ =>
                {
                },
                                                   obs.OnError,
                                                   obs.OnCompleted);

                var disposableMessage = _wrappedClient.ObservableMessage
                                        .Subscribe(
                    obs.OnNext,
                    obs.OnError,
                    obs.OnCompleted);

                var disposableDisconnect = _wrappedClient.ObservableDisconnect
                                           .Where(disconnect => disconnect == true)
                                           .Select(x => Observable.FromAsync(() => _wrappedClient.DisconnectAsync()).Timeout(TimeSpan.FromSeconds(5)))
                                           .Concat()
                                           .Subscribe(d =>
                {
                    Debug.WriteLine("Disconnected");
                    obs.OnCompleted();
                },
                                                      obs.OnError,
                                                      obs.OnCompleted);

                return(new CompositeDisposable(
                           disposableMessage,
                           disposableConnect,
                           disposableDisconnect));
            })
                             .FinallyAsync(async() => { await _wrappedClient?.DisconnectAsync(); })
                             .Publish().RefCount();

            return(observable, _wrappedClient);
        }