/// <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)); } } }
/// <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); }
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); }