mac
2024-01-05 51d7007fd4bcaaa771d43a745cb6728d4e6d29ae
2024年01月05日18:04:39
1个文件已添加
16个文件已修改
805 ■■■■ 已修改文件
app/src/main/java/com/hdl/photovoltaic/HDLApp.java 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/broadcast/NetworkChangeReceiver.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/NetworkUtils.java 381 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/utils/NetworkUtils123.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_test_log.xml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_test_main.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -1,15 +1,8 @@
package com.hdl.photovoltaic;
import android.app.Application;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import com.hdl.hdlhttp.HxHttpConfig;
@@ -18,21 +11,22 @@
import com.hdl.linkpm.sdk.user.callback.IOnReloginListener;
import com.hdl.linkpm.sdk.utils.HDLSDKSPUtils;
import com.hdl.photovoltaic.config.AppConfigManage;
import com.hdl.photovoltaic.config.ConstantManage;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpServer;
import com.hdl.photovoltaic.internet.HttpServer.MyNanoHttpService;
import com.hdl.photovoltaic.other.HdlFileLogic;
import com.hdl.photovoltaic.other.HdlOtaLogic;
import com.hdl.photovoltaic.other.HdlThreadLogic;
import com.hdl.photovoltaic.enums.NetworkType;
import com.hdl.photovoltaic.ui.HomeLoginActivity;
import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
import com.hdl.photovoltaic.utils.AppManagerUtils;
import com.hdl.photovoltaic.utils.LocalManageUtil;
import com.hdl.photovoltaic.utils.NetworkUtils;
import com.hdl.photovoltaic.utils.SharedPreUtils;
import com.hdl.sdk.link.HDLLinkLocalSdk;
import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
import com.hdl.sdk.link.core.connect.HDLUdpConnect;
import com.hdl.sdk.link.core.utils.QueueUtils;
import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
import org.greenrobot.eventbus.EventBus;
import java.util.HashMap;
import java.util.Locale;
@@ -134,9 +128,10 @@
        initSocket();
        //4.初始化OKHttpLog 是否开启
        setOKHttpLogOpen(isLogEnabled);
        //监听网络状态变化
        this.networkMonitoring();
    }
    /**
     * 初始化HDLLinkPMSdk
@@ -223,6 +218,32 @@
    }
    /**
     * 监听网络状态变化
     */
    private void networkMonitoring() {
        NetworkUtils.init(getInstance());
        NetworkUtils.registerNetworkStatusChangedListener(new NetworkUtils.OnNetworkStatusChangedListener() {
            @Override
            public void onDisconnected() {
                BaseEventBus baseEventBus = new BaseEventBus();
                baseEventBus.setTopic(ConstantManage.network_change_post);
                baseEventBus.setType(NetworkType.no_network.toString());
                baseEventBus.setData("当前无网络连接");
                EventBus.getDefault().post(baseEventBus);
            }
            @Override
            public void onConnected(NetworkUtils.NetworkType networkType) {
                BaseEventBus mobile_network = new BaseEventBus();
                mobile_network.setTopic(ConstantManage.network_change_post);
                mobile_network.setType(networkType.toString());
                mobile_network.setData("正在使用2G/3G/4G网络/wifi");
                EventBus.getDefault().post(mobile_network);
            }
        });
    }
//    /**
//     * 初始化uni app mqtt
app/src/main/java/com/hdl/photovoltaic/broadcast/NetworkChangeReceiver.java
@@ -13,45 +13,49 @@
import org.greenrobot.eventbus.EventBus;
/**
 * 监听网络状态变化的广播
 */
public class NetworkChangeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isAvailable()) {
            switch (networkInfo.getType()) {
                case ConnectivityManager.TYPE_MOBILE:
                    BaseEventBus mobile_network = new BaseEventBus();
                    mobile_network.setTopic(ConstantManage.network_change_post);
                    mobile_network.setType(NetworkType.g_4.toString());
                    mobile_network.setData("正在使用2G/3G/4G网络");
                    EventBus.getDefault().post(mobile_network);
                    break;
                case ConnectivityManager.TYPE_WIFI:
                    BaseEventBus wif_network = new BaseEventBus();
                    wif_network.setTopic(ConstantManage.network_change_post);
                    wif_network.setType(NetworkType.wifi.toString());
                    wif_network.setData("正在使用wifi上网");
                    EventBus.getDefault().post(wif_network);
                    break;
                default:
                    break;
            }
        } else {
            BaseEventBus baseEventBus = new BaseEventBus();
            baseEventBus.setTopic(ConstantManage.network_change_post);
            baseEventBus.setType(NetworkType.no_network.toString());
            baseEventBus.setData("当前无网络连接");
            EventBus.getDefault().post(baseEventBus);
        }
        //todo 已经在NetworkUtils里面实现
