package com.dayu.henanlibrary.activity; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.widget.Toast; import com.dayu.baselibrary.tools.BcdUtil; import com.dayu.baselibrary.utils.AidlUtil; import com.dayu.baselibrary.utils.BaseCommon; import com.dayu.baselibrary.utils.CRC8; import com.dayu.baselibrary.utils.DateUtil; import com.dayu.baselibrary.utils.MornyUtil; import com.dayu.baselibrary.utils.TipUtil; import com.dayu.baselibrary.view.ConfirmDialog; import com.dayu.baselibrary.view.TitleBar; import com.dayu.henanlibrary.card.CleanCard; import com.dayu.henanlibrary.card.CleanUserCard; import com.dayu.henanlibrary.card.ConfigurationPowerCard; import com.dayu.henanlibrary.card.ConfigureDeviceRegistrationCrad; import com.dayu.henanlibrary.card.DomainCard; import com.dayu.henanlibrary.card.ManageCard; import com.dayu.henanlibrary.card.RegisteredCard; import com.dayu.henanlibrary.card.TestCard; import com.dayu.henanlibrary.card.UserCard; import com.dayu.henanlibrary.databinding.ActivityWriteTextHnBinding; import com.dayu.henanlibrary.dbBean.AdminDataBean; import com.dayu.henanlibrary.dbBean.ElectricPriceBean; import com.dayu.henanlibrary.dbBean.RechargeBean; import com.dayu.henanlibrary.dbBean.UserCardBean; import com.dayu.henanlibrary.net.SocketCallBack; import com.dayu.henanlibrary.net.SocketData; import com.dayu.henanlibrary.net.SocketNet; import com.dayu.henanlibrary.socketBean.BalanceSelecteRequestBean; import com.dayu.henanlibrary.socketBean.RechargeRequestBean; import com.dayu.henanlibrary.tools.NFCWriteHelper; import com.dayu.henanlibrary.tools.NfcReadHelper; import com.dayu.henanlibrary.tools.WriteCardUtils; import com.dayu.henanlibrary.utils.CardCommon; import com.dayu.henanlibrary.utils.DeviceNumberUtils; import com.dayu.henanlibrary.utils.SocketUtil; import com.dayu.henanlibrary.view.ProgressDialog; import com.tencent.bugly.crashreport.CrashReport; import java.util.Arrays; import java.util.Calendar; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-08 21:19 * Description: nfc写卡界面 */ public class NFCWreatActivity extends BaseNfcActivity { public static String TAG = "NFCWreatActivity"; boolean cleanFlag = false; boolean userFlag = false; boolean manageCardFlag = false; boolean registeredFlag = false; boolean administrativeCardFlag = false; boolean cleanUserCardFlag = false; boolean domainCrdFlag = false; boolean testCardFlag = false; boolean configDeviceRegiestFlag = false; boolean configPowerFlag = false; /** * 是否不再验证用户直接写卡 */ boolean isAgainWrite = false; UserCardBean userCardBean; String morny; String userName; AdminDataBean adminData; RechargeBean rechargeBean; Intent intent; RegisteredCard registeredCard; CleanUserCard cleanUserCard; ManageCard manageCard; DomainCard domainCard; CleanCard cleanCard; ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad; TestCard testCard; ConfigurationPowerCard configurationPowerCard; //打印 public static NFCWreatActivity nfcWreatActivity; /** * 是否是用户卡,假如是用户卡的话需要检测卡片是否已经开过户,假如已开户则报错不能再写卡 */ boolean isUser = false;// //是否是充值过程 boolean isRecharge = false; //充值通信是否完成 boolean rechargeIsOk = false; ActivityWriteTextHnBinding binding; ConfirmDialog confirmDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { binding = ActivityWriteTextHnBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); nfcWreatActivity = this; setData(); titleBack(); getData(); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } private void setData() { titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE, v -> { //处理因用户误操作返回导致不能写卡的问题,添加二次确认 back(); }); } private void back() { if (isUser) { confirmDialog = new ConfirmDialog(NFCWreatActivity.this, v -> { confirmDialog.dismiss(); myFinish(); }); confirmDialog.show(); } else if (!TextUtils.isEmpty(morny)) { confirmDialog = new ConfirmDialog(NFCWreatActivity.this, v -> { confirmDialog.dismiss(); myFinish(); }); confirmDialog.show(); } else { finish(); } } private void myFinish() { if (NewCardActivity.newCardActivity != null) { NewCardActivity.newCardActivity.finish(); } if (RechargeActivity.rechargeActivity != null) { RechargeActivity.rechargeActivity.finish(); } NFCWreatActivity.nfcWreatActivity.finish(); } //点击两次退出程序 有时间间隔 间隔内点击则退出程序 否则 则提示 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { back(); return true; } return super.onKeyDown(keyCode, event); } @SuppressLint("SetTextI18n") private void getData() { try { if (this.getIntent().hasExtra("userCard")) { userCard = (UserCard) this.getIntent().getSerializableExtra("userCard"); } if (this.getIntent().hasExtra("cleanCard")) { cleanCard = (CleanCard) this.getIntent().getSerializableExtra("cleanCard"); binding.cardData.setText("制作清零卡"); } if (this.getIntent().hasExtra("manageCard")) { manageCard = (ManageCard) this.getIntent().getSerializableExtra("manageCard"); binding.cardData.setText("制作管理卡"); } if (this.getIntent().hasExtra("registeredCard")) { registeredCard = (RegisteredCard) this.getIntent().getSerializableExtra("registeredCard"); binding.cardData.setText("制作重新注册设备卡"); } if (this.getIntent().hasExtra("dbUserCard")) { userCardBean = (UserCardBean) this.getIntent().getSerializableExtra("dbUserCard"); isUser = true; } if (this.getIntent().hasExtra("cleanUserCard")) { cleanUserCard = (CleanUserCard) this.getIntent().getSerializableExtra("cleanUserCard"); binding.cardData.setText("制作删除全部用户卡"); } if (this.getIntent().hasExtra("domainCard_xinxiang")) { domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard_xinxiang"); binding.cardData.setText("制作设置新乡域名卡"); } if (this.getIntent().hasExtra("domainCard_luyi")) { domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard_luyi"); binding.cardData.setText("制作设置鹿邑域名卡"); } if (this.getIntent().hasExtra("testCard")) { testCard = (TestCard) this.getIntent().getSerializableExtra("testCard"); binding.cardData.setText("制作测试卡"); } if (this.getIntent().hasExtra("configureDeviceRegistrationCrad")) { configureDeviceRegistrationCrad = (ConfigureDeviceRegistrationCrad) this.getIntent().getSerializableExtra("configureDeviceRegistrationCrad"); binding.cardData.setText("制作配置设备注册信息卡"); } if (this.getIntent().hasExtra("configurationPowerCard")) { configurationPowerCard = (ConfigurationPowerCard) this.getIntent().getSerializableExtra("configurationPowerCard"); binding.cardData.setText("制作配置水泵功率卡"); } if (this.getIntent().hasExtra("morny")) { startAnim(); isRecharge = true; morny = this.getIntent().getStringExtra("morny"); userName = this.getIntent().getStringExtra("userName"); binding.cardData.setText("充值金额:" + morny + "元"); // 充值逻辑 recharge(userCard.getInitPeasantCode(), userName); } try { adminData = baseDao.adminDao().findFirst(); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } /** * 检测是否是用户卡,假如是用户卡的话需要检测卡片是否已经开过户,假如已开户则报错不能再写卡假如是用户卡需要 */ private void checkHasUser() { String cardType = NfcReadHelper.getInstence(intent, this).getCradType(); Log.i("NFCWreatActivity", "cardType=" + cardType); if (cardType.equals(CardCommon.USER_CARD_TYPE_1) || cardType.equals(CardCommon.USER_CARD_TYPE_2) || cardType.equals(CardCommon.USER_CARD_TYPE_3) ) { binding.textView.setText("该卡已经写入用户信息,请更换卡片"); binding.textView.setTextColor(getResources().getColor(com.dayu.baselibrary.R.color.red)); } else if (cardType.equals(BaseCommon.CARD_TYPE_ERROR1)) { TipUtil.show(NFCWreatActivity.this, "请勿移动卡片,读卡失败请重试!!"); } else if (cardType.equals(BaseCommon.CARD_TYPE_ERROR2)) { TipUtil.show(NFCWreatActivity.this, ",卡片未能识别,请检查卡片是否是本公司卡片"); } else { Log.i("NFCWreatActivity", "olduserCard!=null saveData"); saveData(); } stopAnim(); } private void saveData() { try { startAnim(); if (userCard != null || cleanCard != null || manageCard != null || registeredCard != null || cleanUserCard != null || domainCard != null || testCard != null || configureDeviceRegistrationCrad != null || configurationPowerCard != null) { if (userCard != null && TextUtils.isEmpty(morny)) { userFlag = WriteCardUtils.setUser(intent, userCard, this); } if (cleanCard != null) { setClean(intent, cleanCard); } if (manageCard != null) { setmanageCard(intent, manageCard); } if (registeredCard != null) { setRegisteredCard(intent, registeredCard); } if (cleanUserCard != null) { setCleanUserCard(intent, cleanUserCard); } if (domainCard != null) { setDomainCard(intent, domainCard); } if (testCard != null) { setTestCard(intent, testCard); } if (configureDeviceRegistrationCrad != null) { setConfigDeviceRegiest(intent, configureDeviceRegistrationCrad); } if (configurationPowerCard != null) { setConfigurationPower(intent, configurationPowerCard); } if ((configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag)) { try { if (userFlag && userCardBean != null) { //用户卡 startDetailActivity(userCardBean.getUserName(), "启用"); } else if (!TextUtils.isEmpty(morny)) { TipUtil.show(NFCWreatActivity.this, "充值成功", NFCWreatActivity.this::finish); } else { TipUtil.show(NFCWreatActivity.this, "写卡成功", NFCWreatActivity.this::finish); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } else { TipUtil.show(NFCWreatActivity.this, "写卡失败"); } stopAnim(); } else if (userCard == null && userCardBean != null) { //补卡逻辑 selectBalance(userCardBean.getInitPeasantCode()); } else { stopAnim(); TipUtil.show(this, "参数错误"); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); try { this.intent = intent; startAnim(); Log.i("NFCWreatActivity", "isUser:" + isUser); if (isUser) { checkHasUser(); } else if (isRecharge) { if (rechargeIsOk) { rechargeWrratCard(); } else { Toast.makeText(this, "正在通信请稍后", Toast.LENGTH_SHORT).show(); } } else { saveData(); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } /** * 打印机相关信息 * * @param rechargeBean */ private void setPrinterData(RechargeBean rechargeBean) { try { StringBuffer data = new StringBuffer(); if (rechargeBean != null) { data.append("*****************************" + "\n"); data.append("设备序列号:").append(rechargeBean.getSerial()).append("\n"); data.append("用户名:").append(rechargeBean.getUserName()).append("\n"); // data.append("户 号:" + rechargeBean.getUserNum() + "\n"); data.append("充值金额:").append(rechargeBean.getMorny()).append("元").append("\n"); data.append("卡内余额:").append(rechargeBean.getBalance()).append("元").append("\n"); data.append("日 期:").append(DateUtil.dateToStamp(rechargeBean.getDate(), DateUtil.type2)).append("\n\n"); data.append("*****************************"); } float size = 26; try { AidlUtil.getInstance().printText(data.toString(), size, true, false); AidlUtil.getInstance().print3Line(); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } void startAnim() { binding.avi.setVisibility(View.VISIBLE); binding.avi.show(); // or avi.smoothToShow(); } void stopAnim() { binding.avi.hide(); // or avi.smoothToHide(); } //充值上传(Socket) private void recharge(String initPeasantCode, String name) { try { RechargeRequestBean rechargeRequestBean = new RechargeRequestBean(); rechargeRequestBean.setControl("01"); String initCode = DeviceNumberUtils.getDeviceNumber(); rechargeRequestBean.setInitCode(initCode); rechargeRequestBean.setXuLie(SocketUtil.getXuLie(this)); rechargeRequestBean.setAFN("95"); rechargeRequestBean.setInitPeasantCode(initPeasantCode); rechargeRequestBean.setBalance(morny); rechargeRequestBean.setOrderId(SocketUtil.getOrderId(NFCWreatActivity.this)); SocketNet.getInstance().sendTestMessage(rechargeRequestBean.pack(), "95", new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { //金额 byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7); int balance = SocketUtil.get16to10LowHigh(blanceByte); //姓名 byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19); userName = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte)); byte[] orderByte = Arrays.copyOfRange(readData.getBodyBytes(), 19, 27); String orderId = BcdUtil.bcdToStr(orderByte); if (CRC8.isCRC8(readData.getOriginDataBytes())) { String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]); //00启用01禁用02隶属信息不符03无此卡信息04其它 if ("00".equalsIgnoreCase(state)) { rechargeIsOk = true; binding.cardData.setText("充值" + morny + "元通信完成,请帖卡写卡"); rechargeBean = new RechargeBean(); rechargeBean.setDate(System.currentTimeMillis()); rechargeBean.setMorny(morny); rechargeBean.setUserName(name); rechargeBean.setSerial(adminData.getSerial()); userCard.setRechargeDate(Calendar.getInstance()); userCard.setBalance(balance); 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"); userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this); NFCWreatActivity.this.finish(); TipUtil.show("充值报文错误-禁用"); } else if ("02".equalsIgnoreCase(state)) { TipUtil.show("充值报文错误-隶属信息不符"); NFCWreatActivity.this.finish(); } else if ("03".equalsIgnoreCase(state)) { TipUtil.show("充值报文错误-无此卡信息"); NFCWreatActivity.this.finish(); } else { TipUtil.show("充值报文错误-其它"); NFCWreatActivity.this.finish(); } } else { //校验CRC错误 TipUtil.show(NFCWreatActivity.this, "充值报文错误校验CRC错误"); NFCWreatActivity.this.finish(); } stopAnim(); } @Override public void onSocketError(int code, String msg) { runOnUiThread(() -> { stopAnim(); TipUtil.show(NFCWreatActivity.this, msg); }); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } //往卡内写充值后的数据 private void rechargeWrratCard() { UserCard userCardold = NfcReadHelper.getInstence(intent, this).getUserCardData(); if (userCardold != null) { //判断是否充值的是一个卡 if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode()) || isAgainWrite) { userCard.setState("00"); userFlag = WriteCardUtils.setUser(intent, userCard, this); // 打印相关 if (userFlag) { setPrinterData(rechargeBean); startDetailActivity(userName, "启用"); } else { isAgainWrite = true; TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新贴卡"); } } else { TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致"); } } stopAnim(); } private void setmanageCard(Intent intent, final ManageCard manageCard) { try { manageCardFlag = NFCWriteHelper.getInstence(intent, this).writeData(manageCard.toZeroByte(baseDao), 1, 0); } catch (Exception e) { e.printStackTrace(); } } /** * 制作清零卡 * * @param intent * @param clearOrInitCard */ private void setClean(Intent intent, final CleanCard clearOrInitCard) { try { cleanFlag = NFCWriteHelper.getInstence(intent, this).writeData(clearOrInitCard.toByte(baseDao), 1, 0); } catch (Exception e) { e.printStackTrace(); } } /** * 重新注册设备卡 * * @param intent * @param registeredCard */ private void setRegisteredCard(Intent intent, RegisteredCard registeredCard) { try { registeredFlag = NFCWriteHelper.getInstence(intent, this).writeData(registeredCard.toByte(baseDao), 1, 0); } catch (Exception e) { e.printStackTrace(); } } /** * 删除全部用户卡 * * @param intent * @param cleanUserCard */ private void setCleanUserCard(Intent intent, CleanUserCard cleanUserCard) { try { cleanUserCardFlag = NFCWriteHelper.getInstence(intent, this).writeData(cleanUserCard.toByte(baseDao), 1, 0); } catch (Exception e) { e.printStackTrace(); } } /** * 设置域名卡 * * @param intent * @param domainXinXiangCard */ private void setDomainCard(Intent intent, DomainCard domainXinXiangCard) { try { domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getZeroByte(), 1, 0); if (!domainCrdFlag) { return; } domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getOneByte(), 1, 1); if (!domainCrdFlag) { return; } domainCrdFlag = NFCWriteHelper.getInstence(intent, this).writeData(domainXinXiangCard.getTwoByte(), 1, 2); } catch (Exception e) { domainCrdFlag = false; e.printStackTrace(); } } private void setTestCard(Intent intent, TestCard testCard) { testCardFlag = NFCWriteHelper.getInstence(intent, this).writeData(testCard.toByte(baseDao), 1, 0); } private void setConfigDeviceRegiest(Intent intent, ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad) { configDeviceRegiestFlag = NFCWriteHelper.getInstence(intent, this).writeData(configureDeviceRegistrationCrad.toByte(baseDao), 1, 0); } private void setConfigurationPower(Intent intent, ConfigurationPowerCard configurationPowerCard) { try { configPowerFlag = NFCWriteHelper.getInstence(intent, this).writeData(configurationPowerCard.toByte(baseDao), 1, 0); } catch (Exception e) { configPowerFlag = false; e.printStackTrace(); } } private void startDetailActivity(String userName, String statu) { Intent detail = new Intent(this, RechargeDetail.class); detail.putExtra("userName", userName); detail.putExtra("statu", statu); detail.putExtra("userCard", userCard); if (!TextUtils.isEmpty(morny)) { detail.putExtra("morny", morny); } startActivity(detail); myFinish(); } /** * 查询余额 * * @param initPeasantCode 农户注册编号 */ private void selectBalance(String initPeasantCode) { Log.i(TAG, "补卡查询余额:农户注册编号 " + initPeasantCode); try { startAnim(); BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean(); requestBean.setAFN("94"); requestBean.setControl("01"); String initCode = DeviceNumberUtils.getDeviceNumber(); requestBean.setInitCode(initCode); requestBean.setInitPeasantCode(initPeasantCode); requestBean.setXuLie(SocketUtil.getXuLie(this)); SocketNet.getInstance().sendTestMessage(requestBean.pack(), "94", new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { if (CRC8.isCRC8(readData.getOriginDataBytes())) { StringBuffer stateText = null; try { stateText = new StringBuffer(); 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(0); userCard.setState("00"); userCard.setBalance(0); userCard.setAddressCode(adminData.getAddressCode()); userCard.setInitPeasantCode(initPeasantCode); } //只有启动状态才能充值 //金额 byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7); int balance = SocketUtil.get16to10LowHigh(blanceByte); //姓名 byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19); String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte)); if ("00".equals(state)) { stateText.append("启用"); userCard.setBalance(balance); userCard.setState("00"); //补卡逻辑 userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this); if (userFlag) { TipUtil.show(NFCWreatActivity.this, "补卡成功", () -> NFCWreatActivity.this.finish()); } return; } else if ("01".equals(state)) { stateText.append("禁用"); userCard.setState("01"); userCard.setBalance(balance); userFlag = WriteCardUtils.setUser(intent, userCard, NFCWreatActivity.this); startDetailActivity(name, stateText.toString()); } else if ("02".equals(state)) { stateText.append("隶属信息不符"); } else if ("03".equals(state)) { stateText.append("无此卡信息"); } else if ("04".equals(state)) { stateText.append("其它"); } stopAnim(); binding.cardData.setText(stateText); TipUtil.show(NFCWreatActivity.this, stateText.toString()); } catch (Exception e) { e.printStackTrace(); stopAnim(); } } else { //校验CRC错误 TipUtil.show(NFCWreatActivity.this, "开卡报文校验CRC错误"); } stopAnim(); } @Override public void onSocketError(int code, String msg) { runOnUiThread(() -> { stopAnim(); TipUtil.show(NFCWreatActivity.this, msg); }); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); stopAnim(); ProgressDialog.dismiss(); } } protected void onDestroy() { super.onDestroy(); ProgressDialog.dismiss(); nfcWreatActivity = null; } private void titleBack() { titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE, new View.OnClickListener() { @Override public void onClick(View v) { back(); } }); } }