| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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
- {
- /// <summary>
- /// Web 通讯(HTTP 客户端)。ReadValue(address) 为 GET 请求,
- /// WriteValue(address, value) 为 POST 请求,address 为相对路径。
- /// </summary>
- [Communication("Web", "基础通讯", "HTTP/WebApi 客户端")]
- public class WebCommunication : BindableCommunicationBase
- {
- [JsonIgnore]
- private static readonly HttpClient _http = new HttpClient();
- [JsonIgnore]
- private readonly ConcurrentQueue<string> _received = new ConcurrentQueue<string>();
- [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<object, bool> ConnectChangedEvent;
- public override event Action<object, string> 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<object> 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);
- }
- }
- }
|