From 5b602b536c5be89b2cbfd211025236fb41ba2fa3 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期一, 18 十二月 2023 17:46:00 +0800
Subject: [PATCH] 充值记录分页加载 补卡用户列表分页加载 通信模块添加日志方便分析长时间链接后不能通讯问题

---
 gradlew                                                                         |  275 +++++++-----
 app/src/main/java/com/dayu/recharge/activity/MyActivity.java                    |    4 
 app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java           |  103 +++-
 app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java                        |    6 
 app/src/main/res/layout/item_replacement.xml                                    |   76 +++
 app/src/main/res/layout/activity_newcard_list.xml                               |    4 
 app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java          |   98 +++-
 easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java       |    5 
 app/src/main/java/com/dayu/recharge/dao/RechargeDao.java                        |    3 
 app/src/main/res/layout/activity_replacement.xml                                |   21 
 gradlew.bat                                                                     |   14 
 app/src/main/java/com/dayu/recharge/net/SocketNet.java                          |   19 
 easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java       |    7 
 app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java           |   24 
 app/src/main/res/layout/item_new_card.xml                                       |    1 
 app/src/main/res/layout/activity_recharge_list.xml                              |   24 
 app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java                |   99 +++-
 easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java |    1 
 local.properties                                                                |    4 
 app/src/main/res/layout/item_recharge.xml                                       |   87 ++-
 easysocket/src/main/java/com/easysocket/utils/HexUtil.java                      |  275 +++++++++++++
 app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java             |   97 ++++
 app/build.gradle                                                                |    2 
 23 files changed, 959 insertions(+), 290 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 590068d..9878278 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,7 +3,7 @@
 android {
     signingConfigs {
         debug {
-            storeFile file('dycz.jks')
+            storeFile file('D:\\androidProject\\charge\\app\\dycz.jks')
             storePassword 'dycz@2023'
             keyAlias 'dayu'
             keyPassword 'dycz@2023'
diff --git a/app/src/main/java/com/dayu/recharge/activity/MyActivity.java b/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
index f2b190a..c7cee23 100644
--- a/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/MyActivity.java
@@ -162,7 +162,7 @@
                             if (isRechargeList) {
                                 listData = asynchBaseDao.rechargeDao().ansyFindByTime(beginTime, endTime);
                             } else {
-                                listData = baseDao.userCardDao().findByTime(beginTime, endTime);
+                                listData = asynchBaseDao.userCardDao().findByTime(beginTime, endTime);
                             }
                             if (listData == null || listData.size() == 0) {
                                 handler.sendEmptyMessage(2);
@@ -178,7 +178,7 @@
                             return;
                         }
                         if (isRechargeList) {
-                            title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "韬唤璇佸彿", "鍏呭�兼棩鏈�", "鍏呭�奸噾棰濓紙鍏冿級", "鍓╀綑閲戦锛堝厓锛�"};
+                            title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "璁㈠崟鍙�", "鍏呭�兼棩鏈�", "鍏呭�奸噾棰濓紙鍏冿級", "鍓╀綑閲戦锛堝厓锛�"};
                             fileName = file.toString() + "/" + ExcelUtil.outRechargePathName;
                         } else {
                             title = new String[]{"璁惧搴忓垪鍙�", "鐢ㄦ埛鍚�", "韬唤璇佸彿", "娉ㄥ唽鏃ユ湡", "鐢佃瘽"};
diff --git a/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java b/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
index 46bb0e6..4bab5ec 100644
--- a/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
@@ -54,7 +54,6 @@
     //姣忛〉鏁版嵁鏉℃暟
     int limit = 30;
     RefreshLayout myRefreshLayout;
-    Handler handler;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -83,7 +82,7 @@
         newcardListBinding.recyclerView.setLayoutManager(layoutManager);
         newcardListBinding.recyclerView.setAdapter(adapter);
         int totale = baseDao.userCardDao().getUserTotale();
-        newcardListBinding.userTotal.setText(totale + "");
+        newcardListBinding.userTotal.setText("寮�鎴锋暟锛�" + totale + "");
     }
 
 
@@ -161,15 +160,18 @@
                 if ((endTime < beginTime) && endTime != beginTime) {
                     TipUtil.show(NewCardListActivity.this, "缁撴潫鏃堕棿涓嶈兘鏅氫簬寮�濮嬫椂闂�");
                 } else {
-                    try {
-                        endTime = endTime + (1000 * 60 * 60 * 24) - 1;
-                        List<UserCardBean> userList = baseDao.userCardDao().findByTime(beginTime, endTime);
-                        userCardBeanList.clear();
-                        userCardBeanList.addAll(userList);
-                        adapter.notifyDataSetChanged();
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
+//                    try {
+//                        endTime = endTime + (1000 * 60 * 60 * 24) - 1;
+//                        List<UserCardBean> userList = baseDao.userCardDao().findByTime(beginTime, endTime);
+//                        userCardBeanList.clear();
+//                        userCardBeanList.addAll(userList);
+//                        adapter.notifyDataSetChanged();
+//                    } catch (Exception e) {
+//                        e.printStackTrace();
+//                    }
+                    endTime = endTime + (1000 * 60 * 60 * 24) - 1;
+                    userCardBeanList.clear();
+                    getList();
                 }
             }
         }, beginTimestamp, endTimestamp);
diff --git a/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java b/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
index 9ad290f..88e8d1b 100644
--- a/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/RechargeListActivity.java
@@ -6,17 +6,28 @@
 import android.view.LayoutInflater;
 import android.view.View;
 
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.dayu.recharge.adapter.NewCardAdapter;
 import com.dayu.recharge.adapter.RechargeAdapter;
 import com.dayu.recharge.databinding.ActivityRechargeListBinding;
 import com.dayu.recharge.dbBean.RechargeBean;
