using System; using System.Configuration; using System.Net.Http; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using MonitorSnapshot = ivf_tl_Control.MonitorSnapshot; namespace ivf_tl_Operate.Helpers { /// /// 阶段2:operate 跨进程访问独立 control 的本地 HTTP 客户端。 /// 拆分后 operate 进程内已无 control 的实时 AppData,监控页/调试页改经此客户端读 /status、 /// 借串口 /serial/pause|resume、受护栏停止 /shutdown。全部 try 兜底,失败返回 null/false 不抛。 /// public static class ControlClient { private static readonly HttpClient _http = new HttpClient { Timeout = TimeSpan.FromSeconds(3) }; public static int Port => int.TryParse(ConfigurationManager.AppSettings["controlPort"], out var p) ? p : 38080; private static string BaseUrl => $"http://127.0.0.1:{Port}"; /// GET /status → 取回 control 的 MonitorSnapshot(失败返回 null,监控页据此显示"未托管")。 public static MonitorSnapshot GetStatusSnapshot() { try { var resp = _http.GetAsync($"{BaseUrl}/status").GetAwaiter().GetResult(); if (!resp.IsSuccessStatusCode) return null; string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult(); var jo = JObject.Parse(json); var snapTok = jo["snapshot"]; if (snapTok == null || snapTok.Type == JTokenType.Null) return null; return snapTok.ToObject(); } catch { return null; } } /// control 是否存活(GET /ping)。 public static bool IsAlive() { try { var resp = _http.GetAsync($"{BaseUrl}/ping").GetAwaiter().GetResult(); return resp.IsSuccessStatusCode; } catch { return false; } } /// 受护栏停止:POST /shutdown {token}。token=工程师口令,control 端校验。成功返回 true。 public static bool Shutdown(string token) { try { var resp = _http.PostAsync($"{BaseUrl}/shutdown", JsonBody(new { token })).GetAwaiter().GetResult(); return resp.IsSuccessStatusCode; } catch { return false; } } /// 调试借串口:POST /serial/pause {houseSn} → control 让出该舱采集。成功返回 true。 public static bool SerialPause(int houseSn) => PostSerial("pause", houseSn); /// 调试归还:POST /serial/resume {houseSn} → control 恢复该舱采集。 public static bool SerialResume(int houseSn) => PostSerial("resume", houseSn); private static bool PostSerial(string action, int houseSn) { try { var resp = _http.PostAsync($"{BaseUrl}/serial/{action}", JsonBody(new { houseSn })).GetAwaiter().GetResult(); return resp.IsSuccessStatusCode; } catch { return false; } } private static StringContent JsonBody(object o) => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json"); } }