From 6a5879320dfac43155d024814a0a4d794a612696 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期三, 21 八月 2024 13:52:14 +0800
Subject: [PATCH] 齐河联网版程序除补卡相关逻辑

---
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java               |   22 +++-
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/InitialuzeActivity.java |   48 +++++++++
 local.properties                                                                            |    4 
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java   |    7 
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/NFCWriteHelper.java        |   73 ++++++++++++++
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/ReadCardAcitivy.java    |   13 -
 qiheonlinelibrary/src/main/res/layout/activity_admin_qhl.xml                                |   12 ++
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/SysActivity.java        |    6 +
 qiheonlinelibrary/src/main/AndroidManifest.xml                                              |   10 ++
 qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/BaseNFCHelper.java         |    9 +
 qiheonlinelibrary/src/main/res/layout/activity_init_qhl.xml                                 |   53 ++++++++++
 11 files changed, 235 insertions(+), 22 deletions(-)

diff --git a/local.properties b/local.properties
index f074cd4..60bc885 100644
--- a/local.properties
+++ b/local.properties
@@ -4,5 +4,5 @@
 # Location of the SDK. This is only used by Gradle.
 # For customization when using a Version Control System, please read the
 # header note.
-#Mon Aug 12 12:34:59 CST 2024
-sdk.dir=D\:\\AndroidStudio\\sdk
+#Mon Aug 19 09:59:12 CST 2024
+sdk.dir=D\:\\android\\sdk
diff --git a/qiheonlinelibrary/src/main/AndroidManifest.xml b/qiheonlinelibrary/src/main/AndroidManifest.xml
index 27c2076..d2e9d71 100644
--- a/qiheonlinelibrary/src/main/AndroidManifest.xml
+++ b/qiheonlinelibrary/src/main/AndroidManifest.xml
@@ -103,6 +103,16 @@
         <activity
             android:name=".activity.CardSearchActivity"
             android:launchMode="singleTop" />
+        <activity
+            android:name="com.dayu.qiheonlinelibrary.activity.InitialuzeActivity"
+            android:exported="true"
+            android:launchMode="singleTop">
+            <intent-filter>
+                <action android:name="android.nfc.action.ACTION_NDEF_DISCOVERED" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="text/plain" />
+            </intent-filter>
+        </activity>
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/InitialuzeActivity.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/InitialuzeActivity.java
new file mode 100644
index 0000000..db742a7
--- /dev/null
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/InitialuzeActivity.java
@@ -0,0 +1,48 @@
+package com.dayu.qiheonlinelibrary.activity;
+
+import android.content.Intent;
+import android.nfc.NfcAdapter;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.dayu.baselibrary.utils.TipUtil;
+import com.dayu.qiheonlinelibrary.databinding.ActivityInitQhlBinding;
+import com.dayu.qiheonlinelibrary.tools.NFCWriteHelper;
+import com.dayu.qiheonlinelibrary.view.ProgressDialog;
+
+/**
+ * author: zuo
+ * Date: 2024-08-20
+ * Time: 15:59
+ * 澶囨敞锛�
+ */
+public class InitialuzeActivity extends BaseNfcActivity {
+
+    ActivityInitQhlBinding binding;
+    Intent intent;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        binding = ActivityInitQhlBinding.inflate(LayoutInflater.from(this));
+        setContentView(binding.getRoot());
+
+    }
+
+
+    @Override
+    public void onNewIntent(Intent intent) {
+        this.intent = intent;
+        binding.avi.setVisibility(View.VISIBLE);
+        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
+            if (NFCWriteHelper.getInstence(intent, this).initCard()) {
+                TipUtil.show(this, "鏍煎紡鍖栨垚鍔燂紒", () -> InitialuzeActivity.this.finish());
+                binding.avi.hide();
+            }
+        }
+        super.onNewIntent(intent);
+    }
+
+
+}
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/ReadCardAcitivy.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/ReadCardAcitivy.java
index fb8b5e7..a359ef0 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/ReadCardAcitivy.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/ReadCardAcitivy.java
@@ -7,7 +7,6 @@
 import android.view.LayoutInflater;
 import android.view.View;
 
-import com.dayu.baselibrary.tools.HexUtil;
 import com.dayu.baselibrary.utils.MornyUtil;
 import com.dayu.baselibrary.utils.TipUtil;
 import com.dayu.baselibrary.view.ConfirmDialog;
