public async Task StartAsyncSubscribesToTopics()
        {
            // Arrange
            var mockManagedMqttClient         = new Mock <IManagedMqttClient>();
            var mockManagedMqttClientOptions  = new Mock <IManagedMqttClientOptions>();
            var mqttConfiguration             = new MqttConfiguration(mockManagedMqttClientOptions.Object, new[] { new TopicFilter("test/topic", MqttQualityOfServiceLevel.AtLeastOnce) });
            var mockMqttClientFactory         = new Mock <IMqttClientFactory>();
            var mockTriggeredFunctionExecutor = new Mock <ITriggeredFunctionExecutor>();

            mockManagedMqttClient
            .Setup(m => m.SubscribeAsync(It.Is <TopicFilter[]>(y => y == mqttConfiguration.Topics)))
            .Returns(Task.CompletedTask);

            mockManagedMqttClient
            .Setup(m => m.StartAsync(It.Is <IManagedMqttClientOptions>(y => y == mqttConfiguration.Options)))
            .Returns(Task.CompletedTask);

            mockMqttClientFactory
            .Setup(m => m.CreateManagedMqttClient())
            .Returns(mockManagedMqttClient.Object);

            var mqttListener = new MqttListener(mockMqttClientFactory.Object, mqttConfiguration, mockTriggeredFunctionExecutor.Object, _mockLogger.Object);

            // Act
            await mqttListener.StartAsync(_cancellationToken).ConfigureAwait(false);

            // Assert
            mockMqttClientFactory.Verify(x => x.CreateManagedMqttClient(), Times.Once());
            mockManagedMqttClient.VerifyAll();
        }
        public async Task StartAsyncSubscribesToTopics()
        {
            // Arrange
            var mockManagedMqttClient        = new Mock <IManagedMqttClient>();
            var mockManagedMqttClientOptions = new Mock <IManagedMqttClientOptions>();
            var mockMqttClientFactory        = new Mock <IManagedMqttClientFactory>();
            var messageProcessor             = new Mock <IProcesMqttMessage>();

            mockMqttClientFactory
            .Setup(m => m.CreateManagedMqttClient())
            .Returns(mockManagedMqttClient.Object);

            mockManagedMqttClient
            .Setup(m => m.StartAsync(It.Is <IManagedMqttClientOptions>(y => y == mockManagedMqttClientOptions.Object)))
            .Returns(Task.CompletedTask);

            messageProcessor.Setup(x => x.OnMessage(It.IsAny <MqttMessageReceivedEventArgs>())).Returns(Task.CompletedTask);

            var config = new MqttConfiguration("CustomConfig", mockManagedMqttClientOptions.Object);

            var mqttConnection = new MqttConnection(mockMqttClientFactory.Object, config, _mockLogger.Object);

            // Act
            await mqttConnection.StartAsync(messageProcessor.Object);

            await mqttConnection.HandleConnectedAsync(new MqttClientConnectedEventArgs(new MqttClientAuthenticateResult {
                IsSessionPresent = true,
                ResultCode = MqttClientConnectResultCode.Success
            }));

            // Assert
            Assert.Equal(ConnectionState.Connected, mqttConnection.ConnectionState);
            mockMqttClientFactory.VerifyAll();
            mockManagedMqttClient.VerifyAll();
        }
        public async Task NewMessageIsProcessed()
        {
            // Arrange
            var mockManagedMqttClient        = new Mock <IManagedMqttClient>();
            var mockManagedMqttClientOptions = new Mock <IManagedMqttClientOptions>();
            var mockMqttClientFactory        = new Mock <IManagedMqttClientFactory>();
            var messageProcessor             = new Mock <IProcesMqttMessage>();

            mockMqttClientFactory
            .Setup(m => m.CreateManagedMqttClient())
            .Returns(mockManagedMqttClient.Object);

            messageProcessor.Setup(x => x.OnMessage(It.IsAny <MqttMessageReceivedEventArgs>())).Returns(Task.CompletedTask);

            var config         = new MqttConfiguration("CustomConfig", mockManagedMqttClientOptions.Object);
            var mqttConnection = new MqttConnection(mockMqttClientFactory.Object, config, _mockLogger.Object);

            // Act
            await mqttConnection.StartAsync(messageProcessor.Object);

            await mqttConnection.HandleApplicationMessageReceivedAsync(new MqttApplicationMessageReceivedEventArgs("ClientId", DefaultMessage));

            // Assert
            messageProcessor.Verify(x => x.OnMessage(It.Is <MqttMessageReceivedEventArgs>(y => y.Message.Topic == DefaultMessage.Topic)));
            messageProcessor.Verify(x => x.OnMessage(It.Is <MqttMessageReceivedEventArgs>(y => y.Message.Retain == DefaultMessage.Retain)));
            messageProcessor.Verify(x => x.OnMessage(It.Is <MqttMessageReceivedEventArgs>(y => y.Message.QosLevel.ToString() == DefaultMessage.QualityOfServiceLevel.ToString())));
            messageProcessor.Verify(x => x.OnMessage(It.Is <MqttMessageReceivedEventArgs>(y => y.Message.GetMessage() == DefaultMessage.Payload)));
        }
