xiongzhu пре 5 година
родитељ
комит
229d9bc5a9
2 измењених фајлова са 347 додато и 0 уклоњено
  1. 248 0
      libs/HCNetSDK.cs
  2. 99 0
      model/AcsDevice.cs

+ 248 - 0
libs/HCNetSDK.cs

@@ -3585,5 +3585,253 @@ namespace DeviceCenter
         [DllImport(@"HCNetSDK.dll")]
         public static extern bool NET_DVR_CaptureJPEGPicture(int lUserID, int lChannel, ref CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara, IntPtr sPicFileName);
         #endregion
+
+        #region 门禁卡,指纹,人脸接口优化新增命令码及结构体
+        public const int NET_DVR_GET_CARD = 2560;
+        public const int NET_DVR_SET_CARD = 2561;
+        public const int NET_DVR_DEL_CARD = 2562;
+        public const int NET_DVR_GET_FINGERPRINT = 2563;
+        public const int NET_DVR_SET_FINGERPRINT = 2564;
+        public const int NET_DVR_DEL_FINGERPRINT = 2565;
+        public const int NET_DVR_GET_FACE = 2566;
+        public const int NET_DVR_SET_FACE = 2567;
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_CARD_COND
+        {
+            public uint dwSize;
+            public uint dwCardNum; //card number, 0xffffffff means to get all card information when getting
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 64, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byRes = new byte[64];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_CARD_RECORD
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            public byte byCardType;
+            public byte byLeaderCard;
+            public byte byUserType;
+            public byte byRes1;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOOR_NUM_256, ArraySubType = UnmanagedType.I1)]
+            public byte[] byDoorRight;
+            public NET_DVR_VALID_PERIOD_CFG struValid;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_GROUP_NUM_128, ArraySubType = UnmanagedType.I1)]
+            public byte[] byBelongGroup;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = CARD_PASSWORD_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardPassword;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_DOOR_NUM_256, ArraySubType = UnmanagedType.I1)]
+            public ushort[] wCardRightPlan;
+            public uint dwMaxSwipeTimes;
+            public uint dwSwipeTimes;
+            public uint dwEmployeeNo;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = NAME_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byName;
+            //按位表示,0-无权限,1-有权限
+            //第0位表示:弱电报警
+            //第1位表示:开门提示音
+            //第2位表示:限制客卡
+            //第3位表示:通道
+            //第4位表示:反锁开门
+            //第5位表示:巡更功能
+            public uint dwCardRight;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 256, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byDoorRight = new byte[MAX_DOOR_NUM_256];
+                byBelongGroup = new byte[MAX_GROUP_NUM_128];
+                byCardPassword = new byte[CARD_PASSWORD_LEN];
+                wCardRightPlan = new ushort[MAX_DOOR_NUM_256];
+                byName = new byte[NAME_LEN];
+                byRes = new byte[256];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FINGERPRINT_COND
+        {
+            public uint dwSize;
+            public uint dwFingerPrintNum; //the number send or get. if get,0xffffffff means all
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo;
+            public uint dwEnableReaderNo;
+            public byte byFingerPrintID;
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 131, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes = new byte[131];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FACE_COND
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            public uint dwFaceNum; //the number send or get. if get,0xffffffff means all
+            public uint dwEnableReaderNo;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 124, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes = new byte[124];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_CARD_SEND_DATA
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 16, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes = new byte[16];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FACE_RECORD
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            public uint dwFaceLen;
+            public IntPtr pFaceBuffer;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 128, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes = new byte[128];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_CARD_STATUS
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            public uint dwErrorCode;
+            public byte byStatus; //0-fail, 1-success
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 23, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes = new byte[23];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FACE_STATUS
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ERROR_MSG_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byErrorMsg; //下发错误信息,当byCardReaderRecvStatus为4时,表示已存在人脸对应的卡号
+            public uint dwReaderNo; //人脸读卡器编号,可用于下发错误返回
+            public byte byRecvStatus; //人脸读卡器状态,按字节表示,0-失败,1-成功,2-重试或人脸质量差,3-内存已满(人脸数据满),4-已存在该人脸,5-非法人脸ID
+            //,6-算法建模失败,7-未下发卡权限,8-未定义(保留),9-人眼间距小距小,10-图片数据长度小于1KB,11-图片格式不符(png/jpg/bmp),12-图片像素数量超过上限,13-图片像素数量低于下限,14-图片信息校验失败,15-图片解码失败,16-人脸检测失败,17-人脸评分失败
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 131, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byErrorMsg = new byte[ERROR_MSG_LEN];
+                byRes = new byte[131];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FINGERPRINT_RECORD
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //card No
+            public uint dwFingerPrintLen; //指纹数据长度
+            public uint dwEnableReaderNo; //需要下发指纹的读卡器编号
+            public byte byFingerPrintID; //手指编号,有效值范围为1-10
+            public byte byFingerType; //指纹类型  0-普通指纹,1-胁迫指纹
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 30, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes1;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = MAX_FINGER_PRINT_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byFingerData; //指纹数据内容
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 96, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byRes1 = new byte[30];
+                byFingerData = new byte[MAX_FINGER_PRINT_LEN];
+                byRes = new byte[96];
+            }
+        }
+
+        [StructLayoutAttribute(LayoutKind.Sequential)]
+        public struct NET_DVR_FINGERPRINT_STATUS
+        {
+            public uint dwSize;
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ACS_CARD_NO_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byCardNo; //指纹关联的卡号
+            public byte byCardReaderRecvStatus; //指纹读卡器状态,按字节表示,0-失败,1-成功,2-该指纹模组不在线,3-重试或指纹质量差,4-内存已满,5-已存在该指纹,6-已存在该指纹ID,7-非法指纹ID,8-该指纹模组无需配置
+            public byte byFingerPrintID; //手指编号,有效值范围为1-10
+            public byte byFingerType; //指纹类型  0-普通指纹,1-胁迫指纹
+            public byte byRecvStatus; //主机错误状态:0-成功,1-手指编号错误,2-指纹类型错误,3-卡号错误(卡号规格不符合设备要求),4-指纹未关联工号或卡号(工号或卡号字段为空),5-工号不存在,6-指纹数据长度为0,7-读卡器编号错误,8-工号错误
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ERROR_MSG_LEN, ArraySubType = UnmanagedType.I1)]
+            public byte[] byErrorMsg; //下发错误信息,当byCardReaderRecvStatus为5时,表示已存在指纹对应的卡号
+            public uint dwCardReaderNo; //当byCardReaderRecvStatus为5时,表示已存在指纹对应的指纹读卡器编号,可用于下发错误返回。0时表示无错误信息
+            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 20, ArraySubType = UnmanagedType.I1)]
+            public byte[] byRes;
+
+            public void Init()
+            {
+                byCardNo = new byte[ACS_CARD_NO_LEN];
+                byErrorMsg = new byte[ERROR_MSG_LEN];
+                byRes = new byte[20];
+            }
+        }
+
+        // 新增接口一个
+        [DllImportAttribute(@"..\..\..\HCNetSDK\HCNetSDK.dll")]
+        public static extern int NET_DVR_SendWithRecvRemoteConfig(int lHandle, IntPtr lpInBuff, uint dwInBuffSize, IntPtr lpOutBuff, uint dwOutBuffSize, ref uint dwOutDataLen);
+
+        // 用户调用SendwithRecv接口时,接口返回的状态
+        public enum NET_SDK_SENDWITHRECV_STATUS
+        {
+            NET_SDK_CONFIG_STATUS_SUCCESS = 1000,    // 成功读取到数据,客户端处理完本次数据后需要再次调用NET_DVR_SendWithRecvRemoteConfig获取下一条数据
+            NET_SDK_CONFIG_STATUS_NEEDWAIT,          // 配置等待,客户端可重新NET_DVR_SendWithRecvRemoteConfig
+            NET_SDK_CONFIG_STATUS_FINISH,            // 数据全部取完,此时客户端可调用NET_DVR_StopRemoteConfig结束
+            NET_SDK_CONFIG_STATUS_FAILED,            // 配置失败,客户端可重新NET_DVR_SendWithRecvRemoteConfig
+            NET_SDK_CONFIG_STATUS_EXCEPTION,         // 配置异常,此时客户端可调用NET_DVR_StopRemoteConfig结束
+        }
+
+        #endregion
     }
 }

