public HslMqttService(IManagedMqttClient client, ManagedMqttClientOptions options) { _options = options; _client = client; _client.UseApplicationMessageReceivedHandler(MessageReceived); _batchTimer = new Timer(BatchTimerTick); }
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); }
public async Task Connect(ManagedMqttClientOptions clientOptions) { var client = _factory.CreateManagedMqttClient(); _client = client; client.ApplicationMessageReceivedHandler = this; client.ConnectedHandler = this; await client.StartAsync(clientOptions); }
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); } }
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); } }
/// <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); }
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), }; }
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); }); }
//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); }
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(); }
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); }
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()); } }
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(); }
async Task Background(ManagedMqttClientOptions options) { await client.StartAsync(options); }
/* * 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(); }