| | |
| | | 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(); |
| | |
| | | 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; |
| | |
| | | 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() { |
| | |
| | | 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() { |
| | |
| | | |
| | | public void setRechargeDate(Calendar rechargeDate) { |
| | | this.rechargeDate = rechargeDate; |
| | | } |
| | | |
| | | public String getInitPeasantCode() { |
| | | return initPeasantCode; |
| | | } |
| | | |
| | | public void setInitPeasantCode(String initPeasantCode) { |
| | | this.initPeasantCode = initPeasantCode; |
| | | } |
| | | |
| | | |