+ 99 - 0
model/AcsDevice.cs

@@ -2,11 +2,13 @@
 using log4net;
 using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
 using System.Runtime.InteropServices;
 using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
+using System.Windows.Interop;
 
 namespace DeviceCenter
 {
@@ -242,7 +244,18 @@ namespace DeviceCenter
                 if ("MINOR_FACE_VERIFY_PASS".Equals(eventType) || "MINOR_FACE_VERIFY_FAIL".Equals(eventType))
                 {
                     Dictionary<string, string> data = new Dictionary<string, string>();
+                    if (!string.IsNullOrEmpty(cardNo))
+                    {
+                        try
+                        {
+                            employNo = getEmployNo(cardNo);
+                        }
+                        catch (Exception ex)
+                        {
+                            log.Error("get employNo error", ex);
+                        }
 
+                    }
                     data.Add("pass", "MINOR_FACE_VERIFY_PASS".Equals(eventType).ToString());
                     data.Add("cardNo", cardNo);
                     data.Add("employNo", employNo);
@@ -396,5 +409,91 @@ namespace DeviceCenter
 
             return eventList;
         }
+
+        private string getEmployNo(string cardNo)
+        {
+            CHCNetSDK.NET_DVR_CARD_COND struCond = new CHCNetSDK.NET_DVR_CARD_COND();
+            struCond.Init();
+            struCond.dwSize = (uint)Marshal.SizeOf(struCond);
+            struCond.dwCardNum = 1;
+            IntPtr ptrStruCond = Marshal.AllocHGlobal((int)struCond.dwSize);
+            Marshal.StructureToPtr(struCond, ptrStruCond, false);
+
+            CHCNetSDK.NET_DVR_CARD_RECORD struData = new CHCNetSDK.NET_DVR_CARD_RECORD();
+            struData.Init();
+            struData.dwSize = (uint)Marshal.SizeOf(struData);
+            byte[] byTempCardNo = new byte[CHCNetSDK.ACS_CARD_NO_LEN];
+            byTempCardNo = System.Text.Encoding.UTF8.GetBytes(cardNo);
+            for (int i = 0; i < byTempCardNo.Length; i++)
+            {
+                struData.byCardNo[i] = byTempCardNo[i];
+            }
+            IntPtr ptrStruData = Marshal.AllocHGlobal((int)struData.dwSize);
+            Marshal.StructureToPtr(struData, ptrStruData, false);
+
+            CHCNetSDK.NET_DVR_CARD_SEND_DATA struSendData = new CHCNetSDK.NET_DVR_CARD_SEND_DATA();
+            struSendData.Init();
+            struSendData.dwSize = (uint)Marshal.SizeOf(struSendData);
+            for (int i = 0; i < byTempCardNo.Length; i++)
+            {
+                struSendData.byCardNo[i] = byTempCardNo[i];
+            }
+            IntPtr ptrStruSendData = Marshal.AllocHGlobal((int)struSendData.dwSize);
+            Marshal.StructureToPtr(struSendData, ptrStruSendData, false);
+            int m_lGetCardCfgHandle = CHCNetSDK.NET_DVR_StartRemoteConfig(userId, CHCNetSDK.NET_DVR_GET_CARD, ptrStruCond, (int)struCond.dwSize, null, Process.GetCurrentProcess().MainWindowHandle);
+            if (m_lGetCardCfgHandle < 0)
+            {
+                log.Error("NET_DVR_GET_CARD error: " + CHCNetSDK.NET_DVR_GetLastError());
+                Marshal.FreeHGlobal(ptrStruCond);
+                return null;
+            }
+            else
+            {
+                int dwState = (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS;
+                uint dwReturned = 0;
+                while (true)
+                {
+                    dwState = CHCNetSDK.NET_DVR_SendWithRecvRemoteConfig(m_lGetCardCfgHandle, ptrStruSendData, struSendData.dwSize, ptrStruData, struData.dwSize, ref dwReturned);
+                    struData = (CHCNetSDK.NET_DVR_CARD_RECORD)Marshal.PtrToStructure(ptrStruData, typeof(CHCNetSDK.NET_DVR_CARD_RECORD));
+                    if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_NEEDWAIT)
+                    {
+                        Thread.Sleep(10);
+                        continue;
+                    }
+                    else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FAILED)
+                    {
+                        MessageBox.Show("NET_DVR_GET_CARD fail error: " + CHCNetSDK.NET_DVR_GetLastError());
+                    }
+                    else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_SUCCESS)
+                    {
+                        string cardRightPlan = struData.wCardRightPlan[0].ToString();
+                        string employNo = struData.dwEmployeeNo.ToString();
+                        string name = System.Text.Encoding.Default.GetString(struData.byName);
+                        log.Info($"NET_DVR_GET_CARD success:: employNo:{employNo} name:{name}");
+                        return employNo;
+                    }
+                    else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_FINISH)
+                    {
+                        log.Info("NET_DVR_GET_CARD finish");
+                        break;
+                    }
+                    else if (dwState == (int)CHCNetSDK.NET_SDK_SENDWITHRECV_STATUS.NET_SDK_CONFIG_STATUS_EXCEPTION)
+                    {
+                        log.Error("NET_DVR_GET_CARD exception error: " + CHCNetSDK.NET_DVR_GetLastError());
+                        break;
+                    }
+                    else
+                    {
+                        log.Error("unknown status error: " + CHCNetSDK.NET_DVR_GetLastError());
+                        break;
+                    }
+                }
+            }
+            CHCNetSDK.NET_DVR_StopRemoteConfig(m_lGetCardCfgHandle);
+            m_lGetCardCfgHandle = -1;
+            Marshal.FreeHGlobal(ptrStruSendData);
+            Marshal.FreeHGlobal(ptrStruData);
+            return null;
+        }
     }
 }