package com.dayu.recharge.acitivity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.text.TextUtils; import android.view.LayoutInflater; import com.dayu.recharge.MyApplication; import com.dayu.recharge.card.CleanCard; import com.dayu.recharge.card.CleanUserCard; import com.dayu.recharge.card.ManageCard; import com.dayu.recharge.card.RegisteredCard; import com.dayu.recharge.card.UserCard; import com.dayu.recharge.databinding.ActivityWriteTextBinding; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.dbBean.RechargeBean; import com.dayu.recharge.dbBean.UserCardBean; import com.dayu.recharge.net.SocketCallBack; import com.dayu.recharge.net.SocketData; import com.dayu.recharge.net.SocketNet; import com.dayu.recharge.socketBean.BalanceSelecteRequestBean; import com.dayu.recharge.socketBean.RechargeRequestBean; import com.dayu.recharge.tools.BcdUtil; import com.dayu.recharge.tools.HexUtil; import com.dayu.recharge.tools.NFCWriteHelper; import com.dayu.recharge.tools.NfcReadHelper; import com.dayu.recharge.utils.AidlUtil; import com.dayu.recharge.utils.CRC8; import com.dayu.recharge.utils.DateUtil; import com.dayu.recharge.utils.MornyUtil; import com.dayu.recharge.utils.SocketUtil; import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.utils.WSHelper; import com.tencent.bugly.crashreport.CrashReport; import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.Map; public class NFCWreatActivity extends BaseNfcActivity { /** * 该卡已写入用户信息 */ public final static int HAS_USER = 1; /** * 该卡未写入用户信息 */ public final static int NO_USER = 2; /** * 充值 */ public final static int RECHARGE = 3; public final static int ERROR = -1; boolean cleanFlag = false; boolean userFlag = false; boolean manageCardFlag = false; boolean registeredFlag = false; boolean administrativeCardFlag = false; boolean cleanUserCardFlag = false; volatile UserCard userCard; ManageCard manageCard; UserCardBean userCardBean; CleanCard cleanCard; String morny; AdminDataBean adminData; RechargeBean rechargeBean; Intent intent; RegisteredCard registeredCard; CleanUserCard cleanUserCard; //打印 MyApplication baseApp; public static NFCWreatActivity nfcWreatActivity; /** * 是否是用户卡,假如是用户卡的话需要检测卡片是否已经开过户,假如已开户则报错不能再写卡 */ boolean isUser = false;// ActivityWriteTextBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { binding = ActivityWriteTextBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); nfcWreatActivity = this; getData(); baseApp = (MyApplication) getApplication(); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } private void getData() { try { if (this.getIntent().hasExtra("userCard")) { userCard = (UserCard) this.getIntent().getSerializableExtra("userCard"); isUser = true; } if (this.getIntent().hasExtra("cleanCard")) { cleanCard = (CleanCard) this.getIntent().getSerializableExtra("cleanCard"); } if (this.getIntent().hasExtra("manageCard")) { manageCard = (ManageCard) this.getIntent().getSerializableExtra("manageCard"); } if (this.getIntent().hasExtra("registeredCard")) { registeredCard = (RegisteredCard) this.getIntent().getSerializableExtra("registeredCard"); } if (this.getIntent().hasExtra("dbUserCard")) { userCardBean = (UserCardBean) this.getIntent().getSerializableExtra("dbUserCard"); } if (this.getIntent().hasExtra("cleanUserCard")) { cleanUserCard = (CleanUserCard) this.getIntent().getSerializableExtra("cleanUserCard"); } morny = this.getIntent().getStringExtra("morny"); try { adminData = baseDao.adminDao().findFirst(); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } /** * 检测是否是用户卡,假如是用户卡的话需要检测卡片是否已经开过户,假如已开户则报错不能再写卡假如是用户卡需要 */ private void checkHasUser() { try { NfcReadHelper.getInstence(intent) .getData(1, 0, new NfcReadHelper.NFCCallByteback() { @Override public void callBack(byte[] data) { Message message = new Message(); String type = HexUtil.byteToHex(data[0]).toUpperCase(); switch (type) { case "A1": case "A8": case "A2": message.what = HAS_USER; break; default: message.what = NO_USER; break; } handler.sendMessage(message); } @Override public void error() { Message message = new Message(); message.what = ERROR; handler.sendMessage(message); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } private void saveData() { try { startAnim(); if (userCard != null || cleanCard != null || manageCard != null || registeredCard != null || cleanUserCard != null) { if (userCard != null) { setUser(intent, userCard); } 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 ((userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag)) { try { if (userFlag && userCardBean != null) { baseDao.userCardDao().insert(userCardBean); ToastUtil.show(this, "注册成功"); NFCWreatActivity.this.finish(); if (NewCardActivity.newCardActivity != null) { NewCardActivity.newCardActivity.finish(); } } else if (!TextUtils.isEmpty(morny)) { NFCWreatActivity.this.finish(); ToastUtil.show(this, "充值成功"); } else { NFCWreatActivity.this.finish(); ToastUtil.show(this, "写卡成功"); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } else { ToastUtil.show(this, "写卡失败"); } stopAnim(); } else if (!TextUtils.isEmpty(morny)) { readAllData(intent); } else { stopAnim(); ToastUtil.show(this, "参数错误"); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } @Override public void onNewIntent(Intent intent) { try { this.intent = intent; startAnim(); if (isUser) { checkHasUser(); } else { saveData(); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } /** * 读取全部数据 */ private void readAllData(Intent intent) { try { NfcReadHelper.getInstence(intent) .getAllData(new NfcReadHelper.NFCCallListback() { @Override public void callBack(Map> data) { Message message = new Message(); // 获取1扇区数据 List oneSector = data.get("1"); if (oneSector != null && oneSector.size() > 0) { userCard = UserCard.getBean(oneSector); message.what = RECHARGE; } else { message.what = ERROR; } handler.sendMessage(message); } @Override public void error() { Message message = new Message(); message.what = ERROR; handler.sendMessage(message); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case HAS_USER://判断已写入用户 ToastUtil.show(NFCWreatActivity.this, "该卡已经写入用户信息,请更换卡片"); break; case NO_USER://没有写过用户继续保存 saveData(); break; case RECHARGE://充值流程 selectBalance(userCard.getInitPeasantCode()); break; default: stopAnim(); ToastUtil.show(NFCWreatActivity.this, "卡片读取失败"); break; } return false; } }); /** * 打印机相关信息 * * @param rechargeBean */ private void setPrinterData(RechargeBean rechargeBean) { try { StringBuffer data = new StringBuffer(); if (rechargeBean != null) { data.append("*****************************" + "\n"); data.append(" 农业水价综合改革充值系统\n\n"); data.append("设备序列号:" + rechargeBean.getSerial() + "\n"); data.append("用户名:" + rechargeBean.getUserName() + "\n"); // data.append("户 号:" + rechargeBean.getUserNum() + "\n"); data.append("充值金额:" + rechargeBean.getMorny() + "元" + "\n"); data.append("卡内余额:" + rechargeBean.getBalance() + "元" + "\n"); data.append("日 期:" + DateUtil.dateToStamp(rechargeBean.getDate(), DateUtil.type2) + "\n\n"); data.append("*****************************"); } float size = 26; if (baseApp.isAidl()) { AidlUtil.getInstance().printText(data.toString(), size, true, false); AidlUtil.getInstance().print3Line(); } } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } void startAnim() { binding.avi.show(); // or avi.smoothToShow(); } void stopAnim() { binding.avi.hide(); // or avi.smoothToHide(); } //充值上传(Socket) private void recharge(String initPeasantCode) { try { RechargeRequestBean rechargeRequestBean = new RechargeRequestBean(); rechargeRequestBean.setControl("01"); String initCode = WSHelper.getInstance(this).get("initCode", ""); 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(), new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { if (CRC8.isCRC8(readData.getOriginDataBytes())) { String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]); //00启用01禁用02隶属信息不符03无此卡信息04其它 if ("00".equalsIgnoreCase(state)) { try { baseDao.rechargeDao().insert(rechargeBean); } catch (Exception e) { e.printStackTrace(); } userCard.setRechargeTimes(userCard.getRechargeTimes() + 1); setUser(intent, userCard); // 打印相关 setPrinterData(rechargeBean); ToastUtil.show(NFCWreatActivity.this, "写卡成功"); RechargeActivity.rechargeActivity.finish(); NFCWreatActivity.nfcWreatActivity.finish(); } else if ("01".equalsIgnoreCase(state)) { NFCWreatActivity.this.finish(); ToastUtil.show(NFCWreatActivity.this, "充值报文错误-禁用"); } else if ("02".equalsIgnoreCase(state)) { ToastUtil.show(NFCWreatActivity.this, "充值报文错误-隶属信息不符"); NFCWreatActivity.this.finish(); } else if ("03".equalsIgnoreCase(state)) { ToastUtil.show(NFCWreatActivity.this, "充值报文错误-无此卡信息"); NFCWreatActivity.this.finish(); } else { ToastUtil.show(NFCWreatActivity.this, "充值报文错误-其它"); NFCWreatActivity.this.finish(); } } else { //校验CRC错误 ToastUtil.show(NFCWreatActivity.this, "充值报文错误校验CRC错误"); NFCWreatActivity.this.finish(); } stopAnim(); } @Override public void onSocketError(int code, String msg) { stopAnim(); ToastUtil.show(NFCWreatActivity.this, msg); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } private void setmanageCard(Intent intent, final ManageCard manageCard) { NFCWriteHelper.getInstence(intent).writeData(manageCard.toZeroByte(), 1, 0, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { manageCardFlag = flag; } }); } /** * 制作清零卡 * * @param intent * @param clearOrInitCard */ private void setClean(Intent intent, final CleanCard clearOrInitCard) { NFCWriteHelper.getInstence(intent).writeData(clearOrInitCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { cleanFlag = flag; } }); } //向卡写入用户信息 private void setUser(Intent intent, UserCard userCard) { NFCWriteHelper.getInstence(intent).writeData(userCard.getZeroBytes(), 1, 0, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { userFlag = flag; } }); NFCWriteHelper.getInstence(intent).writeData(userCard.getOneBytes(), 1, 1, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { userFlag = flag; } }); NFCWriteHelper.getInstence(intent).writeData(userCard.getTwoBytes(), 1, 2, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { userFlag = flag; } }); } /** * 重新注册设备卡 * * @param intent * @param registeredCard */ private void setRegisteredCard(Intent intent, RegisteredCard registeredCard) { NFCWriteHelper.getInstence(intent).writeData(registeredCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { registeredFlag = flag; } }); } private void setCleanUserCard(Intent intent, CleanUserCard cleanUserCard) { NFCWriteHelper.getInstence(intent).writeData(cleanUserCard.toByte(), 1, 0, new NFCWriteHelper.NFCCallback() { @Override public void isSusses(boolean flag) { cleanUserCardFlag = flag; } }); } /** * @param initPeasantCode 农户注册编号 */ private void selectBalance(String initPeasantCode) { try { BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean(); requestBean.setAFN("94"); requestBean.setControl("01"); String initCode = WSHelper.getInstance(this).get("initCode", ""); requestBean.setInitCode(initCode); requestBean.setInitPeasantCode(initPeasantCode); requestBean.setXuLie(SocketUtil.getXuLie(this)); SocketNet.getInstance().sendTestMessage(requestBean.pack(), new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { if (CRC8.isCRC8(readData.getOriginDataBytes())) { StringBuffer stateText = null; try { stateText = new StringBuffer(); stateText.append("状 态:"); String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]); //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s if ("00".equals(state)) { //只有启动状态才能充值 //金额 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)); rechargeBean = new RechargeBean(); rechargeBean.setDate(System.currentTimeMillis()); rechargeBean.setMorny(morny); if (userCardBean != null) { rechargeBean.setUserName(userCardBean.getUserName()); } else { rechargeBean.setUserName(name); } List userCardBeans = baseDao.userCardDao().findAll(); String userId = ""; if (userCardBeans != null) { for (int i = 0; i < userCardBeans.size(); i++) { if (initPeasantCode.equalsIgnoreCase(userCardBeans.get(i).getInitPeasantCode())) { userId = userCardBeans.get(i).getUserID(); } } } rechargeBean.setSerial(adminData.getSerial()); userCard.setBalance(balance); userCard.setRechargeDate(Calendar.getInstance()); rechargeBean.setBalance(MornyUtil.changeF2Y(balance) + ""); rechargeBean.setUserId(userId); //与socket服务器通信后进行后续操作 recharge(initPeasantCode); stateText.append("启用"); return; } else if ("01".equals(state)) { stateText.append("禁用"); userCard.setState("01"); setUser(intent, userCard); } else if ("02".equals(state)) { stateText.append("隶属信息不符"); } else if ("03".equals(state)) { stateText.append("无此卡信息"); } else if ("04".equals(state)) { stateText.append("其它"); } ToastUtil.show(NFCWreatActivity.this, stateText.toString()); } catch (Exception e) { e.printStackTrace(); stopAnim(); } } else { //校验CRC错误 ToastUtil.show(NFCWreatActivity.this, "开卡报文校验CRC错误"); } } @Override public void onSocketError(int code, String msg) { stopAnim(); ToastUtil.show(NFCWreatActivity.this, msg); } }); } catch (Exception e) { e.printStackTrace(); CrashReport.postCatchedException(e); } } }