From ac09097d05bbcfa32e9bb5580e4345486b7b0b71 Mon Sep 17 00:00:00 2001 From: Fabio Lopes Date: Wed, 17 Apr 2024 22:43:45 -0400 Subject: [PATCH] mqtt --- EPTracer/EPTracer.csproj | 17 +++++---- EPTracer/Program.cs | 80 ++++++++++++++++++++++++++++++++++++--- EPTracer/appsettings.json | 5 ++- 3 files changed, 88 insertions(+), 14 deletions(-) diff --git a/EPTracer/EPTracer.csproj b/EPTracer/EPTracer.csproj index df46591..f65dc2f 100644 --- a/EPTracer/EPTracer.csproj +++ b/EPTracer/EPTracer.csproj @@ -2,17 +2,18 @@ Exe - net5.0 + net8.0 - - - - - - - + + + + + + + + PreserveNewest diff --git a/EPTracer/Program.cs b/EPTracer/Program.cs index f73322e..9a20692 100644 --- a/EPTracer/Program.cs +++ b/EPTracer/Program.cs @@ -2,10 +2,14 @@ using InfluxDB.Client.Api.Domain; using InfluxDB.Client.Writes; using Microsoft.Extensions.Configuration; +using MQTTnet; +using MQTTnet.Client; using NModbus; using NModbus.Serial; using System; +using System.Collections.Generic; using System.IO.Ports; +using System.Threading; namespace EPTracer { @@ -17,7 +21,7 @@ namespace EPTracer Console.WriteLine(); Console.WriteLine("***************************************************************"); Console.WriteLine("Loading config..."); - + IConfiguration config = new ConfigurationBuilder() .AddJsonFile("appsettings.json", true, true) .Build(); @@ -27,7 +31,13 @@ namespace EPTracer string token = config["token"]; string bucket = config["bucket"]; string org = config["org"]; - + + string mqtt_server = config["mqtt_server"]; + string mqtt_user = config["mqtt_user"]; + string mqtt_password = config["mqtt_password"]; + + + Console.WriteLine(); Console.WriteLine($"Serial Port: {portConf}"); Console.WriteLine($"Interval: {interval}"); @@ -41,13 +51,16 @@ namespace EPTracer using (SerialPort port = new SerialPort(portConf)) { + var mqttClient = MqttConnect(mqtt_server, mqtt_user, mqtt_password); + var time = DateTime.Now; + Console.WriteLine($"Configuring serial port: {portConf}"); // configure serial port port.BaudRate = 115200; port.DataBits = 8; port.Parity = Parity.None; port.StopBits = StopBits.One; - + Console.WriteLine("Opening port"); port.Open(); @@ -62,6 +75,16 @@ namespace EPTracer Console.WriteLine("....."); while (true) { + if (mqttClient == null) + { + // try to connect every 3 minutes + if (DateTime.Now > time.AddMinutes(3)) + { + mqttClient = MqttConnect(mqtt_server, mqtt_user, mqtt_password); + time = DateTime.Now; + } + } + //read registers ushort[] registers = master.ReadInputRegisters(slaveId, startAddress, numRegisters); @@ -81,7 +104,7 @@ namespace EPTracer using (var client = InfluxDBClientFactory.Create(influxdb, token)) { client.SetLogLevel(InfluxDB.Client.Core.LogLevel.Body); - + var timestamp = DateTime.UtcNow; var point = PointData.Measurement("solar") .Tag("unit", "1") @@ -106,9 +129,56 @@ namespace EPTracer } } - System.Threading.Thread.Sleep(interval * 1000); + var messages = new List(); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/pvv").WithPayload(pvv.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/pva").WithPayload(pva.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/pvw").WithPayload(pvw.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/btv").WithPayload(btv.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/bta").WithPayload(bta.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/btw").WithPayload(btw.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/ldv").WithPayload(ldv.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/lda").WithPayload(lda.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/ldw").WithPayload(ldw.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/btt").WithPayload(btt.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/btc").WithPayload(btc.ToString("0.00")).Build()); + messages.Add(new MqttApplicationMessageBuilder().WithTopic("ep/dev1/rbt").WithPayload(rbt.ToString("0.00")).Build()); + + try + { + foreach (var message in messages) + { + mqttClient.PublishAsync(message, CancellationToken.None); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + + Thread.Sleep(interval * 1000); } } } + public static MQTTnet.Client.MqttClient MqttConnect(string server, string user, string password) + { + Console.WriteLine("Connecting to MQTT server..."); + var mqttFactory = new MqttFactory(); + var mqttClient = mqttFactory.CreateMqttClient() as MQTTnet.Client.MqttClient; + var mqttClientOptions = new MqttClientOptionsBuilder() + .WithTcpServer(server) + .WithCredentials(user, password) + .Build(); + try + { + var response = mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None); + Console.WriteLine("MQTT connected!"); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + mqttClient = null; + } + return mqttClient; + } } } diff --git a/EPTracer/appsettings.json b/EPTracer/appsettings.json index c5cb5af..697eb7b 100644 --- a/EPTracer/appsettings.json +++ b/EPTracer/appsettings.json @@ -4,5 +4,8 @@ "influxdb": "http://127.0.0.1:8086", "token": "l8GGGVe6YaNTfvsE5h4WLMLOEVkOL49NyOvCD3eV1LqI4va2Uh9Acza0-_UIhbuT5FdJe5FniRlMoWtHM3kV-A==", "bucket": "solar", - "org": "flexa" + "org": "flexa", + "mqtt_server": "10.20.0.6", + "mqtt_user": "mqtt", + "mqtt_password": "mqtt" } \ No newline at end of file