左晓为主开发手持机充值管理机
zuoxiao
2023-11-30 8e3719a37a6be0c9e244a0160b5f2f3331ca3122
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -2,18 +2,16 @@
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
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.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;
@@ -21,13 +19,17 @@
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.ToastUtil;
import com.dayu.recharge.utils.WSHelper;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.view.ProgressDialog;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
@@ -41,14 +43,23 @@
    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;
    private static final int ERROR = -1;
    UserCard userCard;
    UserCardBean waterCard;
    RechargeBean rechargeBean;
    //    农户注册编号
    volatile UserCard userCard;
    ActivityRedCardBinding redCardBinding;
    //    Intent intent;
    Tag mTag;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -57,134 +68,157 @@
        setContentView(redCardBinding.getRoot());
    }
    private void setData(String statu) {
        String initCode = WSHelper.getInstance(this).get("initCode", "");
        if (TextUtils.isEmpty(initCode)) {
            ToastUtil.show(this, "设备注册号为空,请先设置IP和管理员地址");
            return;
    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() + "");
        }
//        redCardBinding.redVillageNum.setText("设备序列号:" + initS.getANo() + "");
        redCardBinding.redName.setText("用 户 名:" + rechargeBean.getUserName());
        redCardBinding.redRemainderMorny.setText("剩余金额:" + rechargeBean.getBalance() + "" + "元");
        redCardBinding.redStatu.setText("状    态:" + statu);
    }
    @Override
    public void physicalCardDoing(Tag tag) {
        super.physicalCardDoing(tag);
        mTag = tag;
        ProgressDialog.show(this);
        readAllData(tag);
    }
    @Override
    public void onNewIntent(Intent intent) {
        startAnim();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
            readAllData(intent);
        }