+import com.dayu.recharge.dbBean.UserCardBean;
 import com.dayu.recharge.model.RechargeListModel;
 import com.dayu.recharge.utils.ArithUtil;
 import com.dayu.recharge.utils.TipUtil;
 import com.dayu.recharge.view.datepicker.CustomDatePicker;
 import com.dayu.recharge.view.datepicker.DateFormatUtils;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
 
 import java.util.ArrayList;
 import java.util.List;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 /**
  * Copyright (C), 2023,
@@ -35,7 +46,11 @@
     long beginTime;
     long endTime;
 
-    RechargeListModel rechargeListModel;
+    int page = 0;
+
+    //姣忛〉鏁版嵁鏉℃暟
+    int limit = 30;
+    RefreshLayout myRefreshLayout;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -43,22 +58,26 @@
         rechargeListBinding = ActivityRechargeListBinding.inflate(LayoutInflater.from(this));
         setContentView(rechargeListBinding.getRoot());
         setRightButton();
-        setData();
         initDatePicker();
-        getTotal();
+        initList();
+        getList();
     }
 
-    private void setData() {
-
-        rechargeListModel = new RechargeListModel(this);
-        rechargeListModel.getAllRechargeList().observe(this, myList -> {
-            rechargeList.clear();
-            rechargeList.addAll(myList);
-            adapter.notifyDataSetChanged();
-            getTotal();
+    private void initList() {
+        myRefreshLayout = (RefreshLayout) rechargeListBinding.refreshLayout;
+        myRefreshLayout.setEnableRefresh(false);
+        myRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
+        myRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
+            @Override
+            public void onLoadMore(RefreshLayout refreshlayout) {
+                page = page + 1;
+                getList();
+            }
         });
         adapter = new RechargeAdapter(this, rechargeList);
-        rechargeListBinding.rechargeList.setAdapter(adapter);
+        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+        rechargeListBinding.recyclerView.setLayoutManager(layoutManager);
+        rechargeListBinding.recyclerView.setAdapter(adapter);
     }
 
     private void getTotal() {
@@ -68,9 +87,46 @@
                 double b = Double.parseDouble(rechargeList.get(i).getMorny());
                 total = ArithUtil.add(total, b);
             }
-            rechargeListBinding.rechargeTotal.setText("绱鍏呭�硷細" + String.valueOf(total) + "鍏�");
+            rechargeListBinding.rechargeTotal.setText("宸插姞杞芥暟鎹疮璁″厖鍊硷細" + String.valueOf(total) + "鍏�");
         }
 
+    }
+
+    private void getList() {
+        // 鍒涘缓涓�涓� Observable
+        Observable<List<RechargeBean>> observable = Observable.create(emitter -> {
+            // 鍦ㄨ繖閲屾墽琛屽紓姝ユ搷浣�
+            List<RechargeBean> beanList;
+            if (beginTime == 0 && endTime == 0) {
+                beanList = asynchBaseDao.rechargeDao().findAll(page * limit, limit);
+            } else {
+                beanList = asynchBaseDao.rechargeDao().ansyFindByTime(beginTime, endTime);
+            }
+            // 灏嗙粨鏋滃彂閫佺粰瑙傚療鑰�
+            emitter.onNext(beanList);
+            emitter.onComplete();
+        });
+        // 璁㈤槄瑙傚療鑰�
+        observable.subscribeOn(Schedulers.io()) // 鎸囧畾鍦� IO 绾跨▼鎵ц
+                .observeOn(AndroidSchedulers.mainThread()) // 鎸囧畾鍦ㄥ崟涓�绾跨▼瑙傚療缁撴灉
+                .subscribe(
+                        result -> {
+                            // 鍦ㄨ繖閲屽鐞嗙粨鏋滐紝杩欓噷鏄湪涓荤嚎绋嬩腑
+//                            System.out.println("Result: " + result);
+                            if (result.size() < limit) {
+                                myRefreshLayout.finishLoadMoreWithNoMoreData();
+                            }
+                            if (result != null && result.size() > 0) {
+                                rechargeList.addAll(result);
+                            }
+                            adapter.notifyDataSetChanged();
+                            getTotal();
+                        },
+                        error -> {
+                            // 澶勭悊閿欒
+                            System.err.println("Error: " + error.getMessage());
+                        }
+                );
     }
 
 
@@ -112,20 +168,8 @@
                     TipUtil.show(RechargeListActivity.this, "缁撴潫鏃堕棿涓嶈兘鏅氫簬寮�濮嬫椂闂�");
                 } else {
                     endTime = endTime + (1000 * 60 * 60 * 24) - 1;
-
-                    rechargeListModel.getRechargeList(beginTime, endTime).observe(RechargeListActivity.this, list -> {
-                        if (rechargeList != null) {
-                            rechargeList.clear();
-                            rechargeList.addAll(list);
-                            adapter.notifyDataSetChanged();
-                            getTotal();
-                        } else {
-                            TipUtil.show(RechargeListActivity.this, "鏈煡璇㈠埌鏁版嵁!");
-                        }
-
-                    });
-
-
+                    rechargeList.clear();
+                    getList();
                 }
             }
         }, beginTimestamp, endTimestamp);
diff --git a/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java b/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
index f6c182b..053aaa1 100644
--- a/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
@@ -8,13 +8,24 @@
 import android.view.View;
 import android.widget.AdapterView;
 
+import androidx.recyclerview.widget.LinearLayoutManager;
+
 import com.dayu.recharge.adapter.NewCardAdapter;
+import com.dayu.recharge.adapter.ReplacementAdapter;
 import com.dayu.recharge.databinding.ActivityReplacementBinding;
 import com.dayu.recharge.dbBean.UserCardBean;
 import com.dayu.recharge.utils.TipUtil;
 import com.dayu.recharge.view.EdtDialog;
+import com.scwang.smart.refresh.footer.ClassicsFooter;
+import com.scwang.smart.refresh.layout.api.RefreshLayout;
+import com.scwang.smart.refresh.layout.listener.OnLoadMoreListener;
 
+import java.util.ArrayList;
 import java.util.List;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
 
 /**
  * Created by Android Studio.
@@ -24,42 +35,90 @@
  * 澶囨敞锛� 琛ュ崱鐣岄潰
  */
 public class ReplacementActivity extends BaseActivity {
-    ActivityReplacementBinding binding;
-    List<UserCardBean> userCardBeanList;
-    NewCardAdapter adapter;
+    ActivityReplacementBinding newcardListBinding;
+    List<UserCardBean> userCardBeanList = new ArrayList<>();
+    ReplacementAdapter adapter;
+    long beginTime;
+    long endTime;
+    int page = 0;
+
+    //姣忛〉鏁版嵁鏉℃暟
+    int limit = 30;
+    RefreshLayout myRefreshLayout;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        binding = ActivityReplacementBinding.inflate(LayoutInflater.from(this));
-        setContentView(binding.getRoot());
+        newcardListBinding = ActivityReplacementBinding.inflate(LayoutInflater.from(this));
+        setContentView(newcardListBinding.getRoot());
         setRightButton();
-        setData();
-        initView();
+        initList();
+        getList();
     }
 
-    private void initView() {
-        binding.newCardListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+
+    public void itemClick(View view) {
+        UserCardBean userCardBean = userCardBeanList.get((int) view.getTag());
+        Intent intent = new Intent(ReplacementActivity.this, NFCWreatActivity.class);
+        intent.putExtra("dbUserCard", userCardBean);
+        startActivity(intent);
+    }
+
+    private void initList() {
+        myRefreshLayout = (RefreshLayout) newcardListBinding.refreshLayout;
+        myRefreshLayout.setEnableRefresh(false);
+        myRefreshLayout.setRefreshFooter(new ClassicsFooter(this));
+        myRefreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
             @Override
-            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                UserCardBean userCardBean = userCardBeanList.get(position);
-                Intent intent = new Intent(ReplacementActivity.this, NFCWreatActivity.class);
-                intent.putExtra("dbUserCard", userCardBean);
-                startActivity(intent);
+            public void onLoadMore(RefreshLayout refreshlayout) {
+                page = page + 1;
+                getList();
             }
         });
