| package com.dayu.henanlibrary.activity; | 
|   | 
| import android.content.Intent; | 
| import android.nfc.NfcAdapter; | 
| import android.os.Bundle; | 
| import android.text.TextUtils; | 
| import android.view.LayoutInflater; | 
| import android.view.View; | 
|   | 
| import com.dayu.baselibrary.tools.BcdUtil; | 
| import com.dayu.baselibrary.tools.HexUtil; | 
| import com.dayu.baselibrary.utils.CRC8; | 
| import com.dayu.baselibrary.utils.MornyUtil; | 
| import com.dayu.baselibrary.utils.TipUtil; | 
| import com.dayu.henanlibrary.card.ConfigurationPowerCard; | 
| import com.dayu.henanlibrary.card.DomainCard; | 
| import com.dayu.henanlibrary.card.UserCard; | 
| import com.dayu.henanlibrary.databinding.ActivityRedCardHnBinding; | 
| 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.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 java.util.Arrays; | 
| import java.util.Calendar; | 
| import java.util.List; | 
|   | 
| /** | 
|  * Copyright (C), 2023, | 
|  * Author: zuo | 
|  * Date: 2023-11-10 19:52 | 
|  * Description: 读卡界面 | 
|  */ | 
| public class ReadCardAcitivy extends BaseNfcActivity { | 
|   | 
|     volatile UserCard userCard; | 
|     ActivityRedCardHnBinding redCardBinding; | 
|   | 
|     Intent intent; | 
|   | 
|     @Override | 
|     protected void onCreate(Bundle savedInstanceState) { | 
|         super.onCreate(savedInstanceState); | 
|         redCardBinding = ActivityRedCardHnBinding.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); | 
|         redCardBinding.redAddressCode.setText("地址码:" + userCard.getAddressCode()); | 
|         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) { | 
|         this.intent = intent; | 
|         ProgressDialog.show(this); | 
|         if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { | 
|             readAllData(intent); | 
|         } | 
|         super.onNewIntent(intent); | 
|     } | 
|   | 
|     /** | 
|      * 读取全部数据 | 
|      */ | 
|   | 
|     public void readAllData(Intent intent) { | 
|         NfcReadHelper.getInstence(intent, this) | 
|                 .getOneSectorData(new NfcReadHelper.NFCCallListback() { | 
|                     @Override | 
|                     public void callBack(List<byte[]> data) { | 
|                         //获取1扇区数据 | 
|                         if (data != null && data.size() > 0) { | 
|                             byte cardType = data.get(0)[0]; | 
|                             String cardTypeStr = HexUtil.byteToHex(cardType); | 
|                             switch (cardTypeStr) { | 
|                                 case CardCommon.USER_CARD_TYPE_1: | 
|                                 case CardCommon.USER_CARD_TYPE_2: | 
|                                 case CardCommon.USER_CARD_TYPE_3: | 
|                                     userCard = UserCard.getBean(data); | 
|                                     selectBalance(userCard.getInitPeasantCode()); | 
|                                     break; | 
|                                 case CardCommon.MANAGE_CRAD: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为管理卡"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.CLEAN_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为清零卡"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.REGISTERED_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为重新注册设备卡"); | 
|                                     stopAnim(); | 
|   | 
|                                     break; | 
|                                 case CardCommon.CLEAN_ALL_USER_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为删除全部用户卡"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.DOMAIN_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     DomainCard domainXinXiangCard = DomainCard.toBean(data); | 
|                                     if(domainXinXiangCard.getType()==0){ | 
|                                         redCardBinding.readCardTypeTV.setText("当前为新乡域名卡"); | 
|                                     }else { | 
|                                         redCardBinding.readCardTypeTV.setText("当前为鹿邑域名卡"); | 
|                                     } | 
|                                     StringBuilder builder = new StringBuilder(); | 
|                                     if (domainXinXiangCard.getType() == 0) { | 
|                                         builder.append("序号:" + domainXinXiangCard.getDomainNumber() + "\n"); | 
|                                     } | 
|                                     builder.append("域名:" + domainXinXiangCard.getDomainName()); | 
|                                     builder.append("\n" + "端口号:" + domainXinXiangCard.getPort()); | 
|   | 
|                                     redCardBinding.readCardDataTV.setText(builder.toString()); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.TEST_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为测试卡"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.CONFIGURATION_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前为配置设备注册信息卡"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 case CardCommon.CONFIGURATION_POWER_CARD_TYPE: | 
|                                     viweGone(false); | 
|                                     redCardBinding.readCardTypeTV.setText("当前配置水泵功率卡"); | 
|                                     ConfigurationPowerCard powerCard = ConfigurationPowerCard.toBean(data.get(0)); | 
|                                     redCardBinding.readCardDataTV.setText(powerCard.getPower()); | 
|                                     stopAnim(); | 
|                                     break; | 
|                                 default: | 
|                                     TipUtil.show(ReadCardAcitivy.this, "当前卡片为白卡,请制卡后读取"); | 
|                                     stopAnim(); | 
|                                     break; | 
|                             } | 
|   | 
|                         } else { | 
|                             TipUtil.show(ReadCardAcitivy.this, "卡片无法识别"); | 
|                             stopAnim(); | 
|                         } | 
|   | 
|                     } | 
|   | 
|                     @Override | 
|                     public void error(int code) { | 
|                         switch (code) { | 
|                             case CardCommon.ERROR_MOVE: | 
|                                 stopAnim(); | 
|                                 TipUtil.show("连接中断,请重新贴合卡片"); | 
|                                 break; | 
|                             default: | 
|                                 stopAnim(); | 
|                                 TipUtil.show("卡片识别错误,请重试!"); | 
|                         } | 
|                     } | 
|                 }); | 
|     } | 
|   | 
|   | 
|     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 stopAnim() { | 
|         ProgressDialog.dismiss(); | 
|         // or avi.smoothToHide(); | 
|     } | 
|   | 
|     /** | 
|      * @param initPeasantCode 农户注册编号 | 
|      */ | 
|     private void selectBalance(String initPeasantCode) { | 
|         String initCode = DeviceNumberUtils.getDeviceNumber(); | 
|         if (TextUtils.isEmpty(initCode)) { | 
|             TipUtil.show("设备未注册"); | 
|             return; | 
|         } | 
|         BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean(); | 
|         requestBean.setAFN("94"); | 
|         requestBean.setControl("01"); | 
|         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(); | 
|                         int balance = 0; | 
|                         String name = null; | 
|                         try { | 
|                             //金额 | 
|                             byte[] blanceByte = Arrays.copyOfRange(readData.getBodyBytes(), 3, 7); | 
|                             balance = SocketUtil.get16to10LowHigh(blanceByte); | 
|                             //姓名 | 
|                             byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19); | 
|                             name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte)); | 
|                         } catch (Exception e) { | 
|                             e.printStackTrace(); | 
|                         } | 
|   | 
|                         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, ReadCardAcitivy.this); | 
|                             stateText.append("启用"); | 
|                         } else if ("01".equals(state)) { | 
|                             userCard.setBalance(balance); | 
|                             userCard.setState("01"); | 
|                             WriteCardUtils.setUser(intent, userCard, ReadCardAcitivy.this); | 
|                             stateText.append("禁用"); | 
|                         } else if ("02".equals(state)) { | 
|                             stateText.append("隶属信息不符"); | 
|                         } else if ("03".equals(state)) { | 
|                             stateText.append("无此卡信息"); | 
|                         } else if ("04".equals(state)) { | 
|                             stateText.append("其它"); | 
|                         } | 
|   | 
|                         setUserData(name, balance, stateText.toString()); | 
|                         stopAnim(); | 
|                     } catch (Exception e) { | 
|                         e.printStackTrace(); | 
|                     } | 
|                 } else { | 
|                     //校验CRC错误 | 
|                     TipUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误"); | 
|                 } | 
|                 stopAnim(); | 
|             } | 
|   | 
|             @Override | 
|             public void onSocketError(int code, String msg) { | 
|                 runOnUiThread(() -> { | 
|                     stopAnim(); | 
|                     TipUtil.show(ReadCardAcitivy.this, msg); | 
|                 }); | 
|   | 
|             } | 
|         }); | 
|     } | 
|   | 
| } |