//        ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//        NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
//        if (networkInfo != null && networkInfo.isAvailable()) {
//            switch (networkInfo.getType()) {
//                case ConnectivityManager.TYPE_MOBILE:
//                    BaseEventBus mobile_network = new BaseEventBus();
//                    mobile_network.setTopic(ConstantManage.network_change_post);
//                    mobile_network.setType(NetworkType.g_4.toString());
//                    mobile_network.setData("正在使用2G/3G/4G网络");
//                    EventBus.getDefault().post(mobile_network);
//                    break;
//                case ConnectivityManager.TYPE_WIFI:
//                    BaseEventBus wif_network = new BaseEventBus();
//                    wif_network.setTopic(ConstantManage.network_change_post);
//                    wif_network.setType(NetworkType.wifi.toString());
//                    wif_network.setData("正在使用wifi上网");
//                    EventBus.getDefault().post(wif_network);
//                    break;
//                default:
//                    break;
//            }
//
//        } else {
//            BaseEventBus baseEventBus = new BaseEventBus();
//            baseEventBus.setTopic(ConstantManage.network_change_post);
//            baseEventBus.setType(NetworkType.no_network.toString());
//            baseEventBus.setData("当前无网络连接");
//            EventBus.getDefault().post(baseEventBus);
//        }
    }
}
}
app/src/main/java/com/hdl/photovoltaic/jpush/JPushReceiverService.java
@@ -42,7 +42,7 @@
     */
    public void onMessage(Context context, CustomMessage customMessage) {
        HdlLogLogic.print("极光--->自定义消息回调--->" + new Gson().toJson(customMessage), true);
        HdlLogLogic.print("极光--->自定义消息回调--->" + new Gson().toJson(customMessage), false);
    }
    /**
@@ -76,7 +76,7 @@
     * @param registrationId 注册 id
     */
    public void onRegister(Context context, String registrationId) {
        HdlLogLogic.print("极光--->注册成功回调Id--->" + registrationId, true);
        HdlLogLogic.print("极光--->注册成功回调Id:" + registrationId, false);
    }
    /**
@@ -86,7 +86,7 @@
     * @param isConnected 长连接状态
     */
    public void onConnected(Context context, boolean isConnected) {
        HdlLogLogic.print("极光--->长连接状态回调--->" + isConnected, true);
        HdlLogLogic.print("极光--->长连接状态回调:" + isConnected, false);
    }
    /**
app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -117,26 +117,26 @@
    public void uploadDataToCloud(String homeId, String mac, CloudCallBeak<Boolean> callBeak) {
        getInverterOidList(mac, new LinkCallBack<List<OidBean>>() {
            @Override
            public void onSuccess(List<OidBean> obj) {
                if (obj == null) {
            public void onSuccess(List<OidBean> oidBeanList) {
                if (oidBeanList == null) {
                    return;
                }
                fullUpdateOid(homeId, obj, new CloudCallBeak<Boolean>() {
                fullUpdateOid(homeId, oidBeanList, new CloudCallBeak<Boolean>() {
                    @Override
                    public void onSuccess(Boolean obj) {
                        HdlLogLogic.print("上传oid列表到云端成功-->" + homeId + "--->" + mac, true);
                        HdlLogLogic.print("上传oid列表到云端成功--->住宅id:" + homeId + "--->mac:" + mac, true);
                    }
                    @Override
                    public void onFailure(HDLException e) {
                        HdlLogLogic.print("上传oid列表到云端失败-->" + homeId + "--->" + mac + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                        HdlLogLogic.print("上传oid列表到云端失败--->住宅id:" + homeId + "--->mac:" + mac + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                    }
                });
            }
            @Override
            public void onError(HDLLinkException e) {
                HdlLogLogic.print("获取逆变器oid列表失败-->" + homeId + "--->" + mac + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
                HdlLogLogic.print("获取逆变器oid列表失败--->住宅id:" + homeId + "--->mac:" + mac + "-->" + e.getMsg() + "(" + e.getCode() + ")", true);
            }
        });
@@ -332,7 +332,6 @@
                    cloudCallBeak.onSuccess(true);
                }
                HdlLogLogic.print("全量更新oid到云端成功--->", true);
            }
@@ -341,7 +340,6 @@
                if (cloudCallBeak != null) {
                    cloudCallBeak.onFailure(e);
                }
                HdlLogLogic.print("全量更新oid到云端失败--->" + e.getMsg() + "(" + e.getCode() + ")", true);
            }
        });
app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
@@ -27,9 +27,9 @@
    private static volatile HdlFileLogic sHdlFileLogic;
    /**
     * 表示1m大小数据
     * 表示0.5m大小数据
     */
    private final int mDataSize = 1;
    private final double mDataSize = 0.5;
    /**
     * 获取当前对象
app/src/main/java/com/hdl/photovoltaic/other/HdlJpushLogic.java
@@ -66,17 +66,20 @@
     * 添加在推送数据到缓存列表中
     */
    private void addPushDataToMemoryList(JPushMessageInfoBean jPushMessageInfoBean) {
        if (TextUtils.isEmpty(jPushMessageInfoBean.getExpantContent())) {
            return;
        try {
            if (TextUtils.isEmpty(jPushMessageInfoBean.getExpantContent())) {
                return;
            }
            Gson gson = new Gson();
            MessageBean messageBean = gson.fromJson(jPushMessageInfoBean.getExpantContent(), MessageBean.class);
            if (messageBean == null) {
                return;
            }
            messageBean.setTitle(jPushMessageInfoBean.getTitle());
            messageBean.setDeviceDesc(jPushMessageInfoBean.getContent());
            HdlMessageLogic.getInstance().setListMessage(messageBean, 0);
            HdlLogLogic.print("添加在推送数据到缓存列表中--->成功");
        } catch (Exception ignored) {
        }
        Gson gson = new Gson();
        MessageBean messageBean = gson.fromJson(jPushMessageInfoBean.getExpantContent(), MessageBean.class);
        if (messageBean == null) {
            return;
        }
        messageBean.setTitle(jPushMessageInfoBean.getTitle());
        messageBean.setDeviceDesc(jPushMessageInfoBean.getContent());
        HdlMessageLogic.getInstance().setListMessage(messageBean, 0);
        HdlLogLogic.print("添加在推送数据到缓存列表中--->成功");
    }
}
app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
@@ -27,9 +27,8 @@
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.listener.LinkCallBack;
import com.hdl.photovoltaic.utils.AesUtils;
import com.hdl.photovoltaic.utils.AppManagerUtils;
import com.hdl.photovoltaic.utils.Md5Utils;
import com.hdl.photovoltaic.utils.NetworkUtils;
import com.hdl.photovoltaic.utils.NetworkUtils123;
import com.hdl.sdk.link.common.exception.HDLLinkException;
import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
@@ -39,12 +38,10 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import okhttp3.ResponseBody;
@@ -503,7 +500,7 @@
        //1,建立本地服务;
        //2,告诉网关手机ip和端口;
        //实例化 获取ip 地址
        MyNanoHttpServer.getInstance(NetworkUtils.getInstance().getIPAddress(HDLApp.getInstance()));
        MyNanoHttpServer.getInstance(NetworkUtils123.getInstance().getIPAddress(HDLApp.getInstance()));
        //MyNanoHttpServer.getInstance("127.0.0.1");
        intentServer = new Intent();
        intentServer.setClass(HDLApp.getInstance(), MyNanoHttpService.class);
