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 |  204 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 132 insertions(+), 72 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 449ebe7..a1923c1 100644
--- a/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
+++ b/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
@@ -1,22 +1,15 @@
 package com.dayu.recharge.tools;
 
+import android.app.Activity;
 import android.content.Intent;
 import android.nfc.NfcAdapter;
 import android.nfc.Tag;
 import android.nfc.tech.MifareClassic;
-import android.util.Base64;
+import android.util.Log;
+
+import com.dayu.recharge.card.UserCard;
 
 import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
 
 /**
  * @author zx
@@ -24,16 +17,16 @@
  * email 1058083107@qq.com
  * description
  */
-public class NFCWriteHelper extends BaseNFCHelper{
+public class NFCWriteHelper extends BaseNFCHelper {
 
     private Tag tag;
-    private NFCWriteHelper.NFCCallback callback;
+
     private static NFCWriteHelper helper;
-    private static int PASSWORD_LENTH = 6;
+    private static int PASSWORD_LENTH = 12;
 
-    public NFCWriteHelper(Intent intent) {
+    public NFCWriteHelper(Intent intent, Activity activity) {
+        super(activity);
         this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
-
     }
 
     /**
@@ -42,9 +35,9 @@
      * @param intent
      * @return
      */
-    public static NFCWriteHelper getInstence(Intent intent) {
+    public static NFCWriteHelper getInstence(Intent intent, Activity activity) {
         if (helper == null) {
-            helper = new NFCWriteHelper(intent);
+            helper = new NFCWriteHelper(intent, activity);
         }
         return helper;
     }
@@ -58,21 +51,83 @@
     public NFCWriteHelper setReadPassword(String str) {
         if (null != str && (str.length() <= PASSWORD_LENTH)) {
             for (int i = 0; i < str.length(); i++) {
-                bytes[i] = (byte) str.charAt(i);
+                defauleKey[i] = (byte) str.charAt(i);
             }
         }
         return helper;
     }
 
+
     /**
      * 鍐欏崱
      *
-     * @param str      涔﹀啓鍐呭锛�16涓瓧鑺�
-     * @param a        涔﹀啓鐨勬墖鍖� (浠�0寮�濮嬫暟)
-     * @param b        涔﹀啓鐨勫潡(浠�0寮�濮嬫暟)
-     * @param callback 杩斿洖鐩戝惉
+     * @param userCard 鐢ㄦ埛鍗″唴瀹�
+     * @param
      */
-    public void writeData(byte[] str, int a, int b, NFCWriteHelper.NFCCallback callback) {
+    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;
+    }
+
+
+    /**
+     * 鍐欏崱
+     *
+     * @param str 涔﹀啓鍐呭锛�16涓瓧鑺�
+     * @param a   涔﹀啓鐨勬墖鍖� (浠�0寮�濮嬫暟)
+     * @param b   涔﹀啓鐨勫潡(浠�0寮�濮嬫暟)
+     * @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);
@@ -84,29 +139,32 @@
                         int count = mfc.getSectorCount();
                         //濡傛灉浼犺繘鏉ョ殑鎵囧尯澶т簡鎴栬�呭皬浜嗙洿鎺ラ��鍑烘柟娉�
                         if (a > count - 1 || a < 0) {
-                            callback.isSusses(false);
-                            return;
+                            return false;
                         }
                         //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
                         int bCount = mfc.getBlockCountInSector(a);
                         //濡傛灉杈撳叆鐨勫潡澶т簡鎴栬�呭皬浜嗕篃鏄洿鎺ラ��鍑�
                         if (b > bCount - 1 || b < 0) {
-                            callback.isSusses(false);
-                            return;
+                            return false;
                         }
                         //楠岃瘉鎵囧尯瀵嗙爜
-                        boolean isOpen = mfc.authenticateSectorWithKeyA(a, bytes);
+                        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);
-                            callback.isSusses(true);
-                            return;
+                            return true;
                         }
-                        callback.isSusses(false);
+                        return false;
                     } catch (Exception e) {
                         e.printStackTrace();
-                        callback.isSusses(false);
+                        return false;
                     } finally {
                         try {
                             mfc.close();
@@ -117,66 +175,68 @@
                 }
             } catch (Exception e) {
                 e.printStackTrace();
+                return false;
             }
         }
+        return false;
     }
 
 
     /**
      * 淇敼瀵嗙爜
      *
-     * @param password 涔﹀啓瀵嗙爜锛�16涓瓧鑺�
-     * @param a        涔﹀啓鐨勬墖鍖�
-     * @param callback 杩斿洖鐩戝惉
+     * @param a 涔﹀啓鐨勬墖鍖�
+     *          //     * @param callback 杩斿洖鐩戝惉
      */
-    public void changePasword(String password, int a, final NFCWriteHelper.NFCCallback callback) {
-        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();
-                if (password.length() != PASSWORD_LENTH) {
-                    callback.isSusses(false);
-                    return;
-                }
-                int count = mfc.getSectorCount();
-                if (a > count - 1 || a < 0) {
-                    callback.isSusses(false);
-                    return;
-                }
+//                mfc.connect();
+//                int count = mfc.getSectorCount();
+//                boolean isOpen = mfc.authenticateSectorWithKeyA(a, defauleKey);
+//                //楠岃瘉鏄惁鏄粯璁ゅ瘑鐮侊紝褰撻粯璁ゅ瘑鐮佹椂淇敼瀵嗙爜
+//                if (isOpen) {
                 //灏嗗瘑鐮佽浆鎹负keyA
-                for (int i = 0; i < password.length(); i++) {
-                    data[i] = (byte) password.charAt(i);
-                }
-                //灏嗗瘑鐮佽浆鎹负KeyB
-                for (int i = 0; i < password.length(); i++) {
-                    data[i + password.length() + 4] = (byte) password.charAt(i);
+                byte[] dataA = HexUtil.hexToByteArray(companyKeyA);
+                for (int i = 0; i < dataA.length; i++) {
+                    data[i] = dataA[i];
                 }
                 //杈撳叆鎺у埗浣�
-                data[password.length()] = (byte) 0xff;
-                data[password.length() + 1] = (byte) 0x07;
-                data[password.length() + 2] = (byte) 0x80;
-                data[password.length() + 3] = (byte) 0x69;
-                //楠岃瘉瀵嗙爜
-                boolean isOpen = mfc.authenticateSectorWithKeyA(a, bytes);
-                if (isOpen) {
-                    int bIndex = mfc.sectorToBlock(a);
-                    int bCount = mfc.getBlockCountInSector(a);
-                    //鍐欏埌鎵囧尯鐨勬渶鍚庝竴涓潡
-                    mfc.writeBlock(bIndex + bCount - 1, data);
+                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];
                 }
-                callback.isSusses(true);
+                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();
-                callback.isSusses(false);
+                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