/// <summary> /// 预消费 /// </summary> /// <param name="paid">消费金额(分为单位)</param> /// <param name="walletType">钱包类型 1表示M1 2表示CPU</param> /// <param name="maxOfflineMonth">离线过期月数</param> /// <returns></returns> public YCTPaymentInfo Prepaid(int paid, int walletType, int maxOfflineMonth = 0) { DateTime dt = DateTime.Now; List <byte> data = new List <byte>(); data.AddRange(BEBinaryConverter.IntToBytes(paid)); data.AddRange(BEBinaryConverter.IntToBytes(paid)); data.Add(BCDConverter.IntToBCD(dt.Year / 100)); data.Add(BCDConverter.IntToBCD(dt.Year % 100)); data.Add(BCDConverter.IntToBCD(dt.Month)); data.Add(BCDConverter.IntToBCD(dt.Day)); data.Add(BCDConverter.IntToBCD(dt.Hour)); data.Add(BCDConverter.IntToBCD(dt.Minute)); data.Add(BCDConverter.IntToBCD(dt.Second)); data.Add((byte)(maxOfflineMonth > 0 ? 0x01 : 0x00)); data.Add(BCDConverter.IntToBCD(maxOfflineMonth)); var response = Request(YCTCommandType.Prepaid, data.ToArray()); if (response != null && response.IsCommandExcuteOk) { if (walletType == 1) { return(GetPaymentInfoFromM1(response)); } if (walletType == 2) { return(GetPaymentInfoFromCPU(response)); } } return(null); }
/// <summary> /// 设置商家编号 /// </summary> /// <param name="code"></param> /// <returns></returns> public bool SetServiceCode(int code) { code = code % 10000; //取数值的低四位 byte[] bcd = new byte[] { BCDConverter.IntToBCD(code / 100), BCDConverter.IntToBCD(code % 100) }; var response = Request(YCTCommandType.SetServiceCode, bcd); return(response != null && response.IsCommandExcuteOk); }
/// <summary> /// 根据卡片实体类生成卡片数据 /// </summary> /// <param name="info"></param> /// <returns></returns> public byte[] CreateDateBytes(CardInfo info) { try { int block0 = 0 * 16; int block1 = 1 * 16; int block2 = 2 * 16; byte[] tempbytes = new byte[4]; byte[] data = new byte[48]; #region 块0 data[block0 + 0] = info.CardVersion; //这里需要使用CardType来判断,如使用IsMonthCard,业主卡也属于月租卡 data[block0 + 1] |= GetByte(info.CardType); data[block0 + 1] |= (byte)((info.CarType & 0x03) << 4); data[block0 + 1] |= 0x40;//预留,置1 data[block0 + 1] |= info.Status == CardStatus.Enabled ? (byte)0x80 : (byte)0x00; data[block0 + 2] |= info.OnlineHandleWhenOfflineMode ? (byte)0x00 : (byte)0x01; data[block0 + 2] |= 0x02;//预留,置1 data[block0 + 2] |= info.CanRepeatIn ? (byte)0x00 : (byte)0x04; data[block0 + 2] |= info.CanRepeatOut ? (byte)0x00 : (byte)0x08; data[block0 + 2] |= info.WithCount ? (byte)0x10 : (byte)0x00; data[block0 + 2] |= info.CanEnterWhenFull ? (byte)0x00 : (byte)0x20; data[block0 + 2] |= info.HolidayEnabled ? (byte)0x40 : (byte)0x00; data[block0 + 2] |= info.EnableWhenExpired ? (byte)0x00 : (byte)0x80; data[block0 + 3] = info.AccessID; if (info.ActivationDate != null && info.ActivationDate != DateTime.MaxValue) { if (info.ActivationDate == DateTime.MinValue) { data[block0 + 4] = 0xFF; data[block0 + 5] = 0xFF; data[block0 + 6] = 0xFF; } else if (info.ActivationDate.Year - 2000 >= 0) { data[block0 + 4] = BCDConverter.IntToBCD(info.ActivationDate.Year % 100); data[block0 + 5] = BCDConverter.IntToBCD(info.ActivationDate.Month); data[block0 + 6] = BCDConverter.IntToBCD(info.ActivationDate.Day); } } if (info.ValidDate != null && info.ValidDate != DateTime.MinValue) { if (info.ValidDate == DateTime.MaxValue) { data[block0 + 7] = 0xFF; data[block0 + 8] = 0xFF; data[block0 + 9] = 0xFF; } else if (info.ValidDate.Year - 2000 >= 0) { data[block0 + 7] = BCDConverter.IntToBCD(info.ValidDate.Year % 100); data[block0 + 8] = BCDConverter.IntToBCD(info.ValidDate.Month); data[block0 + 9] = BCDConverter.IntToBCD(info.ValidDate.Day); } } data[block0 + 10] = 0xFF; //预留(留作卡号等使用),默认0xFF data[block0 + 11] = 0xFF; //预留(留作卡号等使用),默认0xFF data[block0 + 12] = 0xFF; //预留(留作卡号等使用),默认0xFF data[block0 + 13] = 0xFF; //预留(留作卡号等使用),默认0xFF data[block0 + 14] = 0xFF; //预留(留作卡号等使用),默认0xFF data[block0 + 15] = GetDataLRC(data, 0); #endregion #region 块1 data[block1 + 0] |= (byte)((info.ParkingStatus & ParkingStatus.In) == ParkingStatus.In ? 0x00 : 0x01); data[block1 + 0] |= (byte)((info.ParkingStatus & ParkingStatus.IndoorIn) == ParkingStatus.IndoorIn ? 0x00 : 0x02); data[block1 + 0] |= (byte)((info.ParkingStatus & ParkingStatus.PaidBill) == ParkingStatus.PaidBill ? 0x00 : 0x08); data[block1 + 0] |= (byte)((info.ParkingStatus & ParkingStatus.NestedParkMarked) == ParkingStatus.NestedParkMarked ? 0x00 : 0x40); data[block1 + 0] |= 0xB4;//其余置1 if (info.LastDateTime < FromDate) { return(null); //如果刷卡时间小于起始时间,返回空值 } tempbytes = SEBinaryConverter.UintToBytes((uint)(info.LastDateTime - FromDate).TotalSeconds); data[block1 + 1] = tempbytes[0]; data[block1 + 2] = tempbytes[1]; data[block1 + 3] = tempbytes[2]; data[block1 + 4] = tempbytes[3]; if (info.PaidDateTime.HasValue) { if (info.PaidDateTime.Value < FromDate) { return(null); //如果缴费时间小于起始时间,返回空值 } tempbytes = SEBinaryConverter.UintToBytes((uint)(info.PaidDateTime.Value - FromDate).TotalSeconds); data[block1 + 5] = tempbytes[0]; data[block1 + 6] = tempbytes[1]; data[block1 + 7] = tempbytes[2]; data[block1 + 8] = tempbytes[3]; } if (info.ParkFee > 167772.15M) { return(null); //如果余额大于最大金额167772.15元,返回空值 } tempbytes = SEBinaryConverter.IntToBytes((int)(info.ParkFee * 100)); data[block1 + 9] = tempbytes[0]; data[block1 + 10] = tempbytes[1]; data[block1 + 11] = tempbytes[2]; //if (info.TotalFee > 167772.15M) return null;//如果余额大于最大金额167772.15元,返回空值 //tempbytes = SEBinaryConverter.IntToBytes((int)info.TotalFee * 100); if (info.TotalPaidFee > 167772.15M) { return(null); //如果已缴费用大于最大金额167772.15元,返回空值 } tempbytes = SEBinaryConverter.IntToBytes((int)(info.TotalPaidFee * 100)); data[block1 + 12] = tempbytes[0]; data[block1 + 13] = tempbytes[1]; data[block1 + 14] = tempbytes[2]; data[block1 + 15] = GetDataLRC(data, 1); #endregion #region 块2 if (info.Balance > 167772.15M) { return(null); //如果余额大于最大金额167772.15元,返回空值 } tempbytes = SEBinaryConverter.IntToBytes((int)(info.Balance * 100)); data[block2 + 0] = tempbytes[0]; data[block2 + 1] = tempbytes[1]; data[block2 + 2] = tempbytes[2]; if (info.FreeDateTime.HasValue) { if (info.FreeDateTime.Value < FromDate) { return(null); //如果免费时间点小于起始时间,返回空值 } TimeSpan ts = info.FreeDateTime.Value - FromDate; if (ts.TotalMinutes < 0xFFFFFF) { tempbytes = SEBinaryConverter.IntToBytes((int)ts.TotalMinutes); data[block2 + 3] = tempbytes[0]; data[block2 + 4] = tempbytes[1]; data[block2 + 5] = tempbytes[2]; } else { //超过最大值时设为最大值 data[block2 + 3] = 0xFF; data[block2 + 4] = 0xFF; data[block2 + 5] = 0xFF; } } if (!string.IsNullOrEmpty(info.CarPlate)) { tempbytes = Encoding.GetEncoding("gb2312").GetBytes(info.CarPlate); if (tempbytes.Length > 9)//最多9字节 { Array.Resize(ref tempbytes, 9); } Array.Copy(tempbytes, 0, data, block2 + 6, tempbytes.Length);//9字节,不够9字节用0x00填充 } data[block2 + 15] = GetDataLRC(data, 2); #endregion return(data); } catch (Exception ex) { ExceptionPolicy.HandleException(ex); } return(null); }