app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -28,8 +28,7 @@
import com.hdl.photovoltaic.ui.bean.OidBean;
import com.hdl.photovoltaic.uni.HDLUniMP;
import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
import com.hdl.photovoltaic.utils.AppManagerUtils;
import com.hdl.photovoltaic.utils.NetworkUtils;
import com.hdl.photovoltaic.utils.NetworkUtils123;
import com.hdl.photovoltaic.utils.WifiUtils;
import com.hdl.sdk.link.common.exception.HDLLinkCode;
import com.hdl.sdk.link.common.exception.HDLLinkException;
@@ -321,7 +320,7 @@
                    break;
                }
            }
            HdlLogLogic.print("uni发来的数据--->大类-->" + topic + "\r\n" + data, true);
            HdlLogLogic.print("uni发来的数据--->大类--->" + topic + "\r\n" + data, true);
        } catch (Exception e) {
            HdlLogLogic.print("uni发来的数据--->" + e.getMessage(), true);
        }
@@ -518,7 +517,7 @@
        String version = getKeyValue("version", getKeyValue("data", data));//固件版本
        String hardwareModel = getKeyValue("hardwareModel", getKeyValue("data", data));//云端上文件MD5
        String imageId = getKeyValue("imageId", getKeyValue("data", data));//固件镜像id
        String module = "FW#" + imageId;
        String module = "FW#" + imageId;//模块信息(HW:硬件)
        //升级本地优先->云端升级
        HdlDeviceLogic.getInstance().isLocalConnect(deviceMac, new CloudCallBeak<Boolean>() {
@@ -542,7 +541,7 @@
                            }
                            String md5 = HDLMD5Utils.encodeMD5(data);//网关固件需要
                            //升级固件文件地址
                            String upgradeFileLocalPathUrl = "http://" + NetworkUtils.getInstance().getIPAddress(HDLApp.getInstance()) + ":" + MyNanoHttpServer.HTTP_PORT + firmwarePathFileName;
                            String upgradeFileLocalPathUrl = "http://" + NetworkUtils123.getInstance().getIPAddress(HDLApp.getInstance()) + ":" + MyNanoHttpServer.HTTP_PORT + firmwarePathFileName;
                            //通知给网关升级固件文件地址等信息
                            HdlOtaLogic.getInstance().pushUpgradePacketInfo(deviceMac, oid, module, version, data.length + "", upgradeFileLocalPathUrl, md5, new LinkCallBack<String>() {
                                @Override
@@ -798,7 +797,7 @@
                            }
                            String md5 = HDLMD5Utils.encodeMD5(data);//网关驱动需要
                            //升级驱动文件地址
                            String upgradeFileLocalPathUrl = "http://" + NetworkUtils.getInstance().getIPAddress(HDLApp.getInstance()) + ":" + MyNanoHttpServer.HTTP_PORT + drivePathFileName;
                            String upgradeFileLocalPathUrl = "http://" + NetworkUtils123.getInstance().getIPAddress(HDLApp.getInstance()) + ":" + MyNanoHttpServer.HTTP_PORT + drivePathFileName;
                            //通知给网关升级驱动文件地址等信息
                            HdlOtaLogic.getInstance().pushUpgradePacketInfo(deviceMac, deviceOid, module, version, data.length + "", upgradeFileLocalPathUrl, md5, new LinkCallBack<String>() {
                                @Override
app/src/main/java/com/hdl/photovoltaic/ui/MyPowerStationActivity.java
@@ -91,8 +91,7 @@
        this.registerAllTopicsListener();
        //初始化mqtt客户端
        this.initMqttClient();
        //监听网络状态变化
        this.networkMonitoring();
        //上传极光注册ID
        this.pushTokens();
        //点击极光通知栏消息进来
@@ -134,13 +133,13 @@
                                UserConfigManage.getInstance().setPushId(pushId);
                                UserConfigManage.getInstance().Save();
                            }
                            HdlLogLogic.print("添加推送极光ID--->registrationID===" + finalRegistrationID, true);
                            HdlLogLogic.print("添加极光ID到云端--->registrationID:" + finalRegistrationID, true);
                        }
                        @Override
                        public void onFailure(HDLException e) {
                            HdlLogLogic.print("添加推送极光ID失败--->registrationID===" + finalRegistrationID, true);
                            HdlLogLogic.print("添加极光ID到云端失败--->registrationID:" + finalRegistrationID, true);
                        }
                    });