Exemple #4
0
        public void when_packet_channel_error_then_notifies()
        {
            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = 1
            };
            Subject <byte[]> receiver = new Subject <byte[]>();
            Mock <IMqttChannel <byte[]> > innerChannel = new Mock <IMqttChannel <byte[]> >();

            innerChannel.Setup(x => x.ReceiverStream).Returns(receiver);

            Mock <IPacketManager> manager = new Mock <IPacketManager>();

            PacketChannel channel = new PacketChannel(innerChannel.Object, manager.Object, configuration);

            string errorMessage = "Packet Exception";

            receiver.OnError(new MqttException(errorMessage));

            Exception errorReceived = default;

            channel.ReceiverStream.Subscribe(_ => { }, ex =>
            {
                errorReceived = ex;
            });

            Assert.NotNull(errorReceived);
            Assert.True(errorReceived is MqttException);
            errorMessage.Should().Be((errorReceived as MqttException).Message);
        }
Exemple #5
0
        public void when_reading_bytes_then_notifies_packet(string packetPath, Type packetType)
        {
            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = 1
            };
            Subject <byte[]> receiver = new Subject <byte[]>();
            Mock <IMqttChannel <byte[]> > innerChannel = new Mock <IMqttChannel <byte[]> >();

            innerChannel.Setup(x => x.ReceiverStream).Returns(receiver);

            object expectedPacket         = Activator.CreateInstance(packetType);
            Mock <IPacketManager> manager = new Mock <IPacketManager>();

            manager.Setup(x => x.GetPacketAsync(It.IsAny <byte[]>()))
            .Returns(Task.FromResult <IPacket>((IPacket)expectedPacket));

            PacketChannel channel = new PacketChannel(innerChannel.Object, manager.Object, configuration);

            IPacket receivedPacket = default;

            channel.ReceiverStream.Subscribe(packet =>
            {
                receivedPacket = packet;
            });

            packetPath = Path.Combine(Environment.CurrentDirectory, packetPath);

            byte[] readPacket = Packet.ReadAllBytes(packetPath);

            receiver.OnNext(readPacket);

            Assert.NotNull(receivedPacket);
            packetType.Should().Be(receivedPacket.GetType());
        }
Exemple #6
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            var configuration = new MqttConfiguration()
            {
                Port = port,
                AllowWildcardsInTopicFilters = true,
                KeepAliveSecs         = 30,
                ConnectionTimeoutSecs = 30,
                WaitTimeoutSecs       = 30
            };

            client = await MqttClient.CreateAsync(broker, configuration);

            clientId = Guid.NewGuid().ToString().Replace("-", "");

            client.Disconnected += Client_Disconnected;

            do
            {
                try
                {
                    if (!client.IsConnected)
                    {
                        await Connect();
                    }

                    await Task.Delay(5000, stoppingToken);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.GetType().ToString());
                    _logger.LogError(ex.Message);
                }
            }while (!stoppingToken.IsCancellationRequested);
        }
