ICommunicationProtocol.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using TeamAAS_VP.Enums;
  7. namespace TeamAAS_VP.Core.Lights
  8. {
  9. /// <summary>
  10. /// 定义灯光控制或通信设备的通用通信协议契约。
  11. /// 实现此接口的类负责建立连接、发送/接收数据以及在连接状态改变时通知订阅者。
  12. /// 实现类应负责释放底层资源,因此继承自 <see cref="IDisposable"/>。
  13. /// </summary>
  14. public interface ICommunicationProtocol : IDisposable
  15. {
  16. /// <summary>
  17. /// 获取当前连接状态。
  18. /// 返回 true 表示已建立连接并可进行数据收发;false 表示未连接或已断开。
  19. /// </summary>
  20. bool IsConnected { get; }
  21. /// <summary>
  22. /// 获取或设置通信报文的结束标记(终止符)。
  23. /// 该标记用于分割或终结文本协议消息。
  24. /// </summary>
  25. Terminator Terminator { get; }
  26. /// <summary>
  27. /// 获取用于文本消息编码/解码的字符编码(例如 UTF8、ASCII)。
  28. /// 当使用字符串重载的发送/接收方法时,此编码将被应用。
  29. /// </summary>
  30. Encoding Encoding { get; }
  31. /// <summary>
  32. /// 当连接状态发生变化时触发。
  33. /// sender 为事件源,bool 参数表示新的连接状态(true=已连接,false=已断开)。
  34. /// </summary>
  35. event Action<object, bool> ConnectionChanged;
  36. /// <summary>
  37. /// 当接收到完整的数据(按协议分包或终止符)时触发。
  38. /// sender 为事件源,string 为已接收并按 <see cref="Encoding"/> 解码的文本内容。
  39. /// </summary>
  40. event Action<object, string> DataReceived;
  41. /// <summary>
  42. /// 当成功发送数据时触发。
  43. /// sender 为事件源,string 为已发送并按 <see cref="Encoding"/> 编码的文本内容(若使用字节发送则可为空或经转换的展示文本)。
  44. /// </summary>
  45. event Action<object, string> DataSent;
  46. /// <summary>
  47. /// 异步建立与设备的连接。
  48. /// 实现应在连接成功后触发 <see cref="ConnectionChanged"/>(true)。
  49. /// </summary>
  50. /// <returns>任务结果为 true 表示连接成功,false 表示连接失败或未建立。</returns>
  51. Task<bool> ConnectAsync();
  52. /// <summary>
  53. /// 异步断开与设备的连接并释放相关资源(但不等同于 Dispose)。
  54. /// 实现应在断开后触发 <see cref="ConnectionChanged"/>(false)。
  55. /// </summary>
  56. /// <returns>表示断开操作完成的任务。</returns>
  57. Task DisconnectAsync();
  58. /// <summary>
  59. /// 异步发送字节数组并等待返回的字节数组响应。
  60. /// </summary>
  61. /// <param name="data">要发送的原始字节数据。</param>
  62. /// <param name="timeout">超时时间(毫秒),在超时未收到完整响应时应抛出或返回空/部分数据,默认 5000ms。</param>
  63. /// <returns>返回接收到的字节数组响应。</returns>
  64. Task<byte[]> SendAndReceiveAsync(byte[] data, int timeout = 5000);
  65. /// <summary>
  66. /// 异步发送字节数组,不等待响应。
  67. /// </summary>
  68. /// <param name="data">要发送的原始字节数据。</param>
  69. /// <returns>表示发送操作完成的任务。</returns>
  70. Task SendAsync(byte[] data);
  71. /// <summary>
  72. /// 异步发送文本并等待文本响应。
  73. /// 使用 <see cref="Encoding"/> 对字符串进行编码/解码,超时时间单位为毫秒。
  74. /// </summary>
  75. /// <param name="data">要发送的文本数据。</param>
  76. /// <param name="timeout">超时时间(毫秒),默认 5000ms。</param>
  77. /// <returns>返回接收到的文本响应。</returns>
  78. Task<string> SendAndReceiveAsync(string data, int timeout = 5000);
  79. /// <summary>
  80. /// 同步发送文本并等待文本响应。
  81. /// 注意:在 UI 线程中调用此方法可能导致界面阻塞,建议使用异步重载。
  82. /// </summary>
  83. /// <param name="data">要发送的文本数据。</param>
  84. /// <param name="timeout">超时时间(毫秒),默认 5000ms。</param>
  85. /// <returns>接收到的文本响应。</returns>
  86. string SendAndReceive(string data, int timeout = 5000);
  87. /// <summary>
  88. /// 同步发送字节数组并等待返回的字节数组响应。
  89. /// 注意:在 UI 线程中调用此方法可能导致界面阻塞,建议使用异步重载。
  90. /// </summary>
  91. /// <param name="data">要发送的字节数组。</param>
  92. /// <param name="timeout">超时时间(毫秒),默认 5000ms。</param>
  93. /// <returns>接收到的字节数组响应。</returns>
  94. byte[] SendAndReceive(byte[] data, int timeout = 5000);
  95. /// <summary>
  96. /// 同步发送字节数组,不等待响应。
  97. /// 注意:在 UI 线程中调用此方法可能导致界面阻塞,建议使用异步重载。
  98. /// </summary>
  99. /// <param name="data">要发送的字节数组。</param>
  100. void Send(byte[] data);
  101. /// <summary>
  102. /// 异步发送文本数据。
  103. /// 使用 <see cref="Encoding"/> 对字符串进行编码后发送。
  104. /// </summary>
  105. /// <param name="data">要发送的文本数据。</param>
  106. /// <returns>表示发送操作完成的任务。</returns>
  107. Task SendAsync(string data);
  108. /// <summary>
  109. /// 同步发送文本数据。
  110. /// 注意:在 UI 线程中调用此方法可能导致界面阻塞,建议使用异步重载。
  111. /// </summary>
  112. /// <param name="data">要发送的文本数据。</param>
  113. void Send(string data);
  114. }
  115. }