package com.dayu.recharge.activity; import android.content.Intent; import android.nfc.NfcAdapter; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.View; import com.dayu.recharge.card.ConfigurationPowerCard; import com.dayu.recharge.card.DomainCard; import com.dayu.recharge.card.UserCard; import com.dayu.recharge.databinding.ActivityRedCardBinding; 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.tools.BcdUtil; import com.dayu.recharge.tools.HexUtil; import com.dayu.recharge.tools.NfcReadHelper; import com.dayu.recharge.tools.WriteCardUtils; import com.dayu.recharge.utils.CRC8; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.MornyUtil; import com.dayu.recharge.utils.MyCommon; import com.dayu.recharge.utils.SocketUtil; import com.dayu.recharge.utils.TipUtil; import java.util.Arrays; import java.util.Calendar; import java.util.List; import java.util.Map; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-10 19:52 * Description: 读卡界面 */ public class ReadCardAcitivy extends BaseNfcActivity { private static final int USER_CRAD = 1; private static final int MANAGE_CRAD = 2; private static final int CLEAN_CARD = 3; private static final int REGISTERED_CARD = 4; private static final int CLEAN_ALL_USER = 5; private static final int DOMAIN_CARD = 6; private static final int TEST_CARD = 7; private static final int CONFIGURATION_CARD = 8; private static final int CONFIGURATION_POWER_CARD = 9; private static final int PASS_WORD_CRAD = 10; volatile UserCard userCard; ActivityRedCardBinding redCardBinding; Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); redCardBinding = ActivityRedCardBinding.inflate(LayoutInflater.from(this)); setContentView(redCardBinding.getRoot()); } private void setUserData(String userName, int blance, String statu) { viweGone(true); redCardBinding.redName.setText("用户姓名:" + userName); 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); 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); redCardBinding.redRechargeDate.setText("本卡最后购水日期:" + year + month + day + " " + hour + ":" + minute + ":" + second); } else { redCardBinding.redRechargeDate.setText("本卡最后购水日期:无"); } redCardBinding.redRechargeNumber.setText("本卡充值次数:" + userCard.getRechargeTimes() + ""); } } @Override public void onNewIntent(Intent intent) { super.onNewIntent(intent); this.intent = intent; startAnim(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { readAllData(intent); } } /** * 读取全部数据 */ public void readAllData(Intent intent) { 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) { byte cardType = oneSector.get(0)[0]; String cardTypeStr = HexUtil.byteToHex(cardType); switch (cardTypeStr) { case MyCommon.USER_CARD_TYPE_1: case MyCommon.USER_CARD_TYPE_2: case MyCommon.USER_CARD_TYPE_3: userCard = UserCard.getBean(oneSector); message.what = USER_CRAD; break; case MyCommon.MANAGE_CRAD: message.what = MANAGE_CRAD; break; case MyCommon.CLEAN_CARD_TYPE: message.what = CLEAN_CARD; break; case MyCommon.REGISTERED_CARD_TYPE: message.what = REGISTERED_CARD; break; case MyCommon.CLEAN_ALL_USER_CARD_TYPE: message.what = CLEAN_ALL_USER; break; case MyCommon.DOMAIN_CARD_TYPE: message.what = DOMAIN_CARD; message.obj = oneSector; break; case MyCommon.TEST_CARD_TYPE: message.what = TEST_CARD; break; case MyCommon.CONFIGURATION_CARD_TYPE: message.what = CONFIGURATION_CARD; break; case MyCommon.CONFIGURATION_POWER_CARD_TYPE: message.what = CONFIGURATION_POWER_CARD; message.obj = oneSector.get(0); break; } } else { message.what = MyCommon.ERROR; } handler.sendMessage(message); } @Override public void error(int code) { Message message = new Message(); message.what = code; handler.sendMessage(message); } }); } Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case USER_CRAD: selectBalance(userCard.getInitPeasantCode()); break; case MANAGE_CRAD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为管理卡"); stopAnim(); break; case CLEAN_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为清零卡"); stopAnim(); break; case REGISTERED_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为重新注册设备卡"); stopAnim(); break; case CLEAN_ALL_USER: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为删除全部用户卡"); stopAnim(); break; case DOMAIN_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为设置域名卡"); List data = (List) msg.obj; DomainCard domainCard = DomainCard.toBean(data); redCardBinding.readCardDataTV.setText("序号:" + domainCard.getDomainNumber() + "\n" + "域名:" + domainCard.getDomainName() + "\n" + "端口号:" + domainCard.getPort()); stopAnim(); break; case TEST_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为测试卡"); stopAnim(); break; case CONFIGURATION_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为配置设备注册信息卡"); stopAnim(); break; case CONFIGURATION_POWER_CARD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前配置水泵功率卡"); byte[] powerData = (byte[]) msg.obj; ConfigurationPowerCard powerCard = ConfigurationPowerCard.toBean(powerData); redCardBinding.readCardDataTV.setText(powerCard.getPower()); stopAnim(); break; case PASS_WORD_CRAD: viweGone(false); redCardBinding.readCardTypeTV.setText("当前为密码卡"); stopAnim(); break; case MyCommon.ERROR_MOVE: stopAnim(); TipUtil.show("连接中断,请重新贴合卡片"); break; default: TipUtil.show(ReadCardAcitivy.this, "卡片无法识别"); stopAnim(); break; } return false; } }); private void viweGone(boolean isUSerCard) { redCardBinding.readImgLL.setVisibility(View.GONE); if (isUSerCard) { redCardBinding.readCardTypeLL.setVisibility(View.GONE); redCardBinding.readUserLL.setVisibility(View.VISIBLE); } else { redCardBinding.readCardTypeLL.setVisibility(View.VISIBLE); redCardBinding.readUserLL.setVisibility(View.GONE); } } void startAnim() { redCardBinding.avi.setVisibility(View.VISIBLE); redCardBinding.avi.show(); // or avi.smoothToShow(); } void stopAnim() { redCardBinding.avi.hide(); // or avi.smoothToHide(); } /** * @param initPeasantCode 农户注册编号 */ private void selectBalance(String initPeasantCode) { 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(), new SocketCallBack() { @Override public void onSocketResponse(SocketData readData) { if (CRC8.isCRC8(readData.getOriginDataBytes())) { StringBuffer stateText = null; try { stateText = new StringBuffer(); //金额 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)); setUserData(name, balance, stateText.toString()); String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]); //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s if ("00".equals(state)) { userCard.setBalance(balance); userCard.setState("00"); WriteCardUtils.setUser(intent, userCard); stateText.append("启用"); } else if ("01".equals(state)) { userCard.setBalance(balance); userCard.setState("01"); WriteCardUtils.setUser(intent, userCard); stateText.append("禁用"); } else if ("02".equals(state)) { stateText.append("隶属信息不符"); } else if ("03".equals(state)) { stateText.append("无此卡信息"); } else if ("04".equals(state)) { stateText.append("其它"); } stopAnim(); } catch (Exception e) { e.printStackTrace(); } } else { //校验CRC错误 TipUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误"); } stopAnim(); } @Override public void onSocketError(int code, String msg) { TipUtil.show(ReadCardAcitivy.this, msg); } }); } }