diff --git a/esp_server/Program.cs b/esp_server/Program.cs index c1bea27..b9135af 100644 --- a/esp_server/Program.cs +++ b/esp_server/Program.cs @@ -60,6 +60,8 @@ namespace ESPServer { var unitReceiver = new UnitDataReceiver(config.RootElement.GetProperty("port").GetInt32(), db, registers); unitReceiver.Start(); + var unitPinger = new UnitPinger(db); + unitPinger.Start(); var modbusServer = new ModbusServer(registers); modbusServer.Port = config.RootElement.GetProperty("modbusPort").GetInt32(); modbusServer.Run(); diff --git a/esp_server/UnitPinger.cs b/esp_server/UnitPinger.cs new file mode 100644 index 0000000..d24f8b6 --- /dev/null +++ b/esp_server/UnitPinger.cs @@ -0,0 +1,57 @@ +using NLog; +using System; +using System.Collections.Generic; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace ESPServer +{ + class UnitPinger + { + const int PING_INTERVAL = 30 * 1000; // 30 seconds + const int UNIT_TARGET_PORT = 7000; + + private readonly Logger logger = LogManager.GetCurrentClassLogger(); + UnitsDatabase db; + + public UnitPinger(UnitsDatabase db) + { + this.db = db; + } + + public void Start() + { + var t = new Thread(new ThreadStart(this.Run)); + t.Start(); + } + + private void Run() + { + logger.Info("Started UnitPinger"); + while (true) + { + try + { + Thread.Sleep(PING_INTERVAL); + var ips = db.GetUnitIPs(); + foreach (var kv in ips) + { + var ip = kv.Value; + using (var udpClient = new UdpClient()) + { + udpClient.Connect(ip, UNIT_TARGET_PORT); + var data = Encoding.ASCII.GetBytes("ping"); + udpClient.Send(data, data.Length); + udpClient.Close(); + } + } + } + catch (Exception e) + { + logger.Error(e.Message); + } + } + } + } +} diff --git a/esp_server/UnitsDatabase.cs b/esp_server/UnitsDatabase.cs index 828485b..d321d8d 100644 --- a/esp_server/UnitsDatabase.cs +++ b/esp_server/UnitsDatabase.cs @@ -103,6 +103,22 @@ namespace ESPServer } } + internal Dictionary GetUnitIPs() + { + var result = new Dictionary(); + lock (units) + { + foreach (var u in units) + { + if (!string.IsNullOrEmpty(u.ip)) + { + result[u.id] = u.ip; + } + } + } + return result; + } + public Unit GetUnit(string id) { lock (units)