左晓为主开发手持机充值管理机
zuoxiao
2024-02-29 1c549ae7af5f8d7bdeecb4ad38ab181af4831821
添加齐河项目的卡结构
8个文件已修改
3个文件已添加
812 ■■■■■ 已修改文件
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeDetail.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/card/BlackCard.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/card/ElectricPriceCard.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/card/RegionCard.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/card/UserCard.java 474 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/HexUtil.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/utils/MyCommon.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
@@ -168,7 +168,7 @@
                userName = this.getIntent().getStringExtra("userName");
                binding.cardData.setText("充值金额:" + morny + "元");
                // 充值逻辑
                recharge(userCard.getInitPeasantCode(), userName, "启用");
//                recharge(userCard.getInitPeasantCode(), userName, "启用");
            }
            try {
@@ -373,26 +373,26 @@
                        String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);
                        //00启用01禁用02隶属信息不符03无此卡信息04其它
                        if ("00".equalsIgnoreCase(state)) {
                            rechargeIsOk = true;
                            binding.cardData.setText("充值通信完成,请帖卡充值");
                            rechargeBean = new RechargeBean();
                            rechargeBean.setDate(System.currentTimeMillis());
                            rechargeBean.setMorny(morny);
                            rechargeBean.setUserName(name);
                            rechargeBean.setSerial(adminData.getSerial());
                            userCard.setRechargeDate(Calendar.getInstance());
                            rechargeBean.setBalance(MornyUtil.changeF2Y(balance));
                            rechargeBean.setInitPeasantCode(initPeasantCode);
                            rechargeBean.setOrderID(orderId);
                            try {
                                baseDao.rechargeDao().insert(rechargeBean);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            userCard.setRechargeTimes(userCard.getRechargeTimes() + 1);
//                            rechargeIsOk = true;
//                            binding.cardData.setText("充值通信完成,请帖卡充值");
//                            rechargeBean = new RechargeBean();
//                            rechargeBean.setDate(System.currentTimeMillis());
//                            rechargeBean.setMorny(morny);
//                            rechargeBean.setUserName(name);
//
//                            rechargeBean.setSerial(adminData.getSerial());
//                            userCard.setRechargeDate(Calendar.getInstance());
//                            rechargeBean.setBalance(MornyUtil.changeF2Y(balance));
//                            rechargeBean.setInitPeasantCode(initPeasantCode);
//                            rechargeBean.setOrderID(orderId);
//                            try {
//                                baseDao.rechargeDao().insert(rechargeBean);
//                            } catch (Exception e) {
//                                e.printStackTrace();
//                            }
//                            userCard.setRechargeTimes(userCard.getRechargeTimes() + 1);
                        } else if ("01".equalsIgnoreCase(state)) {
                            userCard.setState("01");
//                            userCard.setState("01");
                            userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this);
                            NFCWreatActivity.this.finish();
                            TipUtil.show("充值报文错误-禁用");
@@ -432,19 +432,19 @@
        UserCard userCardold = NfcReadHelper.getInstence(intent, this).getUserCardData();
        if (userCardold != null) {
            //判断是否充值的是一个卡
            if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode())) {
                userCard.setState("00");
                userFlag = WriteCardUtils.setUser(intent, userCard, this);
                //   打印相关
                if (userFlag) {
                    setPrinterData(rechargeBean);
                    startDetailActivity(userName, "启用");
                } else {
                    TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新再试");
                }
            } else {
                TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致");
            }
//            if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode())) {
//                userCard.setState("00");
//                userFlag = WriteCardUtils.setUser(intent, userCard, this);
//                //   打印相关
//                if (userFlag) {
//                    setPrinterData(rechargeBean);
//                    startDetailActivity(userName, "启用");
//                } else {
//                    TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新再试");
//                }
//            } else {
//                TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致");
//            }
        } else {
        }
