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"; }