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"