@@ -570,19 +570,19 @@
                            String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
                            if (userCard == null) {
                                userCard = new UserCard();
                                userCard.setRechargeTimes(0);
                                ElectricPriceBean electricPriceBean = baseDao.electricPriceDao().findFirst();
                                if (electricPriceBean != null) {
                                    userCard.setElectricityPrice(electricPriceBean.getPrice());
                                } else {
                                    //默认是1元
                                    userCard.setElectricityPrice(1.000f);
                                }
                                userCard.setSwipeNumber((short) 0);
                                userCard.setState("00");
                                userCard.setBalance(0);
                                userCard.setAddressCode(adminData.getAddressCode());
                                userCard.setInitPeasantCode(initPeasantCode);
//                                userCard.setRechargeTimes(0);
//                                ElectricPriceBean electricPriceBean = baseDao.electricPriceDao().findFirst();
//                                if (electricPriceBean != null) {
//                                    userCard.setElectricityPrice(electricPriceBean.getPrice());
//                                } else {
//                                    //默认是1元
//                                    userCard.setElectricityPrice(1.000f);
//                                }
//                                userCard.setSwipeNumber((short) 0);
//                                userCard.setState("00");
//                                userCard.setBalance(0);
//                                userCard.setAddressCode(adminData.getAddressCode());
//                                userCard.setInitPeasantCode(initPeasantCode);
                            }
                            //只有启动状态才能充值
                            //金额
