/// <summary>
        /// 设置门禁主机时间
        /// </summary>
        /// <param name="deviceIp">门禁主机ip</param>
        /// <returns>true:成功 false:失败</returns>
        public bool SetDeviceTime(string deviceIp)
        {
            CHDOperate op = GetOPByIP(deviceIp);
            bool       b  = false;

            if (null != op && !string.IsNullOrWhiteSpace(deviceIp))
            {
                if (!op.isLinkOn)
                {
                    op.isLinkOn = op.LinkOn(false);
                }
                if (op.isLinkOn)
                {
                    b = op.SetDeviceTime();
                    if (!b)
                    {
                        CHDDoorUseInfo info = GetUseInfo(deviceIp);
                        if (null != info)
                        {
                            ReLogin(info);
                        }
                    }
                    return(b);
                }
            }
            TextMsg?.Invoke(string.Format("门禁主机 {0} 同步时间 {1} 失败···", deviceIp, DateTime.Now));
            return(b);
        }
        /// <summary>
        /// 登出门禁主机
        /// </summary>
        /// <param name="userInfo">门禁主机信息</param>
        public bool LoginOut(CHDDoorUseInfo userInfo)
        {
            CHDOperate op = GetOPByIP(userInfo.DeviceIp);

            if (null != op)
            {
                return(op.DisConnectionDevice());
            }
            return(false);
        }
        /// <summary>
        /// 重新登录门禁主机
        /// </summary>
        /// <param name="infos">门禁主机信息</param>
        public void ReLogin(CHDDoorUseInfo infos)
        {
            LoginOut(infos);
            CHDOperate op = GetOPByIP(infos.DeviceIp);

            if (null != op)
            {
                opera.Remove(op);
            }
            (new Thread(new ParameterizedThreadStart(LoginDevice))
            {
                IsBackground = true
            }).Start(infos);
        }
        private void LoginDevice(object obj)
        {
            CHDDoorUseInfo item = obj as CHDDoorUseInfo;
            CHDOperate     op   = new CHDOperate();

            op.CHDLogMsg    += Op_CHDLogMsg;
            op.CHDEventInfo += Op_CHDEventInfo;
            serverIsStart    = true;
            bool b = false;

            for (int i = 0; i < 5; i++)
            {
                try
                {
                    if (!serverIsStart)
                    {
                        return;
                    }
                    b = op.ConnectionDevice(item.DeviceIp, DeviceType.CHD806D2CP, portOrBaud: (int)item.DevicePoint, szSysPwd: item.UserName, szKeyPwd: item.UserPwd);
                    if (b)
                    {
                        opera.Add(op);
                        (new Thread(new ParameterizedThreadStart(LinkOn))
                        {
                            IsBackground = true
                        }).Start(op);
                        break;
                    }
                    else
                    {
                        Thread.Sleep(20);
                    }
                }
                catch (Exception) { }
            }
        }
        /// <summary>
        /// 门禁远程操作
        /// </summary>
        /// <param name="deviceIp">门禁主机ip</param>
        /// <param name="type">操作类型</param>
        /// <param name="doorId">门禁编号</param>
        /// <param name="delay">持续时间</param>
        /// <param name="userCard">用户门禁卡</param>
        /// <returns>true:成功 false:失败</returns>
        public bool ControlDoor(string deviceIp, CHDControlDoorType type, uint doorId, uint delay, string userCard)
        {
            CHDOperate op = GetOPByIP(deviceIp);

            if (null != op)
            {
                // CHDDoorUseInfo info = GetUseInfo(deviceIp);
                bool b = false;
                if (op.isLinkOn)
                {
                    switch (type)
                    {
                    case CHDControlDoorType.Open:
                        b = op.OpenDoor(doorId, delay, userCard);
                        break;

                    case CHDControlDoorType.StartOpen:
                        b = op.OpenAlwaysOpenDoor(doorId, delay, userCard);
                        break;

                    case CHDControlDoorType.StartClose:
                        b = op.OpenAlwaysCloseDoor(doorId, delay, userCard);
                        break;

                    case CHDControlDoorType.EndOpen:
                        b = op.CloseAlwaysOpenDoor(doorId, userCard);
                        break;

                    case CHDControlDoorType.EndClose:
                        b = op.CloseAlwaysCloseDoor(doorId, userCard);
                        break;
                    }
                    if (!b)
                    {
                        if (!op.ReConnection())
                        {
                            CHDDoorUseInfo info = GetUseInfo(deviceIp);
                            if (null != info)
                            {
                                ReLogin(info);
                            }
                        }
                        op.isLinkOn = op.LinkOn(true);
                    }
                    return(b);
                }
                else
                {
                    TextMsg?.Invoke(string.Format("门禁主机 {0} 远程 {1} 操作失败,身份确认失败···", deviceIp + " " + doorId, type.ToString()));
                    if (!op.ReConnection())
                    {
                        CHDDoorUseInfo info = GetUseInfo(deviceIp);
                        if (null != info)
                        {
                            ReLogin(info);
                        }
                    }
                    op.isLinkOn = op.LinkOn(true);
                    return(false);
                }
            }
            TextMsg?.Invoke(string.Format("门禁主机 {0} 远程 {1} 操作失败···", deviceIp + " " + doorId, type.ToString()));
            return(false);
        }