+        adapter = new ReplacementAdapter(this, userCardBeanList);
+        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
+        newcardListBinding.recyclerView.setLayoutManager(layoutManager);
+        newcardListBinding.recyclerView.setAdapter(adapter);
     }
 
-    private void setData() {
-        try {
-            userCardBeanList = baseDao.userCardDao().findAll();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        adapter = new NewCardAdapter(this, userCardBeanList);
-//        binding.newCardListView.setAdapter(adapter);
+
+    private void getList() {
+        // 鍒涘缓涓�涓� Observable
+        Observable<List<UserCardBean>> observable = Observable.create(emitter -> {
+            // 鍦ㄨ繖閲屾墽琛屽紓姝ユ搷浣�
+            List<UserCardBean> beanList;
+            if (beginTime == 0 && endTime == 0) {
+                beanList = asynchBaseDao.userCardDao().findAll(page * limit, limit);
+            } else {
+                beanList = asynchBaseDao.userCardDao().findByTime(beginTime, endTime);
+            }
+            // 灏嗙粨鏋滃彂閫佺粰瑙傚療鑰�
+            emitter.onNext(beanList);
+            emitter.onComplete();
+        });
+        // 璁㈤槄瑙傚療鑰�
+        observable.subscribeOn(Schedulers.io()) // 鎸囧畾鍦� IO 绾跨▼鎵ц
+                .observeOn(AndroidSchedulers.mainThread()) // 鎸囧畾鍦ㄥ崟涓�绾跨▼瑙傚療缁撴灉
+                .subscribe(
+                        result -> {
+                            // 鍦ㄨ繖閲屽鐞嗙粨鏋滐紝杩欓噷鏄湪涓荤嚎绋嬩腑
+//                            System.out.println("Result: " + result);
+                            if (result.size() < limit) {
+                                myRefreshLayout.finishLoadMoreWithNoMoreData();
+                            }
+                            if (result != null && result.size() > 0) {
+                                userCardBeanList.addAll(result);
+                            }
+                            adapter.notifyDataSetChanged();
+                        },
+                        error -> {
+                            // 澶勭悊閿欒
+                            System.err.println("Error: " + error.getMessage());
+                        }
+                );
     }
 
+
     EdtDialog edtDialog;
 
     private void setRightButton() {
diff --git a/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java b/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
index 2fba322..55f720f 100644
--- a/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
+++ b/app/src/main/java/com/dayu/recharge/adapter/RechargeAdapter.java
@@ -1,6 +1,7 @@
 package com.dayu.recharge.adapter;
 
 import android.content.Context;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
@@ -8,8 +9,16 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.annotation.NonNull;
+import androidx.databinding.DataBindingUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
 import com.dayu.recharge.R;
+import com.dayu.recharge.databinding.ItemRechargeBinding;
+import com.dayu.recharge.databinding.ItemNoMoreBinding;
+import com.dayu.recharge.databinding.ItemRechargeBinding;
 import com.dayu.recharge.dbBean.RechargeBean;
+import com.dayu.recharge.dbBean.UserCardBean;
 import com.dayu.recharge.utils.DateUtil;
 
 import java.util.List;
@@ -18,7 +27,7 @@
  * Created by zuoxiao on 2018/12/24.
  */
 
-public class RechargeAdapter extends BaseAdapter {
+public class RechargeAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
 
     List<RechargeBean> rechargeList;
     Context mContext;
@@ -28,51 +37,69 @@
         this.rechargeList = rechargeList;
     }
 
+
+    @NonNull
     @Override
-    public int getCount() {
-        if (rechargeList == null) {
-            return 0;
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        if (viewType == VIEW_TYPE_EMPTY) {
+            ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false);
+            return new ViewHolderEmpty(emptyView);
+        } else {
+            ItemRechargeBinding binding = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_recharge, parent, false);
+            return new ViewHolder(binding);
+        }
+
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        if (holder instanceof ViewHolder) {
+            if (rechargeList.size() > 0) {
+                ((ViewHolder) holder).getBinding().userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
+                ((ViewHolder) holder).getBinding().userNo.setText("鐢ㄦ埛缂栧彿:" + rechargeList.get(position).getInitPeasantCode());
+                ((ViewHolder) holder).getBinding().morny.setText("鍏呭�奸噾棰�:" + rechargeList.get(position).getMorny());
+                ((ViewHolder) holder).getBinding().date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
+            }
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        //鍚屾椂杩欓噷涔熼渶瑕佹坊鍔犲垽鏂紝濡傛灉mData.size()涓�0鐨勮瘽锛屽彧寮曞叆涓�涓竷灞�锛屽氨鏄痚mptyView
+        // 閭d箞锛岃繖涓猺ecyclerView鐨刬temCount涓�1
+        if (rechargeList.size() == 0) {
+            return 1;
         }
         return rechargeList.size();
     }
 
     @Override
-    public Object getItem(int position) {
-        return position;
-    }
-
-    @Override
-    public long getItemId(int position) {
-        return position;
-    }
-
-    @Override
-    public View getView(int position, View convertView, ViewGroup parent) {
-        ViewHolder holder = null;
-        if (convertView == null) {
-            holder = new ViewHolder();
-            convertView = View.inflate(mContext, R.layout.item_recharge, null);
-            holder.userName = (TextView) convertView.findViewById(R.id.userName);
-            holder.userNo = (TextView) convertView.findViewById(R.id.userNo);
-            holder.morny = (TextView) convertView.findViewById(R.id.morny);
-            holder.date = (TextView) convertView.findViewById(R.id.date);
-
-            convertView.setTag(holder);
+    public int getItemViewType(int position) {
+        if (rechargeList.size() == 0) {
+            return VIEW_TYPE_EMPTY;
         } else {
-            holder = (ViewHolder) convertView.getTag();
+            return VIEW_TYPE_ITEM;
         }
-        holder.userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
-        holder.userNo.setText("鐢ㄦ埛缂栧彿:" + rechargeList.get(position).getInitPeasantCode());
-        holder.morny.setText("鍏呭�奸噾棰�:" + rechargeList.get(position).getMorny());
-        holder.date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
-        return convertView;
     }
 
-    class ViewHolder {
 
-        TextView userName;
-        TextView userNo;
-        TextView morny;
-        TextView date;
+    static class ViewHolder extends RecyclerView.ViewHolder {
+        ItemRechargeBinding mBinding;
+
+        public ItemRechargeBinding getBinding() {
+            return mBinding;
+        }
+
+        public void setBinding(ItemRechargeBinding binding) {
+            this.mBinding = binding;
+        }
+
+        public ViewHolder(ItemRechargeBinding itemView) {
+            super(itemView.getRoot());
+            this.mBinding = itemView;
+
+        }
     }
+
+
 }
diff --git a/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java b/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java
new file mode 100644
index 0000000..127a70e
--- /dev/null
+++ b/app/src/main/java/com/dayu/recharge/adapter/ReplacementAdapter.java
@@ -0,0 +1,97 @@
+package com.dayu.recharge.adapter;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import androidx.annotation.NonNull;
+import androidx.databinding.DataBindingUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.dayu.recharge.R;
+import com.dayu.recharge.activity.ReplacementActivity;
+import com.dayu.recharge.databinding.ItemNewCardBinding;
+import com.dayu.recharge.databinding.ItemNoMoreBinding;
+import com.dayu.recharge.databinding.ItemReplacementBinding;
+import com.dayu.recharge.dbBean.UserCardBean;
+import com.dayu.recharge.utils.DateUtil;
+
+import java.util.List;
+
+public class ReplacementAdapter extends BaseRecyclerAdapter<RecyclerView.ViewHolder> {
+
+    List<UserCardBean> rechargeList;
+    ReplacementActivity mContext;
+
+    public ReplacementAdapter(ReplacementActivity context, List<UserCardBean> rechargeList) {
+        mContext = context;
+        this.rechargeList = rechargeList;
+    }
+
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        if (viewType == VIEW_TYPE_EMPTY) {
+            ItemNoMoreBinding emptyView = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_no_more, parent, false);
+            return new ViewHolderEmpty(emptyView);
+        } else {
+            ItemReplacementBinding binding = DataBindingUtil.inflate((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE), R.layout.item_replacement, parent, false);
+            return new ViewHolder(binding);
+        }
+
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        if (holder instanceof ViewHolder) {
+            if (rechargeList.size() > 0) {
+                ((ViewHolder) holder).getBinding().userName.setText("鐢ㄦ埛鍚�:" + rechargeList.get(position).getUserName());
+                ((ViewHolder) holder).getBinding().userNo.setText("韬唤璇佸彿:" + rechargeList.get(position).getUserID());
+                ((ViewHolder) holder).getBinding().water.setText("鐢佃瘽:" + rechargeList.get(position).getPhone());
+                ((ViewHolder) holder).getBinding().date.setText("鏃ユ湡:" + DateUtil.dateToStamp(rechargeList.get(position).getDate(), DateUtil.type1));
+                ((ViewHolder) holder).getBinding().item.setTag(position);
+                ((ViewHolder) holder).getBinding().setActivity(mContext);
+            }
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        //鍚屾椂杩欓噷涔熼渶瑕佹坊鍔犲垽鏂紝濡傛灉mData.size()涓�0鐨勮瘽锛屽彧寮曞叆涓�涓竷灞�锛屽氨鏄痚mptyView
+        // 閭d箞锛岃繖涓猺ecyclerView鐨刬temCount涓�1
+        if (rechargeList.size() == 0) {
+            return 1;
+        }
+        return rechargeList.size();
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if (rechargeList.size() == 0) {
+            return VIEW_TYPE_EMPTY;
+        } else {
+            return VIEW_TYPE_ITEM;
+        }
+    }
+
+
+    static class ViewHolder extends RecyclerView.ViewHolder {
+        ItemReplacementBinding mBinding;
+
+        public ItemReplacementBinding getBinding() {
+            return mBinding;
+        }
+
+        public void setBinding(ItemReplacementBinding binding) {
+            this.mBinding = binding;
+        }
+
+        public ViewHolder(ItemReplacementBinding itemView) {
+            super(itemView.getRoot());
+            this.mBinding = itemView;
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java b/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
index 5af3c7f..157acc9 100644
--- a/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
+++ b/app/src/main/java/com/dayu/recharge/dao/RechargeDao.java
@@ -39,4 +39,7 @@
 
     @Query("select  * from RechargeBean where date>=:beginTime and date<=:endTime")
     List<RechargeBean> ansyFindByTime(long beginTime, long endTime);
+
+    @Query("select  * from RechargeBean order by date desc LIMIT :limit OFFSET :offset")
+    List<RechargeBean> findAll(int offset,int limit);
 }
diff --git a/app/src/main/java/com/dayu/recharge/net/SocketNet.java b/app/src/main/java/com/dayu/recharge/net/SocketNet.java
index 3f0aaed..9783701 100644
--- a/app/src/main/java/com/dayu/recharge/net/SocketNet.java
+++ b/app/src/main/java/com/dayu/recharge/net/SocketNet.java
@@ -11,11 +11,13 @@
 import com.dayu.recharge.dbBean.DeviceNumber;
 import com.dayu.recharge.dbBean.IpBean;
 import com.easysocket.EasySocket;
+import com.easysocket.connection.action.SocketStatus;
 import com.easysocket.entity.OriginReadData;
 import com.easysocket.entity.SocketAddress;
 import com.easysocket.interfaces.conn.ISocketActionListener;
 import com.easysocket.interfaces.conn.SocketActionListener;
 import com.dayu.recharge.MyApplication;
+import com.easysocket.utils.HexUtil;
 
 
 /**
@@ -53,7 +55,12 @@
         if (EasySocket.getInstance().getDefconnection() != null) {
 //            EasySocket.getInstance().disconnect(false);
 //            EasySocket.getInstance().connect();
+//            if (EasySocket.getInstance().getDefconnection().getConnectionStatus()== SocketStatus.SOCKET_CONNECTED){
             EasySocket.getInstance().upMessage(dataMessage);
+//            }else {
+//
+//            }
+
 //            this.dataMessage = dataMessage;
         } else {
             MyApplication.myApplication.initEasySocket(false, null);
@@ -144,21 +151,17 @@
             rushState();
         }
 
+
+
         /**
          * socket鎺ユ敹鐨勬暟鎹�
          * @param socketAddress
-         * @param readData
+         * @param originReadData
          */
-        @Override
-        public void onSocketResponse(SocketAddress socketAddress, String readData) {
-            Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + readData);
-
-        }
-
         @Override
         public void onSocketResponse(SocketAddress socketAddress, OriginReadData originReadData) {
             super.onSocketResponse(socketAddress, originReadData);
-            Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + originReadData.getBodyString());
+            Log.i("SocketActionListener", "SocketActionListener鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(originReadData.getBodyBytes()));
             SocketData socketData = new SocketData();
             socketData.setBodyData(originReadData.getBodyBytes());
             socketData.setHeaderData(originReadData.getHeaderData());
diff --git a/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java b/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
index 4ac6e11..3de12c9 100644
--- a/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
+++ b/app/src/main/java/com/dayu/recharge/utils/ExcelUtil.java
@@ -131,11 +131,7 @@
                         RechargeBean projectBean = (RechargeBean) objList.get(j);
                         list.add(projectBean.getSerial());
                         list.add(projectBean.getUserName());
-                        if (projectBean.getUserId() != null) {
-                            list.add(projectBean.getUserId());
-                        } else {
-                            list.add("");
-                        }
+                        list.add(projectBean.getOrderID());
                         list.add(DateUtil.dateToStamp(projectBean.getDate(), DateUtil.type2));
                         list.add(projectBean.getMorny());
                         list.add(projectBean.getBalance());
diff --git a/app/src/main/res/layout/activity_newcard_list.xml b/app/src/main/res/layout/activity_newcard_list.xml
index add0af0..560692e 100644
--- a/app/src/main/res/layout/activity_newcard_list.xml
+++ b/app/src/main/res/layout/activity_newcard_list.xml
@@ -10,7 +10,7 @@
         android:layout_width="match_parent"
         android:layout_height="@dimen/dimen_title_height"
         android:background="@drawable/title_bar_bg"
-        app:centerText="娉ㄥ唽璁板綍"
+        app:centerText="寮�鎴疯褰�"
         app:leftImage="@mipmap/icon_back"
         app:rightText="绛涢��" />
 
@@ -26,7 +26,7 @@
             android:id="@+id/recyclerView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:background="#fff"
+            android:background="#ffffff"
             android:overScrollMode="never"
             android:padding="10dp" />
 
diff --git a/app/src/main/res/layout/activity_recharge_list.xml b/app/src/main/res/layout/activity_recharge_list.xml
index e9994ce..4c0d194 100644
--- a/app/src/main/res/layout/activity_recharge_list.xml
+++ b/app/src/main/res/layout/activity_recharge_list.xml
@@ -14,15 +14,25 @@
         app:leftImage="@mipmap/icon_back"
         app:rightText="绛涢��" />
 
-    <ListView
-        android:id="@+id/recharge_list"
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:layout_above="@+id/recharge_total"
-        android:layout_below="@+id/titleBar"
-        android:cacheColorHint="#ffffff"
-        android:divider="@null"
-        android:dividerHeight="0dp" />
+        android:layout_above="@id/recharge_total"
+        android:layout_below="@+id/titleBar">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="#ffffff"
+            android:overScrollMode="never"
+            android:padding="10dp" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 
     <TextView
         android:id="@+id/recharge_total"
diff --git a/app/src/main/res/layout/activity_replacement.xml b/app/src/main/res/layout/activity_replacement.xml
index acbfa9c..21cd54b 100644
--- a/app/src/main/res/layout/activity_replacement.xml
+++ b/app/src/main/res/layout/activity_replacement.xml
@@ -14,13 +14,24 @@
         app:leftImage="@mipmap/icon_back"
         app:rightText="绛涢��" />
 
-    <ListView
-        android:id="@+id/newCard_listView"
+    <com.scwang.smart.refresh.layout.SmartRefreshLayout
+        android:id="@+id/refreshLayout"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:cacheColorHint="#ffffff"
-        android:divider="@null"
-        android:dividerHeight="0dp" />
+        android:layout_above="@id/user_total"
+        android:layout_below="@+id/titleBar">
 
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/recyclerView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="#fff"
+            android:overScrollMode="never"
+            android:padding="10dp" />
+
+        <com.scwang.smart.refresh.footer.ClassicsFooter
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+    </com.scwang.smart.refresh.layout.SmartRefreshLayout>
 
 </LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_new_card.xml b/app/src/main/res/layout/item_new_card.xml
index 574e7eb..323228f 100644
--- a/app/src/main/res/layout/item_new_card.xml
+++ b/app/src/main/res/layout/item_new_card.xml
@@ -14,6 +14,7 @@
             android:layout_height="wrap_content"
             android:layout_marginLeft="15dp"
             android:layout_marginTop="10dp"
+
             android:layout_marginRight="15dp"
             android:orientation="vertical">
 
diff --git a/app/src/main/res/layout/item_recharge.xml b/app/src/main/res/layout/item_recharge.xml
index 06bab4b..5760b9a 100644
--- a/app/src/main/res/layout/item_recharge.xml
+++ b/app/src/main/res/layout/item_recharge.xml
@@ -1,55 +1,60 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical">
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="15dp"
-        android:layout_marginRight="15dp"
-        android:layout_marginTop="10dp"
         android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/userName"
+        <LinearLayout
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="鐢ㄦ埛鍚�"
-            android:textSize="14sp" />
+            android:layout_marginLeft="15dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="15dp"
+            android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/userNo"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="鐢ㄦ埛缂栧彿"
-            android:textSize="14sp" />
+            <TextView
+                android:id="@+id/userName"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鐢ㄦ埛鍚�"
+                android:textSize="14sp" />
 
-        <TextView
-            android:id="@+id/morny"
+            <TextView
+                android:id="@+id/userNo"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鐢ㄦ埛缂栧彿"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/morny"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="閲戦锛�"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/date"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鏃ユ湡"
+                android:textSize="14sp" />
+        </LinearLayout>
+
+
+        <View
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="閲戦锛�"
-            android:textSize="14sp" />
-        <TextView
-            android:id="@+id/date"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="鏃ユ湡"
-            android:textSize="14sp" />
+            android:layout_height="1px"
+            android:layout_marginTop="15dp"
+            android:background="#000000" />
+
     </LinearLayout>
+</layout>
 
-
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1px"
-        android:layout_marginTop="15dp"
-        android:background="#000000" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_replacement.xml b/app/src/main/res/layout/item_replacement.xml
new file mode 100644
index 0000000..cea90d1
--- /dev/null
+++ b/app/src/main/res/layout/item_replacement.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <data>
+
+        <variable
+            name="activity"
+            type="com.dayu.recharge.activity.ReplacementActivity" />
+
+    </data>
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/item"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="15dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginRight="15dp"
+            android:onClick="@{ activity.itemClick}"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/userName"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鐢ㄦ埛鍚�"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/userNo"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鎴峰彿锛�123123"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/water"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="姘撮噺锛�123123"
+                android:textSize="14sp" />
+
+            <TextView
+                android:id="@+id/date"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鏃ユ湡"
+                android:textSize="14sp" />
+
+
+        </LinearLayout>
+
+
+        <View
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_marginTop="15dp"
+            android:background="#000000" />
+
+    </LinearLayout>
+
+
+</layout>
+
diff --git a/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java b/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
index ba28343..af5491a 100644
--- a/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
+++ b/easysocket/src/main/java/com/easysocket/connection/connect/SuperConnection.java
@@ -321,6 +321,7 @@
      */
     private IConnectionManager sendBytes(byte[] bytes) {
         if (ioManager == null || connectionStatus.get() != SocketStatus.SOCKET_CONNECTED) {
+            LogUtil.w("sendBytes閿欒-----ioManager涓簄ull鎴栬�卌onnectionStatus鐘舵�佷笉涓哄凡杩炴帴");
             return this;
         }
         ioManager.sendBytes(bytes);
diff --git a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
index 3d23041..d2bea0d 100644
--- a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
+++ b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyReader.java
@@ -10,6 +10,7 @@
 import com.easysocket.interfaces.conn.IConnectionManager;
 import com.easysocket.interfaces.conn.ISocketActionDispatch;
 import com.easysocket.interfaces.io.IReader;
+import com.easysocket.utils.HexUtil;
 import com.easysocket.utils.LogUtil;
 
 import java.io.IOException;
@@ -138,7 +139,7 @@
                     // 淇濆瓨body
                     originalData.setBodyData(bodyBuf.array());
 
-                    LogUtil.d("Socket鏀跺埌鏁版嵁-->" + originalData.getBodyString());
+                    LogUtil.d("Socket鏀跺埌鏁版嵁-->" +HexUtil.bytesToHex(originalData.getBodyBytes()) );
                     // 鍒嗗彂鏁版嵁
                     actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, originalData);
 
@@ -171,7 +172,7 @@
             throw new ReadUnrecoverableException("鏁版嵁body鐨勯暱搴︿笉鑳藉皬浜�0");
         }
 
-        LogUtil.d("Socket鏀跺埌鏁版嵁-->" + originalData.getBodyString());
+        LogUtil.d("Socket鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(originalData.getBodyBytes()));
         // 鍒嗗彂
         actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, originalData);
 
@@ -236,7 +237,7 @@
         byte[] data = new byte[len];
         originBuf.get(data, 0, len);
         readData.setBodyData(data);
-        LogUtil.d("Socket鏀跺埌鏁版嵁-->" + readData.getBodyString());
+        LogUtil.d("Socket鏀跺埌鏁版嵁-->" + HexUtil.bytesToHex(readData.getBodyBytes()));
         // 鍒嗗彂鏁版嵁
         actionDispatch.dispatchAction(IOAction.ACTION_READ_COMPLETE, readData);
         // 鐩稿綋浜庢妸鎸囬拡閲嶆柊鎸囧悜positon=0
diff --git a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
index 554a06d..9634e16 100644
--- a/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
+++ b/easysocket/src/main/java/com/easysocket/connection/iowork/EasyWriter.java
@@ -4,6 +4,7 @@
 import com.easysocket.interfaces.conn.IConnectionManager;
 import com.easysocket.interfaces.conn.ISocketActionDispatch;
 import com.easysocket.interfaces.io.IWriter;
+import com.easysocket.utils.HexUtil;
 import com.easysocket.utils.LogUtil;
 
 import java.io.IOException;
@@ -92,8 +93,8 @@
     @Override
     public void write(byte[] sendBytes) throws IOException {
         if (sendBytes != null) {
-            LogUtil.d("Socket鍙戦�佹暟鎹甋tring-->" + new String(sendBytes, Charset.forName("utf-8")));
-            LogUtil.d("Socket鍙戦�佹暟鎹産yte[]-->" + Arrays.toString(sendBytes));
+            LogUtil.d("EasyWriter--Socket鍙戦�佹暟鎹甋tring-->" + HexUtil.bytesToHex(sendBytes));
+            LogUtil.d("EasyWriter--Socket鍙戦�佹暟鎹産yte[]-->" + Arrays.toString(sendBytes));
             int packageSize = socketOptions.getMaxWriteBytes(); // 姣忔鍙互鍙戦�佺殑鏈�澶ф暟鎹�
             int remainingCount = sendBytes.length;
             ByteBuffer writeBuf = ByteBuffer.allocate(packageSize);
diff --git a/easysocket/src/main/java/com/easysocket/utils/HexUtil.java b/easysocket/src/main/java/com/easysocket/utils/HexUtil.java
new file mode 100644
index 0000000..a92049b
--- /dev/null
+++ b/easysocket/src/main/java/com/easysocket/utils/HexUtil.java
@@ -0,0 +1,275 @@
+package com.easysocket.utils;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Copyright (C), 2022,
+ * Author: zuo
+ * Date: 2022/3/9 14:55
+ * Description:
+ */
+public class HexUtil {
+
+
+    /**
+     * hex瀛楃涓茶浆byte鏁扮粍
+     *
+     * @param inHex 寰呰浆鎹㈢殑Hex瀛楃涓�
+     * @return 杞崲鍚庣殑byte鏁扮粍缁撴灉
+     */
+    public static byte[] hexToByteArray(String inHex) {
+        int hexlen = inHex.length();
+        byte[] result;
+        if (hexlen % 2 == 1) {
+            //濂囨暟
+            hexlen++;
+            result = new byte[(hexlen / 2)];
+            inHex = "0" + inHex;
+        } else {
+            //鍋舵暟
+            result = new byte[(hexlen / 2)];
+        }
+        int j = 0;
+        for (int i = 0; i < hexlen; i += 2) {
+            result[j] = hexToByte(inHex.substring(i, i + 2));
+            j++;
+        }
+        return result;
+    }
+
+
+    /**
+     * Hex瀛楃涓茶浆byte
+     *
+     * @param inHex 寰呰浆鎹㈢殑Hex瀛楃涓�
+     * @return 杞崲鍚庣殑byte
+     */
+    public static byte hexToByte(String inHex) {
+        return (byte) Integer.parseInt(inHex, 16);
+    }
+
+    /**
+     * 瀛楄妭杞崄鍏繘鍒�
+     *
+     * @param b 闇�瑕佽繘琛岃浆鎹㈢殑byte瀛楄妭
+     * @return 杞崲鍚庣殑Hex瀛楃涓�
+     */
+    public static String byteToHex(byte b) {
+        String hex = Integer.toHexString(b & 0xFF);
+        if (hex.length() < 2) {
+            hex = "0" + hex;
+        }
+        return hex.toUpperCase();
+    }
+
+
+    /**
+     * 瀛楄妭鏁扮粍杞�16杩涘埗
+     *
+     * @param bytes 闇�瑕佽浆鎹㈢殑byte鏁扮粍
+     * @return 杞崲鍚庣殑Hex瀛楃涓�
+     */
+    public static String bytesToHex(byte[] bytes) {
+        try {
+            StringBuffer sb = new StringBuffer();
+            for (int i = 0; i < bytes.length; i++) {
+                String hex = Integer.toHexString(bytes[i] & 0xFF);
+                if (hex.length() < 2) {
+                    sb.append(0);
+                }
+                sb.append(hex);
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    public static String byteArrayToHexString(byte[] byteArray) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : byteArray) {
+            // 灏嗗瓧鑺傝浆鎹负鏃犵鍙锋暣鏁�
+            int unsignedInt = b & 0xff;
+            // 灏嗘棤绗﹀彿鏁存暟杞崲涓�16杩涘埗瀛楃涓�
+            String hex = Integer.toHexString(unsignedInt);
+            // 濡傛灉瀛楃涓查暱搴﹀皬浜�2锛屽湪鍓嶉潰琛�0
+            if (hex.length() < 2) {
+                hex = "0" + hex;
+            }
+            hexString.append(hex);
+        }
+        return hexString.toString();
+    }
+
+    /**
+     * 瀛楄妭鏁扮粍杞�16杩涘埗 涓嶅湪鏈熬娣诲姞0
+     *
+     * @param bytes 闇�瑕佽浆鎹㈢殑byte鏁扮粍
+     * @return 杞崲鍚庣殑Hex瀛楃涓�
+     */
+    public static String bytesToHexNoAddZero(byte[] bytes) {
+        StringBuffer sb = new StringBuffer();
+        for (int i = 0; i < bytes.length; i++) {
+            String hex = Integer.toHexString(bytes[i] & 0xFF);
+            sb.append(hex);
+        }
+        return sb.toString();
+    }
+
+
+    /**
+     * 灏� 4瀛楄妭鐨�16杩涘埗瀛楃涓诧紝杞崲涓�32浣嶅甫绗﹀彿鐨勫崄杩涘埗娴偣鍨�
+     *
+     * @param str 4瀛楄妭 16杩涘埗瀛楃
+     * @return
+     */
+    public static float hexToFloat(String str) {
+        return Float.intBitsToFloat(new BigInteger(str, 16).intValue());
+    }
+
+    /**
+     * 灏嗗甫绗﹀彿鐨�32浣嶆诞鐐规暟瑁呮崲涓�16杩涘埗
+     *
+     * @param value
+     * @return
+     */
+    public static String folatToHexString(Float value) {
+        return Integer.toHexString(Float.floatToIntBits(value));
+    }
+
+    /**
+     * 鍗佽繘鍒惰浆16杩涘埗
+     *
+     * @param number
+     * @return
+     */
+    public static String get10to16(int number) {
+        return Integer.toHexString(number);
+    }
+
+    /**
+     * 鍗佽繘鍒惰浆16杩涘埗 琛ラ綈鍋舵暟 楂樹綅鍦ㄥ墠浣庝綅鍦ㄥ悗
+     *
+     * @param number
+     * @return
+     */
+    public static String get10to16CompleteHex(int number) {
+        String hex = Integer.toHexString(number);
+        if (hex.length() % 2 == 0) {
+            return hex;
+        } else {
+            return "0" + hex;
+        }
+    }
+
+    /**
+     * 鍗佽繘鍒惰浆16杩涘埗浣庝綅鍦ㄥ墠楂樹綅鍦ㄥ悗
+     *
+     * @param number 鍗佽繘鍒舵暟
+     * @param length 琛ヨ冻澶氬皯浣�
+     * @return
+     */
+    public static String get10to16LowHigh(int number, int length) {
+        String str = "";
+        try {
+            str = Integer.toHexString(number);
+            str = getHexToLenght(str, length);
+            str = spaceHex(str);
+            str = HighLowHex(str);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return str;
+    }
+
+    /**
+     * 16杩涘埗杞�10杩涘埗楂樹綆浣嶈浆鎹�
+     *
+     * @param hex
+     * @return
+     */
+    public static int get16to10LowHigh(String hex) {
+        try {
+            String str = "";
+            str = spaceHex(hex);
+            str = HighLowHex(str);
+            return Integer.parseInt(str, 16);
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+
+    /**
+     * 杩斿洖鐗瑰畾闀垮害鐨�16杩涘埗瀛楃涓�
+     *
+     * @param data
+     * @param length
+     * @return
+     */
+    public static String getHexToLenght(String data, int length) {
+        StringBuffer stringBuilder = new StringBuffer(data);
+        for (int i = 0; i < length - data.length(); i++) {
+            stringBuilder.insert(0, "0");
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 鍗佸叚杩涘埗鏁伴殧绌轰綅
+     *
+     * @param str
+     * @return
+     */
+    public static String spaceHex(String str) {
+        char[] array = str.toCharArray();
+        if (str.length() <= 2) return str;
+        StringBuffer bufferHex = new StringBuffer();
+        for (int i = 0; i < array.length; i++) {
+            int start = i + 1;
+            if (start % 2 == 0) {
+                bufferHex.append(array[i]).append(" ");
+            } else {
+                bufferHex.append(array[i]);
+            }
+        }
+        return bufferHex.toString();
+    }
+
+    /**
+     * 楂樹綅16杩涘埗杞綆浣�
+     *
+     * @param str
+     * @return
+     */
+    private static String HighLowHex(String str) {
+        if (str.trim().length() <= 2) return str;
+        List<String> list = Arrays.asList(str.split(" "));
+        Collections.reverse(list);
+        StringBuffer stringBuffer = new StringBuffer();
+        for (String string : list) {
+            stringBuffer.append(string);
+        }
+        return stringBuffer.toString();
+    }
+
+    /**
+     * @param hex
+     * @return
+     */
+    public static int get16to10(String hex) {
+        int x = 0;
+        try {
+            x = Integer.parseInt(hex, 16);
+        } catch (NumberFormatException e) {
+            e.printStackTrace();
+        }
+        return x;
+    }
+}
diff --git a/gradlew b/gradlew
index 4f906e0..a69d9cb 100644
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
 
 #
-# Copyright 2015 the original author or authors.
+# Copyright 漏 2015-2021 the original authors.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
 #
 
 ##############################################################################
-##
-##  Gradle start up script for UN*X
-##
+#
+#   Gradle start up script for POSIX generated by Gradle.
+#
+#   Important for running:
+#
+#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+#       noncompliant, but you have some other compliant shell such as ksh or
+#       bash, then to run this script, type that shell name before the whole
+#       command line, like:
+#
+#           ksh Gradle
+#
+#       Busybox and similar reduced shells will NOT work, because this script
+#       requires all of these POSIX shell features:
+#         * functions;
+#         * expansions 芦$var禄, 芦${var}禄, 芦${var:-default}禄, 芦${var+SET}禄,
+#           芦${var#prefix}禄, 芦${var%suffix}禄, and 芦$( cmd )禄;
+#         * compound commands having a testable exit status, especially 芦case禄;
+#         * various built-in commands including 芦command禄, 芦set禄, and 芦ulimit禄.
+#
+#   Important for patching:
+#
+#   (2) This script targets any POSIX shell, so it avoids extensions provided
+#       by Bash, Ksh, etc; in particular arrays are avoided.
+#
+#       The "traditional" practice of packing multiple parameters into a
+#       space-separated string is a well documented source of bugs and security
+#       problems, so this is (mostly) avoided, by progressively accumulating
+#       options in "$@", and eventually passing that to Java.
+#
+#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+#       see the in-line comments for details.
+#
+#       There are tweaks for specific operating systems such as AIX, CygWin,
+#       Darwin, MinGW, and NonStop.
+#
+#   (3) This script is generated from the Groovy template
+#       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+#       within the Gradle project.
+#
+#       You can find Gradle at https://github.com/gradle/gradle/.
+#
 ##############################################################################
 
 # Attempt to set APP_HOME
+
 # Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+    APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path
+    [ -h "$app_path" ]
+do
+    ls=$( ls -ld "$app_path" )
+    link=${ls#*' -> '}
+    case $link in             #(
+      /*)   app_path=$link ;; #(
+      *)    app_path=$APP_HOME$link ;;
+    esac
 done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
 
 APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
 
 # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
 DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
 
 # Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
 
 warn () {
     echo "$*"
-}
+} >&2
 
 die () {
     echo
     echo "$*"
     echo
     exit 1
-}
+} >&2
 
 # OS specific support (must be 'true' or 'false').
 cygwin=false
 msys=false
 darwin=false
 nonstop=false
-case "`uname`" in
-  CYGWIN* )
-    cygwin=true
-    ;;
-  Darwin* )
-    darwin=true
-    ;;
-  MINGW* )
-    msys=true
-    ;;
-  NONSTOP* )
-    nonstop=true
-    ;;
+case "$( uname )" in                #(
+  CYGWIN* )         cygwin=true  ;; #(
+  Darwin* )         darwin=true  ;; #(
+  MSYS* | MINGW* )  msys=true    ;; #(
+  NONSTOP* )        nonstop=true ;;
 esac
 
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
         # IBM's JDK on AIX uses strange locations for the executables
-        JAVACMD="$JAVA_HOME/jre/sh/java"
+        JAVACMD=$JAVA_HOME/jre/sh/java
     else
-        JAVACMD="$JAVA_HOME/bin/java"
+        JAVACMD=$JAVA_HOME/bin/java
     fi
     if [ ! -x "$JAVACMD" ] ; then
         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@
 location of your Java installation."
     fi
 else
-    JAVACMD="java"
+    JAVACMD=java
     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
 
 Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,101 @@
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
-    MAX_FD_LIMIT=`ulimit -H -n`
-    if [ $? -eq 0 ] ; then
-        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
-            MAX_FD="$MAX_FD_LIMIT"
-        fi
-        ulimit -n $MAX_FD
-        if [ $? -ne 0 ] ; then
-            warn "Could not set maximum file descriptor limit: $MAX_FD"
-        fi
-    else
-        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
-    fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
-    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
-    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
-    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
-    JAVACMD=`cygpath --unix "$JAVACMD"`
-
-    # We build the pattern for arguments to be converted via cygpath
-    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
-    SEP=""
-    for dir in $ROOTDIRSRAW ; do
-        ROOTDIRS="$ROOTDIRS$SEP$dir"
-        SEP="|"
-    done
-    OURCYGPATTERN="(^($ROOTDIRS))"
-    # Add a user-defined pattern to the cygpath arguments
-    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
-        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
-    fi
-    # Now convert the arguments - kludge to limit ourselves to /bin/sh
-    i=0
-    for arg in "$@" ; do
-        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
-        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
-
-        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
-            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
-        else
-            eval `echo args$i`="\"$arg\""
-        fi
-        i=`expr $i + 1`
-    done
-    case $i in
-        0) set -- ;;
-        1) set -- "$args0" ;;
-        2) set -- "$args0" "$args1" ;;
-        3) set -- "$args0" "$args1" "$args2" ;;
-        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+    case $MAX_FD in #(
+      max*)
+        MAX_FD=$( ulimit -H -n ) ||
+            warn "Could not query maximum file descriptor limit"
+    esac
+    case $MAX_FD in  #(
+      '' | soft) :;; #(
+      *)
+        ulimit -n "$MAX_FD" ||
+            warn "Could not set maximum file descriptor limit to $MAX_FD"
     esac
 fi
 
-# Escape application args
-save () {
-    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
-    echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command, stacking in reverse order:
+#   * args from the command line
+#   * the main class name
+#   * -classpath
+#   * -D...appname settings
+#   * --module-path (only if needed)
+#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
 
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+    APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+    CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+    JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    for arg do
+        if
+            case $arg in                                #(
+              -*)   false ;;                            # don't mess with options #(
+              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath
+                    [ -e "$t" ] ;;                      #(
+              *)    false ;;
+            esac
+        then
+            arg=$( cygpath --path --ignore --mixed "$arg" )
+        fi
+        # Roll the args list around exactly as many times as the number of
+        # args, so each arg winds up back in the position where it started, but
+        # possibly modified.
+        #
+        # NB: a `for` loop captures its iteration list before it begins, so
+        # changing the positional parameters here affects neither the number of
+        # iterations, nor the values presented in `arg`.
+        shift                   # remove old arg
+        set -- "$@" "$arg"      # push replacement arg
+    done
+fi
+
+# Collect all arguments for the java command;
+#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+#     shell script including quotes and variable substitutions, so put them in
+#     double quotes to make sure that they get re-expanded; and
+#   * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+        "-Dorg.gradle.appname=$APP_BASE_NAME" \
+        -classpath "$CLASSPATH" \
+        org.gradle.wrapper.GradleWrapperMain \
+        "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+    die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+#   readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+#   set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+        printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+        xargs -n1 |
+        sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+        tr '\n' ' '
+    )" '"$@"'
 
 exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 107acd3..f127cfd 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -14,7 +14,7 @@
 @rem limitations under the License.
 @rem
 
-@if "%DEBUG%" == "" @echo off
+@if "%DEBUG%"=="" @echo off
 @rem ##########################################################################
 @rem
 @rem  Gradle startup script for Windows
@@ -25,7 +25,7 @@
 if "%OS%"=="Windows_NT" setlocal
 
 set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
+if "%DIRNAME%"=="" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
@@ -40,7 +40,7 @@
 
 set JAVA_EXE=java.exe
 %JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
+if %ERRORLEVEL% equ 0 goto execute
 
 echo.
 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +75,15 @@
 
 :end
 @rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
+if %ERRORLEVEL% equ 0 goto mainEnd
 
 :fail
 rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
 rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
 
 :mainEnd
 if "%OS%"=="Windows_NT" endlocal
diff --git a/local.properties b/local.properties
index 1f4d3ae..cf06b5b 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.
-#Thu Dec 14 09:58:29 CST 2023
-sdk.dir=D\:\\AndroidStudio\\sdk
+#Mon Dec 18 10:17:13 CST 2023
+sdk.dir=D\:\\android\\sdk

--
Gitblit v1.8.0