Пример #1
0
 /// <summary>
 /// 保存刷卡记录
 /// </summary>
 /// <param name="objData">刷卡实体</param>
 private void SaveSwipingCardData(SwipingCardData objData)
 {
     if (objData != null)
     {
         try
         {
             IDAL.ICardLog objDAL = DALFactory.DALFactory.CardLog();
             int           iNewID = objDAL.Add(objData, out string strErrInfo);
             if (!string.IsNullOrEmpty(strErrInfo))
             {
                 DoNotice(string.Format("保存刷卡记录失败,错误原因:\r\n{0}", strErrInfo));
             }
         }
         catch (Exception err)
         {
             DoNotice(string.Format("保存刷卡记录失败,错误原因:\r\n{0}", err.Message));
         }
     }
 }
Пример #2
0
        /// <summary>
        /// 解包刷卡响应包
        /// </summary>
        /// <param name="bArrBag"></param>
        /// <returns></returns>
        public static bool ParseBag_SwipingCard(byte[] bArrBag, ref SwipingCardData objSwipingCardData, out string strErrMsg)
        {
            bool bIfSucc = false;

            strErrMsg = "";
            try
            {
                //55 FF 00 12 20 01 00 00 00 00 06 12 34 00 01 F0 00 1D 00 9C 00 00 6D 刷卡头刷卡上传
                //数据位
                byte bCode = bArrBag[5];
                if (bCode == 0x01)
                {
                    //解析源地址
                    //解析设备类型
                    byte bDeviceType = Convert.ToByte(bArrBag[10] & 0x7F); //01111111
                    objSwipingCardData.DeviceType = GetDeviceType(bDeviceType);
                    //解析设备地址
                    byte[] bArrDeviceNo = new byte[2];
                    Array.Copy(bArrBag, 11, bArrDeviceNo, 0, bArrDeviceNo.Length);
                    objSwipingCardData.DeviceNo = ScaleConverter.ByteArr2HexStr(bArrDeviceNo).Replace(" ", "");

                    //解析卡类型
                    byte bCardType = bArrBag[15];
                    objSwipingCardData.CardType = GetCardType(bCardType);

                    int iBeginIndex = 16;
                    //解析卡号
                    byte[] bArrCardNo = new byte[4];
                    for (int i = bArrCardNo.Length - 1; i >= 0; i--)
                    {
                        bArrCardNo[i] = bArrBag[iBeginIndex++];
                    }
                    objSwipingCardData.CardNo = Functions.ConverToUInt(bArrCardNo);//低字节在前,高字节在后

                    bIfSucc = true;
                }
            }
            catch (Exception err)
            {
                strErrMsg = err.Message;
            }
            return(bIfSucc);
        }