@@ -593,8 +593,8 @@
                            String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte));
                            if ("00".equals(state)) {
                                stateText.append("启用");
                                userCard.setBalance(balance);
                                userCard.setState("00");
//                                userCard.setBalance(balance);
//                                userCard.setState("00");
                                //补卡逻辑
                                userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this);
                                if (userFlag) {
@@ -608,8 +608,8 @@
                                return;
                            } else if ("01".equals(state)) {
                                stateText.append("禁用");
                                userCard.setState("01");
                                userCard.setBalance(balance);
//                                userCard.setState("01");
//                                userCard.setBalance(balance);
                                userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this);
                                startDetailActivity(name, stateText.toString());
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -283,19 +283,7 @@
                        String serial = baseDao.adminDao().findFirst().getSerial();
                        UserCard userCard = new UserCard();
                        userCard.setRechargeTimes(0);
                        ElectricPriceBean electricPriceBean = baseDao.electricPriceDao().findFirst();
                        if (electricPriceBean != null) {
                            userCard.setElectricityPrice(electricPriceBean.getPrice());
                        } else {
                            //默认是1元
                            userCard.setElectricityPrice(1.000f);
                        }
                        userCard.setState("00");
                        userCard.setBalance(0);
                        userCard.setAddressCode(adminData.getAddressCode());
                        userCard.setInitPeasantCode(initPeasantCode);
                        userCardBean.setSerial(serial);
                        userCardBean.setInitPeasantCode(initPeasantCode);
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -72,7 +72,7 @@
        redCardBinding.redRemainderBlance.setText("剩余金额:" + MornyUtil.changeF2Y(blance) + "元");
        redCardBinding.redStatu.setText("卡状态:" + statu);
        if (userCard != null) {
            redCardBinding.redInitCode.setText(userCard.getInitPeasantCode());
            Calendar calendar = userCard.getRechargeDate();
            if (calendar != null) {
                int year = calendar.get(Calendar.YEAR);
@@ -119,7 +119,7 @@
                                case MyCommon.USER_CARD_TYPE_2:
                                case MyCommon.USER_CARD_TYPE_3:
                                    userCard = UserCard.getBean(data);
                                    selectBalance(userCard.getInitPeasantCode());
//                                    selectBalance(userCard.getInitPeasantCode());
                                    break;
                                case MyCommon.MANAGE_CRAD:
                                    viweGone(false);
@@ -253,13 +253,13 @@
                        String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]);  //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s
                        if ("00".equals(state)) {
                            userCard.setBalance(balance);
                            userCard.setState("00");
//                            userCard.setState("00");
                            WriteCardUtils.setUser(intent, userCard, ReadCardAcitivy.this);
                            stateText.append("启用");
                        } else if ("01".equals(state)) {
                            userCard.setBalance(balance);
                            userCard.setState("01");
//                            userCard.setState("01");
                            WriteCardUtils.setUser(intent, userCard, ReadCardAcitivy.this);
                            stateText.append("禁用");
                        } else if ("02".equals(state)) {
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
@@ -68,7 +68,7 @@
            userCard = NfcReadHelper.getInstence(intent, this).getUserCardData();
            if (userCard != null) {
                ProgressDialog.show(this);
                selectBalance(userCard.getInitPeasantCode());
//                selectBalance(userCard.getInitPeasantCode());
            } else {
                TipUtil.show(RechargeActivity.this, "卡片读取失败");
            }
@@ -201,13 +201,13 @@
                            if ("00".equals(state)) {
                                binding.rechargeRegistBtn.setVisibility(View.VISIBLE);
                                stateText.append("启用");
                                userCard.setState("00");
//                                userCard.setState("00");
                                userCard.setBalance(balance);
                                binding.redStatu.setText(stateText.toString());
                                return;
                            } else if ("01".equals(state)) {
                                stateText.append("该卡已被禁用");
                                userCard.setState("01");
//                                userCard.setState("01");
                                userCard.setBalance(balance);
                                userFlag = WriteCardUtils.setUser(intent, userCard, RechargeActivity.this);
                            } else if ("02".equals(state)) {
app/src/main/java/com/dayu/recharge/activity/RechargeDetail.java
@@ -63,16 +63,14 @@
        binding.redRemainderBlance.setText("剩余金额:" + MornyUtil.changeF2Y(balance) + " 元");
        binding.redStatu.setText("卡状态:" + statu);
        if (userCard != null) {
            binding.redInitCode.setText("用户注册编号:" + userCard.getInitPeasantCode());
//            binding.redInitCode.setText("用户注册编号:" + userCard.getInitPeasantCode());
            Calendar calendar = userCard.getRechargeDate();
            if (calendar != null) {
                int year = calendar.get(Calendar.YEAR);
                int month = calendar.get(Calendar.MONTH); // 月份从0开始,所以需要加1
                int day = calendar.get(Calendar.DAY_OF_MONTH);
                int hour = calendar.get(Calendar.HOUR_OF_DAY);
                int minute = calendar.get(Calendar.MINUTE);
                int second = calendar.get(Calendar.SECOND);
                binding.redRechargeDate.setText("本卡最后购水日期:" + year + month + day + " " + hour + ":" + minute + ":" + second);
                binding.redRechargeDate.setText("本卡最后购水日期:" + year + month + day );
            } else {
                binding.redRechargeDate.setText("本卡最后购水日期:无");
            }
app/src/main/java/com/dayu/recharge/card/BlackCard.java
New file
@@ -0,0 +1,21 @@
package com.dayu.recharge.card;
import com.dayu.recharge.utils.MyCommon;
import java.io.Serializable;
/**
 * author: zuo
 * Date: 2024-02-29
 * Time: 17:17
 * 备注:配置黑卡  当用户丢失卡时,需要在对应的控制器把此用户配置为黑户,防止非法用水
 */
public class BlackCard implements Serializable {
    public String cardType = MyCommon.BLACK;
}
app/src/main/java/com/dayu/recharge/card/ElectricPriceCard.java
New file
@@ -0,0 +1,18 @@
package com.dayu.recharge.card;
import com.dayu.recharge.utils.MyCommon;
import java.io.Serializable;
/**
 * author: zuo
 * Date: 2024-02-29
 * Time: 16:59
 * 备注:电量单价卡
 */
public class ElectricPriceCard implements Serializable {
    public String cardType = MyCommon.ELECTRIC_PRICE;
}
app/src/main/java/com/dayu/recharge/card/RegionCard.java
New file
@@ -0,0 +1,65 @@
package com.dayu.recharge.card;
import com.dayu.recharge.tools.HexUtil;
import com.dayu.recharge.utils.MyCommon;
import java.io.Serializable;
import java.util.List;
/**
 * author: zuo
 * Date: 2024-02-29
 * Time: 16:29
 * 备注:区域标号卡
 */
public class RegionCard implements Serializable {
    public String cardType = MyCommon.REGION;//卡命令
    public short region;//区域地址(低前高后) 可以识别某县镇村
    public short controllerCodel;// 控制器编号(低前高后) 本区域内控制器编号
    public byte[] toByte() {
        RegionCard.Zero zero = new RegionCard.Zero();
        return zero.toByte();
    }
    public static RegionCard getBean(List<byte[]> data){
        RegionCard regionCard=new RegionCard();
        byte[] zero=data.get(0);
        regionCard.cardType=HexUtil.byteToHex(zero[0]);
        return regionCard;
    }
    public class Zero extends BaseCard {
        public byte[] toByte() {
            byte[] data = new byte[16];
            data[0] = HexUtil.hexToByte(cardType);
            byte[] regionBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(region));
            if (regionBytes != null) {
                System.arraycopy(regionBytes, 0, data, 1, regionBytes.length);
            }
            byte[] controllerCodelBytes = HexUtil.hexToByteArray(HexUtil.get10To16LowHigh(controllerCodel));
            if (controllerCodelBytes != null) {
                System.arraycopy(controllerCodelBytes, 0, data, 3, controllerCodelBytes.length);
            }
            data[15] = getByteSum(data);
            return data;
        }
    }
}
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,215 +236,6 @@
        return zero.toBytes();
    }
    /**
     * 通过byte转bean
     *
     * @param data
     */
    public static UserCard getBean(List<byte[]> data) {
        try {
            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.get16to10LowHigh(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;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        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;
@@ -268,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() {
@@ -309,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() {
@@ -323,14 +307,6 @@
    public void setRechargeDate(Calendar rechargeDate) {
        this.rechargeDate = rechargeDate;
    }
    public String getInitPeasantCode() {
        return initPeasantCode;
    }
    public void setInitPeasantCode(String initPeasantCode) {
        this.initPeasantCode = initPeasantCode;
    }
app/src/main/java/com/dayu/recharge/tools/HexUtil.java
@@ -9,7 +9,7 @@
 * Copyright (C), 2022,
 * Author: zuo
 * Date: 2022/3/9 14:55
 * Description:
 * Description: 进制转换
 */
public class HexUtil {
@@ -40,6 +40,9 @@
        return result;
    }
    public static int getBcdToInt(byte data) {
        return ((data & 0xF0) >> 4) * 10 + ((data & 0x0F));
    }
    /**
     * Hex字符串转byte
@@ -161,6 +164,63 @@
        }
    }
    /**
     * short10进制转16进制 低位在前高位在后
     * @param number
     * @return
     */
    public static String get10To16LowHigh(short number) {
        // 使用 Integer.toHexString 将 short 转换为十六进制字符串
        int intValue = Short.toUnsignedInt(number);
        // 使用 Integer.toHexString 将 int 转换为十六进制字符串
        String hexString = Integer.toHexString(intValue);
        // 补0,确保字符串长度为4
        while (hexString.length() < 4) {
            hexString = "0" + hexString;
        }
        hexString = spaceHex(hexString);
        hexString = HighLowHex(hexString);
        return hexString;
    }
    /**
     * short10进制转16进制 低位在前高位在后
     * @param number
     * @return
     */
    public static String get10To16LowHigh(int number) {
        // 使用 Integer.toHexString 将 int 转换为十六进制字符串
        String hexString = Integer.toHexString(number);
        hexString = spaceHex(hexString);
        hexString = HighLowHex(hexString);
        return hexString;
    }
    /**
     * short16进制转10进制 低位在前高位在后
     * @param hex
     * @return
     */
    public static short  getShort10To16LowHigh(String hex){
        try {
            String str = "";
            str = spaceHex(hex);
            str = HighLowHex(str);
            return (short) Integer.parseInt(str, 16);
        } catch (NumberFormatException e) {
           e.printStackTrace();
        }
        return 0;
    }
    /**
     * 十进制转16进制低位在前高位在后
     *
@@ -184,6 +244,7 @@
    /**
     * 16进制转10进制高低位转换
     *
     * @param hex
     * @return
     */
app/src/main/java/com/dayu/recharge/utils/MyCommon.java
@@ -25,15 +25,48 @@
     */
    public static final String USER_CARD_TYPE_3 = "A2";
    /**
     * 设置区域表号卡
     */
    public static final String REGION = "B0";
    /**
     * 设置用户电量单价卡
     */
    public static final String ELECTRIC_PRICE = "B1";
    /**
     * 管理卡
     */
    public static final String MANAGE_CRAD = "B2";
    /**
     * 清零卡
     */
    public static final String CLEAN_CARD_TYPE = "C8";
    /**
     * 密码卡
     */
    public static final String PASS_WORD_CRAD_TYPE = "B3";
    /**
     * 配置黑卡  当用户丢失卡时,需要在对应的控制器把此用户配置为黑户,防止非法用水
     */
    public static final String BLACK = "B4";
    /**
     * 以下未用到
     * *****************************************************************************************************************************************
     */
    /**
     * 重新注册设备卡
@@ -64,9 +97,5 @@
     */
    public static final String CONFIGURATION_POWER_CARD_TYPE = "BD";
    /**
     * 密码卡
     */
    public static final String PASS_WORD_CRAD_TYPE = "B3";
}