Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }