示例#1
0
 public HslMqttService(IManagedMqttClient client, ManagedMqttClientOptions options)
 {
     _options = options;
     _client  = client;
     _client.UseApplicationMessageReceivedHandler(MessageReceived);
     _batchTimer = new Timer(BatchTimerTick);
 }
示例#2
0
        private static async Task Start()
        {
            var managedClient = new MqttFactory().CreateManagedMqttClient();

            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId    = "MQTTnetManagedClientTest",
                    Credentials = new MqttClientCredentials
                    {
                        Username = string.Empty,
                        Password = new byte[] { }
                    },

                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "localhost"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
                //Storage = ms
            };

            managedClient.UseApplicationMessageReceivedHandler(HandleReceivedApplicationMessage);
            await managedClient.StartAsync(options);

            await managedClient.SubscribeAsync("home/garden/fountain", MqttQualityOfServiceLevel.AtLeastOnce);
        }
示例#3
0
        public async Task Connect(ManagedMqttClientOptions clientOptions)
        {
            var client = _factory.CreateManagedMqttClient();

            _client = client;

            client.ApplicationMessageReceivedHandler = this;
            client.ConnectedHandler = this;
            await client.StartAsync(clientOptions);
        }
示例#4
0
        public static async Task RunAsync()
        {
            var services = new ServiceCollection()
                           .AddMqttClient()
                           .AddLogging()
                           .BuildServiceProvider();

            services.GetService <ILoggerFactory>()
            .AddConsole();

            var ms = new ClientRetainedMessageHandler();

            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = "MQTTnetManagedClientTest",
                    Credentials    = new RandomPassword(),
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "broker.hivemq.com"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
                Storage            = ms
            };

            try
            {
                var managedClient = services.GetRequiredService <ManagedMqttClient>();
                managedClient.ApplicationMessageReceived += (s, e) =>
                {
                    Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic);
                };

                await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("1").Build());

                await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS().Build());

                await managedClient.StartAsync(options);

                await managedClient.SubscribeAsync(new TopicFilter("xyz", MqttQualityOfServiceLevel.AtMostOnce));

                await managedClient.PublishAsync(new MqttApplicationMessageBuilder().WithTopic("Step").WithPayload("3").Build());

                Console.WriteLine("Managed client started.");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        public static async Task RunAsync()
        {
            var ms = new ClientRetainedMessageHandler();

            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = "MQTTnetManagedClientTest",
                    Credentials    = new RandomPassword(),
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "broker.hivemq.com"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
                Storage            = ms
            };

            try
            {
                var managedClient = new MqttFactory().CreateManagedMqttClient();
                managedClient.ApplicationMessageReceivedAsync += e =>
                {
                    Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic);
                    return(PlatformAbstractionLayer.CompletedTask);
                };

                await managedClient.StartAsync(options);

                await managedClient.EnqueueAsync(topic : "Step", payload : "1");

                await managedClient.EnqueueAsync(topic : "Step", payload : "2", MqttQualityOfServiceLevel.AtLeastOnce);

                await managedClient.SubscribeAsync(topic : "xyz", qualityOfServiceLevel : MqttQualityOfServiceLevel.AtMostOnce);

                await managedClient.SubscribeAsync(topic : "abc", qualityOfServiceLevel : MqttQualityOfServiceLevel.AtMostOnce);

                await managedClient.EnqueueAsync(topic : "Step", payload : "3");

                Console.WriteLine("Managed client started.");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
示例#6
0
        public static async Task RunAsync()
        {
            var ms = new ClientRetainedMessageHandler();

            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = "MQTTnetManagedClientTest",
                    Credentials    = new RandomPassword(),
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "broker.hivemq.com"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
                Storage            = ms
            };

            try
            {
                var managedClient = new MqttFactory().CreateManagedMqttClient();
                managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
                {
                    Console.WriteLine(">> RECEIVED: " + e.ApplicationMessage.Topic);
                });

                await managedClient.StartAsync(options);

                await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("1"));

                await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("2").WithAtLeastOnceQoS());

                await managedClient.SubscribeAsync(new MqttTopicFilter { Topic = "xyz", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });

                await managedClient.SubscribeAsync(new MqttTopicFilter { Topic = "abc", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });

                await managedClient.PublishAsync(builder => builder.WithTopic("Step").WithPayload("3"));

                Console.WriteLine("Managed client started.");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