@@ -17,22 +16,17 @@
 import com.dayu.qiheonlinelibrary.card.DomainCard;
 import com.dayu.qiheonlinelibrary.card.ElectricPriceCard;
 import com.dayu.qiheonlinelibrary.card.ManageCard;
-import com.dayu.qiheonlinelibrary.card.ManagerToUserCard;
 import com.dayu.qiheonlinelibrary.card.RegionCard;
 import com.dayu.qiheonlinelibrary.card.UserCard;
 import com.dayu.qiheonlinelibrary.databinding.ActivityRedCardQhlBinding;
 import com.dayu.qiheonlinelibrary.dbBean.AdminDataBean;
-import com.dayu.qiheonlinelibrary.dbBean.UserCardBean;
 import com.dayu.qiheonlinelibrary.net.ApiManager;
 import com.dayu.qiheonlinelibrary.net.BaseResponse;
 import com.dayu.qiheonlinelibrary.net.subscribers.SubscriberListener;
-import com.dayu.qiheonlinelibrary.tools.NFCWriteHelper;
 import com.dayu.qiheonlinelibrary.tools.NfcReadHelper;
 import com.dayu.qiheonlinelibrary.utils.CardCommon;
 import com.dayu.qiheonlinelibrary.view.ProgressDialog;
 