app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
@@ -1,6 +1,5 @@
package com.hdl.photovoltaic.ui.me;
import android.app.job.JobScheduler;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
@@ -308,7 +307,7 @@
            @Override
            public void onFailure(HDLException e) {
                HdlLogLogic.print("获取用户自定义配置温度单位详情--->" + e.getMessage() + "(" + e.getCode() + ")", true);
                HdlLogLogic.print("获取用户自定义配置温度单位详情--->" + e.getMsg() + "(" + e.getCode() + ")", true);
//                HdlThreadLogic.toast(_mActivity, e);
            }
        });
app/src/main/java/com/hdl/photovoltaic/ui/message/MessageFragment.java
@@ -220,11 +220,10 @@
        //接收外部点击事件
        if (eventBus.getTopic().equals(ConstantManage.homepage_title_tab_switch)) {
            if (eventBus.getType().equals(HomepageTitleTabSwitch.message.toString())) {
                postEventBus(MessageFunctionTabSwitch.nascent);
                HdlLogLogic.print("正在点击【消息】");
                // 取消粘性事件
                EventBus.getDefault().removeStickyEvent(eventBus);
                postEventBus(MessageFunctionTabSwitch.nascent);
                HdlLogLogic.print("正在点击【消息】");
            }
        } else if (eventBus.getTopic().equals(ConstantManage.message_count)) {
            if (eventBus.getType().equals(MessageStateType.untreated)) {
app/src/main/java/com/hdl/photovoltaic/ui/test/TestLogActivity.java
@@ -4,6 +4,7 @@
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.View;
@@ -75,6 +76,19 @@
            }
        });
        viewBinding.clickToBottomTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                int offset = (viewBinding.sv.getChildAt(0).getMeasuredHeight() - viewBinding.sv.getHeight()); // 计算需要滚动的距离