示例#7
0
        /// <summary>
        /// Connects to the MQTT broker
        /// </summary>
        public async Task Connect(string url)
        {
            var clientOptions = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = "SDO.SnipsAi.Client",
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = url
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
            };

            await Connect(clientOptions);
        }
示例#8
0
        public MqttTests(ITestOutputHelper output) : base(output)
        {
            MqttClient  = new MqttFactory().CreateAsyncEnumMqttClient();
            MqttOptions = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = $"ManagedMqttClientOptionsTest{Guid.NewGuid()}",
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "localhost"
                                 //Server = "broker.hivemq.com"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
            };
        }
示例#9
0
        public void Create(ConnectionOptions options, Credentials credentials, string topic)
        {
            //configure options
            var mqttClientOptions = new MqttClientOptionsBuilder()
                                    .WithClientId(credentials.UserName)
                                    .WithTcpServer(options.IpAddress, options.Port)
                                    .WithCredentials(credentials.Login, credentials.Password)
                                    .WithCleanSession()
                                    .Build();


            var mqttManagedMqttClientOptions = _options = new ManagedMqttClientOptionsBuilder()
                                                          .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                                                          .WithClientOptions(mqttClientOptions)
                                                          .Build();


            // Create a new MQTT client.
            _client = new MqttFactory().CreateManagedMqttClient();


            //handlers
            _client.UseConnectedHandler(e =>
            {
                OnConnected?.Invoke(e);

                //subscribing to a topic
                if (!string.IsNullOrEmpty(topic))
                {
                    _topic = topic;
                    _client.SubscribeAsync(new TopicFilterBuilder().WithTopic(topic).Build()).Wait();
                }
            });
            _client.UseDisconnectedHandler(e =>
            {
                OnDisconnected?.Invoke(e);
            });
            _client.UseApplicationMessageReceivedHandler(e =>
            {
                OnMessageReceived?.Invoke(e);
            });
        }
示例#10
0
 //MQTTClient connector (Throw in constructed client, brokerIP) [WebSocket]
 public static async Task ManagedMqttConnectWebSocket(IManagedMqttClient managedMqttClient, string brokerIP)
 {
     // Use WebSocket connection.
     string clientID = Guid.NewGuid().ToString();
     var    ms       = new ClientRetainedMessageHandler();
     var    options  = new ManagedMqttClientOptions
     {
         ClientOptions = new MqttClientOptions
         {
             ClientId       = "MQTTnetManagedClient " + clientID + " (WebSocket)",
             ChannelOptions = new MqttClientWebSocketOptions
             {
                 Uri = brokerIP
             }
         },
         AutoReconnectDelay = TimeSpan.FromSeconds(1),
         Storage            = ms
     };
     await managedMqttClient.StartAsync(options);
 }
示例#11
0
        public MqttWorker(EvoHomeSettings evoHomeSettings, ILogger <MqttWorker> logger)
        {
            _settings = evoHomeSettings;
            _logger   = logger;

            if (evoHomeSettings.DisableMqtt)
            {
                _logger.LogInformation("Mqtt Disabled");
                return;
            }

            var builder = new MqttClientOptionsBuilder()
                          .WithClientId(evoHomeSettings.MqttClientName);

            if (!string.IsNullOrWhiteSpace(evoHomeSettings.MqttUser))
            {
                builder.WithCredentials(evoHomeSettings.MqttUser, evoHomeSettings.MqttPassword);
            }

            if (evoHomeSettings.MqttWebSockets)
            {
                builder.WithWebSocketServer($"{evoHomeSettings.MqttConnection}:{evoHomeSettings.MqttPort}");
            }
            else
            {
                builder.WithTcpServer(evoHomeSettings.MqttConnection, evoHomeSettings.MqttPort);
            }

            var options = builder.Build();

            _managedOptions = new ManagedMqttClientOptionsBuilder()
                              .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                              .WithClientOptions(options)
                              .Build();

            var factory = new MqttFactory();

            _mqttClient = factory.CreateManagedMqttClient();
        }
