using StandardDomeNewApp.Communication.Sockets; using StandardDomeNewApp.Mappering; using StandardDomeNewApp.Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace StandardDomeNewApp.Communication.SweepCodeGun { public class ScanCode_ClientSocket : IScanCode { /// /// 是否连接 /// public override bool IsConnect { get => base.IsConnect; protected set { if (base.IsConnect != value) { base.IsConnect = value; if (configModel == null) { return; } using (var dbContext = new DataBaseMappering()) { var find = dbContext.TSweepCodeGunConfigs.Where(o => o.PrimaryKey == configModel.PrimaryKey); if (find != null) { var list = find.ToList(); if (list.Count > 0) { var one = list.ElementAt(0); //修改这个one one.IsConnect = value ? 1 : 0; dbContext.SaveChanges(); } } } } } } /// /// 虚拟码 /// public override int Vcode { get => base.Vcode; set { if (base.Vcode != value) { base.Vcode = value; if (configModel == null) { return; } using (var dbContext = new DataBaseMappering()) { var find = dbContext.TSweepCodeGunConfigs.Where(o => o.PrimaryKey == configModel.PrimaryKey); if (find != null) { var list = find.ToList(); if (list.Count > 0) { var one = list.ElementAt(0); //修改这个one one.VCode = value; dbContext.SaveChanges(); } } } } } } /// /// 读取操作的锁 /// private object readopLock { set; get; } = new object(); /// /// 扫码枪配置参数 /// private SweepCodeGunConfigModel configModel { set; get; } /// /// 网口客户端对象 /// private ProvidOrdinaryClient providOrdinaryClient { set; get; } /// /// 正则对象 /// private Regex regex { set; get; } /// /// 一个客户端接收数据也是一个个来的 /// private string dataPack { set; get; } /// /// 是否允许开始接收了 /// private bool IsAllowReceive { set; get; } = false; /// /// 条码的长度 /// private int QRcodeLength = int.Parse(Login.GetParaValue("QRCodeLength")); /// /// 建立对象 /// /// public override void Build(object config) { if (config is SweepCodeGunConfigModel model) { configModel = model; KeyName = configModel.PrimaryKey; if (configModel.MaxVCode == -1 || configModel.MinVCode == -1) { IsUserVCode = false; } MaxVCode = configModel.MaxVCode; MinVCode = configModel.MinVCode; Vcode = configModel.VCode; if (configModel.ErrorCode != null) { var errorcodes = configModel.ErrorCode.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var item in errorcodes) { ErrorCodes.Add(item); } } if (!string.IsNullOrEmpty(configModel.CodeRegex)) { regex = new Regex(configModel.CodeRegex); } } } /// /// 连接 /// /// public override bool Connect() { IsConnect = false; if (configModel == null) { ShowMessageAction?.Invoke("请先Build后再尝试连接!", false, Core.SysEnumInfon.MessageLogType.Info); Util.CommonHelper.Fatal("ScanCode_ClientSocket","Error 1:"+ "请先Build后再尝试连接!"); return false; } providOrdinaryClient = contentCache.GetContent(configModel.ProtocolKey); if (providOrdinaryClient == null) { ShowMessageAction?.Invoke($"无法找到[{configModel.ProtocolKey}]对应的网口客户端对象!", false, Core.SysEnumInfon.MessageLogType.Info); Util.CommonHelper.Fatal("ScanCode_ClientSocket", "Error 2:" + $"无法找到[{configModel.ProtocolKey}]对应的网口客户端对象!"); return false; } providOrdinaryClient.IsconnectserverAction = b => { IsConnect = b; ShowMessageAction?.Invoke($"扫码枪对象[{KeyName}]连接状态:{IsConnect}!", false, Core.SysEnumInfon.MessageLogType.Info); Util.CommonHelper.Fatal("ScanCode_ClientSocket", "Error 3:" + $"扫码枪对象[{KeyName}]连接状态:{IsConnect}!"); }; providOrdinaryClient.GetMessages = RawData_Receive; IsConnect = providOrdinaryClient.IsconnectServer; oneEncoding = providOrdinaryClient.encoding; ShowMessageAction?.Invoke($"扫码枪对象[{KeyName}]连接状态:{IsConnect}!", false, Core.SysEnumInfon.MessageLogType.Info); Util.CommonHelper.Fatal("ScanCode_ClientSocket", "Error 4:" + $"扫码枪对象[{KeyName}]连接状态:{IsConnect}!"); return IsConnect; } /// /// 读取条码 (同步完成的) 自动扫码 /// /// public Tuple ReadCode3()//去掉了 override { lock (readopLock) { IsBusy = true; string dataPackResult = ""; for (int i = 0; i < MaxReadCount; i++) { //发送命令 if (!string.IsNullOrEmpty(configModel.Command)) { var array = configModel.Command.Split('+'); var command = array[0]; if (array.Length > 1 && array[1] == "NewLine") { providOrdinaryClient.SendCommand(command + Environment.NewLine); } else { providOrdinaryClient.SendCommand(command); } } //开始允许接收 IsAllowReceive = true; //记录开始的时间 DateTime dateTime = DateTime.Now; while (true) { if ((DateTime.Now - dateTime).TotalMilliseconds > configModel.OutTime) { //超过预定的时间跳出等待 break; } //正则表达式,基本用不到 //直接拿过来 if (!string.IsNullOrEmpty(dataPack)) { //只要有数据来就进来解析 dataPackResult = dataPack;//dataPack在RawData_Receive函数接收 var find = ErrorCodes.Find(o => dataPackResult.Contains(o)); if (find == null) { //如果读到了数据就跳出来,以下语句挑出两层循环 goto OutPutData; } } Thread.Sleep(5); } } OutPutData: //读取完成无论成功与否都结束接收 IsAllowReceive = false; //清除缓存 dataPack = string.Empty; IsBusy = false; //这个时候拿出(返回)数据包 return Tuple.Create(dataPackResult,-1,true); } } /// /// 手动扫码 /// /// public override Tuple ReadCode() { lock (readopLock) { IsBusy = true; string dataPackResult = ""; //开始允许接收 //IsAllowReceive = true; //正则表达式,基本用不到 //直接拿过来 if (!string.IsNullOrEmpty(dataPack)) { //只要有数据来就进来解析 dataPackResult = dataPack;//dataPack在RawData_Receive函数接收 var find = ErrorCodes.Find(o => dataPackResult.Contains(o)); if (find == null) { //如果读到了数据就跳出来,以下语句挑出两层循环 goto OutPutData; } } OutPutData: //读取完成无论成功与否都结束接收 IsAllowReceive = false; //清除缓存 dataPack = string.Empty; IsBusy = false; //这个时候拿出(返回)数据包 bool flag = false; if (dataPackResult.Length>=3) { flag = true; } return Tuple.Create(dataPackResult, -1, flag); } } public override void ReConnect() { providOrdinaryClient?.ReConnect(); } /// /// 断开连接 /// /// public override bool UnConnect() { if (providOrdinaryClient == null) { return false; } providOrdinaryClient.CloseConnect(); IsConnect = false; return true; } /// /// 原始数据接收 /// /// /// private void RawData_Receive(byte[] data, Encoding encoding) { GetOriginalData?.Invoke(data, encoding); //if (!IsAllowReceive) //{ // return; //} dataPack += encoding.GetString(data); //if (encoding.BodyName=="utf-8")// addwang 读取刷卡机 //{ // StringBuilder builder = new StringBuilder(); // for (int i = 0; i < data.Length; i++) // { // builder.Append(string.Format("{0:X2} ", data[i])); // } // dataPack = builder.ToString().Trim(); //} //else //{ // dataPack += encoding.GetString(data); //} } /// /// /// /// /// } }