WebCommunication.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Net.Http;
  4. using System.Threading.Tasks;
  5. using Newtonsoft.Json;
  6. using TeamAAS.Communication.Attributes;
  7. using TeamAAS.Communication.Base;
  8. using TeamAAS.Communication.Interfaces;
  9. namespace TeamAAS.Communication.Devices
  10. {
  11. /// <summary>
  12. /// Web 通讯(HTTP 客户端)。ReadValue(address) 为 GET 请求,
  13. /// WriteValue(address, value) 为 POST 请求,address 为相对路径。
  14. /// </summary>
  15. [Communication("Web", "基础通讯", "HTTP/WebApi 客户端")]
  16. public class WebCommunication : BindableCommunicationBase
  17. {
  18. [JsonIgnore]
  19. private static readonly HttpClient _http = new HttpClient();
  20. [JsonIgnore]
  21. private readonly ConcurrentQueue<string> _received = new ConcurrentQueue<string>();
  22. [JsonIgnore]
  23. private bool _connected;
  24. private string _baseUrl = "http://127.0.0.1:8000";
  25. public string BaseUrl
  26. {
  27. get { return _baseUrl; }
  28. set { SetProperty(ref _baseUrl, value); }
  29. }
  30. public override string EndpointUrl
  31. {
  32. get { return BaseUrl; }
  33. set
  34. {
  35. if (!string.IsNullOrWhiteSpace(value))
  36. BaseUrl = value.TrimEnd('/');
  37. }
  38. }
  39. public override bool IsConnected
  40. {
  41. get { return _connected; }
  42. }
  43. public override event Action<object, bool> ConnectChangedEvent;
  44. public override event Action<object, string> DataReceivedEvent;
  45. public WebCommunication()
  46. {
  47. }
  48. public override void Connect()
  49. {
  50. if (string.IsNullOrWhiteSpace(BaseUrl))
  51. throw new InvalidOperationException("Web 基础地址不能为空。");
  52. _connected = true;
  53. Notify(nameof(IsConnected));
  54. ConnectChangedEvent?.Invoke(this, true);
  55. Notify(nameof(IsConnected));
  56. }
  57. public override Task ConnectAsync()
  58. {
  59. Connect();
  60. return Task.CompletedTask;
  61. }
  62. public override void Disconnect()
  63. {
  64. _connected = false;
  65. Notify(nameof(IsConnected));
  66. ConnectChangedEvent?.Invoke(this, false);
  67. Notify(nameof(IsConnected));
  68. }
  69. public override void Dispose()
  70. {
  71. Disconnect();
  72. }
  73. public override object ReadValue(string address)
  74. {
  75. try
  76. {
  77. var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}";
  78. return _http.GetStringAsync(url).GetAwaiter().GetResult();
  79. }
  80. catch (Exception ex)
  81. {
  82. return ex.Message;
  83. }
  84. }
  85. public override async Task<object> ReadValueAsync(string address)
  86. {
  87. try
  88. {
  89. var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}";
  90. return await _http.GetStringAsync(url);
  91. }
  92. catch (Exception ex)
  93. {
  94. return ex.Message;
  95. }
  96. }
  97. public override void WriteValue(string address, object value)
  98. {
  99. var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}";
  100. var content = new StringContent(value?.ToString() ?? string.Empty, System.Text.Encoding.UTF8, "application/json");
  101. _http.PostAsync(url, content).GetAwaiter().GetResult();
  102. }
  103. public override async Task WriteValueAsync(string address, object value)
  104. {
  105. var url = string.IsNullOrWhiteSpace(address) ? BaseUrl : $"{BaseUrl}/{address.TrimStart('/')}";
  106. var content = new StringContent(value?.ToString() ?? string.Empty, System.Text.Encoding.UTF8, "application/json");
  107. await _http.PostAsync(url, content);
  108. }
  109. }
  110. }