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;
public 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");
}
}