Exemple #7
0
        public async Task when_writing_packet_then_inner_channel_is_notified(string packetPath, Type packetType)
        {
            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = 1
            };

            packetPath = Path.Combine(Environment.CurrentDirectory, packetPath);

            byte[] bytes = Packet.ReadAllBytes(packetPath);

            Subject <byte[]> receiver = new Subject <byte[]>();
            Mock <IMqttChannel <byte[]> > innerChannel = new Mock <IMqttChannel <byte[]> >();

            innerChannel.Setup(x => x.ReceiverStream).Returns(receiver);
            innerChannel.Setup(x => x.SendAsync(It.IsAny <byte[]>()))
            .Returns(Task.Delay(0));

            IPacket packet = Activator.CreateInstance(packetType) as IPacket;

            Mock <IPacketManager> manager = new Mock <IPacketManager>();

            manager.Setup(x => x.GetBytesAsync(It.IsAny <IPacket>()))
            .Returns(Task.FromResult(bytes));

            PacketChannel channel = new PacketChannel(innerChannel.Object, manager.Object, configuration);

            await channel.SendAsync(packet);

            innerChannel.Verify(x => x.SendAsync(It.Is <byte[]>(b => b.ToList().SequenceEqual(bytes))));
            manager.Verify(x => x.GetBytesAsync(It.Is <IPacket>(p => Convert.ChangeType(p, packetType) == packet)));
        }
        public async static void SetupClient()
        {
            localClient = new MqttClientLocal();
            var configuration = new MqttConfiguration()
            {
                Port            = 12393,
                KeepAliveSecs   = 60,
                WaitTimeoutSecs = 5,
                BufferSize      = 128 * 1024,
                AllowWildcardsInTopicFilters = true,
                MaximumQualityOfService      = MqttQualityOfService.AtLeastOnce
            };
            string topicSubscribe  = "song/#";
            string topicSubscribe2 = "status";

            remoteClient = await MqttClient.CreateAsync("broker.busk.cf", configuration);

            await remoteClient.ConnectAsync(new MqttClientCredentials(clientId : "Frontend", "front", "frontpass"));

            await remoteClient.SubscribeAsync(topicSubscribe, MqttQualityOfService.AtLeastOnce);  //subscribe on cloud mqtt

            await remoteClient.SubscribeAsync(topicSubscribe2, MqttQualityOfService.AtLeastOnce); //subscribe on cloud mqtt

            localClient.Subscribe(remoteClient.MessageStream);                                    // subscribe to the iobservable (the response message stream)
        }
Exemple #9
0
        public static async Task setup_template()
        {
            MqttClientLocal localClient   = new MqttClientLocal();
            var             configuration = new MqttConfiguration()
            {
                Port            = 12393,
                KeepAliveSecs   = 0,
                WaitTimeoutSecs = 5,
                BufferSize      = 128 * 1024,
                AllowWildcardsInTopicFilters = true,
                MaximumQualityOfService      = MqttQualityOfService.AtLeastOnce
            };
            string topicSubscribe = "my/topic";
            string topicPost      = "my/other/topic";
            var    remoteClient   = await MqttClient.CreateAsync("localhost", configuration);

            await remoteClient.ConnectAsync(new MqttClientCredentials(clientId : "Frontend", "front", "frontpass"));

            await remoteClient.SubscribeAsync(topicSubscribe, MqttQualityOfService.AtLeastOnce);

            localClient.Subscribe(remoteClient.MessageStream);
            string payloadToSend = "MY MESSAGE TO BE SENT";
            var    mymessage     = new MqttApplicationMessage(topicPost, Encoding.UTF8.GetBytes(payloadToSend));

            remoteClient.PublishAsync(mymessage, MqttQualityOfService.AtLeastOnce).Wait();
        }
