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