左晓为主开发手持机充值管理机
zuoxiao
2024-03-26 ebc06a3ae3a42bd6ac1359a59c55d5e6f1a0e2f0
app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
@@ -7,6 +7,8 @@
import android.nfc.tech.MifareClassic;
import android.util.Log;
import com.dayu.recharge.card.UserCard;
import java.io.IOException;
/**
@@ -55,6 +57,67 @@
        return helper;
    }
    /**
     * 写卡
     *
     * @param userCard 用户卡内容
     * @param
     */
    public boolean writeUserData(UserCard userCard) {
        if (userCard != null) {
            int a = 1;
            try {
                MifareClassic mfc = MifareClassic.get(tag);
                if (null != mfc) {
                    try {
                        //连接NFC
                        mfc.connect();
                        //验证扇区密码
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
                        if (!isOpen) {
                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey);
                        } else {
                            //写卡时修改所有密码
                            changePasword(a, mfc);
                        }
                        if (isOpen) {
                            for (int b = 0; b < 3; b++) {
                                byte[] data;
                                if (b == 0) {
                                    data = userCard.getZeroBytes();
                                } else if (b == 1) {
                                    data = userCard.getOneBytes();
                                } else {
                                    data = userCard.getTwoBytes();
                                }
                                int bIndex = mfc.sectorToBlock(a);
                                //写卡
                                mfc.writeBlock(bIndex + b, data);
                            }
                            return true;
                        }
                        return false;
                    } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                    } finally {
                        try {
                            mfc.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }
    /**
     * 写卡
     *
@@ -65,8 +128,6 @@
     */
    public boolean writeData(byte[] str, int a, int b) {
        Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b);
        //写卡时修改所有密码
        changePasword(a);
        if (str.length <= 16) {
            try {
                MifareClassic mfc = MifareClassic.get(tag);
@@ -90,6 +151,9 @@
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
                        if (!isOpen) {
                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey);
                        } else {
                            //写卡时修改所有密码
                            changePasword(a, mfc);
                        }
                        if (isOpen) {
                            int bIndex = mfc.sectorToBlock(a);
@@ -124,54 +188,52 @@
     * @param a 书写的扇区
     *          //     * @param callback 返回监听
     */
    public boolean changePasword(int a) {
        MifareClassic mfc = MifareClassic.get(tag);
    public boolean changePasword(int a, MifareClassic mfc) {
//        MifareClassic mfc = MifareClassic.get(tag);
        byte[] data = new byte[16];
        if (null != mfc) {
            try {
                mfc.connect();
                int count = mfc.getSectorCount();
                boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
                //验证是否是默认密码,当默认密码时修改密码
                if (isOpen) {
                    //将密码转换为keyA
                    byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
                    for (int i = 0; i < dataA.length; i++) {
                        data[i] = dataA[i];
                    }
                    //输入控制位
                    data[6] = (byte) 0xFF;
                    data[7] = (byte) 0x07;
                    data[8] = (byte) 0x80;
                    data[9] = (byte) 0x69;
                    byte[] dataB = HexUtil.hexToByteArray(companyKeyB);
                    //将密码转换为KeyB
                    for (int i = 0; i < dataB.length; i++) {
                        data[i + 10] = dataB[i];
                    }
                    int bIndex = mfc.sectorToBlock(a);
                    int bCount = mfc.getBlockCountInSector(a);
                    //写到扇区的最后一个块
                    mfc.writeBlock(bIndex + bCount - 1, data);
//                mfc.connect();
//                int count = mfc.getSectorCount();
//                boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
//                //验证是否是默认密码,当默认密码时修改密码
//                if (isOpen) {
                //将密码转换为keyA
                byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
                for (int i = 0; i < dataA.length; i++) {
                    data[i] = dataA[i];
                }
                //输入控制位
                data[6] = (byte) 0xFF;
                data[7] = (byte) 0x07;
                data[8] = (byte) 0x80;
                data[9] = (byte) 0x69;
                byte[] dataB = HexUtil.hexToByteArray(companyKeyB);
                //将密码转换为KeyB
                for (int i = 0; i < dataB.length; i++) {
                    data[i + 10] = dataB[i];
                }
                int bIndex = mfc.sectorToBlock(a);
                int bCount = mfc.getBlockCountInSector(a);
                //写到扇区的最后一个块
                mfc.writeBlock(bIndex + bCount - 1, data);
//                    byte[] dataa = mfc.readBlock(bIndex + bCount - 1);
//                    // 修改密码 A
//                    mfc.writeBlock(mfc.sectorToBlock(a) + 3, dataA);
//                    // 修改密码 B
//                    mfc.writeBlock(mfc.sectorToBlock(a) + 7, dataB);
                }
//                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
//                callback.isSusses(false);
            } finally {
                try {
                    mfc.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
//                try {
//                    mfc.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
            }
        }
        return false;