ControlClient.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Configuration;
  3. using System.Net.Http;
  4. using System.Text;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using MonitorSnapshot = ivf_tl_Control.MonitorSnapshot;
  8. namespace ivf_tl_Operate.Helpers
  9. {
  10. /// <summary>
  11. /// 阶段2:operate 跨进程访问独立 control 的本地 HTTP 客户端。
  12. /// 拆分后 operate 进程内已无 control 的实时 AppData,监控页/调试页改经此客户端读 /status、
  13. /// 借串口 /serial/pause|resume、受护栏停止 /shutdown。全部 try 兜底,失败返回 null/false 不抛。
  14. /// </summary>
  15. public static class ControlClient
  16. {
  17. private static readonly HttpClient _http = new HttpClient { Timeout = TimeSpan.FromSeconds(3) };
  18. public static int Port =>
  19. int.TryParse(ConfigurationManager.AppSettings["controlPort"], out var p) ? p : 38080;
  20. public static string BaseUrl => $"http://127.0.0.1:{Port}";
  21. /// <summary>GET /status → 取回 control 的 MonitorSnapshot(失败返回 null,监控页据此显示"未托管")。</summary>
  22. public static MonitorSnapshot GetStatusSnapshot()
  23. {
  24. try
  25. {
  26. var resp = _http.GetAsync($"{BaseUrl}/status").GetAwaiter().GetResult();
  27. if (!resp.IsSuccessStatusCode) return null;
  28. string json = resp.Content.ReadAsStringAsync().GetAwaiter().GetResult();
  29. var jo = JObject.Parse(json);
  30. var snapTok = jo["snapshot"];
  31. if (snapTok == null || snapTok.Type == JTokenType.Null) return null;
  32. return snapTok.ToObject<MonitorSnapshot>();
  33. }
  34. catch { return null; }
  35. }
  36. /// <summary>control 是否存活(GET /ping)。</summary>
  37. public static bool IsAlive()
  38. {
  39. try
  40. {
  41. var resp = _http.GetAsync($"{BaseUrl}/ping").GetAwaiter().GetResult();
  42. return resp.IsSuccessStatusCode;
  43. }
  44. catch { return false; }
  45. }
  46. /// <summary>受护栏停止:POST /shutdown {token}。token=工程师口令,control 端校验。成功返回 true。</summary>
  47. public static bool Shutdown(string token)
  48. {
  49. try
  50. {
  51. var resp = _http.PostAsync($"{BaseUrl}/shutdown", JsonBody(new { token })).GetAwaiter().GetResult();
  52. return resp.IsSuccessStatusCode;
  53. }
  54. catch { return false; }
  55. }
  56. /// <summary>调试借串口:POST /serial/pause {houseSn} → control 让出该舱采集。成功返回 true。</summary>
  57. public static bool SerialPause(int houseSn) => PostSerial("pause", houseSn);
  58. /// <summary>调试归还:POST /serial/resume {houseSn} → control 恢复该舱采集。</summary>
  59. public static bool SerialResume(int houseSn) => PostSerial("resume", houseSn);
  60. private static bool PostSerial(string action, int houseSn)
  61. {
  62. try
  63. {
  64. var resp = _http.PostAsync($"{BaseUrl}/serial/{action}", JsonBody(new { houseSn })).GetAwaiter().GetResult();
  65. return resp.IsSuccessStatusCode;
  66. }
  67. catch { return false; }
  68. }
  69. private static StringContent JsonBody(object o) =>
  70. new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
  71. }
  72. }