diff --git a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs index 67e7e2db..2f7bd499 100644 --- a/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs +++ b/Aucma.Core.ProductOffLine/Business/MvCodeHelper.cs @@ -1,5 +1,6 @@ using Admin.Core.Common; using Aucma.Core.Scanner; +using log4net; using MvCodeReaderSDKNet; using StackExchange.Profiling; using System; @@ -8,6 +9,7 @@ using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using UAParser; namespace Aucma.Core.ProductOffLine.Business { @@ -23,8 +25,17 @@ namespace Aucma.Core.ProductOffLine.Business // 箱壳扫码器ip private static string ShellScannerIp = allScanners.First(x => x.Name == "外侧扫码器2").Ip; + private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OffLineBusiness)); + + + #region 全局变量定义 + public static MvCodeReader ShellDevice = null; + public static MvCodeReader LinerDevice = null; + public static DateTime ShellLiveTime = DateTime.Now; + public static DateTime LinerLiveTime = DateTime.Now; + #endregion #region 委托事件 - + /// /// 成品下线委托 /// @@ -38,7 +49,7 @@ namespace Aucma.Core.ProductOffLine.Business /// /// /// - public delegate void RefreshState(string ip); + public delegate void RefreshState(string ip,bool flag); public static event RefreshState RefreshStateEvent; @@ -59,7 +70,10 @@ namespace Aucma.Core.ProductOffLine.Business // Console.WriteLine("CodeNum[" + Convert.ToString(stBcrResult.nCodeNum) + "]"); if (stBcrResult.nCodeNum == 0) { - Console.WriteLine("外侧--->No Read 处理"); + Console.WriteLine(DateTime.Now + ":外侧--->No Read 处理"); + log.Info(DateTime.Now + ":外侧--->No Read 处理"); + //更新扫码器存活时间 + ShellLiveTime = DateTime.Now; } for (Int32 i = 0; i < stBcrResult.nCodeNum; i++) { @@ -67,21 +81,26 @@ namespace Aucma.Core.ProductOffLine.Business if (bIsValidUTF8) { string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode); - Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + Console.WriteLine(DateTime.Now + ":Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + } else { string strCode = Encoding.GetEncoding("GB2312").GetString(stBcrResult.stBcrInfoEx2[i].chCode); - Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + Console.WriteLine(DateTime.Now + ":外侧扫码器==>Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + log.Info(DateTime.Now + ":外侧扫码器==>Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp); if (strCode.Trim().TrimEnd('\0').Length == 20) { + //更新扫码器存活时间 + ShellLiveTime = DateTime.Now; RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), ShellScannerIp); // 业务处理 } else { - Console.WriteLine("外侧--->No Read 处理"); + Console.WriteLine(DateTime.Now + ":外侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); + log.Info(DateTime.Now + ":外侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); } } @@ -106,7 +125,10 @@ namespace Aucma.Core.ProductOffLine.Business // Console.WriteLine("CodeNum[" + Convert.ToString(stBcrResult.nCodeNum) + "]"); if (stBcrResult.nCodeNum == 0) { - Console.WriteLine("内侧--->No Read 处理"); + Console.WriteLine(DateTime.Now+":内侧--->No Read 处理"); + log.Info(DateTime.Now + ":内侧--->No Read 处理"); + // 更新存活时间 + LinerLiveTime = DateTime.Now; } for (Int32 i = 0; i < stBcrResult.nCodeNum; i++) { @@ -114,24 +136,27 @@ namespace Aucma.Core.ProductOffLine.Business if (bIsValidUTF8) { string strCode = Encoding.UTF8.GetString(stBcrResult.stBcrInfoEx2[i].chCode); - Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + Console.WriteLine(DateTime.Now + ":Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); } else { string strCode = Encoding.GetEncoding("GB2312").GetString(stBcrResult.stBcrInfoEx2[i].chCode); - Console.WriteLine("Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + Console.WriteLine(DateTime.Now + ":内侧扫码器==>Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); + log.Info(DateTime.Now + ":内侧扫码器==>Get CodeNum: " + "CodeNum[" + i.ToString() + "], CodeString[" + strCode.Trim().TrimEnd('\0') + "]"); // RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp); if (strCode.Trim().TrimEnd('\0').Length == 20) { + // 更新存活时间 + LinerLiveTime = DateTime.Now; // 业务处理 RefreshMaterialCodeStrEvent?.Invoke(strCode.Trim().TrimEnd('\0'), LinerScannerIp); } else { - Console.WriteLine("内侧--->No Read 处理"); + Console.WriteLine(DateTime.Now + "内侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); + log.Info(DateTime.Now + "内侧扫码器==>条码:" + strCode.Trim().TrimEnd('\0') + "长度不为20,当做No Read 处理"); } - } } @@ -208,13 +233,17 @@ namespace Aucma.Core.ProductOffLine.Business // ch:打开设备 | en:Open device nRet = device.MV_CODEREADER_OpenDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) { Console.WriteLine("Open device failed:{0:x8}", nRet); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); break; } + // 刷新扫码器状态 - RefreshStateEvent?.Invoke("外侧"); + RefreshStateEvent?.Invoke("外侧",true); // ch:注册回调函数 | en:Register image callback ImageCallback = new MvCodeReader.cbOutputEx2delegate(ShellImageCallbackFunc); nRet = device.MV_CODEREADER_RegisterImageCallBackEx2_NET(ImageCallback, IntPtr.Zero); @@ -231,8 +260,11 @@ namespace Aucma.Core.ProductOffLine.Business Console.WriteLine("Start grabbing failed:{0:x8}", nRet); break; } - + + // 关闭使用 + ShellDevice = device; Console.WriteLine("Press enter to exit"); + Console.WriteLine(DateTime.Now.ToString()); Console.ReadLine(); // ch:停止抓图 | en:Stop grabbing @@ -339,10 +371,12 @@ namespace Aucma.Core.ProductOffLine.Business if (MvCodeReader.MV_CODEREADER_OK != nRet) { Console.WriteLine("Open device failed:{0:x8}", nRet); + // 刷新扫码器状态 + RefreshStateEvent?.Invoke("外侧", false); break; } // 刷新扫码器状态 - RefreshStateEvent?.Invoke("内侧"); + RefreshStateEvent?.Invoke("内侧", true); // ch:注册回调函数 | en:Register image callback ImageCallback = new MvCodeReader.cbOutputEx2delegate(LinerImageCallbackFunc); @@ -360,8 +394,11 @@ namespace Aucma.Core.ProductOffLine.Business Console.WriteLine("Start grabbing failed:{0:x8}", nRet); break; } + // 关闭使用 + ShellDevice = device; Console.WriteLine("Press enter to exit"); + Console.WriteLine(DateTime.Now.ToString()); Console.ReadLine(); // ch:停止抓图 | en:Stop grabbing @@ -401,6 +438,114 @@ namespace Aucma.Core.ProductOffLine.Business } + /// + /// 关闭内胆扫码器 + /// + public static void CloseLiner() + { + int nRet = MvCodeReader.MV_CODEREADER_OK; + MvCodeReader device = LinerDevice; + // ch:停止抓图 | en:Stop grabbing + nRet = device.MV_CODEREADER_StopGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Stop grabbing failed{0:x8}", nRet); + return; + } + + // ch:关闭设备 | en:Close device + nRet = device.MV_CODEREADER_CloseDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Close device failed{0:x8}", nRet); + return; + } + + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + return; + } + Console.WriteLine("关闭内胆扫码器成功"); + return; + } + + /// + /// 关闭箱壳扫码器 + /// + public static void CloseShell() + { + int nRet = MvCodeReader.MV_CODEREADER_OK; + MvCodeReader device = ShellDevice; + // ch:停止抓图 | en:Stop grabbing + nRet = device.MV_CODEREADER_StopGrabbing_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Stop grabbing failed{0:x8}", nRet); + return; + } + + // ch:关闭设备 | en:Close device + nRet = device.MV_CODEREADER_CloseDevice_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Close device failed{0:x8}", nRet); + return; + } + + // ch:销毁设备 | en:Destroy device + nRet = device.MV_CODEREADER_DestroyHandle_NET(); + if (MvCodeReader.MV_CODEREADER_OK != nRet) + { + Console.WriteLine("Destroy device failed:{0:x8}", nRet); + return; + } + Console.WriteLine("关闭箱壳扫码器成功"); + return; + } + + /// + /// 监测扫码器15分钟以内是否有触发操作,如果超时未触发,关闭再重连扫码器 + /// + public static void JudgeShellIsConnectedAndReConnect() + { + try + { + DateTime dateTime = DateTime.Now; + TimeSpan timeSpan = dateTime.Subtract(ShellLiveTime); + Task.Run(() => + { + if (timeSpan.TotalMinutes >= 1) + { + Console.WriteLine("箱壳扫码器超时,重连"); + ShellLiveTime = dateTime; + CloseShell(); + Shell(); + } + }); + Task.Run(() => + { + TimeSpan timeSpan2 = dateTime.Subtract(LinerLiveTime); + if (timeSpan2.TotalMinutes >= 1) + { + Console.WriteLine("内胆扫码器超时,重连"); + LinerLiveTime = dateTime; + CloseLiner(); + Liner(); + } + }); + + } + catch (Exception ex) + { + log.Error("JudgeShellIsConnectedAndReConnect判断扫码器重连方法异常:"+ex.Message.ToString()); + } + + } + + #region 判断字符编码 /// /// 判断字符编码