示例#12
0
        public MqttIpcServer(MqttIpcServerConfiguration configuration, IIpcSerializer serializer, IIpcPacketRouter router, IIpcPacketHandlersContainer packetHandlersContainer)
        {
            _serializer = serializer;
            _router     = router;
            _packetHandlersContainer = packetHandlersContainer;

            _client  = new MqttFactory().CreateManagedMqttClient(new MqttNetLogger(configuration.ClientName));
            _queues  = new HashSet <string>();
            _options = new ManagedMqttClientOptionsBuilder()
                       .WithAutoReconnectDelay(TimeSpan.FromSeconds(5))
                       .WithClientOptions(new MqttClientOptionsBuilder()
                                          .WithClientId(configuration.ClientName)
                                          .WithTcpServer(configuration.EndPoint)
                                          .Build())
                       .Build();

            // event handlers
            _client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(Client_OnMessage);
            _client.ConnectedHandler    = new MqttClientConnectedHandlerDelegate(Client_OnConnected);
            _client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(Client_OnDisconnected);

            _packetHandlersContainer.Registered   += HandlersContainer_OnRegistered;
            _packetHandlersContainer.Unregistered += HandlersContainer_OnUnregistered;
        }
        public MqttPersistentConnection(ILogger <MqttPersistentConnection> logger,
                                        IOptionsMonitor <EventBusMqttOptions> options)
        {
            _logger = logger;

            var clientOptionsBuilder = new MqttClientOptionsBuilder()
                                       .WithClientId(options.CurrentValue.ClientId)
                                       .WithTcpServer(options.CurrentValue.TcpIp, options.CurrentValue.TcpPort)
                                       .WithCleanSession(options.CurrentValue.CleanSession);

            if (!string.IsNullOrEmpty(options.CurrentValue.Username) &&
                !string.IsNullOrEmpty(options.CurrentValue.Password))
            {
                clientOptionsBuilder =
                    clientOptionsBuilder.WithCredentials(options.CurrentValue.Username, options.CurrentValue.Password);
            }

            _clientOptions = new ManagedMqttClientOptionsBuilder()
                             .WithAutoReconnectDelay(TimeSpan.FromSeconds(10))
                             .WithClientOptions(clientOptionsBuilder.Build())
                             .Build();

            _mqttClient = new MqttFactory().CreateManagedMqttClient();
        }
        private static IManagedMqttClient SetupConnectionHandler(this IManagedMqttClient mqttClient, ManagedMqttClientOptions options)
        {
            // Handle disconnection
            mqttClient.UseDisconnectedHandler(async e =>
            {
                Console.WriteLine("### DISCONNECTED FROM SERVER ###");
                await Task.Delay(TimeSpan.FromSeconds(5));

                try
                {
                    await mqttClient.StartAsync(options);
                }
                catch
                {
                    Console.WriteLine("### RECONNECTING FAILED ###");
                }
            });
            return(mqttClient);
        }
