Esempio n. 1
0
        /// <summary>
        /// Crate a <see cref="IRxMqttClient"/> from the factory.
        /// </summary>
        /// <param name="factory">The factory to use.</param>
        /// <returns>The <see cref="IRxMqttClient"/>.</returns>
        public static IRxMqttClient CreateRxMqttClient(this IMqttFactory factory)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }

            return(new RxMqttClient(factory.CreateManagedMqttClient(), factory.DefaultLogger));
        }
Esempio n. 2
0
        /// <summary>
        /// Crate a <see cref="IRxMqttClient"/> from the factory.
        /// </summary>
        /// <param name="factory">The factory to use.</param>
        /// <param name="logger">The mqtt net logger to use.</param>
        /// <returns>The <see cref="IRxMqttClient"/>.</returns>
        public static IRxMqttClient CreateRxMqttClient(this IMqttFactory factory, IMqttNetLogger logger)
        {
            if (factory == null)
            {
                throw new ArgumentNullException(nameof(factory));
            }
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            return(new RxMqttClient(factory.CreateManagedMqttClient(logger), logger));
        }
Esempio n. 3
0
        public static IServiceCollection AddAndConfigureMqtt(this IServiceCollection services, string applicationName,
                                                             Action <HassMqttManagerConfiguration> hassMqttManagerConfiguration = null,
                                                             Action <ManagedMqttClientOptionsBuilder> mqttOptionsBuilder        = null)
        {
            // MQTT setup
            // This client will be configured to use MqttEvents to distribute connect/disconnect events
            services
            .AddMqttClientFactoryWithLogging()
            .AddSingleton <IManagedMqttClientOptions>(provider =>
            {
                CommonMqttConfiguration mqttConfig = provider.GetRequiredService <IOptions <CommonMqttConfiguration> >().Value;

                // Prepare options
                ManagedMqttClientOptionsBuilder optionsBuilder = new ManagedMqttClientOptionsBuilder()
                                                                 .WithClientOptions(builder =>
                {
                    builder
                    .WithTcpServer(mqttConfig.Server, mqttConfig.Port)
                    .WithCleanSession(false)
                    .WithClientId(mqttConfig.ClientId);

                    // Configure HASS LWT for alive services
                    builder.ConfigureHassConnectedEntityServiceLastWill(provider);

                    if (!string.IsNullOrEmpty(mqttConfig.Username))
                    {
                        builder.WithCredentials(mqttConfig.Username, mqttConfig.Password);
                    }

                    if (mqttConfig.KeepAlivePeriod.HasValue)
                    {
                        builder.WithKeepAlivePeriod(mqttConfig.KeepAlivePeriod.Value);
                    }
                });

                optionsBuilder.WithAutoReconnect()
                .WithAutoReconnectDelay(mqttConfig.ReconnectInterval)
                .WithMaxPendingMessages(10000)
                .WithPendingMessagesOverflowStrategy(MqttPendingMessagesOverflowStrategy.DropNewMessage);

                // Additional config
                mqttOptionsBuilder?.Invoke(optionsBuilder);

                return(optionsBuilder.Build());
            })
            .AddSingleton(provider =>
            {
                // TODO: Support TLS & client certs
                IHostApplicationLifetime appLifetime = provider.GetRequiredService <IHostApplicationLifetime>();
                CancellationToken stoppingtoken      = appLifetime.ApplicationStopping;

                IMqttFactory factory          = provider.GetRequiredService <IMqttFactory>();
                IManagedMqttClient mqttClient = factory.CreateManagedMqttClient();

                // Hook up event handlers
                mqttClient.ConfigureMqttEvents(provider, stoppingtoken);

                return(mqttClient);
            });

            // Add MQTT events manager to help us distribute connected/disconnected events
            services.AddMqttEvents();

            // Add MQTT events manager to help us distribute subscribed messages
            services.AddMqttMessageReceiverService();

            // Add HASS service that indicates if we're alive or not (uses LWT feature of MQTT)
            services.AddHassConnectedEntityService(applicationName);

            // Add HASS MQTT Manager
            services.AddHassMqttManager(hassMqttManagerConfiguration);

            // Add connecter
            services.AddMqttLifetimeService();

            return(services);
        }
Esempio n. 4
0
 public IManagedMqttClient CreateManagedMqttClient()
 {
     return(_mqttFactory.CreateManagedMqttClient());
 }