左晓为主开发手持机充值管理机
zuoxiao
7 天以前 c3edd4a3122b711bc6a0bfef56b6ff6bf5ae03e2
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -12,6 +12,7 @@
import com.tencent.bugly.crashreport.CrashReport;
import java.io.IOException;
import java.util.List;
/**
 * author: zuo
@@ -249,12 +250,120 @@
    /**
     * 修改密码
     *
     * @param a 书写的扇区
     *          //     * @param callback 返回监听
     * @param         书写的扇区
     * @param passWord 密码
     * @return
     */
    public boolean changePasword( List<byte[]> passWord, boolean isConnect, boolean isClose, NFCCallBack callBack) {
        if (passWord == null || passWord.size()!=16) {
            if (callBack != null) {
                callBack.isSusses(false, "密码数组为空或长度不为16");
            }
            return false;
        }
        try {
            MifareClassic mfc = MifareClassic.get(tag);
            if (mfc == null) {
                if (callBack != null) {
                    callBack.isSusses(false, "获取MifareClassic实例失败");
                }
                return false;
            }
            try {
                // 连接NFC
                if (isConnect) {
                    mfc.connect();
                }
                for (int i = 0; i < passWord.size(); i++) {
                    byte [] passWordItem = passWord.get(i);
                    // 验证扇区密码
                    boolean isAuthenticated = false;
                    // 尝试使用默认密钥验证
                    if (mfc.authenticateSectorWithKeyA(i, defauleKey)) {
                        isAuthenticated = true;
                    } else if (mfc.authenticateSectorWithKeyA(i, listA_PS.get(i))) {
                        continue;
                    }
                    if (!isAuthenticated) {
                        if (callBack != null) {
                            callBack.isSusses(false, "扇区" + i + "密码验证失败");
                        }
                        return false;
                    }
                    // 准备数据
                    byte[] data = new byte[16];
                    if (passWordItem.length == 16) {
                        // 如果是完整的16字节数据,直接使用
                        System.arraycopy(passWordItem, 0, data, 0, 16);
                    } else if (passWordItem.length == 6) {
                        // 如果只是6字节密钥,构建完整的控制块
                        // 将密码转换为keyA
                        System.arraycopy(passWordItem, 0, data, 0, 6);
                        // 输入控制位
                        data[6] = (byte) 0xFF;
                        data[7] = (byte) 0x07;
                        data[8] = (byte) 0x80;
                        data[9] = (byte) 0x69;
                        // 将密码作为KeyB
                        System.arraycopy(passWordItem, 0, data, 10, 6);
                    } else {
                        if (callBack != null) {
                            callBack.isSusses(false, "扇区" + i + "密码长度不正确,应为6字节或16字节");
                        }
                        return false;
                    }
                    // 获取写入位置
                    int bIndex = mfc.sectorToBlock(i);
                    int bCount = mfc.getBlockCountInSector(i);
                    try {
                        // 写到扇区的最后一个块(控制块)
                        mfc.writeBlock(bIndex + bCount - 1, data);
                    } catch (IOException e) {
                        if (callBack != null) {
                            callBack.isSusses(false, "扇区" + i + "写入控制块失败: " + e.getMessage());
                        }
                        return false;
                    }
                }
                if (callBack != null) {
                    callBack.isSusses(true, "所有扇区密码修改成功");
                }
                return true;
            } finally {
                try {
                    if (isClose) {
                        mfc.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
            if (callBack != null) {
                callBack.isSusses(false, "修改密码时发生异常: " + e.getMessage());
            }
        }
        return false;
    }
    /**
     * 修改密码
     *
     * @param a  扇区
     * @param mfc MifareClassic实例
     * @return
     */
    @Override
    public boolean changePasword(int a, MifareClassic mfc) {
        byte[] data = new byte[16];
        if (null != mfc) {
            try {
@@ -277,26 +386,20 @@
                int bCount = mfc.getBlockCountInSector(a);
                //写到扇区的最后一个块
                mfc.writeBlock(bIndex + bCount - 1, data);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                CrashReport.postCatchedException(e);
                return false;
            }
        }
        return false;
    }
    public boolean changePasword(int a,byte[] passWord, MifareClassic mfc) {
        try {
        } catch (Exception e) {
            e.printStackTrace();
            CrashReport.postCatchedException(e);
        }
        return false;
    }
    /**
     * 初始化卡