Пример #3
0
        private bool ProcessOne(byte[] bufFrame, out string strErrMsg)
        {
            bool bIfSucc = false;

            strErrMsg = "";
            Package.ECommandType eResponseType = Package.GetResponseType(bufFrame, out strErrMsg);
            switch (eResponseType)
            {
            case Package.ECommandType.SwipingCard:
                SwipingCardData objSwipingCardData = new SwipingCardData();
                IList <string>  listResponseData   = new List <string>();
                bIfSucc = Package.ParseBag_SwipingCard(bufFrame, ref objSwipingCardData, out strErrMsg);
                if (bIfSucc)
                {
                    SwipingCardData objSent = (objSwipingCardData != null) ? (SwipingCardData)objSwipingCardData.Clone() : null;
                    _OnReceiveSwipingCard?.Invoke(objSent, strErrMsg);

                    DoNotice(string.Format("接收刷卡数据正确"), bufFrame);

                    //保存记录
                    SaveSwipingCardData(objSent);

                    //响应
                    byte[] bArrTargetAddress  = new byte[5];
                    byte[] bArrOrigialAddress = new byte[5];
                    Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length);
                    Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length);

                    //55 AA 00 0B 20 01 00 00 00 00 06 12 34 00 01 1E  主机链路层ACK
                    byte[] bArrBag = Package.BuildBag_MainDeviceACK(bArrTargetAddress, bArrOrigialAddress);
                    bIfSucc = SendCommand(bArrBag, out strErrMsg);
                    DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag);

                    /*
                     * Thread.Sleep(50);//停顿数50毫秒
                     *
                     * //55 FF 00 0C 21 06 12 34 00 01 01 00 00 00 00 00 xx 主机应答
                     * byte[] bArrBag2 = Package.BuildBag_MainDeviceResponse(bArrTargetAddress, bArrOrigialAddress);
                     * bIfSucc = SendCommand(bArrBag2, out strErrMsg);
                     * DoNotice(string.Format("{0}{1}", "发送主机应答指令", (bIfSucc ? "成功" : "失败")), bArrBag2);
                     * if (!(bArrBag2 == null || bArrBag2.Length == 0))
                     * {
                     *  this._LastReSendTime = DateTime.Now;
                     *  this._RetryCommandList.Add(new Model.RetryCommand(ScaleConverter.ByteArr2HexStr(bArrBag2).Replace(" ", ""), 1));
                     * }
                     * //55 AA 00 0B 21 06 12 34 00 01 01 00 00 00 00 XX 刷卡头链路层ACK
                     */

                    bIfSucc = true;
                }
                break;

            case Package.ECommandType.CardHeadDeviceACK:
                try
                {
                    if (!(this._RetryCommandList == null || this._RetryCommandList.Count == 0))
                    {
                        string strBuffHexStr    = "";
                        string strCommandHexStr = "";
                        for (int i = this._RetryCommandList.Count - 1; i >= 0; i--)
                        {
                            Model.RetryCommand objCommand = (Model.RetryCommand) this._RetryCommandList[i];
                            if (objCommand != null)
                            {
                                strCommandHexStr = objCommand.CommandHexStr.Substring(10, 20);
                                strBuffHexStr    = ScaleConverter.ByteArr2HexStr(bufFrame).Replace(" ", "").Substring(10, 20);
                                if (string.Compare(strCommandHexStr, strBuffHexStr) == 0)
                                {
                                    this._RetryCommandList.RemoveAt(i);
                                }
                            }
                        }
                    }
                }
                catch (Exception err)
                {
                    strErrMsg = err.Message;
                }
                DoNotice(string.Format("接收刷卡头链路层ACK指令"), bufFrame);
                bIfSucc = true;
                break;

            case Package.ECommandType.PingResponse:
                DeviceAddress objDeviceAddress = new DeviceAddress();
                bIfSucc = Package.ParseBag_PingResponse(bufFrame, ref objDeviceAddress, out strErrMsg);
                if (bIfSucc)
                {
                    DeviceAddress objSent = (objDeviceAddress != null) ? (DeviceAddress)objDeviceAddress.Clone() : null;
                    _OnPingResponse?.Invoke(objSent, strErrMsg);
                    //响应
                    byte[] bArrTargetAddress  = new byte[5];
                    byte[] bArrOrigialAddress = new byte[5];
                    Array.Copy(bufFrame, 5, bArrTargetAddress, 0, bArrTargetAddress.Length);
                    Array.Copy(bufFrame, 10, bArrOrigialAddress, 0, bArrOrigialAddress.Length);

                    //Thread.Sleep(50);//停顿数50毫秒

                    //55 FF 00 0D 93 01 00 00 00 00 06 12 34 00 00 41 98 FE  从机PING应答
                    //55 AA 00 0B 93 01 00 00 00 00 06 12 34 00 00 09 AA   主机链路层应答

                    byte[] bArrBag = Package.BuildBag_MainDeviceACK4Ping(bArrTargetAddress, bArrOrigialAddress);
                    bIfSucc = SendCommand(bArrBag, out strErrMsg);
                    //DoNotice(string.Format("{0}{1}", "发送主机链路层ACK指令", (bIfSucc ? "成功" : "失败")), bArrBag);

                    //_OnPingNotice?.Invoke(string.Format("发送Ping指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag);
                    //if (_OnPingNotice != null) _OnPingNotice(string.Format("发送主机链路层ACK指令{0}", (bIfSucc ? "成功" : "失败")), bArrBag);
                }
                break;

            case Package.ECommandType.MainDeviceACK4PingResponse:
                DeviceAddress objDeviceAddress1 = new DeviceAddress();
                bIfSucc = Package.ParseBag_MainDeviceACK4PingResponse(bufFrame, ref objDeviceAddress1, out strErrMsg);
                if (bIfSucc)
                {
                    DeviceAddress objSent = (objDeviceAddress1 != null) ? (DeviceAddress)objDeviceAddress1.Clone() : null;
                    _OnMainDeviceACK4PingResponse?.Invoke(objSent, strErrMsg);
                }
                break;

            default:
                strErrMsg = "无效数据";
                bIfSucc   = false;
                break;
            }
            return(bIfSucc);
        }