From ebc06a3ae3a42bd6ac1359a59c55d5e6f1a0e2f0 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期二, 26 三月 2024 16:18:08 +0800
Subject: [PATCH] 优化通讯 写卡界面添加二次确认 优化用户写卡逻辑,提高写卡速度。

---
 app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java |  134 ++++++++++++++++++++++++++++++++------------
 1 files changed, 98 insertions(+), 36 deletions(-)

diff --git a/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java b/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
index 16a3046..a1923c1 100644
--- a/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
+++ b/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;

--
Gitblit v1.8.0