| | |
| | | // See https://aka.ms/new-console-template for more information |
| | | using IStation; |
| | | using Newtonsoft.Json; |
| | | |
| | | public class InfluxDBHistoryDataFetcher |
| | | { |
| | | private readonly HttpClient _httpClient; |
| | | private readonly string _baseUri; |
| | | |
| | | using IStation; |
| | | public InfluxDBHistoryDataFetcher(string baseUri) |
| | | { |
| | | _baseUri = baseUri; |
| | | _httpClient = new HttpClient(); |
| | | } |
| | | |
| | | //var dt_now = DateTime.Now; |
| | | //var dt_next = new DateTime(dt_now.Year, dt_now.Month, dt_now.Day, dt_now.Hour, dt_now.Minute + 1, 0); |
| | | //var dt_space = dt_next - dt_now; |
| | | //Console.WriteLine($"åå§å({dt_space.TotalSeconds})..."); |
| | | //Thread.Sleep(dt_space); |
| | | //IStation.Service.MonitorRecord _service_monitor_record = new(); |
| | | //IStation.Settings.ParasHelper.DataBase.SQLite.AnalysisConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\analysis.db"; |
| | | //IStation.Settings.ParasHelper.DataBase.SQLite.ScheduleConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\schedule.db"; |
| | | //IStation.Settings.ParasHelper.DataBase.SQLite.HydraulicConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\hydraulic.db"; |
| | | //IStation.Settings.ParasHelper.DataBase.SQLite.MonitorConnectString = "DataSource=" + IStation.Settings.ParasHelper.LocalFile.DataFolderDirectory + "\\monitor.db"; |
| | | //IStation.Settings.ParasHelper.Save(); |
| | | public async Task<List<ResponseData>> FetchDataAsync( |
| | | List<string> measurements, |
| | | DateTime startTime, |
| | | DateTime endTime, |
| | | string frequency, |
| | | string type = "first") |
| | | { |
| | | // æ¯æ¬¡æå¤ä¼ é 5 个 measurements |
| | | const int batchSize = 5; |
| | | var allData = new List<ResponseData>(); |
| | | |
| | | //Console.WriteLine("å¯å¨å®æ¶æ°æ®éé..."); |
| | | //var timer = new System.Timers.Timer(); |
| | | //timer.Interval = 10 * 1000; |
| | | //timer.Elapsed += (s, e) => |
| | | //{ |
| | | // dt_now = DateTime.Now; |
| | | // var dt_now_str = dt_now.ToString("G"); |
| | | // var get_msg = GlobalHelper.GetMonitorRecordList(dt_now, out List<IStation.Model.MonitorRecord> monitor_record_list, false); |
| | | // if (!string.IsNullOrEmpty(get_msg)) |
| | | // { |
| | | // Console.WriteLine($"{dt_now_str}:{get_msg}"); |
| | | // } |
| | | // else |
| | | // { |
| | | // var bol = _service_monitor_record.Inserts(monitor_record_list); |
| | | // if (bol) |
| | | // { |
| | | // Console.WriteLine($"{dt_now_str}:ééæå!"); |
| | | // } |
| | | // else |
| | | // { |
| | | // Console.WriteLine($"{dt_now_str}:éé失败!"); |
| | | // } |
| | | // } |
| | | //}; |
| | | //timer.AutoReset = true; |
| | | //timer.Start(); |
| | | // åå² measurements 为å¤ä¸ªæ¹æ¬¡ |
| | | for (int i = 0; i < measurements.Count; i += batchSize) |
| | | { |
| | | var batchMeasurements = measurements.Skip(i).Take(batchSize).ToList(); |
| | | var batchData = await FetchBatchAsync(batchMeasurements, startTime, endTime, frequency, type); |
| | | allData.AddRange(batchData); |
| | | } |
| | | |
| | | return allData; |
| | | } |
| | | |
| | | private async Task<List<ResponseData>> FetchBatchAsync( |
| | | List<string> measurements, |
| | | DateTime startTime, |
| | | DateTime endTime, |
| | | string frequency, |
| | | string type) |
| | | { |
| | | // æé URL åæ° |
| | | var queryParams = new Dictionary<string, string> |
| | | { |
| | | { "startTime", startTime.ToString("yyyy-MM-dd") }, |
| | | { "endTime", endTime.ToString("yyyy-MM-dd") }, |
| | | { "type", type }, |
| | | { "frequency", frequency }, |
| | | { "measurements", string.Join(",", measurements) } |
| | | }; |
| | | |
| | | var request_list= |
| | | // æé 宿´ç URL |
| | | var url = ConstructUrl(queryParams); |
| | | |
| | | try |
| | | { |
| | | // åèµ· HTTP GET è¯·æ± |
| | | var response = await _httpClient.GetAsync(url); |
| | | response.EnsureSuccessStatusCode(); // æ£æ¥ HTTP é误 |
| | | |
| | | Console.ReadKey(); |
| | | // è§£æè¿åç JSON æ°æ® |
| | | var content = await response.Content.ReadAsStringAsync(); |
| | | var result = JsonConvert.DeserializeObject<ApiResponse>(content); |
| | | |
| | | if (result != null && result.Status == "200") |
| | | { |
| | | return result.Data; |
| | | } |
| | | else |
| | | { |
| | | Console.WriteLine($"Error fetching data: {result?.Msg}"); |
| | | return new List<ResponseData>(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"Request failed: {ex.Message}"); |
| | | return new List<ResponseData>(); |
| | | } |
| | | } |
| | | |
| | | private string ConstructUrl(Dictionary<string, string> queryParams) |
| | | { |
| | | var queryStrings = queryParams |
| | | .Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}") |
| | | .ToList(); |
| | | |
| | | return $"{_baseUri}?{string.Join("&", queryStrings)}"; |
| | | } |
| | | |
| | | public List<ResponseData> GetDataByMeasurement(List<ResponseData> allData, string measurementName) |
| | | { |
| | | return allData.Where(data => data.TagName == measurementName).ToList(); |
| | | } |
| | | } |
| | | |
| | | // æ¥å£è¿åçæ°æ®æ¨¡å |
| | | public class ApiResponse |
| | | { |
| | | public string Msg { get; set; } |
| | | public List<ResponseData> Data { get; set; } |
| | | public string Status { get; set; } |
| | | } |
| | | |
| | | public class ResponseData |
| | | { |
| | | public string DataMsg { get; set; } |
| | | public List<List<string>> Vals { get; set; } |
| | | public string TagName { get; set; } |
| | | } |
| | | |
| | | // 使ç¨ç¤ºä¾ |
| | | public class Program |
| | | { |
| | | public static async Task Main(string[] args) |
| | | { |
| | | // åå§åè¾
å©ç±» |
| | | var fetcher = new InfluxDBHistoryDataFetcher( |
| | | "http://192.168.201.235:8009/dataController/getCommHistoryDataOfInfluxDB"); |
| | | |
| | | // ç¤ºä¾ measurements |
| | | var measurements = GlobalHelper.HistoryTagList; |
| | | |
| | | // è·åæ°æ® |
| | | var startTime = new DateTime(2024, 5, 12); |
| | | var endTime = new DateTime(2024, 5, 13); |
| | | var frequency = "12h"; |
| | | var type = "first"; |
| | | |
| | | var allData = await fetcher.FetchDataAsync( |
| | | measurements: measurements, |
| | | startTime: startTime, |
| | | endTime: endTime, |
| | | frequency: frequency, |
| | | type: type); |
| | | |
| | | // æå°ç»æ |
| | | Console.WriteLine("æææ°æ®:"); |
| | | foreach (var data in allData) |
| | | { |
| | | Console.WriteLine($"TagName: {data.TagName}"); |
| | | foreach (var val in data.Vals) |
| | | { |
| | | Console.WriteLine($" {val[0]}: {val[1]}"); |
| | | } |
| | | } |
| | | |
| | | // æåç¹å® measurement çæ°æ® |
| | | var specificData = fetcher.GetDataByMeasurement(allData, "äºåæ°´é«å1å·ä¸»æ°´æ³µ.æååç"); |
| | | Console.WriteLine("\nç¹å®æµéé¡¹æ°æ®:"); |
| | | foreach (var data in specificData) |
| | | { |
| | | Console.WriteLine($"TagName: {data.TagName}"); |
| | | foreach (var val in data.Vals) |
| | | { |
| | | Console.WriteLine($" {val[0]}: {val[1]}"); |
| | | } |
| | | } |
| | | Console.WriteLine("ç»æ"); |
| | | Console.ReadKey(); |
| | | } |
| | | } |