示例#15
0
        public static async Task RunAsync(string type)
        {
            var ms = new ClientRetainedMessageHandler();

            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId       = Settings.MQTT.MQTTClientId,
                    Credentials    = new RandomPassword(),
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = Settings.MQTT.Server,
                        Port   = Settings.MQTT.Port
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1),
                Storage            = ms
            };

            try
            {
                managedClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
                {
                    Logging.DebugWrite("Debug", ">> RECEIVED: " + e.ApplicationMessage.Topic);
                });

                await managedClient.StartAsync(options);

                if (type == "config")
                {
                    //these are for inverter values -32
                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_inverter_mode/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_inverter_mode\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_inverter_mode\",\"icon\": \"mdi:solar_power\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_grid_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_ac_grid_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_grid_voltage\",\"icon\": \"mdi:power-plug\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_grid_frequency/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_ac_grid_frequency\",\"unit_of_measurement\": \"Hz\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_grid_frequency\",\"icon\": \"mdi:current-ac\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_out_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_ac_out_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_out_voltage\",\"icon\": \"mdi:power-plug\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_out_frequency/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_ac_out_frequency\",\"unit_of_measurement\": \"Hz\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_out_frequency\",\"icon\": \"mdi:current-ac\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_pv_in_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_voltage\",\"icon\": \"mdi:solar-panel-large\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_current/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_pv_in_current\",\"unit_of_measurement\": \"A\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_current\",\"icon\": \"mdi:solar-panel-large\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_watts/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_pv_in_watts\",\"unit_of_measurement\": \"W\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_watts\",\"icon\": \"mdi:solar-panel-large\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_watthour/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_pv_in_watthour\",\"unit_of_measurement\": \"Wh\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_pv_in_watthour\",\"icon\": \"mdi:solar-panel-large\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_scc_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_scc_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_scc_voltage\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_pct/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_load_pct\",\"unit_of_measurement\": \"%\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_pct\",\"icon\": \"mdi:brightness-percent\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_watt/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_load_watt\",\"unit_of_measurement\": \"W\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_watt\",\"icon\": \"mdi:chart-bell-curve\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_watthour/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_load_watthour\",\"unit_of_measurement\": \"Wh\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_watthour\",\"icon\": \"mdi:chart-bell-curve\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_va/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_load_va\",\"unit_of_measurement\": \"VA\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_va\",\"icon\": \"mdi:chart-bell-curve\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_bus_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_bus_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_bus_voltage\",\"icon\": \"mdi:details\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_heatsink_temperature/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_heatsink_temperature\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_heatsink_temperature\",\"icon\": \"mdi:details\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_capacity/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_capacity\",\"unit_of_measurement\": \"%\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_capacity\",\"icon\": \"mdi:battery-outline\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_voltage\",\"icon\": \"mdi:battery-outline\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_charge_current/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_charge_current\",\"unit_of_measurement\": \"A\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_charge_current\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_discharge_current/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_discharge_current\",\"unit_of_measurement\": \"A\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_discharge_current\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_status_on/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_load_status_on\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_load_status_on\",\"icon\": \"mdi:power\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_scc_charge_on/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_scc_charge_on\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_scc_charge_on\",\"icon\": \"mdi:power\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_charge_on/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_ac_charge_on\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_ac_charge_on\",\"icon\": \"mdi:power\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_recharge_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_recharge_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_recharge_voltage\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_under_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_under_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_under_voltage\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_bulk_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_bulk_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_bulk_voltage\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_float_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_float_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_float_voltage\",\"icon\": \"mdi:current-dc\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_max_grid_charge_current/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_max_grid_charge_current\",\"unit_of_measurement\": \"A\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_max_grid_charge_current\",\"icon\": \"mdi:current-ac\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_max_charge_current/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_max_charge_current\",\"unit_of_measurement\": \"A\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_max_charge_current\",\"icon\": \"mdi:current-ac\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_out_source_priority/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_out_source_priority\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_out_source_priority\",\"icon\": \"mdi:grid\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_charger_source_priority/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_charger_source_priority\",\"unit_of_measurement\": \"\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_charger_source_priority\",\"icon\": \"mdi:solar-power\"}").WithRetainFlag(true));

                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_redischarge_voltage/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_battery_redischarge_voltage\",\"unit_of_measurement\": \"V\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_battery_redischarge_voltage\",\"icon\": \"mdi:battery-negative\"}").WithRetainFlag(true));

                    //this is for raw command
                    await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/voltronic/config").WithPayload("{\"name\": \"voltronic\",\"state_topic\": \"homeassistant/sensor/voltronic\"}").WithRetainFlag(true));

                    //await managedClient.PublishAsync(builder => builder.WithTopic("homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_$1/config").WithPayload("{\"name\": \"" + Settings.MQTT.MQTTClientId + "_$1\",\"unit_of_measurement\": \"$2\",\"state_topic\": \"homeassistant/sensor/" + Settings.MQTT.MQTTClientId + "_$1\",\"icon\": \"mdi:s$3\"}"));
                    //await managedClient.PublishAsync(builder => builder.WithTopic("PV_in_voltage").WithPayload("300").WithAtLeastOnceQoS());

                    //subscribe to raw command
                    await managedClient.SubscribeAsync(new MqttTopicFilter { Topic = "homeassistant/sensor/voltronic", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });

                    //await managedClient.SubscribeAsync(new MqttTopicFilter { Topic = "abc", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce });

                    //await managedClient.PublishAsync(builder => builder.WithTopic("PV_in_current").WithPayload("3"));
                }


                Logging.DebugWrite("Debug", "Managed client started.");
                //Console.ReadLine();
            }
            catch (Exception e)
            {
                Logging.DebugWrite("Error", e.ToString());
            }
        }
