| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- 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
- {
- /// <summary>
- /// 阶段2:operate 跨进程访问独立 control 的本地 HTTP 客户端。
- /// 拆分后 operate 进程内已无 control 的实时 AppData,监控页/调试页改经此客户端读 /status、
- /// 借串口 /serial/pause|resume、受护栏停止 /shutdown。全部 try 兜底,失败返回 null/false 不抛。
- /// </summary>
- 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;
- public static string BaseUrl => $"http://127.0.0.1:{Port}";
- /// <summary>GET /status → 取回 control 的 MonitorSnapshot(失败返回 null,监控页据此显示"未托管")。</summary>
- 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<MonitorSnapshot>();
- }
- catch { return null; }
- }
- /// <summary>control 是否存活(GET /ping)。</summary>
- public static bool IsAlive()
- {
- try
- {
- var resp = _http.GetAsync($"{BaseUrl}/ping").GetAwaiter().GetResult();
- return resp.IsSuccessStatusCode;
- }
- catch { return false; }
- }
- /// <summary>受护栏停止:POST /shutdown {token}。token=工程师口令,control 端校验。成功返回 true。</summary>
- public static bool Shutdown(string token)
- {
- try
- {
- var resp = _http.PostAsync($"{BaseUrl}/shutdown", JsonBody(new { token })).GetAwaiter().GetResult();
- return resp.IsSuccessStatusCode;
- }
- catch { return false; }
- }
- /// <summary>调试借串口:POST /serial/pause {houseSn} → control 让出该舱采集。成功返回 true。</summary>
- public static bool SerialPause(int houseSn) => PostSerial("pause", houseSn);
- /// <summary>调试归还:POST /serial/resume {houseSn} → control 恢复该舱采集。</summary>
- 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");
- }
- }
|