using SKMC.Api.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SKMC.Api.Device.Adapter.Vision
{
///
/// 视觉通讯协议基础客户端
///
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;
}
}
}