示例#16
0
        public static async Task Main(string[] args)
        {
            string topic                     = "/emqx/topic/msg";
            string connectionType            = "tcp"; //tcp, tls, ws, wss
            ManagedMqttClientOptions options = null;

            if (args.Length >= 1)
            {
                connectionType = args[0];
                Console.WriteLine("connection: {0}", connectionType);
            }

            switch (connectionType)
            {
            case "tcp":
                options = TcpMqttClientOptions("broker.emqx.io");
                Console.WriteLine("tcp connection");
                break;

            case "tls":
                options = TlsMqttClientOptions("broker.emqx.io", @"broker.emqx.io-ca.crt");
                Console.WriteLine("tls connection");
                break;

            case "ws":
                options = WsMqttClientOptions("broker.emqx.io:8083/mqtt");
                Console.WriteLine("ws connection");
                break;

            case "wss":
                options = WssMqttClientOptions(
                    "broker.emqx.io:8084/mqtt",
                    @"broker.emqx.io-ca.crt"
                    );
                Console.WriteLine("wss connection");
                break;

            default:
                Console.WriteLine("Unsupported: {0}" + args[1]);
                return;
            }

            var mqttClient = new MqttFactory().CreateManagedMqttClient();

            await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder().WithTopic(topic).Build());

            mqttClient.UseApplicationMessageReceivedHandler(
                msg =>
                Console.Write(
                    "Received: '{0}' from '{1}'\n",
                    System.Text.Encoding.UTF8.GetString(msg.ApplicationMessage.Payload),
                    msg.ApplicationMessage.Topic
                    )
                );

            mqttClient.UseConnectedHandler(
                (arg) => Console.WriteLine("Establish connection " + arg.ConnectResult.ResultCode)
                );

            await mqttClient.StartAsync(options);

            Console.Write("Input message for topic '{0}'\n", topic);
            string payload;

            while ((payload = Console.ReadLine()) != "quit")
            {
                Console.Write("Send '{0}' to topic '{1}'\n", payload, topic);

                await mqttClient.PublishAsync(
                    new MqttApplicationMessageBuilder()
                    .WithTopic("/emqx/topic/msg")
                    .WithPayload(payload)
                    .WithExactlyOnceQoS()
                    .Build()
                    );

                Console.Write("Input message for topic '{0}', press 'quit' to exit.\n", topic);
            }

            await mqttClient.StopAsync();
        }
示例#17
0
 async Task Background(ManagedMqttClientOptions options)
 {
     await client.StartAsync(options);
 }