//        this.intent = intent;
        super.onNewIntent(intent);
    }
    /**
     * 读取全部数据
     */
    private void readAllData(Intent intent) {
    public void readAllData(Tag intent) {
        NfcReadHelper.getInstence(intent)
                .getAllData(new NfcReadHelper.NFCCallListback() {
                .getOneSectorData(new NfcReadHelper.NFCCallListback() {
                    @Override
                    public void callBack(Map<String, List<byte[]>> data) {
                        Message message = new Message();
                    public void callBack(List<byte[]> data) {
                        //获取1扇区数据
                        List<byte[]> oneSector = data.get("1");
                        if (oneSector != null && oneSector.size() > 0) {
                            byte cardType = oneSector.get(0)[0];
                        if (data != null && data.size() > 0) {
                            byte cardType = data.get(0)[0];
                            String cardTypeStr = HexUtil.byteToHex(cardType);
//                            switch (cardTypeStr){
//                                case
//                            }
                                    userCard = UserCard.getBean(oneSector);
                            message.what = USER_CRAD;
                            switch (cardTypeStr) {
                                case MyCommon.USER_CARD_TYPE_1:
                                case MyCommon.USER_CARD_TYPE_2:
                                case MyCommon.USER_CARD_TYPE_3:
                                    userCard = UserCard.getBean(data);
                                    selectBalance(userCard.getInitPeasantCode());
                                    break;
                                case MyCommon.MANAGE_CRAD:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为管理卡");
                                    stopAnim();
                                    break;
                                case MyCommon.CLEAN_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为清零卡");
                                    stopAnim();
                                    break;
                                case MyCommon.REGISTERED_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为重新注册设备卡");
                                    stopAnim();
                                    break;
                                case MyCommon.CLEAN_ALL_USER_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为删除全部用户卡");
                                    stopAnim();
                                    break;
                                case MyCommon.DOMAIN_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为设置域名卡");
                                    DomainCard domainCard = DomainCard.toBean(data);
                                    redCardBinding.readCardDataTV.setText("序号:" + domainCard.getDomainNumber() + "\n" + "域名:" + domainCard.getDomainName() + "\n" + "端口号:" + domainCard.getPort());
                                    stopAnim();
                                    break;
                                case MyCommon.TEST_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为测试卡");
                                    stopAnim();
                                    break;
                                case MyCommon.CONFIGURATION_CARD_TYPE:
                                    viweGone(false);
                                    redCardBinding.readCardTypeTV.setText("当前为配置设备注册信息卡");
                                    stopAnim();
                                    break;
                                case MyCommon.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 {
                            message.what = ERROR;
                            TipUtil.show(ReadCardAcitivy.this, "卡片无法识别");
                            stopAnim();
                        }
                        handler.sendMessage(message);
                    }
                    @Override
                    public void error() {
                        Message message = new Message();
                        message.what = ERROR;
                        handler.sendMessage(message);
                    public void error(int code) {
                        switch (code) {
                            case MyCommon.ERROR_MOVE:
                                stopAnim();
                                TipUtil.show("连接中断,请重新贴合卡片");
                                break;
                            default:
                                stopAnim();
                                TipUtil.show("卡片识别错误,请重试!");
                        }
                    }
                });
    }
    Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case USER_CRAD:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.VISIBLE);
                    redCardBinding.readSysLL.setVisibility(View.GONE);
                    redCardBinding.readCleanLL.setVisibility(View.GONE);
                    redCardBinding.readInitLL.setVisibility(View.GONE);
//                    selectBalance(newUserCard.getPeasantCode());
                    break;
                case MANAGE_CRAD:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.GONE);
                    redCardBinding.readSysLL.setVisibility(View.VISIBLE);
                    redCardBinding.readCleanLL.setVisibility(View.GONE);
                    redCardBinding.readInitLL.setVisibility(View.GONE);
                    stopAnim();
                    break;
                case 3:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.GONE);
                    redCardBinding.readSysLL.setVisibility(View.GONE);
                    redCardBinding.readCleanLL.setVisibility(View.VISIBLE);
                    redCardBinding.readInitLL.setVisibility(View.GONE);
                    stopAnim();
                    break;
                case 4:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.GONE);
                    redCardBinding.readSysLL.setVisibility(View.GONE);
                    redCardBinding.readCleanLL.setVisibility(View.GONE);
                    redCardBinding.readInitLL.setVisibility(View.VISIBLE);
                    stopAnim();
                    break;
                case 5:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.GONE);
                    redCardBinding.readSysLL.setVisibility(View.GONE);
                    redCardBinding.readCleanLL.setVisibility(View.GONE);
                    redCardBinding.readInitLL.setVisibility(View.VISIBLE);
                    redCardBinding.readInitLL.setText("当前为行政区域卡");
                    stopAnim();
                    break;
                case 6:
                    redCardBinding.readImgLL.setVisibility(View.GONE);
                    redCardBinding.readUserLL.setVisibility(View.GONE);
                    redCardBinding.readSysLL.setVisibility(View.GONE);
                    redCardBinding.readCleanLL.setVisibility(View.GONE);
                    redCardBinding.readInitLL.setVisibility(View.VISIBLE);
                    redCardBinding.readInitLL.setText("当前为设备序号卡");
                    stopAnim();
                    break;
                default:
                    ToastUtil.show(ReadCardAcitivy.this, "卡片未注册");
                    stopAnim();
            }
            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();
        ProgressDialog.dismiss();
        // or avi.smoothToHide();
    }
@@ -192,11 +226,10 @@
     * @param initPeasantCode 农户注册编号
     */
    private void selectBalance(String initPeasantCode) {
        BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean();
        requestBean.setAFN("94");
        requestBean.setControl("01");
        String initCode = WSHelper.getInstance(this).get("initCode", "");
        String initCode = DeviceNumberUtils.getDeviceNumber();
        requestBean.setInitCode(initCode);
        requestBean.setInitPeasantCode(initPeasantCode);
        requestBean.setXuLie(SocketUtil.getXuLie(this));
@@ -209,11 +242,30 @@
                    try {
                        stateText = new StringBuffer();
//                        stateText.append("状    态:");
                        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(mTag, userCard);
                            stateText.append("启用");
                        } else if ("01".equals(state)) {
                            userCard.setBalance(balance);
                            userCard.setState("01");
                            WriteCardUtils.setUser(mTag, userCard);
                            stateText.append("禁用");
                        } else if ("02".equals(state)) {
                            stateText.append("隶属信息不符");
@@ -222,34 +274,22 @@
                        } else if ("04".equals(state)) {
                            stateText.append("其它");
                        }
                        //金额
                        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.setUserName(name);
                        rechargeBean.setBalance(MornyUtil.changeF2Y(balance) + "");
//                        rechargeBean.setTotal_morn(ArithUtil.changeF2Y(userCard.getValue() + ""));
                        setData(stateText.toString());
                        setUserData(name, balance, stateText.toString());
                        stopAnim();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else {
                    //校验CRC错误
                    ToastUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误");
                    TipUtil.show(ReadCardAcitivy.this, "开卡报文校验CRC错误");
                }
                stopAnim();
            }
            @Override
            public void onSocketError(int code, String msg) {
                ToastUtil.show(ReadCardAcitivy.this, msg);
                TipUtil.show(ReadCardAcitivy.this, msg);
            }
        });