左晓为主开发手持机充值管理机
zuoxiao
2024-02-29 1c549ae7af5f8d7bdeecb4ad38ab181af4831821
app/src/main/java/com/dayu/recharge/card/UserCard.java
@@ -4,36 +4,222 @@
import com.dayu.recharge.tools.HexUtil;
import com.dayu.recharge.utils.MornyUtil;
import com.dayu.recharge.utils.MyCommon;
import com.tencent.bugly.crashreport.CrashReport;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
 * Copyright (C), 2023,
 * Author: zuo
 * Date: 2023-11-07 9:37
 * Description: 用户卡结构
 * Description: 齐河项目用户卡结构
 */
public class UserCard implements Serializable {
    public String cardType = MyCommon.USER_CARD_TYPE_1;//写卡标志 A1刷卡开泵前 A8刷卡开泵后  A2叠加充值
    public int rechargeTimes;//充值次数
    public short arerNumber;//区域号(底位在前高位在后)
    public short swipeNumber;//刷卡次数 一般不用精细管控才用
    public short deviceNumberl;//设备编号(底位在前高位在后)
    public byte rechargeTimes;//充值次数
    public float electricityPrice;//电量单价 管理元可以修改
    public int totalWater;//用户总用水量  底位在前,高位在后2位小数点  含两个小数点的整数
    public String state = "00";//卡状态 返写查询充值时卡状态位
    public int totalElectric;//总用电量位 底位在前,高位在后  1位小数点  含1位小数点的整数
    public int balance;//余额(单位为分)
    public int balance;//剩余金额 底位在前  2位小数点,单位元
    public String addressCode;//行政区域
    public int surplusWater;//剩余水量 底位在前  2位小数点 单位立方米
    public Calendar rechargeDate;//购水时间
    public Calendar rechargeDate;// 购水时间 BCD
    public String initPeasantCode;//用户注册编号
    /**
     * 通过byte转bean
     *
     * @param data
     */
    public static UserCard getBean(List<byte[]> data) {
        try {
            UserCard userCard = new UserCard();
            //第0块解析
            byte[] zero = data.get(0);
            userCard.cardType = HexUtil.byteToHex(zero[0]);
            byte[] arerNumberByte = new byte[2];
            System.arraycopy(zero, 1, arerNumberByte, 0, arerNumberByte.length);
            userCard.arerNumber = (short) HexUtil.get16to10LowHigh(HexUtil.bytesToHex(arerNumberByte));
            byte[] deviceNumberlByte = new byte[2];
            System.arraycopy(zero, 3, deviceNumberlByte, 0, deviceNumberlByte.length);
            userCard.deviceNumberl = (short) HexUtil.get16to10LowHigh(HexUtil.bytesToHex(deviceNumberlByte));
            userCard.rechargeTimes = HexUtil.hexToByte(HexUtil.byteToHex(zero[5]));
            byte[] totalWaterByte = new byte[4];
            System.arraycopy(zero, 3, totalWaterByte, 0, totalWaterByte.length);
            userCard.totalWater = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(totalWaterByte));
            byte[] totalElectricByte = new byte[4];
            System.arraycopy(zero, 3, totalElectricByte, 0, totalElectricByte.length);
            userCard.totalElectric = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(totalElectricByte));
            //第1块解析
            byte[] one = data.get(1);
            byte[] balanceByte = new byte[4];
            System.arraycopy(one, 0, balanceByte, 0, balanceByte.length);
            userCard.balance = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(balanceByte));
            byte[] surplusWaterByte = new byte[4];
            System.arraycopy(one, 4, surplusWaterByte, 0, surplusWaterByte.length);
            userCard.surplusWater = HexUtil.get16to10LowHigh(HexUtil.bytesToHex(surplusWaterByte));
            byte[] rechargeDateByte = new byte[3];
            System.arraycopy(one, 12, rechargeDateByte, 0, rechargeDateByte.length);
            int year = HexUtil.getBcdToInt(one[12]);
            int month = HexUtil.getBcdToInt(one[13]);
            int day = HexUtil.getBcdToInt(one[14]);
            Calendar calendar = Calendar.getInstance();
            calendar.set(2000 + year, month, day, 0, 0, 0);
            userCard.rechargeDate = calendar;
            return userCard;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 用户卡0块
     */
    public class Zero extends BaseCard {
        public byte[] toByte() {
            try {
                byte[] data = new byte[16];
                data[0] = HexUtil.hexToByte(cardType);
                byte[] arerNumberBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(arerNumber));
                if (arerNumberBytes != null) {
                    System.arraycopy(arerNumberBytes, 0, data, 1, arerNumberBytes.length);
                }
                byte[] deviceNumberlBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(deviceNumberl));
                if (deviceNumberlBytes != null) {
                    System.arraycopy(deviceNumberlBytes, 0, data, 3, deviceNumberlBytes.length);
                }
                byte rechargeTimesByte = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes));
                data[5] = rechargeTimesByte;
                byte[] totalWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalWater));
                if (totalWaterBytes != null) {
                    System.arraycopy(totalWaterBytes, 0, data, 6, totalWaterBytes.length);
                }
                byte[] totalElectricBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(totalElectric));
                if (totalElectricBytes != null) {
                    System.arraycopy(totalElectricBytes, 0, data, 10, totalElectricBytes.length);
                }
                data[15] = getByteSum(data);
                return data;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    /**
     * 用户卡1块
     */
    public class One extends BaseCard {
        public byte[] toBytes() {
            byte[] data = new byte[16];
            try {
                byte[] balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance));
                if (balanceBytes != null) {
                    System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length);
                }
                byte[] surplusWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater));
                if (surplusWaterBytes != null) {
                    System.arraycopy(surplusWaterBytes, 0, data, 0, surplusWaterBytes.length);
                }
                if (rechargeDate != null) {
                    // 获取年、月、日、时、分、秒
                    int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
                    int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
                    int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
                    byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100));
                    byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
                    byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
                    data[12] = bcdYear;
                    data[13] = bcdMonth;
                    data[14] = bcdDay;
                }
                data[15] = getByteSum(data);
            } catch (Exception e) {
                e.printStackTrace();
                CrashReport.postCatchedException(e);
            }
            return data;
        }
    }
    /**
     * 用户卡2块
     */
    public class Two extends BaseCard {
        public byte[] toBytes() {
            byte[] data = new byte[16];
            try {
                byte[] balanceBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(balance));
                if (balanceBytes != null) {
                    System.arraycopy(balanceBytes, 0, data, 0, balanceBytes.length);
                }
                byte[] surplusWaterBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(surplusWater));
                if (surplusWaterBytes != null) {
                    System.arraycopy(surplusWaterBytes, 0, data, 0, surplusWaterBytes.length);
                }
                if (rechargeDate != null) {
                    // 获取年、月、日、时、分、秒
                    int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
                    int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
                    int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
                    byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100));
                    byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
                    byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
                    data[12] = bcdYear;
                    data[13] = bcdMonth;
                    data[14] = bcdDay;
                }
                data[15] = getByteSum(data);
            } catch (Exception e) {
                e.printStackTrace();
                CrashReport.postCatchedException(e);
            }
            return data;
        }
    }
    public byte[] getZeroBytes() {
        Zero zero = new Zero();
@@ -50,210 +236,6 @@
        return zero.toBytes();
    }
    /**
     * 通过byte转bean
     *
     * @param data
     */
    public static UserCard getBean(List<byte[]> data) {
        UserCard userCard = new UserCard();
        if (data != null) {
            byte[] zero = data.get(0);
            byte[] one = data.get(1);
            byte[] two = data.get(2);
            userCard.cardType = HexUtil.byteToHex(zero[0]);
            userCard.rechargeTimes = HexUtil.get16to10(HexUtil.byteToHex(zero[1]));
            byte[] swipeNumberBytes = new byte[2];
            swipeNumberBytes[0] = zero[2];
            swipeNumberBytes[1] = zero[3];
            String swipeNumberHex = HexUtil.bytesToHex(swipeNumberBytes);
            userCard.swipeNumber = (short) HexUtil.get16to10(swipeNumberHex);
            byte[] electricityPriceBytes = new byte[4];
            for (int i = 0; i < 4; i++) {
                electricityPriceBytes[i] = zero[i + 4];
            }
            userCard.electricityPrice = HexUtil.hexToFloat(HexUtil.bytesToHex(electricityPriceBytes));
            userCard.state = BcdUtil.bcdToStr(zero[8]);
            byte[] balanceBytes = new byte[4];
            for (int i = 0; i < 4; i++) {
                balanceBytes[i] = zero[i + 9];
            }
            userCard.balance = HexUtil.get16to10(HexUtil.bytesToHex(balanceBytes));
            byte[] addressCodeBytes = new byte[6];
            addressCodeBytes[0] = zero[13];
            addressCodeBytes[1] = zero[14];
            addressCodeBytes[2] = two[11];
            addressCodeBytes[3] = two[12];
            addressCodeBytes[4] = two[13];
            addressCodeBytes[5] = two[14];
            userCard.addressCode = BcdUtil.bcdToStr(addressCodeBytes);
            int year = 0;
            int month = 0;
            int day = 0;
            int hour = 0;
            int minute = 0;
            int second = 0;
            for (int i = 0; i < 6; i++) {
                byte byteData = one[i + 4];
                switch (i) {
                    case 0:
                        year = getBcdToInt(byteData);
                        break;
                    case 1:
                        month = getBcdToInt(byteData);
                        break;
                    case 2:
                        day = getBcdToInt(byteData);
                        break;
                    case 3:
                        hour = getBcdToInt(byteData);
                        break;
                    case 4:
                        minute = getBcdToInt(byteData);
                        break;
                    case 5:
                        second = getBcdToInt(byteData);
                        break;
                }
            }
            Calendar calendar = Calendar.getInstance();
            calendar.set(2000 + year, month, day, hour, minute, second);
            byte[] initPeasantCodeBytes = new byte[16];
            initPeasantCodeBytes[0] = one[10];
            initPeasantCodeBytes[1] = one[11];
            initPeasantCodeBytes[2] = one[12];
            initPeasantCodeBytes[3] = one[13];
            initPeasantCodeBytes[4] = one[14];
            initPeasantCodeBytes[5] = two[0];
            initPeasantCodeBytes[6] = two[1];
            initPeasantCodeBytes[7] = two[2];
            initPeasantCodeBytes[8] = two[3];
            initPeasantCodeBytes[9] = two[4];
            initPeasantCodeBytes[10] = two[5];
            initPeasantCodeBytes[11] = two[6];
            initPeasantCodeBytes[12] = two[7];
            initPeasantCodeBytes[13] = two[8];
            initPeasantCodeBytes[14] = two[9];
            initPeasantCodeBytes[15] = two[10];
            userCard.initPeasantCode = HexUtil.bytesToHex(initPeasantCodeBytes);
            return userCard;
        }
        return null;
    }
    private static int getBcdToInt(byte data) {
        return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F));
    }
    /**
     * 用户卡0块
     */
    public class Zero extends BaseCard {
        public byte[] toByte() {
            byte[] data = new byte[16];
            data[0] = HexUtil.hexToByte(cardType);
            try {
                data[1] = HexUtil.hexToByte(HexUtil.get10to16(rechargeTimes));
            } catch (Exception e) {
                e.printStackTrace();
            }
            byte[] swipeNumbers = HexUtil.hexToByteArray(HexUtil.get10to16(swipeNumber));
            for (int i = 0; i < swipeNumbers.length; i++) {
                data[i + 2] = swipeNumbers[i];
            }
            byte[] electricityPrices = HexUtil.hexToByteArray(HexUtil.folatToHexString(electricityPrice));
            for (int i = 0; i < electricityPrices.length; i++) {
                data[i + 4] = electricityPrices[i];
            }
            try {
                data[8] = BcdUtil.strToBcd(state)[0];
            } catch (Exception e) {
                e.printStackTrace();
            }
            byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8));
            for (int i = 0; i < balances.length; i++) {
                data[i + 9] = balances[i];
            }
            byte[] addresscodes = BcdUtil.strToBcd(addressCode);
            data[13] = addresscodes[0];
            data[14] = addresscodes[1];
            data[15] = getByteSum(data);
            return data;
        }
    }
    /**
     * 用户卡1块
     */
    public class One extends BaseCard {
        public byte[] toBytes() {
            byte[] data = new byte[16];
            byte[] balances = HexUtil.hexToByteArray(HexUtil.get10to16LowHigh(balance, 8));
            for (int i = 0; i < balances.length; i++) {
                data[i] = balances[i];
            }
            if (rechargeDate != null) {
                // 获取年、月、日、时、分、秒
//                bcdBytes[0] = (byte) ((year / 1000) << 4) | (byte) (year % 1000 / 100); // 年份的十位和个位(高字节)
//                bcdBytes[1] = (byte) ((year / 10 % 10) << 4) | (byte) (year % 10); // 年份的十位和个位(低字节)
                int year = (rechargeDate.get(Calendar.YEAR)) % 1000;
                int month = rechargeDate.get(Calendar.MONTH) + 1; // 月份从0开始,所以需要加1
                int day = rechargeDate.get(Calendar.DAY_OF_MONTH);
                int hour = rechargeDate.get(Calendar.HOUR_OF_DAY);
                int minute = rechargeDate.get(Calendar.MINUTE);
                int second = rechargeDate.get(Calendar.SECOND);
                byte bcdYear = (byte) ((year / 10) << 4 | ((year % 10) / 100));
                byte bcdMonth = (byte) ((month / 10) << 4 | (month % 10));
                byte bcdDay = (byte) ((day / 10) << 4 | (day % 10));
                byte bcdHour = (byte) ((hour / 10) << 4 | (hour % 10));
                byte bcdMinute = (byte) ((minute / 10) << 4 | (minute % 10));
                byte bcdSecond = (byte) ((second / 10) << 4 | (second % 10));
                data[4] = bcdYear;
                data[5] = bcdMonth;
                data[6] = bcdDay;
                data[7] = bcdHour;
                data[8] = bcdMinute;
                data[9] = bcdSecond;
            }
            byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode);
            for (int i = 0; i < 5; i++) {
                data[i + 10] = initPeasantCodes[i];
            }
            data[15] = getByteSum(data);
            return data;
        }
    }
    /**
     * 用户卡2块
     */
    public class Two extends BaseCard {
        public byte[] toBytes() {
            byte[] data = new byte[16];
            byte[] initPeasantCodes = HexUtil.hexToByteArray(initPeasantCode);
            for (int i = 5; i < 16; i++) {
                data[i - 5] = initPeasantCodes[i];
            }
            byte[] addresscodes = BcdUtil.strToBcd(addressCode);
            data[11] = addresscodes[2];
            data[12] = addresscodes[3];
            data[13] = addresscodes[4];
            data[14] = addresscodes[5];
            data[15] = getByteSum(data);
            return data;
        }
    }
    public String getCardType() {
        return cardType;
@@ -263,37 +245,44 @@
        this.cardType = cardType;
    }
    public int getRechargeTimes() {
    public short getArerNumber() {
        return arerNumber;
    }
    public void setArerNumber(short arerNumber) {
        this.arerNumber = arerNumber;
    }
    public short getDeviceNumberl() {
        return deviceNumberl;
    }
    public void setDeviceNumberl(short deviceNumberl) {
        this.deviceNumberl = deviceNumberl;
    }
    public byte getRechargeTimes() {
        return rechargeTimes;
    }
    public void setRechargeTimes(int rechargeTimes) {
    public void setRechargeTimes(byte rechargeTimes) {
        this.rechargeTimes = rechargeTimes;
    }
    public short getSwipeNumber() {
        return swipeNumber;
    public int getTotalWater() {
        return totalWater;
    }
    public void setSwipeNumber(short swipeNumber) {
        this.swipeNumber = swipeNumber;
    public void setTotalWater(int totalWater) {
        this.totalWater = totalWater;
    }
    public float getElectricityPrice() {
        return electricityPrice;
    public int getTotalElectric() {
        return totalElectric;
    }
    public void setElectricityPrice(float electricityPrice) {
        this.electricityPrice = electricityPrice;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    public void setTotalElectric(int totalElectric) {
        this.totalElectric = totalElectric;
    }
    public int getBalance() {
@@ -304,12 +293,12 @@
        this.balance = balance;
    }
    public String getAddressCode() {
        return addressCode;
    public int getSurplusWater() {
        return surplusWater;
    }
    public void setAddressCode(String addressCode) {
        this.addressCode = addressCode;
    public void setSurplusWater(int surplusWater) {
        this.surplusWater = surplusWater;
    }
    public Calendar getRechargeDate() {
@@ -318,14 +307,6 @@
    public void setRechargeDate(Calendar rechargeDate) {
        this.rechargeDate = rechargeDate;
    }
    public String getInitPeasantCode() {
        return initPeasantCode;
    }
    public void setInitPeasantCode(String initPeasantCode) {
        this.initPeasantCode = initPeasantCode;
    }