Exemple #10
0
        public async Task when_writing_packet_from_source_then_inner_channel_is_notified(string packetPath, string jsonPath, Type packetType)
        {
            var configuration = new MqttConfiguration {
                WaitTimeoutSecs = 1
            };

            packetPath = Path.Combine(Environment.CurrentDirectory, packetPath);

            var bytes = Packet.ReadAllBytes(packetPath);

            var receiver     = new Subject <byte[]> ();
            var innerChannel = new Mock <IMqttChannel <byte[]> >();

            innerChannel.Setup(x => x.ReceiverStream).Returns(receiver);
            innerChannel.Setup(x => x.SendAsync(It.IsAny <byte[]> ()))
            .Returns(Task.Delay(0));

            jsonPath = Path.Combine(Environment.CurrentDirectory, jsonPath);

            var packet = Packet.ReadPacket(jsonPath, packetType) as IPacket;

            var manager = new Mock <IPacketManager> ();

            manager.Setup(x => x.GetBytesAsync(It.IsAny <IPacket>()))
            .Returns(Task.FromResult(bytes));

            var channel = new PacketChannel(innerChannel.Object, manager.Object, configuration);

            await channel.SendAsync(packet)
            .ConfigureAwait(continueOnCapturedContext: false);

            innerChannel.Verify(x => x.SendAsync(It.Is <byte[]> (b => b.ToList().SequenceEqual(bytes))));
            manager.Verify(x => x.GetBytesAsync(It.Is <IPacket> (p => Convert.ChangeType(p, packetType) == packet)));
        }
