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