左晓为主开发手持机充值管理机
zuoxiao
2024-09-27 feb7add1979c830e0d940286242a7c489f2f8f96
henanlibrary/src/main/java/com/dayu/henanlibrary/tools/NFCWriteHelper.java
@@ -8,7 +8,9 @@
import android.util.Log;
import com.dayu.baselibrary.tools.HexUtil;
import com.dayu.henanlibrary.card.UserCard;
import com.dayu.baselibrary.tools.nfc.BaseNfcWriteHelper;
import com.dayu.baselibrary.tools.nfc.NfcWriteAdapter;
import com.dayu.henanlibrary.card.UserCardHN;
import java.io.IOException;
@@ -18,16 +20,15 @@
 * email 1058083107@qq.com
 * description
 */
public class NFCWriteHelper extends BaseNFCHelper {
public class NFCWriteHelper extends HNBaseHelper {
    private Tag tag;
    private static NFCWriteHelper helper;
    private static int PASSWORD_LENTH = 12;
    private NfcWriteAdapter adapter;
    public NFCWriteHelper(Intent intent, Activity activity) {
        super(activity);
        this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        adapter = new NfcWriteAdapter(intent,activity);
    }
    /**
@@ -43,21 +44,6 @@
        return helper;
    }
    /**
     * 设置NFC卡的读取密码
     *
     * @param str
     * @return
     */
    public NFCWriteHelper setReadPassword(String str) {
        if (null != str && (str.length() <= PASSWORD_LENTH)) {
            for (int i = 0; i < str.length(); i++) {
                defauleKey[i] = (byte) str.charAt(i);
            }
        }
        return helper;
    }
    /**
     * 写卡
@@ -65,55 +51,11 @@
     * @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;
            }
    public boolean writeUserData(UserCardHN userCard) {
        try {
            return adapter.writeUserData(userCard);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
@@ -128,56 +70,10 @@
     * @param
     */
    public boolean writeData(byte[] str, int a, int b) {
        Log.i("NFCWreatActivity", "writeData: a=" + a + " b=" + b);
        if (str.length <= 16) {
            try {
                MifareClassic mfc = MifareClassic.get(tag);
                if (null != mfc) {
                    try {
                        //连接NFC
                        mfc.connect();
                        //获取扇区数量
                        int count = mfc.getSectorCount();
                        //如果传进来的扇区大了或者小了直接退出方法
                        if (a > count - 1 || a < 0) {
                            return false;
                        }
                        //获取写的扇区的块的数量
                        int bCount = mfc.getBlockCountInSector(a);
                        //如果输入的块大了或者小了也是直接退出
                        if (b > bCount - 1 || b < 0) {
                            return false;
                        }
                        //验证扇区密码
                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
                        if (!isOpen) {
                            isOpen = mfc.authenticateSectorWithKeyA(a, companyKey);
                        } else {
                            //写卡时修改所有密码
                            changePasword(a, mfc);
                        }
                        if (isOpen) {
                            int bIndex = mfc.sectorToBlock(a);
                            //写卡
                            mfc.writeBlock(bIndex + b, str);
                            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;
            }
        try {
            return adapter.writeData(str, a, b);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
@@ -190,65 +86,12 @@
     *          //     * @param callback 返回监听
     */
    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);
//                    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 {
            adapter.changePasword(a,mfc);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    /**
     * 返回监听类
     */
    public interface NFCCallback {
        /**
         * 返回是否成功
         *
         * @param flag
         */
        void isSusses(boolean flag);
    }
}
}