using SKMC.Api.Common.Logger; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SKMC.Api.Device.SKVision { /// /// 视觉通讯协议基础客户端 /// public class SKVisionClient { private readonly static ILogger log = LogFactory.Get(); private readonly SKVisionClientBase clientBase; public SKVisionClient(int port, int timeout) { clientBase = new SKVisionClientBase(port, timeout); } /// /// 发送请求不接收结果 /// /// 模块码 /// 功能码 /// 产品码 /// 请求参数 public Task Request(string moduleCode, string functionCode, string productCode, bool isOnlySend, List parameters = null) { string timeStamp = DateTime.Now.ToString("yyMMddHHmmssfff"); SKVisionProtocol skVisionRequest = new SKVisionProtocol { Direction = "T", ModuleCode = moduleCode, FuncCode = functionCode, ProductCode = productCode, Timestamp = timeStamp, BodyDomains = parameters }; clientBase.Request(skVisionRequest.ToRequest(), isOnlySend); return default; } /// /// 发送请求并接收结果 (同步模式) /// /// 模块码 /// 功能码 /// 产品码 /// 请求参数 /// 解析函数 public Task Request(string moduleCode, string functionCode, string productCode, List parameters = null, Action resultAction = null) { string timeStamp = DateTime.Now.ToString("yyMMddHHmmssfff"); SKVisionProtocol skVisionRequest = new SKVisionProtocol { Direction = "T", ModuleCode = moduleCode, FuncCode = functionCode, ProductCode = productCode, Timestamp = timeStamp, BodyDomains = parameters }; clientBase.Request(skVisionRequest.ToRequest(), responseAction: (response) => { resultAction?.Invoke(skVisionRequest.FromResponse(response)); }); return default; } /// /// 发送请求并接收结果 (异步模式) /// /// /// /// /// /// /// /// public Task Request(string moduleCode, string functionCode, string productCode, List parameters = null, Action responseAction = null, Action resultAction = null) { string timeStamp = DateTime.Now.ToString("yyMMddHHmmssfff"); // 是否粘包 bool isMultiPacks = false; SKVisionProtocol skVisionRequest = new SKVisionProtocol { Direction = "T", ModuleCode = moduleCode, FuncCode = functionCode, ProductCode = productCode, Timestamp = timeStamp, BodyDomains = parameters }; clientBase.Request(skVisionRequest.ToRequest(), responseAction: (response) => { SKVisionProtocol skVisionProtocol = skVisionRequest.FromResponse(response); responseAction?.Invoke(skVisionRequest.FromResponse(response)); // 有粘包 if (skVisionProtocol.SKVisionSubProtocol != null) { log.Debug("粘包处理..."); resultAction?.Invoke(skVisionProtocol.SKVisionSubProtocol); isMultiPacks = true; } }); if (!isMultiPacks) { return Task.Run(() => { string result = null; try { result = clientBase.GetResult(); } catch (Exception e) { log.Error($"获取视觉结果异常: {e.Message}", e); } try { resultAction?.Invoke(skVisionRequest.FromResponse(result)); } catch (Exception e) { log.Error($"处理视觉结果异常: {e.Message}", e); } }); } return default; } } }