using System; using System.IO; using System.Collections.Generic; using NLog; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using DataClient.Struct; using System.Net; using System.Threading.Tasks; namespace DataClient { /// Класс для связи с СТП. Содержит все инструменты, для получения данных. public class STPClient { //ЛОГИРОВАНИЕ private Logger log = LogManager.GetCurrentClassLogger(); //КОНФИГУРАЦИЯ private string confDir = Path.Combine(Directory.GetCurrentDirectory(), "Config"); private Dictionary confAnalog = new Dictionary(); private List<(int num, string name)> vdpList = new List<(int num, string name)>(); /// Чтение конфигурационнного файла и установка параметров по умолчанию. private void Config() { string jsonString; var confFile = Path.Combine(confDir, "config.json"); try { jsonString = File.ReadAllText(confFile); } catch (Exception e) { log.Warn(e, "Can't read config file from " + confDir + "."); return; } var conf = (JObject)JsonConvert.DeserializeObject(jsonString); if (!conf.HasValues && !conf["servers"].HasValues && conf["servers"].Type != JTokenType.Array) { log.Warn("Doesn't exist \"servers\" object in config file."); return; } var count = -1; foreach (var s in conf["servers"]) { count++; var name = (s["name"].Type == JTokenType.String) ? (string)s["name"] : "default"; var ip = (s["ip"].Type == JTokenType.String) ? (string)s["ip"] : ""; var port = (s["port"].Type == JTokenType.Integer) ? (int)s["port"] : -1; var dir = (s["dir"].Type == JTokenType.String) ? (string)s["dir"] : ""; var res = false; var idx = _servers.FindIndex(x => x.name == name); if (idx == -1) res = AddServer(name, ip, port, dir); else { _servers.RemoveAt(idx); res = AddServer(name, ip, port, dir); } if (!res) log.Trace("Can't add or change server #" + count + " from conf file."); } //init vdp for (var i = 0; i < 49; i++) vdpList.Add(new(i, i == 0 ? "Общие" : "Печь " + i.ToString("D2"))); for (var i = 91; i < 95; i++) vdpList.Add((i, "Печь " + i.ToString("D2"))); //init analog var tmpvdp = new List(); foreach (var v in vdpList) tmpvdp.Add(v.num); confAnalog = Configuration.InitAnalogList(Path.Combine(confDir, "analog"), tmpvdp.ToArray()); } //РАБОТА С СЕРВЕРОМ private List _servers = new List(); private int _useServer = -1; /// Номер сервера, используемого по умолчанию. public int UseServer { get { return _useServer; } set { _useServer = (_servers.Count == 0) ? -1 : (value < 0) ? 0 : (value >= _servers.Count) ? _useServer = _servers.Count - 1 : value; } } /// Массив серверов, инициализированных в экземпляре класса. public server[] ListServers { get { return _servers.ToArray(); } } /// Текущий рабочий сервер public server? Server { get { return (_useServer == -1) ? null : _servers[_useServer]; } } /// /// Проверка параметров сервера. /// /// Ip адрес сервера СТП. /// Порт сервера СТП. /// Путь к архивным данным. /// Результат проверки. private bool CheckDataServer(string ip, int port, string dir) { if (!IPAddress.TryParse(ip, out _)) { log.Warn("Ip address incorrect: " + ip + " ."); return false; } if (port < 1 && port > 65535) { log.Warn("Port incorrect: " + port.ToString() + "."); return false; } if (!Directory.Exists(dir)) { log.Warn("Directory incorrect or not exist: " + dir + " ."); return false; } return true; } /// Добавление сервера в список серверов. /// Название сервера /// IP адресс сервера. /// Порт сервера. /// Путь к архиву. /// Результат выполнения функции. public bool AddServer(string name, string ip, int port, string dir) { if (!CheckDataServer(ip, port, dir)) { log.Warn("Server not added: Data incorrect."); return false; } if (string.IsNullOrEmpty(name)) { log.Warn("Server not added: Incorrect name server."); return false; } if (_servers.FindIndex(x => x.name == name) != -1) { log.Warn("Server not added: Server with this name exist."); return false; } _servers.Add(new server(name, ip, port, dir)); _useServer = 0; log.Trace("Server (name=" + name + ";ip=" + ip + ";port=" + port + ";dir=" + dir + ") added."); return true; } /// Удаление сервера из списка серверов по его номеру. /// Номер сервера в списке серверов. /// Результат выполнения функции. public bool RemoveServer(int id) { if (_servers.Count == 0 || id >= _servers.Count || id < 0) { log.Warn("Server not removed: Id incorrect or list server are empty."); return false; } log.Trace("Server id=" + id.ToString() + ";name=" + _servers[id].name + ";ip=" + _servers[id].ip + ";port=" + _servers[id].port.ToString() + ";dir=" + _servers[id].dir + "; removed."); _servers.RemoveAt(id); UseServer = 0; return true; } //################# //Переменные //Геттеры и сеттеры //Функции /// Создание экземпляра класса. public STPClient() { log.Trace("Create instance class."); Config(); } /// Создание экземпляра класса с указанием конфигурационного файла. /// Путь к файлу конфигурации. public STPClient(string confDir) { log.Trace("Create instance class with dir:" + confDir + "."); this.confDir = confDir; Config(); } public TechCycle[] GetTechCyclesList(int vdp, DateTime tS, DateTime tE) { //Use File with ID = 3 var res = new List(); return res.ToArray(); } public (ConfAnalog conf, Analog[] list)[] GetAnalogsList(int vdp, DateTime tS, DateTime tE, int[] idA = null) { return Array.Empty<(ConfAnalog conf, Analog[] list)>(); } } }