//                if (offset > 0) {
//                    viewBinding.sv.smoothScrollTo(0, offset); // 平滑地滚动到底部位置
//                } else {
//                    viewBinding.sv.fullScroll(View.FOCUS_DOWN); // 直接滚动到最后一行
//                }
                viewBinding.sv.fullScroll(View.FOCUS_DOWN); // 直接滚动到最后一行
            }
        });
        //上传日志到云端上
        viewBinding.uploadingLogTv.setOnClickListener(new View.OnClickListener() {
            @Override
@@ -126,39 +140,58 @@
     * 初始化界面
     */
    private void initView() {
        HdlThreadLogic.runMainThread(new Runnable() {
        String homeId = "测试住宅ID=" + UserConfigManage.getInstance().getHomeId();
        String homeName = "测试住宅名称=" + UserConfigManage.getInstance().getHomeName();
        viewBinding.homeIdTv.setText(homeId);
        viewBinding.homeNameTv.setText(homeName);
        showLoading();
        HdlThreadLogic.runSubThread(new Runnable() {
            @Override
            public void run() {
                String homeId = "测试住宅ID=" + UserConfigManage.getInstance().getHomeId();
                String homeName = "测试住宅名称=" + UserConfigManage.getInstance().getHomeName();
                viewBinding.homeIdTv.setText(homeId);
                viewBinding.homeNameTv.setText(homeName);
                HdlFileLogic.getInstance().delFileLien(HdlFileLogic.getInstance().getLogFileNamePath(), 2);
                String content = HdlLogLogic.readLog();
                int startIndex = 0;
                int endIndex;
                Map<Integer, Integer> map = new IdentityHashMap<>();
                String[] s = content.split("\r\n");
                for (int i = 0; i < s.length; i++) {
                    if (i == 0) {
                        endIndex = s[i].indexOf("s%");
                    } else {
                        startIndex = 2 + startIndex + s[i - 1].length();//2换行符长度
                        endIndex = 2 + startIndex + s[i].indexOf("s%");//2换行符长度
                HdlThreadLogic.runMainThread(new Runnable() {
                    @Override
                    public void run() {
                        hideLoading();
                        if (TextUtils.isEmpty(content)) {
                            return;
                        }
                        int startIndex = 0;
                        int endIndex;
                        Map<Integer, Integer> map = new IdentityHashMap<>();
                        String[] newArray = content.split("\r\n");
//                String[] newArray = new String[oldArray.length];//倒序
//                for (int i = oldArray.length - 1, j = 0; i >= 0; i--, j++) {
//                    newArray[j] = oldArray[i];
//                }
//                StringBuilder stringBuilder = new StringBuilder();
//                for (String s : newArray) {
//                    stringBuilder.append(s).append("\r\n");
//                }
//                content = stringBuilder.toString();
                        for (int i = 0; i < newArray.length; i++) {
                            if (i == 0) {
                                endIndex = newArray[i].indexOf("s%");
                            } else {
                                startIndex = 2 + startIndex + newArray[i - 1].length();//2换行符长度
                                endIndex = 2 + startIndex + newArray[i].indexOf("s%");//2换行符长度
                            }
                            map.put(startIndex, endIndex);
                        }
                        SpannableStringBuilder spannable = new SpannableStringBuilder(content.replace("s%", "  "));//注意s%是两个字符,所以占两位
                        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                            int start = entry.getKey();
                            int end = entry.getValue();
                            //设置时间体验是另一种颜色
                            spannable.setSpan(new ForegroundColorSpan(getColor(R.color.text_245EC3)), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                        }
                        viewBinding.replyContentTv.setText(spannable);
                    }
                    map.put(startIndex, endIndex);
                }
                SpannableStringBuilder spannable = new SpannableStringBuilder(content.replace("s%", "  "));//注意s%是两个字符,所以占两位
                for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                    int start = entry.getKey();
                    int end = entry.getValue();
                    //设置时间体验是另一种颜色
                    spannable.setSpan(new ForegroundColorSpan(getColor(R.color.text_245EC3)), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
                }
                viewBinding.replyContentTv.setText(spannable);
                });
            }
        }, null, null);
        });
    }
}
app/src/main/java/com/hdl/photovoltaic/ui/test/TestMainActivity.java
@@ -2,19 +2,22 @@
import androidx.recyclerview.widget.LinearLayoutManager;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.hdl.linkpm.sdk.core.exception.HDLException;
import com.hdl.photovoltaic.R;
import com.hdl.photovoltaic.base.CustomBaseActivity;
import com.hdl.photovoltaic.config.UserConfigManage;
import com.hdl.photovoltaic.databinding.ActivityTestMainBinding;
import com.hdl.photovoltaic.enums.ShowErrorMode;
import com.hdl.photovoltaic.internet.TcpClient;
import com.hdl.photovoltaic.internet.api.TopicApi;
import com.hdl.photovoltaic.listener.CloudCallBeak;
import com.hdl.photovoltaic.listener.LinkCallBack;
import com.hdl.photovoltaic.other.HdlDeviceLogic;
@@ -22,11 +25,13 @@
import com.hdl.photovoltaic.ui.bean.CloudInverterChildDeviceBean;
import com.hdl.photovoltaic.ui.bean.OidBean;
import com.hdl.photovoltaic.widget.ConfirmationCancelDialog;
import com.hdl.photovoltaic.widget.ConfirmationExceptionDialog;
import com.hdl.sdk.link.common.exception.HDLLinkException;
import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
import com.hdl.sdk.link.core.callback.GatewayCallBack;
import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
@@ -74,6 +79,7 @@
    private void initEvent() {
        viewBinding.topBackBtn.setOnClickListener(this);
        viewBinding.topLogBtn.setOnClickListener(this);
        viewBinding.clickCommandTv.setOnClickListener(this);
        testTitleAdapter.setItemOnClickListener(new TestTitleAdapter.OnClickListener() {
            @Override
            public void OnClick(int position, String title) {
@@ -105,6 +111,8 @@
        } else if (id == viewBinding.topLogBtn.getId()) {
            startActivity(TestLogActivity.class);
        } else if (id == viewBinding.clickCommandTv.getId()) {
        }
    }
app/src/main/java/com/hdl/photovoltaic/utils/NetworkUtils.java
@@ -1,83 +1,346 @@
package com.hdl.photovoltaic.utils;
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.NetworkRequest;
import android.os.Build;
import android.telephony.TelephonyManager;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import com.hdl.photovoltaic.HDLApp;
import java.lang.ref.WeakReference;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.Executors;
/**
 * Created by Tong on 2022/7/13.
 */
public class NetworkUtils {
    private static NetworkUtils mNetworkUtils;
    public static NetworkUtils getInstance() {
        if (null == mNetworkUtils) {
            synchronized (NetworkUtils.class) {
                if (null == mNetworkUtils) {
                    mNetworkUtils = new NetworkUtils();
                }
            }
        }
        return mNetworkUtils;
    public enum NetworkType {
        NETWORK_ETHERNET,
        NETWORK_WIFI,
        NETWORK_5G,
        NETWORK_4G,
        NETWORK_3G,
        NETWORK_2G,
        NETWORK_UNKNOWN,
        NETWORK_NO
    }
    /**
     * 获得IP地址,分为两种情况:
     * 一:是wifi下;
     * 二:是移动网络下;
     */
    public String getIPAddress(Context context) {
        NetworkInfo info = ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
                try {
                    //Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
    public interface OnNetworkStatusChangedListener {
        void onDisconnected();
        void onConnected(NetworkType networkType);
    }
    public static void init(Context context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            NetworkCallbackImpl.getInstance().init(context);
        } else {
            NetworkChangedReceiver.getInstance().init(context);
        }
    }
    public static void registerNetworkStatusChangedListener(final OnNetworkStatusChangedListener listener) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            NetworkCallbackImpl.getInstance().registerListener(listener);
        } else {
            NetworkChangedReceiver.getInstance().registerListener(listener);
        }
    }
    public static void unregisterListener(final OnNetworkStatusChangedListener listener) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            NetworkCallbackImpl.getInstance().unregisterListener(listener);
        } else {
            NetworkChangedReceiver.getInstance().unregisterListener(listener);
        }
    }
    public static final class NetworkChangedReceiver extends BroadcastReceiver {
        private WeakReference<Context> mContext;
        private NetworkChangedReceiver() {
        }
        private static class SingletonInstance {
            private static final NetworkChangedReceiver INSTANCE = new NetworkChangedReceiver();
        }
        public static NetworkChangedReceiver getInstance() {
            return SingletonInstance.INSTANCE;
        }
        private NetworkType mType;
        private final Set<OnNetworkStatusChangedListener> mListeners = new HashSet<>();
        public void init(Context context) {
            if (mContext == null) {
                getInstance().mContext = new WeakReference<>(context.getApplicationContext());
            }
        }
        @RequiresPermission(ACCESS_NETWORK_STATE)
        public void registerListener(final OnNetworkStatusChangedListener listener) {
            if (listener == null) return;
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    int preSize = mListeners.size();
                    mListeners.add(listener);
                    if (preSize == 0 && mListeners.size() == 1 && null != mContext.get()) {
                        mType = getNetworkType();
                        IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
                        mContext.get().registerReceiver(NetworkChangedReceiver.getInstance(), intentFilter);
                    }
                }
            });
        }
        public boolean isRegistered(final OnNetworkStatusChangedListener listener) {
            if (listener == null) return false;
            return mListeners.contains(listener);
        }
        public void unregisterListener(final OnNetworkStatusChangedListener listener) {
            if (listener == null) return;
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    int preSize = mListeners.size();
                    mListeners.remove(listener);
                    if (preSize == 1 && mListeners.size() == 0 && mContext.get() != null) {
                        mContext.get().unregisterReceiver(NetworkChangedReceiver.getInstance());
                    }
                }
            });
        }
        @Override
        public void onReceive(Context context, Intent intent) {
            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
                Executors.newSingleThreadExecutor().execute(new Runnable() {
                    @Override
                    public void run() {
                        NetworkType networkType = NetworkUtils.getNetworkType();
                        if (mType == networkType) return;
                        mType = networkType;
                        if (networkType == NetworkType.NETWORK_NO) {
                            for (OnNetworkStatusChangedListener listener : mListeners) {
                                listener.onDisconnected();
                            }
                        } else {
                            for (OnNetworkStatusChangedListener listener : mListeners) {
                                listener.onConnected(networkType);
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //调用方法将int转换为地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
                });
            }
        } else {
            //当前无网络连接,请在设置中打开网络
        }
        return null;
    }
    /**
     * 将得到的int类型的IP转换为String类型
     *
     * @param ip int类型
     * @return -
     */
    public static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    @RequiresPermission(ACCESS_NETWORK_STATE)
    private static boolean isEthernet() {
        final ConnectivityManager cm =
                (ConnectivityManager) HDLApp.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) return false;
        final NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
        if (info == null) return false;
        NetworkInfo.State state = info.getState();
        if (null == state) return false;
        return state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING;
    }
    @RequiresPermission(ACCESS_NETWORK_STATE)
    public static NetworkType getNetworkType() {
        if (isEthernet()) {
            return NetworkType.NETWORK_ETHERNET;
        }
        NetworkInfo info = getActiveNetworkInfo();
        if (info != null && info.isAvailable()) {
            if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                return NetworkType.NETWORK_WIFI;
            } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
                switch (info.getSubtype()) {
                    case TelephonyManager.NETWORK_TYPE_GSM:
                    case TelephonyManager.NETWORK_TYPE_GPRS:
                    case TelephonyManager.NETWORK_TYPE_CDMA:
                    case TelephonyManager.NETWORK_TYPE_EDGE:
                    case TelephonyManager.NETWORK_TYPE_1xRTT:
                    case TelephonyManager.NETWORK_TYPE_IDEN:
                        return NetworkType.NETWORK_2G;
                    case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
                    case TelephonyManager.NETWORK_TYPE_EVDO_A:
                    case TelephonyManager.NETWORK_TYPE_UMTS:
                    case TelephonyManager.NETWORK_TYPE_EVDO_0:
                    case TelephonyManager.NETWORK_TYPE_HSDPA:
                    case TelephonyManager.NETWORK_TYPE_HSUPA:
                    case TelephonyManager.NETWORK_TYPE_HSPA:
                    case TelephonyManager.NETWORK_TYPE_EVDO_B:
                    case TelephonyManager.NETWORK_TYPE_EHRPD:
                    case TelephonyManager.NETWORK_TYPE_HSPAP:
                        return NetworkType.NETWORK_3G;
                    case TelephonyManager.NETWORK_TYPE_IWLAN:
                    case TelephonyManager.NETWORK_TYPE_LTE:
                        return NetworkType.NETWORK_4G;
                    case 20:
                        return NetworkType.NETWORK_5G;
                    default:
                        String subtypeName = info.getSubtypeName();
                        if (subtypeName.equalsIgnoreCase("TD-SCDMA")
                                || subtypeName.equalsIgnoreCase("WCDMA")
                                || subtypeName.equalsIgnoreCase("CDMA2000")) {
                            return NetworkType.NETWORK_3G;
                        } else {
                            return NetworkType.NETWORK_UNKNOWN;
                        }
                }
            } else {
                return NetworkType.NETWORK_UNKNOWN;
            }
        }
        return NetworkType.NETWORK_NO;
    }
    @RequiresPermission(ACCESS_NETWORK_STATE)
    private static NetworkInfo getActiveNetworkInfo() {
        ConnectivityManager cm =
                (ConnectivityManager) HDLApp.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);
        if (cm == null) return null;
        return cm.getActiveNetworkInfo();
    }
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    private static class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
        private final Set<OnNetworkStatusChangedListener> mListeners = new HashSet<>();
        private ConnectivityManager mConnectivityManager;
        private WeakReference<Context> mContext;
        public NetworkCallbackImpl() {
        }
        private static class SingletonInstance {
            private static final NetworkCallbackImpl INSTANCE = new NetworkCallbackImpl();
        }
        public static NetworkCallbackImpl getInstance() {
            return SingletonInstance.INSTANCE;
        }
        public void init(Context context) {
            if (mContext == null) {
                getInstance().mContext = new WeakReference<>(context.getApplicationContext());
            }
        }
        @RequiresPermission(ACCESS_NETWORK_STATE)
        public void registerListener(final OnNetworkStatusChangedListener listener) {
            if (listener == null || mContext == null || mContext.get() == null) return;
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    if (mContext.get() == null) return;
                    int preSize = mListeners.size();
                    mListeners.add(listener);
                    if (preSize == 0 && mListeners.size() == 1) {
                        NetworkRequest.Builder builder = new NetworkRequest.Builder();
                        NetworkRequest request = builder.build();
                        mConnectivityManager = (ConnectivityManager) mContext.get().getSystemService(Context.CONNECTIVITY_SERVICE);
                        mConnectivityManager.requestNetwork(request, getInstance());
                    }
                }
            });
        }
        public void unregisterListener(final OnNetworkStatusChangedListener listener) {
            if (listener == null) return;
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    int preSize = mListeners.size();
                    mListeners.remove(listener);
                    if (preSize == 1 && mListeners.size() == 0 && mConnectivityManager != null) {
                        mConnectivityManager.unregisterNetworkCallback(getInstance());
                    }
                }
            });
        }
        @Override
        public void onAvailable(Network network) {
            super.onAvailable(network);
            //网络连接
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    NetworkInfo networkInfo = mConnectivityManager.getNetworkInfo(network);
                    if (networkInfo != null) {
                        NetworkType networkType = getNetworkType();
                        for (OnNetworkStatusChangedListener listener : mListeners) {
                            listener.onConnected(networkType);
                        }
                    }
                }
            });
        }
        @Override
        public void onLost(Network network) {
            super.onLost(network);
            //网络已断开
            Executors.newSingleThreadExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    for (OnNetworkStatusChangedListener listener : mListeners) {
                        listener.onDisconnected();
                    }
                }
            });
        }
    }
}
app/src/main/java/com/hdl/photovoltaic/utils/NetworkUtils123.java
New file
@@ -0,0 +1,83 @@
package com.hdl.photovoltaic.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class NetworkUtils123 {
    private static NetworkUtils123 mNetworkUtils123;
    public static NetworkUtils123 getInstance() {
        if (null == mNetworkUtils123) {
            synchronized (NetworkUtils123.class) {
                if (null == mNetworkUtils123) {
                    mNetworkUtils123 = new NetworkUtils123();
                }
            }
        }
        return mNetworkUtils123;
    }
    /**
     * 获得IP地址,分为两种情况:
     * 一:是wifi下;
     * 二:是移动网络下;
     */
    public String getIPAddress(Context context) {
        NetworkInfo info = ((ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (info != null && info.isConnected()) {
            if (info.getType() == ConnectivityManager.TYPE_MOBILE) {//当前使用2G/3G/4G网络
                try {
                    //Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces();
                    for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
                        NetworkInterface intf = en.nextElement();
                        for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
                                return inetAddress.getHostAddress();
                            }
                        }
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            } else if (info.getType() == ConnectivityManager.TYPE_WIFI) {//当前使用无线网络
                WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();
                //调用方法将int转换为地址字符串
                String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
                return ipAddress;
            }
        } else {
            //当前无网络连接,请在设置中打开网络
        }
        return null;
    }
    /**
     * 将得到的int类型的IP转换为String类型
     *
     * @param ip int类型
     * @return -
     */
    public static String intIP2StringIP(int ip) {
        return (ip & 0xFF) + "." +
                ((ip >> 8) & 0xFF) + "." +
                ((ip >> 16) & 0xFF) + "." +
                (ip >> 24 & 0xFF);
    }
}
app/src/main/res/layout/activity_test_log.xml
@@ -84,10 +84,10 @@
            android:id="@+id/homeId_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_25"
            android:layout_marginStart="4dp"
            android:textColor="@color/text_030D1C"
            android:textIsSelectable="true"
            android:textSize="@dimen/text_15"
            android:layout_marginStart="@dimen/dp_5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
@@ -100,6 +100,19 @@
            android:textSize="@dimen/text_15"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/homeId_tv" />
        <TextView
            android:id="@+id/click_to_bottom_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_25"
            android:layout_marginEnd="20dp"
            android:text="滚到底部"
            android:textColor="@color/text_245EC3"
            android:textSize="@dimen/text_15"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <View
            android:layout_width="match_parent"
@@ -116,7 +129,6 @@
        android:id="@+id/sv"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="@dimen/dp_50"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
@@ -128,7 +140,7 @@
            <TextView
                android:id="@+id/reply_content_tv"
                android:layout_width="wrap_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="start"
                android:padding="@dimen/dp_10"
@@ -143,12 +155,12 @@
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_50"
        android:background="@color/text_FFFFFFFF"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/sv"
        android:background="@color/text_FFFFFFFF"
        >
        app:layout_constraintTop_toBottomOf="@+id/sv">
        <TextView
            android:id="@+id/uploading_log_tv"
app/src/main/res/layout/activity_test_main.xml
@@ -85,10 +85,10 @@
            android:id="@+id/homeId_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_25"
            android:layout_marginStart="@dimen/dp_5"
            android:textColor="@color/text_030D1C"
            android:textIsSelectable="true"
            android:textSize="@dimen/text_15"
            android:layout_marginStart="@dimen/dp_5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
@@ -102,6 +102,19 @@
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/homeId_tv" />
        <TextView
            android:id="@+id/click_command_tv"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/dp_25"
            android:layout_marginEnd="20dp"
            android:text="测试指令"
            android:textColor="@color/text_245EC3"
            android:textSize="@dimen/text_15"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"