示例#18
0
        /*
         * private async Task InitAsync()
         * {
         *  try {
         *
         *      ConfigServiceMQTT config = getConfig<ConfigServiceMQTT>();
         *      var factory = new MqttFactory();
         *      mqttClient = factory.CreateMqttClient();
         *
         *
         *      clientOptions = new MqttClientOptionsBuilder()
         *                      .WithClientId(Guid.NewGuid().ToString())
         *                      .WithTcpServer(config.Host)
         *                      .Build();
         *
         *
         *
         *      mqttClient.ApplicationMessageReceived += (s, e) =>
         *      {
         *          Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
         *          Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
         *          Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
         *          Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
         *          Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
         *          Console.WriteLine();
         *      };
         *
         *      mqttClient.Connected += async (s, e) =>
         *      {
         *          Console.WriteLine("### CONNECTED WITH SERVER ###");
         *
         * //                    await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("#").Build());
         *
         * //                    Console.WriteLine("### SUBSCRIBED ###");
         *      };
         *
         *      mqttClient.Disconnected += async (s, e) =>
         *      {
         *          Console.WriteLine("### DISCONNECTED FROM SERVER ###");
         *          await Task.Delay(TimeSpan.FromSeconds(5));
         *
         *          try
         *          {
         *              await mqttClient.ConnectAsync(clientOptions);
         *          }
         *          catch
         *          {
         *              Console.WriteLine("### RECONNECTING FAILED ###");
         *          }
         *      };
         *
         *      try
         *      {
         *          await mqttClient.ConnectAsync(clientOptions);
         *      }
         *      catch (Exception exception)
         *      {
         *          Console.WriteLine("### CONNECTING FAILED ###" + Environment.NewLine + exception);
         *      }
         *
         *      Console.WriteLine("### WAITING FOR APPLICATION MESSAGES ###");
         *
         *  }
         *  catch (Exception exception)
         *  {
         *      Console.WriteLine(exception);
         *  }
         *
         * }
         *
         */
        /*
         * private async Task DoItAsync()
         * {
         *  try {
         *      bool isSubscribed = false;
         *      while (true)
         *      {
         *          Console.ReadLine();
         *
         *          if (isSubscribed)
         *          {
         *              var applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("Goodbye World")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await mqttClient.PublishAsync(applicationMessage);
         *
         *
         *              await Unsubscribe("test/mysensor2");
         *
         *              applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("I am dead")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await mqttClient.PublishAsync(applicationMessage);
         *
         *
         *              isSubscribed = false;
         *          }
         *          else
         *          {
         *              await Subscribe("test/mysensor2", this.MyCallback);
         *
         *              var applicationMessage = new MqttApplicationMessageBuilder()
         *                  .WithTopic("test/mysensor2")
         *                  .WithPayload("Hello World")
         *                  .WithAtLeastOnceQoS()
         *                  .Build();
         *
         *              await mqttClient.PublishAsync(applicationMessage);
         *
         *              applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("I am alive :-)")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await mqttClient.PublishAsync(applicationMessage);
         *
         *              isSubscribed = true;
         *          }
         *      }
         *  }
         *  catch (Exception exception)
         *  {
         *      Console.WriteLine(exception);
         *  }
         *
         * }
         */
        /*
         * public async Task RunAsync()
         * {
         *  throw new NotImplementedException();
         *  try
         *  {
         *      //MqttNetConsoleLogger.ForwardToConsole();
         *
         *      var factory = new MqttFactory();
         *      var client = factory.CreateMqttClient();
         *      var clientOptions = new MqttClientOptions
         *      {
         *          ChannelOptions = new MqttClientTcpOptions
         *          {
         *              Server = "192.168.1.50"
         *          }
         *      };
         *
         *      client.ApplicationMessageReceived += (s, e) =>
         *      {
         *          Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
         *          Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
         *          Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
         *          Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
         *          Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
         *          Console.WriteLine();
         *      };
         *
         *      client.Connected += async (s, e) =>
         *      {
         *          Console.WriteLine("### CONNECTED WITH SERVER ###");
         *
         *          await client.SubscribeAsync(new TopicFilterBuilder().WithTopic("test/mysensor1").Build());
         *
         *          Console.WriteLine("### SUBSCRIBED ###");
         *      };
         *
         *      client.Disconnected += async (s, e) =>
         *      {
         *          Console.WriteLine("### DISCONNECTED FROM SERVER ###");
         *          await Task.Delay(TimeSpan.FromSeconds(5));
         *
         *          try
         *          {
         *              await client.ConnectAsync(clientOptions);
         *          }
         *          catch
         *          {
         *              Console.WriteLine("### RECONNECTING FAILED ###");
         *          }
         *      };
         *
         *      try
         *      {
         *          await client.ConnectAsync(clientOptions);
         *      }
         *      catch (Exception exception)
         *      {
         *          Console.WriteLine("### CONNECTING FAILED ###" + Environment.NewLine + exception);
         *      }
         *
         *      Console.WriteLine("### WAITING FOR APPLICATION MESSAGES ###");
         *      bool isSubscribed = false;
         *      while (true)
         *      {
         *          Console.ReadLine();
         *
         *          if (isSubscribed)
         *          {
         *              var applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("Goodbye World")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await client.PublishAsync(applicationMessage);
         *
         *              List<string> topics = new List<string> { "test/mysensor2" };
         *              await client.UnsubscribeAsync (topics);
         *
         *              applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("I am dead")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await client.PublishAsync(applicationMessage);
         *
         *
         *              isSubscribed = false;
         *          }
         *          else
         *          {
         *              await client.SubscribeAsync(new TopicFilter("test/mysensor2", MqttQualityOfServiceLevel.AtMostOnce));
         *              var applicationMessage = new MqttApplicationMessageBuilder()
         *                  .WithTopic("test/mysensor2")
         *                  .WithPayload("Hello World")
         *                  .WithAtLeastOnceQoS()
         *                  .Build();
         *
         *              await client.PublishAsync(applicationMessage);
         *
         *              applicationMessage = new MqttApplicationMessageBuilder()
         *                                          .WithTopic("test/mysensor2")
         *                                          .WithPayload("I am alive :-)")
         *                                          .WithAtLeastOnceQoS()
         *                                          .Build();
         *
         *              await client.PublishAsync(applicationMessage);
         *
         *              isSubscribed = true;
         *          }
         *      }
         *  }
         *  catch (Exception exception)
         *  {
         *      Console.WriteLine(exception);
         *  }
         * }
         *
         */

        protected void onInitialize_NA()
        {
            ConfigServiceMQTT config = getConfig <ConfigServiceMQTT>();
            //IMqttClientFactory factory = new MqttFactory();
            //IMqttClient mqtt_client = factoryCreateMqttClient();
            var factory     = new MqttFactory();
            var mqtt_client = factory.CreateManagedMqttClient();

            /*var options = new MqttClientOptionsBuilder()
             *              .WithClientId(Guid.NewGuid().ToString())
             *              .WithTcpServer(config.Host)
             *              .Build();
             */


            var options = new ManagedMqttClientOptions
            {
                ClientOptions = new MqttClientOptions
                {
                    ClientId = Guid.NewGuid().ToString(),
                    //Credentials = new RandomPassword(),
                    ChannelOptions = new MqttClientTcpOptions
                    {
                        Server = "broker.hivemq.com"
                    }
                },

                AutoReconnectDelay = TimeSpan.FromSeconds(1)
            };


            mqtt_client.Connected += async(s, e) =>
            {
                await mqtt_client.SubscribeAsync(new TopicFilterBuilder().WithTopic("test/mysensor1").Build());
            };


            Thread.Sleep(15000);
            bool b = mqtt_client.IsConnected;

            mqtt_client.ApplicationMessageReceived += (sender, e) =>
            {
                Console.WriteLine(sender.ToString());
                Console.WriteLine(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
            };

            mqtt_client.StartAsync(options);

            Thread.Sleep(15000);
            // mysensor1

            mqtt_client.SubscribeAsync(new TopicFilterBuilder().WithTopic("test/mysensor2").Build());

            Thread.Sleep(15000);
            // mysensor1 + mysensor2


            List <string> topics1 = new List <string>(new string[] { "test/mysensor1" });

            mqtt_client.UnsubscribeAsync(topics1);
            Thread.Sleep(15000);

            // mysensor2

            List <string> topics2 = new List <string>(new string[] { "test/mysensor2" });

            mqtt_client.UnsubscribeAsync(topics2);
            Thread.Sleep(15000);

            // None

            mqttClient = (MqttClient)mqtt_client;

            //throw new NotImplementedException();
        }