-
-import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -104,7 +98,7 @@
                 if (!data.isEmpty()) {
                     if (!TextUtils.isEmpty(cardNumber)) {
                         userCard = UserCard.getBean(data);
-                        getUserInfoAndCardInfo(cardNumber);
+                        getUserInfoAndCardInfo(cardNumber,userCard.getMyUserCode());
                     } else {
 
                     }
@@ -227,10 +221,11 @@
      *
      * @param iccardCode
      */
-    public void getUserInfoAndCardInfo(String iccardCode) {
+    public void getUserInfoAndCardInfo(String iccardNum,String iccardCode) {
         Map<String, Object> data = new HashMap<>();
         //ic鍗′俊鎭痠d
-        data.put("iccardNum", iccardCode);
+        data.put("iccardNum", iccardNum);
+        data.put("iccardCode", iccardCode);
         ApiManager.getInstance().requestPostLoading(this, "iccard/peasant/getIccardInfoVoByCardCode", CardInfoResult.class, data, new SubscriberListener<BaseResponse<CardInfoResult>>() {
             @Override
             public void onNext(BaseResponse<CardInfoResult> t) {
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java
index cf6f23f..122fc9c 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/RechargeActivity.java
@@ -107,7 +107,7 @@
         }
         //鑾峰彇鍗″唴淇℃伅
         mOldUserCard = NfcReadHelper.getInstence(intent, this).getUserCardData();
-        getUserInfoAndCardInfo(cardNumber);
+        getUserInfoAndCardInfo(cardNumber,mOldUserCard.getMyUserCode());
 
     }
 
@@ -328,10 +328,11 @@
      *
      * @param iccardCode
      */
-    public void getUserInfoAndCardInfo(String iccardCode) {
+    public void getUserInfoAndCardInfo(String iccardNum, String iccardCode) {
         Map<String, Object> data = new HashMap<>();
         //ic鍗′俊鎭痠d
-        data.put("iccardNum", iccardCode);
+        data.put("iccardNum", iccardNum);
+        data.put("iccardCode", iccardCode);
         ApiManager.getInstance().requestPostLoading(this, "iccard/peasant/getIccardInfoVoByCardCode", CardInfoResult.class, data, new SubscriberListener<BaseResponse<CardInfoResult>>() {
             @Override
             public void onNext(BaseResponse<CardInfoResult> t) {
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/SysActivity.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/SysActivity.java
index 5e03ddf..cced7f6 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/SysActivity.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/activity/SysActivity.java
@@ -91,7 +91,11 @@
             }
 
         });
-
+        //鏍煎紡鍖栧崱
+        adminBinding.adminInitCard.setOnClickListener(v -> {
+            Intent intent = new Intent(this, InitialuzeActivity.class);
+            startActivity(intent);
+        });
     }
 
 
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java
index 922934a..0cfd460 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/card/UserCard.java
@@ -41,6 +41,16 @@
 
 
     /**
+     * 杩斿洖瀹屾暣鐨勭敤鎴风紪鍙�
+     *
+     * @return
+     */
+    public String getMyUserCode() {
+        return userCode + String.format("%04d", userCodeNumber);
+//        return "";
+    }
+
+    /**
      * 閫氳繃byte杞琤ean
      *
      * @param data
@@ -55,24 +65,24 @@
 
             byte[] arerNumberByte = new byte[4];
             System.arraycopy(zero, 1, arerNumberByte, 0, arerNumberByte.length);
-            userCard.arerNumber =  HexUtil.get16To10LowHightByBytes(arerNumberByte);
+            userCard.arerNumber = HexUtil.get16To10LowHightByBytes(arerNumberByte);
             byte[] userCodeByte = new byte[6];
             System.arraycopy(zero, 5, userCodeByte, 0, userCodeByte.length);
-            userCard.userCode= BcdUtil.bcdToStr(userCodeByte);
+            userCard.userCode = BcdUtil.bcdToStr(userCodeByte);
             byte[] userCodeNumber = new byte[2];
             System.arraycopy(zero, 11, userCodeNumber, 0, userCodeNumber.length);
-            userCard.userCodeNumber=HexUtil.get16To10LowHightByBytes(userCodeNumber);
+            userCard.userCodeNumber = HexUtil.get16To10LowHightByBytes(userCodeNumber);
             byte[] cardWriteState = new byte[1];
             System.arraycopy(zero, 13, cardWriteState, 0, cardWriteState.length);
-            userCard.cardWriteState=HexUtil.get16To10LowHightByBytes(cardWriteState);
+            userCard.cardWriteState = HexUtil.get16To10LowHightByBytes(cardWriteState);
             byte[] cardState = new byte[1];
             System.arraycopy(zero, 14, cardState, 0, cardState.length);
-            userCard.cardState=HexUtil.get16To10LowHightByBytes(cardState);
+            userCard.cardState = HexUtil.get16To10LowHightByBytes(cardState);
             //绗�1鍧楄В鏋�
             byte[] one = data.get(1);
             byte[] balanceByte = new byte[4];
             System.arraycopy(one, 0, balanceByte, 0, balanceByte.length);
-            userCard.balance =HexUtil.get16To10LowHightByBytes(balanceByte);
+            userCard.balance = HexUtil.get16To10LowHightByBytes(balanceByte);
 
             byte[] surplusWaterByte = new byte[4];
             System.arraycopy(one, 4, surplusWaterByte, 0, surplusWaterByte.length);
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/BaseNFCHelper.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/BaseNFCHelper.java
index ccafb6d..55735e2 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/BaseNFCHelper.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/BaseNFCHelper.java
@@ -31,6 +31,9 @@
      * 鍏徃瀵嗙爜
      */
     public byte[] companyKey;
+
+    //榻愭渤娆ф爣瀵嗙爜
+    public byte[] companyKey2;
     //瀵嗙爜a鍖�
     String companyKeyA;
     //瀵嗙爜B鍖�
@@ -71,7 +74,11 @@
             //decryptedBytes3 瀵瑰簲202311202048
             companyKeyB = new String(decryptedBytes2, StandardCharsets.UTF_8);
 
-
+            //010203:qeg4DUWf0ni9JfRWtD2krA==
+            byte[] encryptedBytes4 = Base64.decode("qeg4DUWf0ni9JfRWtD2krA==", Base64.DEFAULT);
+            byte[] decryptedBytes4 = cipher.doFinal(encryptedBytes4);
+            String companyKeyA = new String(decryptedBytes4, StandardCharsets.UTF_8);
+            companyKey2 = HexUtil.hexToByteArray(companyKeyA);
         } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
                  BadPaddingException | IllegalBlockSizeException e) {
             e.printStackTrace();
diff --git a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/NFCWriteHelper.java b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/NFCWriteHelper.java
index 4abdceb..3517fcb 100644
--- a/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/NFCWriteHelper.java
+++ b/qiheonlinelibrary/src/main/java/com/dayu/qiheonlinelibrary/tools/NFCWriteHelper.java
@@ -241,6 +241,79 @@
     }
 
     /**
+     * 鍒濆鍖栧崱
+     *
+     * @return
+     */
+    public boolean initCard() {
+        try {
+            MifareClassic mfc = MifareClassic.get(tag);
+            if (null != mfc) {
+                try {
+                    //杩炴帴NFC
+                    mfc.connect();
+                    //鑾峰彇鎵囧尯鏁伴噺
+                    int count = mfc.getSectorCount();
+                    byte[] data = new byte[16];
+                    String initData = "FFFFFFFFFFFFFF078069FFFFFFFFFFFF";
+                    byte[] initDataBytes = HexUtil.hexToByteArray(initData);
+                    for (int sector = 0; sector < count; sector++) {
+                        //楠岃瘉鎵囧尯瀵嗙爜
+                        boolean isOpen = mfc.authenticateSectorWithKeyA(sector, defauleKey);
+                        if (!isOpen) {
+                            isOpen = mfc.authenticateSectorWithKeyA(sector, companyKey2);
+                            if (isOpen){
+                                mfc.authenticateSectorWithKeyB(sector, companyKey2);
+                            }
+                        }
+                        if (!isOpen) {
+                            isOpen = mfc.authenticateSectorWithKeyA(sector, companyKey);
+                            if (isOpen){
+                                mfc.authenticateSectorWithKeyB(sector, companyKey);
+                            }
+                        }
+                        if (isOpen) {
+                            //鑾峰彇鍐欑殑鎵囧尯鐨勫潡鐨勬暟閲�
+                            int blockCount = mfc.getBlockCountInSector(sector);
+                            int blockIndex = mfc.sectorToBlock(sector);
+                            for (int block = 0; block < blockCount ; block++) {
+                                // 璺宠繃绗� 0 鎵囧尯鐨勭 0 鍧�
+                                if (sector == 0 && block == 0) {
+                                    blockIndex++;
+                                    continue;
+                                }
+
+                                if (block < 3) {
+                                    mfc.writeBlock(blockIndex, data);
+                                } else {
+                                    mfc.writeBlock(blockIndex, initDataBytes);
+                                }
+                                //鍐欏崱
+
+                                blockIndex++;
+                            }
+                        }
+                    }
+                    return true;
+                } 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;
+    }
+
+    /**
      * 杩斿洖鐩戝惉绫�
      */
     public interface NFCCallback {
diff --git a/qiheonlinelibrary/src/main/res/layout/activity_admin_qhl.xml b/qiheonlinelibrary/src/main/res/layout/activity_admin_qhl.xml
index 01e36aa..d0a708f 100644
--- a/qiheonlinelibrary/src/main/res/layout/activity_admin_qhl.xml
+++ b/qiheonlinelibrary/src/main/res/layout/activity_admin_qhl.xml
@@ -95,6 +95,18 @@
                     android:visibility="visible"
                 android:textColor="@color/text_selecter_color"
                 android:textSize="@dimen/text_size" />
+
+            <TextView
+                android:id="@+id/admin_initCard"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="20dp"
+                android:layout_marginTop="20dp"
+                android:padding="5dp"
+                android:text="鏍煎紡鍖栧崱"
+                android:visibility="visible"
+                android:textColor="@color/text_selecter_color"
+                android:textSize="@dimen/text_size" />
         </LinearLayout>
 
 
diff --git a/qiheonlinelibrary/src/main/res/layout/activity_init_qhl.xml b/qiheonlinelibrary/src/main/res/layout/activity_init_qhl.xml
new file mode 100644
index 0000000..84e45ed
--- /dev/null
+++ b/qiheonlinelibrary/src/main/res/layout/activity_init_qhl.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.dayu.baselibrary.view.TitleBar
+        android:id="@+id/titleBar"
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dimen_title_height"
+        android:background="@color/title_bar_bg"
+        app:centerText="鏍煎紡鍖栧崱鐗�"
+        app:leftImage="@mipmap/icon_back" />
+
+    <LinearLayout
+        android:id="@+id/read_imgLL"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@id/titleBar"
+        android:background="#ffffff"
+        android:orientation="vertical"
+        android:visibility="visible">
+
+        <TextView
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/titleBar"
+            android:layout_marginTop="20dp"
+            android:gravity="center"
+            android:text="璇峰皢鍗¤创鍦ㄨ澶囦笂杩涜鏍煎紡鍖�"
+            android:textSize="@dimen/text_size" />
+
+
+        <ImageView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_below="@id/textView"
+            android:scaleType="fitCenter"
+            android:src="@mipmap/nfc_write" />
+    </LinearLayout>
+
+    <com.wang.avi.AVLoadingIndicatorView
+        android:id="@+id/avi"
+        style="@style/AVLoadingIndicatorView"
+        android:layout_width="80dp"
+        android:layout_height="80dp"
+        android:layout_centerHorizontal="true"
+        android:layout_centerVertical="true"
+        android:visibility="invisible"
+        app:indicatorColor="@color/title_bg"
+        app:indicatorName="BallClipRotatePulseIndicator" />
+</RelativeLayout>
\ No newline at end of file

--
Gitblit v1.8.0