using System; using System.Collections.Concurrent; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; using TeamAAS.Communication.Attributes; using TeamAAS.Communication.Base; using TeamAAS.Communication.Interfaces; namespace TeamAAS.Communication.Devices { /// /// Web 通讯(HTTP 客户端)。ReadValue(address) 为 GET 请求, /// WriteValue(address, value) 为 POST 请求,address 为相对路径。 /// [Communication("Web", "基础通讯", "HTTP/WebApi 客户端")] public class WebCommunication : BindableCommunicationBase { [JsonIgnore] private static readonly HttpClient _http = new HttpClient(); [JsonIgnore] private readonly ConcurrentQueue _received = new ConcurrentQueue(); [JsonIgnore] private bool _connected; private string _baseUrl = "http://127.0.0.1:8000"; public string BaseUrl { get { return _baseUrl; } set { SetProperty(ref _baseUrl, value); } } public override string EndpointUrl { get { return BaseUrl; } set { if (!string.IsNullOrWhiteSpace(value)) BaseUrl = value.TrimEnd('/'); } } public override bool IsConnected { get { return _connected; } } public override event Action ConnectChangedEvent; public override event Action DataReceivedEvent; public WebCommunication() { } public override void Connect() { if (string.IsNullOrWhiteSpace(BaseUrl)) throw new InvalidOperationException("Web 基础地址不能为空。"); _connected = true; Notify(nameof(IsConnected)); ConnectChangedEvent?.Invoke(this, true); Notify(nameof(IsConnected)); } public override Task ConnectAsync() { Connect(); return Task.CompletedTask; } public override void Disconnect() { _connected = false; Notify(nameof(IsConnected)); ConnectChangedEvent?.Invoke(this, false); Notify(nameof(IsConnected)); } public override void Dispose() { Disconnect(); } public override object ReadValue(string address) { try { var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}"; return _http.GetStringAsync(url).GetAwaiter().GetResult(); } catch (Exception ex) { return ex.Message; } } public override async Task ReadValueAsync(string address) { try { var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}"; return await _http.GetStringAsync(url); } catch (Exception ex) { return ex.Message; } } public override void WriteValue(string address, object value) { var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}"; var content = new StringContent(value?.ToString() ?? string.Empty, System.Text.Encoding.UTF8, "application/json"); _http.PostAsync(url, content).GetAwaiter().GetResult(); } public override async Task WriteValueAsync(string address, object value) { var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}"; var content = new StringContent(value?.ToString() ?? string.Empty, System.Text.Encoding.UTF8, "application/json"); await _http.PostAsync(url, content); } } }