Exemple #11
0
        public async void Start()
        {
            var configuration = new MqttConfiguration
            {
                BufferSize                   = 128 * 1024,
                Port                         = 55555,
                KeepAliveSecs                = 10,
                WaitTimeoutSecs              = 2,
                MaximumQualityOfService      = MqttQualityOfService.AtMostOnce,
                AllowWildcardsInTopicFilters = true
            };
            var client = await MqttClient.CreateAsync("127.0.0.1", configuration);

            var sessionState = await client.ConnectAsync(new MqttClientCredentials(clientId : int.MaxValue.ToString()), cleanSession : true);

            await client.SubscribeAsync("foo/bar/topic1", MqttQualityOfService.AtMostOnce);  //QoS0

            await client.SubscribeAsync("foo/bar/topic2", MqttQualityOfService.AtLeastOnce); //QoS1

            await client.SubscribeAsync("foo/bar/topic3", MqttQualityOfService.ExactlyOnce); //QoS2


            //client.MessageStream.Subscribe(msg => Console.WriteLine($"Message received in topic {msg.Topic}"));

            var message3 = new MqttApplicationMessage("foo/bar/topic4", Encoding.UTF8.GetBytes("Foo Message 4"));

            await client.PublishAsync(message3, MqttQualityOfService.AtMostOnce); //QoS0

            client.MessageStream.Where(msg => msg.Topic == "foo/bar/topic2").Subscribe(msg => Console.WriteLine($"Message received in topic {msg.Topic}"));
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="MqttTriggerAttribute"/> class.
 /// </summary>
 /// <param name="parameter">The parameter to bind to.</param>
 /// <param name="mqttClientFactory">The MQTT client factory.</param>
 /// <param name="config">The MQTT configuration.</param>
 /// <param name="logger">The logger.</param>
 public MqttTriggerBinding(ParameterInfo parameter, IMqttClientFactory mqttClientFactory, MqttConfiguration config, ILogger logger)
 {
     _parameter         = parameter;
     _mqttClientFactory = mqttClientFactory;
     _config            = config;
     _logger            = logger;
 }
Exemple #13
0
        public async Task <IMqttConnectedClient> CreateClientAsync(MqttConfiguration configuration)
        {
            try
            {
                //Adding this to not break backwards compatibility related to the method signature
                //Yielding at this point will cause the method to return immediately after it's called,
                //running the rest of the logic acynchronously
                await Task.Yield();

                PrivateBinding             binding             = new PrivateBinding(_privateStreamListener, EndpointIdentifier.Client);
                MqttTopicEvaluator         topicEvaluator      = new MqttTopicEvaluator(configuration);
                IMqttChannelFactory        innerChannelFactory = binding.GetChannelFactory(IPAddress.Loopback.ToString(), configuration);
                PacketChannelFactory       channelFactory      = new PacketChannelFactory(innerChannelFactory, topicEvaluator, configuration);
                PacketIdProvider           packetIdProvider    = new PacketIdProvider();
                InMemoryRepositoryProvider repositoryProvider  = new InMemoryRepositoryProvider();
                ClientProtocolFlowProvider flowProvider        = new ClientProtocolFlowProvider(topicEvaluator, repositoryProvider, configuration);

                return(new MqttConnectedClient(channelFactory, flowProvider, repositoryProvider, packetIdProvider, configuration));
            }
            catch (Exception ex)
            {
                _tracer.Error(ex, ClientProperties.Client_InitializeError);

                throw new MqttClientException(ClientProperties.Client_InitializeError, ex);
            }
        }
        public void Connect()
        {
            try
            {
                var config = new MqttConfiguration {
                    Port = 1883
                };
                var client   = MqttClient.CreateAsync(host, config).Result;
                var clientId = "XamarinClient";
                client.ConnectAsync(new MqttClientCredentials(clientId)).Wait();
                client.SubscribeAsync(topic, MqttQualityOfService.AtLeastOnce).Wait();
                client.MessageStream.Subscribe(message =>
                {
                    var data = Encoding.UTF8.GetString(message.Payload);
                    Debug.WriteLine($"Message Received; {data}");
                    var msg = new MqttMessage
                    {
                        Topic   = message.Topic,
                        Payload = data
                    };
                    //MessagingCenter.Send<XamFormsSample.ViewModels.MainPageViewModel>(this, "Hi");

                    // TODO get nuget fixed....
                    Messenger.Default.Send <MqttMessage>(msg);
                });
            }
            catch (Exception e)
            {
                Debug.WriteLine("_________________ Begin e _________________");
                Debug.WriteLine(e);
                Debug.WriteLine("_________________ End e _________________");
            }
        }
        public void when_creating_stream_then_becomes_ready()
        {
            MqttConfiguration configuration = new MqttConfiguration();
            PrivateStream     stream        = new PrivateStream(configuration);

            Assert.True(!stream.IsDisposed);
        }
        public async void publishMQTT(MqttCon mqtt)
        {
            if (string.IsNullOrEmpty(mqtt.topic) ||
                string.IsNullOrEmpty(mqtt.msg))
            {
                Console.WriteLine("Debe contener Topic y Message");
            }
            else
            {
                Console.WriteLine(mqtt.topic);
                Console.WriteLine(mqtt.msg);
                var configuration = new MqttConfiguration {
                    BufferSize                   = 128 * 1024,
                    Port                         = 1883,
                    KeepAliveSecs                = 10,
                    WaitTimeoutSecs              = 2,
                    MaximumQualityOfService      = MqttQualityOfService.AtMostOnce,
                    AllowWildcardsInTopicFilters = true
                };
                var client = await MqttClient.CreateAsync("iot02.qaingenieros.com", configuration);

                var sessionState = await client.ConnectAsync(new MqttClientCredentials(clientId : "foo"));

                var message1 = new MqttApplicationMessage(mqtt.topic, Encoding.UTF8.GetBytes(mqtt.msg));

                await client.PublishAsync(message1, MqttQualityOfService.AtMostOnce); //QoS0

                await client.DisconnectAsync();
            }
        }
Exemple #17
0
        static void Main(string[] args)
        {
            Console.WriteLine("Started Program to start broker...");

            var mqttOptions = new MqttConfiguration {
                BufferSize                   = 128 * 1024,
                Port                         = 1883,
                KeepAliveSecs                = 10,
                WaitTimeoutSecs              = 2,
                MaximumQualityOfService      = MqttQualityOfService.AtMostOnce,
                AllowWildcardsInTopicFilters = true,
                AllowLocationSubscription    = true
            };

            var broker = MqttServer.Create(mqttOptions);

            try {
                broker.Start();
                Console.WriteLine("Press CTRL + C exit.");
                while (true)
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
            catch (Exception ex) {
                Console.WriteLine(ex);
            }
        }
        public async Task when_sending_packet_then_stream_receives_successfully()
        {
            var configuration = new MqttConfiguration();
            var stream        = new PrivateStream(configuration);
            var channel       = new PrivateChannel(stream, EndpointIdentifier.Client, configuration);

            var packetsReceived = 0;

            stream
            .Receive(EndpointIdentifier.Client)
            .Subscribe(packet => {
                packetsReceived++;
            });

            await channel.SendAsync(new byte[255]);

            await channel.SendAsync(new byte[10]);

            await channel.SendAsync(new byte[34]);

            await channel.SendAsync(new byte[100]);

            await channel.SendAsync(new byte[50]);

            await Task.Delay(TimeSpan.FromMilliseconds(1000));

            Assert.Equal(5, packetsReceived);
        }
Exemple #19
0
        public IObservable <uint> Create()
        {
            return(Observable.Create <uint>(
                       async observer =>
            {
                var config = new MqttConfiguration
                {
                    Port = _configuration.Value.Port,
                    MaximumQualityOfService = MqttQualityOfService.ExactlyOnce,
                    AllowWildcardsInTopicFilters = true
                };

                var client = await MqttClient.CreateAsync(_configuration.Value.Broker, config);

                _ = await client.ConnectAsync();

                await client.SubscribeAsync(_configuration.Value.Topic, MqttQualityOfService.AtLeastOnce);

                var subscription = client
                                   .MessageStream
                                   .Where(message => message.Payload.Length == 4)
                                   .Select(message => BitConverter.ToUInt32(message.Payload))
                                   .Subscribe(observer);

                return new CompositeDisposable(
                    subscription,
                    client
                    );
            }
                       ));
        }
Exemple #20
0
        static void Main(string[] args)
        {
            Debug.WriteLine("Configuring Server...");

            var stopSignal = new ManualResetEventSlim();
            var config     = new MqttConfiguration
            {
                Port = port,
                MaximumQualityOfService      = MqttQualityOfService.AtLeastOnce,
                AllowWildcardsInTopicFilters = true,
                WaitTimeoutSecs = 10,
                KeepAliveSecs   = 15
            };
            var server = MqttServer.Create(config);

            Debug.WriteLine("Starting Server...");

            server.Stopped += (sender, e) =>
            {
                Debug.WriteLine("Server stopped. Finishing app...");
                stopSignal.Set();
            };
            server.ClientConnected    += (sender, e) => Debug.WriteLine($"New player connected: {e}");
            server.ClientDisconnected += (sender, e) => Debug.WriteLine($"Player disconnected: {e}");

            server.Start();

            Debug.WriteLine("Server started...");
            Debug.WriteLine("Listening for new players...");

            stopSignal.Wait();
        }
Exemple #21
0
        /// <summary>
        /// Запуск задачи соединения с облаком
        /// </summary>
        /// <param name="connection_string"></param>
        /// <param name="client_id"></param>
        private async Task <bool> Start(MQTTClient client)
        {
            return(await Task.Run(() =>
            {
                try
                {
                    var configuration = new MqttConfiguration
                    {
                        //BufferSize = 128 * 1024,
                        Port = client.Port
                               //KeepAliveSecs = 10,
                               //WaitTimeoutSecs = 12,
                               //MaximumQualityOfService = MqttQualityOfService.AtMostOnce
                               //AllowWildcardsInTopicFilters = true
                    };

                    //System.Net.Sockets.Socket.
                    CloudConnectionResult.Message = "В ожидании соединения";
                    _client = MqttClient.CreateAsync(client.Server, configuration).Result;
                    _client.Disconnected += _client_Disconnected;
                    var sessionState = _client.ConnectAsync(new MqttClientCredentials(clientId: client.ClientId, userName: client.UserName, password: client.Password), cleanSession: false).Result;
                    CloudConnectionResult.Message = "Соединение установлено";
                    return true;
                }
                catch (System.Exception ex)
                {
                    CloudConnectionResult.Message = ex.Message;
                    Log.Debug(MQTT_TAG, ex.Message);
                    Toast.MakeText(_context, ex.Message, ToastLength.Long);
                    return false;
                }
            }));
        }
        public void when_packet_is_received_then_it_is_dispatched_to_proper_flow()
        {
            Mock <IConnectionProvider>   connectionProvider = new Mock <IConnectionProvider>();
            Mock <IProtocolFlowProvider> flowProvider       = new Mock <IProtocolFlowProvider>();
            IRepositoryProvider          repositoryProvider = Mock.Of <IRepositoryProvider>();

            Mock <IProtocolFlow> flow = new Mock <IProtocolFlow>();

            flowProvider.Setup(p => p.GetFlow(It.IsAny <MqttPacketType>())).Returns(flow.Object);

            MqttConfiguration configuration = new MqttConfiguration {
                WaitTimeoutSecs = 10
            };
            Subject <IPacket> receiver = new Subject <IPacket>();
            Mock <IMqttChannel <IPacket> > packetChannel = new Mock <IMqttChannel <IPacket> >();

            packetChannel.Setup(c => c.ReceiverStream).Returns(receiver);
            packetChannel.Setup(c => c.SenderStream).Returns(new Subject <IPacket>());

            ServerPacketListener listener = new ServerPacketListener(packetChannel.Object, connectionProvider.Object, flowProvider.Object, configuration);

            listener.Listen();

            string  clientId = Guid.NewGuid().ToString();
            Connect connect  = new Connect(clientId, cleanSession: true, MqttProtocol.SupportedLevel);
            Publish publish  = new Publish(Guid.NewGuid().ToString(), MqttQualityOfService.AtMostOnce, false, false);

            receiver.OnNext(connect);
            receiver.OnNext(publish);

            bool connectReceived        = false;
            bool publishReceived        = false;
            ManualResetEventSlim signal = new ManualResetEventSlim();

            listener.PacketStream.Subscribe(p =>
            {
                if (p is Connect)
                {
                    connectReceived = true;
                }
                else if (p is Publish)
                {
                    publishReceived = true;
                }

                if (connectReceived && publishReceived)
                {
                    signal.Set();
                }
            });

            bool signalSet = signal.Wait(1000);

            Assert.True(signalSet);

            flowProvider.Verify(p => p.GetFlow(It.Is <MqttPacketType>(t => t == MqttPacketType.Publish)));
            flow.Verify(f => f.ExecuteAsync(It.Is <string>(s => s == clientId), It.Is <IPacket>(p => p is Connect), It.Is <IMqttChannel <IPacket> >(c => c == packetChannel.Object)));
            flow.Verify(f => f.ExecuteAsync(It.Is <string>(s => s == clientId), It.Is <IPacket>(p => p is Publish), It.Is <IMqttChannel <IPacket> >(c => c == packetChannel.Object)));
        }
        public async Task when_subscribing_new_topics_then_subscriptions_are_created_and_ack_is_sent()
        {
            var configuration = new MqttConfiguration {
                MaximumQualityOfService = MqttQualityOfService.AtLeastOnce
            };
            var topicEvaluator            = new Mock <IMqttTopicEvaluator> ();
            var sessionRepository         = new Mock <IRepository <ClientSession> > ();
            var packetIdProvider          = Mock.Of <IPacketIdProvider> ();
            var retainedMessageRepository = Mock.Of <IRepository <RetainedMessage> > ();
            var senderFlow = Mock.Of <IPublishSenderFlow> ();

            var clientId = Guid.NewGuid().ToString();
            var session  = new ClientSession(clientId, clean: false);

            topicEvaluator.Setup(e => e.IsValidTopicFilter(It.IsAny <string> ())).Returns(true);
            sessionRepository.Setup(r => r.Read(It.IsAny <string> ())).Returns(session);

            var fooQoS          = MqttQualityOfService.AtLeastOnce;
            var fooTopic        = "test/foo/1";
            var fooSubscription = new Subscription(fooTopic, fooQoS);
            var barQoS          = MqttQualityOfService.AtMostOnce;
            var barTopic        = "test/bar/1";
            var barSubscription = new Subscription(barTopic, barQoS);

            var packetId  = (ushort)new Random().Next(0, ushort.MaxValue);
            var subscribe = new Subscribe(packetId, fooSubscription, barSubscription);

            var channel = new Mock <IMqttChannel <IPacket> > ();

            var response = default(IPacket);

            channel.Setup(c => c.SendAsync(It.IsAny <IPacket> ()))
            .Callback <IPacket> (p => response = p)
            .Returns(Task.Delay(0));

            var connectionProvider = new Mock <IConnectionProvider> ();

            connectionProvider
            .Setup(p => p.GetConnection(It.Is <string> (c => c == clientId)))
            .Returns(channel.Object);

            var flow = new ServerSubscribeFlow(topicEvaluator.Object, sessionRepository.Object,
                                               retainedMessageRepository, packetIdProvider, senderFlow, configuration);

            await flow.ExecuteAsync(clientId, subscribe, channel.Object)
            .ConfigureAwait(continueOnCapturedContext: false);

            sessionRepository.Verify(r => r.Update(It.Is <ClientSession> (s => s.Id == clientId && s.Subscriptions.Count == 2 &&
                                                                          s.Subscriptions.All(x => x.TopicFilter == fooTopic || x.TopicFilter == barTopic))));
            Assert.NotNull(response);

            var subscribeAck = response as SubscribeAck;

            Assert.NotNull(subscribeAck);
            Assert.Equal(packetId, subscribeAck.PacketId);
            Assert.Equal(2, subscribeAck.ReturnCodes.Count());
            Assert.Contains(subscribeAck.ReturnCodes, c => c == SubscribeReturnCode.MaximumQoS0);
            Assert.Contains(subscribeAck.ReturnCodes, c => c == SubscribeReturnCode.MaximumQoS1);
        }
 /// <summary>
 /// Inititalizes a new instance of the <see cref="MqttListener"/> class.
 /// </summary>
 /// <param name="mqttClientFactory">The factory for <see cref="IManagedMqttClient"/>s.</param>
 /// <param name="config">The MQTT configuration.</param>
 /// <param name="executor">Allows the function to be executed.</param>
 /// <param name="logger">The logger.</param>
 public MqttListener(IMqttClientFactory mqttClientFactory, MqttConfiguration config, ITriggeredFunctionExecutor executor, ILogger logger)
 {
     _config                  = config;
     _mqttClientFactory       = mqttClientFactory;
     _executor                = executor;
     _logger                  = logger;
     _cancellationTokenSource = new CancellationTokenSource();
 }
Exemple #25
0
 internal MqttConnectedClient(IMqttChannel <IPacket> packetChannel,
                              IProtocolFlowProvider flowProvider,
                              IRepositoryProvider repositoryProvider,
                              IPacketIdProvider packetIdProvider,
                              MqttConfiguration configuration)
     : base(packetChannel, flowProvider, repositoryProvider, packetIdProvider, configuration)
 {
 }
Exemple #26
0
 public MessageMonitor(IOptions <MqttConfiguration> mqttOptions, ILogger <MessageMonitor> logger, DeviceRepository deviceRepository, IMqttClient messageClient, MasterService masterService)
 {
     _mqttOptions      = mqttOptions.Value;
     _logger           = logger;
     _deviceRepository = deviceRepository;
     _messageClient    = messageClient;
     _masterService    = masterService;
 }
Exemple #27
0
        private async Task <IMqttClient> CreateClient()
        {
            Logger.LogInfo($"Connecting to MQTT broker '{_conf.Host}'");

            var mqttConf = new MqttConfiguration();

            return(await MqttClient.CreateAsync(_conf.Host, mqttConf));
        }
Exemple #28
0
 public PrivateChannel(PrivateStream stream, EndpointIdentifier identifier, MqttConfiguration configuration)
 {
     this.stream        = stream;
     this.identifier    = identifier;
     receiver           = new ReplaySubject <byte[]> (window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));
     sender             = new ReplaySubject <byte[]> (window: TimeSpan.FromSeconds(configuration.WaitTimeoutSecs));
     streamSubscription = SubscribeStream();
 }
 protected ProtocolFlowProvider(IMqttTopicEvaluator topicEvaluator,
                                IRepositoryProvider repositoryProvider,
                                MqttConfiguration configuration)
 {
     this.topicEvaluator     = topicEvaluator;
     this.repositoryProvider = repositoryProvider;
     this.configuration      = configuration;
 }
Exemple #30
0
        public Publisher(string broker, int port)
        {
            var configuration = new MqttConfiguration {
                Port = port
            };

            this.client = MqttClient.CreateAsync(broker, configuration).Result;
        }