From 54a8c79222bba0644b02fe1dbc5d75e26ea50b5d Mon Sep 17 00:00:00 2001
From: mac <user@users-MacBook-Pro.local>
Date: 星期二, 14 十一月 2023 18:17:58 +0800
Subject: [PATCH] 2023年11月14日18:17:48

---
 app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java                 |  339 ++++----------
 app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java                          |   11 
 app/src/main/java/com/hdl/photovoltaic/base/BaseActivity.java                     |    3 
 app/src/main/java/com/hdl/photovoltaic/HDLApp.java                                |   13 
 app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java                     |  230 +++++++++-
 app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java                    |  225 +++++++++
 app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java                     |  401 +++++++++++++++++
 app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java                    |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java |    3 
 app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java                  |   19 
 HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/api/HDLCloudHomeApi.java       |    4 
 app/src/main/res/values-en/strings.xml                                            |    6 
 app/build.gradle                                                                  |   12 
 app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java               |   32 +
 app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java                  |   24 +
 15 files changed, 1,048 insertions(+), 286 deletions(-)

diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
index 47347c1..4eb0581 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLModBusConnect.java
@@ -169,6 +169,9 @@
     }
 
 
+
+
+
     /**
      * 鍙戦�佸師鐢熼�忎紶鍛戒护鏁版嵁
      *
diff --git a/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/api/HDLCloudHomeApi.java b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/api/HDLCloudHomeApi.java
index 48d3783..65492ce 100644
--- a/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/api/HDLCloudHomeApi.java
+++ b/HDLLinkPMSdk/src/main/java/com/hdl/linkpm/sdk/core/api/HDLCloudHomeApi.java
@@ -100,9 +100,9 @@
     public static final String POST_OTA_GET_DeviceFirmwares = "/home-wisdom/program/device/ota/getDeviceFirmwares";
     //璁惧鍥轰欢浜戠鐨勯┍鍔ㄥ垎椤靛垪琛ㄨ幏鍙�
     public static final String POST_OTA_GET_CloudDeviceFirmwares = "/smart-footstone/firmware/firmwareVersion/getLastOne";
-    //Link璁惧鍥轰欢鍗囩骇OTA鍛戒护涓嬪彂
+    //璁惧鍥轰欢鍗囩骇OTA鍛戒护
     public static final String POST_OTA_DeviceFirmwareUpgrade = "/home-wisdom/program/device/ota/deviceFirmwareUpgrade";
-    //LINK璁惧鑾峰彇鍥轰欢鍗囩骇鍖呬笅杞藉湴鍧�
+    //璁惧鑾峰彇鍥轰欢鍗囩骇鍖呬笅杞藉湴鍧�
     public static final String POST_OTA_GET_LinkDeviceFirmwareDownloadUrl = "/smart-footstone/mgmt/device/ota/getLinkDeviceFirmwareDownloadUrl";
 
     //鑾峰彇IARCC涓夋柟鍥轰欢鍒嗛〉
diff --git a/app/build.gradle b/app/build.gradle
index 60bdfa3..ed09318 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -50,6 +50,14 @@
             dirs 'libs'
         }
     }
+    /**
+     * 鎵撳寘鑷姩鍛藉悕
+     */
+    android.applicationVariants.configureEach { variant ->
+        variant.outputs.configureEach {
+            outputFileName = "photovoltaic_${name}_v${versionName}_${generateTime()}.apk"
+        }
+    }
 
     buildTypes {
         release {
@@ -70,6 +78,10 @@
         targetCompatibility JavaVersion.VERSION_1_8
     }
 }
+//鏋勫缓鏃堕棿
+static def generateTime() {
+    return new Date().format("yyyyMMddHHmm")
+}
 
 dependencies {
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
index 9378b04..2abcc75 100644
--- a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
+++ b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -1,7 +1,11 @@
 package com.hdl.photovoltaic;
 
 import android.app.Application;
+import android.content.Context;
 import android.content.Intent;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.util.DisplayMetrics;
 
 
 import com.hdl.hdlhttp.HxHttpConfig;
@@ -15,12 +19,14 @@
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.AppManagerUtils;
 import com.hdl.photovoltaic.utils.LocalManageUtil;
+import com.hdl.photovoltaic.utils.SharedPreUtils;
 import com.hdl.sdk.link.HDLLinkLocalSdk;
 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 java.util.HashMap;import java.util.Locale;
+import java.util.HashMap;
+import java.util.Locale;
 import java.util.Objects;
 
 import io.dcloud.common.util.RuningAcitvityUtil;
@@ -186,8 +192,6 @@
     }
 
 
-
-
 //    /**
 //     * 鍒濆鍖杣ni app mqtt
 //     */
@@ -201,4 +205,7 @@
 //        }
 //    }
 
+
+
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/base/BaseActivity.java b/app/src/main/java/com/hdl/photovoltaic/base/BaseActivity.java
index 7824776..f74016b 100644
--- a/app/src/main/java/com/hdl/photovoltaic/base/BaseActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/base/BaseActivity.java
@@ -12,6 +12,7 @@
 import com.hdl.photovoltaic.listener.BaseView;
 import com.hdl.photovoltaic.other.HdlThreadLogic;
 import com.hdl.photovoltaic.utils.AppManagerUtils;
+import com.hdl.photovoltaic.utils.LocalManageUtil;
 import com.hdl.photovoltaic.widget.LoadingDialog;
 import com.hdl.sdk.link.core.bean.eventbus.BaseEventBus;
 
@@ -28,7 +29,7 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
+        LocalManageUtil.changeAppLanguage("en", this);
         _mActivity = this;
         Object content = getContentView();
         //娣诲姞Activity鍒板爢鏍�
diff --git a/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java b/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
index 37526ce..6e363f4 100644
--- a/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
+++ b/app/src/main/java/com/hdl/photovoltaic/base/CustomBaseActivity.java
@@ -1,11 +1,15 @@
 package com.hdl.photovoltaic.base;
 
 
+import android.content.Context;
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
 
 import com.hdl.photovoltaic.R;
+import com.hdl.photovoltaic.utils.LocalManageUtil;
+
+import java.util.Locale;
 
 /**
  * 鑷畾涔夋柟娉�,鐢ㄤ簬瀹炵幇涓�у寲
@@ -15,7 +19,8 @@
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setNotificationBarBackgroundColor(0);
+        setNotificationBarBackgroundColor(CustomColor.blue);
+
     }
 
     /**
@@ -23,15 +28,24 @@
      *
      * @param color 棰滆壊鍊�(0=钃濊壊;1=鐧借壊;)
      */
-    public void setNotificationBarBackgroundColor(int color) {
-
-        if (color == 0) {
-            color = R.color.text_245EC3;
-        } else if (color == 1) {
-            if (color == 1) {
-                color = R.color.text_FFFFFFFF;
+    public void setNotificationBarBackgroundColor(CustomColor color) {
+        switch (color) {
+            case blue: {
+                getWindow().setStatusBarColor(getColor(R.color.text_245EC3));
+                break;
+            }
+            case white: {
+                getWindow().setStatusBarColor(getColor(R.color.text_FFFFFFFF));
+                break;
             }
         }
-        getWindow().setStatusBarColor(getColor(color));
+
+    }
+
+    public enum CustomColor {
+        blue,//钃濊壊
+        white,//鐧借壊
+
+
     }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java b/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
index 1057676..3abca1c 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/TcpClient.java
@@ -1,9 +1,19 @@
 package com.hdl.photovoltaic.internet;
 
 
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.hdl.log.utils.PointUtil;
 import com.hdl.photovoltaic.other.HdlAccountLogic;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
 import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
+import com.hdl.sdk.link.core.callback.ModbusCallBack;
+import com.hdl.sdk.link.core.connect.HDLModBusConnect;
 import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+
+import java.lang.reflect.Type;
+import java.util.Arrays;
 
 /**
  * 瀹㈡埛绔搷浣滈�昏緫
@@ -57,4 +67,219 @@
         HDLLinkLocalGateway.getInstance().sendDataToLinkGateway(mac, topic, jObject, sendPath, callBack);
 
     }
+
+    /**
+     * 鍙戦�丮odBus鏁版嵁鍒扮綉鍏�
+     * 涓嬪彂涓婚搴曞眰榛樿
+     *
+     * @param mac             缃戝叧mac
+     * @param oidAddresses    oid閲岄潰Addresses鍦板潃
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛夈�愭敞鎰忥細鍔熻兘鐮�=3鏃�,濉暟鍊硷紱瀹為檯璇诲灏慴yte灏卞~澶氬皯锛屼緥濡傚~"20"銆�
+     */
+    public void SendModBusDataToLinkGateway(String mac, String oidAddresses, int functionCode, int registerAddress, String contentData, ModbusCallBack modbusCallBack) {
+        String s = "";
+        switch (functionCode) {
+            case 3: {
+                s = getReadModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+            case 6: {
+                s = getWriteSingleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+            case 16: {
+                s = getWriteMultipleModbusPassData(oidAddresses, registerAddress, functionCode, contentData);
+            }
+            break;
+        }
+        HDLModBusConnect.getInstance().Send(mac, s.getBytes(), modbusCallBack);
+    }
+
+    /**
+     * 鑾峰彇璇诲彇銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
+     * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
+     * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
+     * 渚嬪瓙:new byte[]{00,01,00,00,00,0x09,00,00,00,01,03,00,00,00,01};
+     *
+     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getReadModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+        String data = "";
+        try {
+            String eventID = to2ByteHexString(registerAddress);//浜嬩欢ID(2byte)
+            String agreement = "0000";//鍗忚锛�2byte锛�
+            String dataByteLength = "";//闀垮害锛圢 byte锛�
+            String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
+            String registerLength_1 = to2ByteHexString(Integer.getInteger(contentData) / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
+            byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1).getBytes();
+            dataByteLength = to1ByteHexString(bytes.length / 2);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍐欏叆鍗曚釜銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
+     * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
+     * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
+     * 渚嬪瓙:new byte[]{[0, 11, 0, 0, 0, 30, 0, 0, 0, 26, 6, 0, 11, 49, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32]};
+     *
+     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getWriteSingleModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+        String data = "";
+        try {
+            String eventID = to2ByteHexString(registerAddress);//浜嬩欢ID(2byte)
+            String agreement = "0000";//鍗忚锛�2byte锛�
+            String dataByteLength = "";//闀垮害锛圢 byte锛�
+            String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
+            String contentData_1 = contentData;//鍐呭鏁版嵁锛圢 byte锛�
+            byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + contentData_1).getBytes();
+            dataByteLength = to1ByteHexString(bytes.length / 2);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + contentData_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+    /**
+     * 鑾峰彇鍐欏叆澶氫釜銆恗odbus鍗忚銆戞嫾鎺ラ�忎紶鏁版嵁鐨勫瓧绗︿覆
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
+     * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
+     * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
+     * 渚嬪瓙:new byte[]{[0, 11, 0, 0, 0, 30, 0, 0, 0, 26, 16, 0, 11, 0, 10, 20, 49, 50, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32]};
+     *
+     * @param oidAddresses    oid閲岄潰Addresses鐨勫��
+     * @param functionCode    鍔熻兘鐮併��3=锛堣鍙栧涓瘎瀛樺櫒)锛�,6=锛堝啓鍏ュ崟涓瘎瀛樺櫒锛�,16=锛堝啓鍏ュ涓瘎瀛樺櫒锛夈��
+     * @param registerAddress 瀵勫瓨鍣ㄥ湴鍧�
+     * @param contentData     鍐呭鏁版嵁锛堜笉鍚瘎瀛樺櫒鍦板潃锛�
+     */
+    public String getWriteMultipleModbusPassData(String oidAddresses, int functionCode, int registerAddress, String contentData) {
+
+        String data = "";
+        try {
+            String eventID = to2ByteHexString(registerAddress);//浜嬩欢ID(2byte)
+            String agreement = "0000";//鍗忚锛�2byte锛�
+            String dataByteLength = "";//闀垮害锛圢 byte锛�
+            String oidAddresses_1 = oidAddresses;//鏍囪瘑绗︼紙4byte锛�
+            String functionCode_1 = to1ByteHexString(functionCode);//鍔熻兘鐮侊紙=1byte锛�
+            String registerAddress_1 = to2ByteHexString(registerAddress);//瀵勫瓨鍣ㄥ湴鍧�锛�2byte锛�
+            String registerLength_1 = to2ByteHexString(contentData.length() / 2);//瀵勫瓨鍣ㄩ暱搴︼紙2byte锛�
+            String contentLength_1 = to1ByteHexString(contentData.length());//鍐呭闀垮害锛�1byte锛�
+            String contentData_1 = contentData;//鍐呭鏁版嵁锛圢 byte锛�
+            byte[] bytes = (oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1 + contentLength_1 + contentData_1).getBytes();
+            dataByteLength = to1ByteHexString(bytes.length / 2);
+            data = eventID + agreement + dataByteLength + oidAddresses_1 + functionCode_1 + registerAddress_1 + registerLength_1 + contentLength_1 + contentData_1;
+            return data;
+        } catch (Exception ignored) {
+            return data;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 瀵勫瓨鍣ㄥ湴鍧�(鍗佽繘鍒�)
+     * @return (2byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String to2ByteHexString(int value) {
+        String high = "";
+        String low = "";
+        if (value > 255) {
+            high = to1ByteHexString(value / 256);
+
+            low = to1ByteHexString(value % 256);
+        } else {
+            high = "00";
+            low = to1ByteHexString(value);
+        }
+        return high + low;
+    }
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 鍗佽繘鍒�
+     * @return (1byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String to1ByteHexString(int value) {
+        try {
+            String hexString = Integer.toHexString(value);
+            if (hexString.length() == 1) {
+                return "0" + hexString;
+            }
+            return hexString;
+        } catch (Exception e) {
+            return "00";
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param dataBytes 鏁扮粍
+     * @return -(n byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    public String toNByteHexString(byte[] dataBytes) {
+        StringBuilder stringBuilder = new StringBuilder();
+        for (byte dataByte : dataBytes) {
+            String dataB = Integer.toHexString(dataByte & 0xFF);
+            if (dataB.length() == 1) {
+                dataB = "0" + dataB;
+            }
+            stringBuilder.append(dataB);
+        }
+        return stringBuilder.toString();
+    }
+
+    /**
+     * 鑾峰彇鍗佸叚杩涘埗瀛楃涓�(涓嶅涓や綅鍓嶉潰琛�0)
+     *
+     * @param value 瀵勫瓨鍣ㄥ湴鍧�(鍗佽繘鍒�)
+     * @return (2byte)鍗佸叚杩涘埗瀛楃涓�
+     */
+    private String getByteHexString(int value) {
+        String high = "";
+        String low = "";
+        if (value > 255) {
+            high = to1ByteHexString(value / 256);
+
+            low = to1ByteHexString(value % 256);
+        } else {
+            high = "00";
+            low = to1ByteHexString(value);
+        }
+        return high + low;
+    }
+
+
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java b/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
index 843c02d..9cfbc16 100644
--- a/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
+++ b/app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -32,6 +32,25 @@
     public static final String POST_Device_Oid = "/home-wisdom/program/device/oid/add";
     //鑾峰彇閫嗗彉鍣�(鑾峰彇璁惧杩滅▼閫氳淇℃伅)
     public static final String POST_Device_RemoteInfo = "/home-wisdom/program/device/remoteInfo";
+    //璁惧鍩烘湰淇℃伅鍒楄〃(oid)鑾峰彇
+    public static final String POST_DEVICE_OID_LIST_GET = "/home-wisdom/program/device/oid/list";
+    //璁惧鍥轰欢鍒楄〃鑾峰彇
+    public static final String POST_OTA_GET_DeviceFirmwares = "/home-wisdom/program/device/ota/getDeviceFirmwares";
+    //璁惧鍥轰欢浜戠鐨勯┍鍔ㄥ垎椤靛垪琛ㄨ幏鍙�
+    public static final String POST_OTA_GET_CloudDeviceFirmwares = "/smart-footstone/firmware/firmwareVersion/getLastOne";
+    //璁惧鍥轰欢鍗囩骇OTA鍛戒护
+    public static final String POST_OTA_DeviceFirmwareUpgrade = "/home-wisdom/program/device/ota/deviceFirmwareUpgrade";
+    //璁惧鑾峰彇鍥轰欢鍗囩骇鍖呬笅杞藉湴鍧�
+    public static final String POST_OTA_GET_LinkDeviceFirmwareDownloadUrl = "/smart-footstone/mgmt/device/ota/getLinkDeviceFirmwareDownloadUrl";
+    //褰撳墠缃戝叧椹卞姩鍒楄〃鑾峰彇
+    public static final String POST_OTA_GET_GatewayDrivers = "/home-wisdom/program/device/ota/getGatewayDrivers";
+    //缃戝叧浜戠鐨勯┍鍔ㄥ垎椤靛垪琛ㄨ幏鍙�
+    public static final String POST_OTA_GET_CloudGatewayDrivers = "/smart-footstone/driver/buspro/download";
+    //缃戝叧椹卞姩鍗囩骇OTA鍛戒护涓嬪彂
+    public static final String POST_OTA_GatewayDriverUpgrade = "/home-wisdom/program/device/ota/gatewayDriverUpgrade";
+    //LINK璁惧鑾峰彇椹卞姩鍗囩骇鍖呬笅杞藉湴鍧�
+    public static final String POST_OTA_GET_LinkDeviceDriverDownloadUrl = "/smart-footstone/mgmt/device/ota/getLinkDeviceDriverDownloadUrl";
+
     //endregion
     //endregion
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
index 607bb82..88f735e 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -6,7 +6,22 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
+import com.hdl.hdlhttp.HxHttp;
+import com.hdl.linkpm.sdk.core.api.HDLCloudHomeApi;
+import com.hdl.linkpm.sdk.core.callback.IDefaultCallBack;
+import com.hdl.linkpm.sdk.core.callback.IResponseCallBack;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.core.response.HDLResponse;
+import com.hdl.linkpm.sdk.device.bean.DeviceOidInfoBean;
+import com.hdl.linkpm.sdk.device.bean.GatewayCloudBean;
+import com.hdl.linkpm.sdk.ota.HDLLinkPMOta;
+import com.hdl.linkpm.sdk.ota.bean.CloudDeviceFirmwaresBean;
+import com.hdl.linkpm.sdk.ota.bean.CloudGatewayDriversBean;
+import com.hdl.linkpm.sdk.ota.bean.DeviceFirmwareBean;
+import com.hdl.linkpm.sdk.ota.bean.DownloadUrlBean;
+import com.hdl.linkpm.sdk.ota.bean.GatewayDriverBean;
+import com.hdl.linkpm.sdk.project.HDLLinkPMProject;
+import com.hdl.linkpm.sdk.utils.HDLExceptionSubmitUtils;
 import com.hdl.photovoltaic.config.AppConfigManage;
 import com.hdl.photovoltaic.config.UserConfigManage;
 import com.hdl.photovoltaic.internet.HttpClient;
@@ -29,10 +44,15 @@
 import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
 import com.hdl.sdk.link.gateway.type.GatewayMasterType;
 
+import org.json.JSONException;
+
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
+
+import io.dcloud.feature.unimp.DCUniMPJSCallback;
+import io.reactivex.rxjava3.disposables.Disposable;
 
 
 /**
@@ -97,6 +117,8 @@
         }
         return null;
     }
+
+
 
     /**
      * 閫嗗彉鍣ㄤ笂浼犳暟鎹埌浜戠(鍖呮嫭:sid锛宱id)
@@ -801,7 +823,7 @@
      * @param deviceRemoteInfo        璁惧杩滅▼閫氳淇℃伅
      * @param cloudInverterDeviceBean 閫嗗彉鍣�
      */
-    private static void refreshGatewayCacheData(boolean isLocal, CloudInverterDeviceBean cloudInverterDeviceBean, DeviceRemoteInfo deviceRemoteInfo) {
+    private void refreshGatewayCacheData(boolean isLocal, CloudInverterDeviceBean cloudInverterDeviceBean, DeviceRemoteInfo deviceRemoteInfo) {
         //鏈湴鏌ユ壘閫嗗彉鍣�
         GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getLocalGateway(cloudInverterDeviceBean.getOsn());
         if (gatewayBean == null) {
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
index b0b7b8f..fb26833 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlFileLogic.java
@@ -25,7 +25,7 @@
     private static volatile HdlFileLogic sHdlFileLogic;
 
     /**
-     * 琛ㄧず1m鏁版嵁
+     * 琛ㄧず1m澶у皬鏁版嵁
      */
     private final int m = 1;
 
@@ -61,32 +61,32 @@
      * 鑾峰彇鎵嬫満鍐呴儴瀛樺偍鏂囦欢璺緞
      */
     public String getAPPInternalStoreFilesPath() {
-        return HDLApp.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getPath();
+        return Objects.requireNonNull(HDLApp.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)).getPath();
     }
 
     /**
-     * 鑾峰彇瀛樻斁銆愮敤鎴枫�戞枃浠跺す鏍硅矾寰�
+     * 鑾峰彇瀛樻斁銆愮敤鎴锋枃浠跺す銆戞牴璺緞
      */
     public String getCurrentUserRootPath() {
         return getAPPInternalStoreFilesPath() + "/" + getUserId();
     }
 
     /**
-     * 鑾峰彇瀛樻斁銆愪綇瀹呫�戞枃浠跺す鏍硅矾寰�
+     * 鑾峰彇瀛樻斁銆愪綇瀹呮枃浠跺す銆戞牴璺緞
      */
     public String getCurrentHomeRootPath() {
         return getCurrentUserRootPath() + "/" + "home_" + getHomeId();
     }
 
     /**
-     * 鑾峰彇銆愭棩蹇椼�戞枃浠跺叏璺緞
+     * 鑾峰彇銆愭棩蹇楁枃浠躲�戝叏璺緞
      */
     public String getLogFilePath() {
         return getCurrentHomeRootPath() + "/Log.txt";
     }
 
     /**
-     * 鑾峰彇銆愮敤鎴枫�戞枃浠跺叏璺緞
+     * 鑾峰彇銆愮敤鎴锋枃浠躲�戝叏璺緞
      */
     public String getUserFilePath() {
         return getAPPInternalStoreFilesPath() + "/UserConfigManage.txt";
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
new file mode 100644
index 0000000..ca50153
--- /dev/null
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlOtaLogic.java
@@ -0,0 +1,401 @@
+package com.hdl.photovoltaic.other;
+
+import android.text.TextUtils;
+
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.device.bean.DeviceOidInfoBean;
+import com.hdl.linkpm.sdk.ota.bean.CloudDeviceFirmwaresBean;
+import com.hdl.linkpm.sdk.ota.bean.CloudGatewayDriversBean;
+import com.hdl.linkpm.sdk.ota.bean.DeviceFirmwareBean;
+import com.hdl.linkpm.sdk.ota.bean.DownloadUrlBean;
+import com.hdl.linkpm.sdk.ota.bean.GatewayDriverBean;
+import com.hdl.photovoltaic.config.UserConfigManage;
+import com.hdl.photovoltaic.internet.HttpClient;
+import com.hdl.photovoltaic.internet.api.HttpApi;
+import com.hdl.photovoltaic.listener.CloudCallBeak;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * ota鍗囩骇閫昏緫
+ */
+public class HdlOtaLogic {
+    private static volatile HdlOtaLogic sHdlOtaLogic;
+
+    /**
+     * 鑾峰彇褰撳墠瀵硅薄
+     *
+     * @return HdlDeviceLogic
+     */
+    public static synchronized HdlOtaLogic getInstance() {
+        if (sHdlOtaLogic == null) {
+            synchronized (HdlOtaLogic.class) {
+                if (sHdlOtaLogic == null) {
+                    sHdlOtaLogic = new HdlOtaLogic();
+                }
+            }
+
+        }
+        return sHdlOtaLogic;
+    }
+
+    //region -----鍥轰欢鍗囩骇---------
+
+    /**
+     * 鍚戜簯绔幏鍙栭�嗗彉鍣╫id鍒楄〃
+     * 鍓嶆彁鏉′欢:瑕佷笂浼犻�嗗彉鍣╫id鍒楄〃缁欎簯绔�
+     *
+     * @param callBack -
+     */
+    public void getCloudOidList(CloudCallBeak<List<DeviceOidInfoBean>> callBack) {
+        String requestUrl = HttpApi.POST_DEVICE_OID_LIST_GET;
+        JsonObject json = new JsonObject();
+        json.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new ArrayList<>());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<List<DeviceOidInfoBean>>() {
+                }.getType();
+                List<DeviceOidInfoBean> list = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(list);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愬綋鍓嶈澶囧浐浠躲�戝垪琛�
+     * 鍓嶆彁鏉′欢:璁惧鑷姩涓婃姤oid淇℃伅缁欎簯绔�
+     *
+     * @param deviceOidId oid浜戠id
+     * @param callBack    -
+     */
+    public void getCurrentDeviceFirmwares(String deviceOidId, CloudCallBeak<List<DeviceFirmwareBean>> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_DeviceFirmwares;
+        JsonObject json = new JsonObject();
+        json.addProperty("deviceOidId", deviceOidId);
+        json.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new ArrayList<>());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<List<DeviceFirmwareBean>>() {
+                }.getType();
+                List<DeviceFirmwareBean> list = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(list);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囨柊鍥轰欢銆戝垪琛�
+     * 鍓嶆彁鏉′欢:瑕侀�氳繃骞冲彴杞欢涓婁紶鏂板浐浠�
+     *
+     * @param hardwareModel 纭欢鍨嬪彿
+     * @param osImageId     绯荤粺闀滃儚id
+     * @param callBack      -
+     */
+    public void getNewDeviceFirmwares(String hardwareModel, String osImageId, CloudCallBeak<List<CloudDeviceFirmwaresBean>> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_CloudDeviceFirmwares;
+        JsonObject json = new JsonObject();
+        json.addProperty("hardwareModel", hardwareModel);
+        json.addProperty("osImageId", osImageId);
+        json.addProperty("protocolType", "ZIGBEE");//鍗忚绫诲瀷,鍙敤鍊�:BUSPRO,KNX,ZIGBEE,OTHER
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new ArrayList<>());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<List<CloudDeviceFirmwaresBean>>() {
+                }.getType();
+                List<CloudDeviceFirmwaresBean> list = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(list);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 鍚戜簯绔彂璧枫�愯澶囧浐浠躲�戝崌绾TA鎸囦护
+     *
+     * @param deviceOidId       璁惧id
+     * @param firmwareVersionId 鍥轰欢鐗堟湰id
+     * @param callBack-
+     */
+    public void upgradeDeviceFirmware(String deviceOidId, String firmwareVersionId, CloudCallBeak<Boolean> callBack) {
+        String requestUrl = HttpApi.POST_OTA_DeviceFirmwareUpgrade;
+        JsonObject json = new JsonObject();
+        json.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+        json.addProperty("deviceOidId", deviceOidId);
+        json.addProperty("firmwareVersionId", firmwareVersionId);
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+                if (callBack != null) {
+                    callBack.onSuccess(true);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囧浐浠躲�戝崌绾у寘涓嬭浇鍦板潃
+     *
+     * @param firmwareVersionId 鍥轰欢鐗堟湰Id
+     */
+    public void getDeviceFirmwareDownloadUrl(String firmwareVersionId, CloudCallBeak<DownloadUrlBean> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceFirmwareDownloadUrl;
+        JsonObject json = new JsonObject();
+        json.addProperty("firmwareVersionId", firmwareVersionId);
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new DownloadUrlBean());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<DownloadUrlBean>() {
+                }.getType();
+                DownloadUrlBean downloadUrlBean = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(downloadUrlBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+    }
+
+    //endregion
+
+    //region -----椹卞姩鍗囩骇---------
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愬綋鍓嶈澶囬┍鍔ㄣ�戝垪琛�
+     * 鍓嶆彁鏉′欢:璁惧鑷姩涓婃姤oid淇℃伅缁欎簯绔�
+     *
+     * @param oid      缃戝叧璁惧oid
+     * @param callBack -
+     */
+    public void getCurrentGatewayDrivers(String oid, CloudCallBeak<List<GatewayDriverBean>> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_GatewayDrivers;
+        JsonObject json = new JsonObject();
+        json.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+        json.addProperty("oid", oid);
+
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new ArrayList<>());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<List<GatewayDriverBean>>() {
+                }.getType();
+                List<GatewayDriverBean> list = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(list);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囨柊椹卞姩銆戝垪琛�
+     * 鍓嶆彁鏉′欢:瑕侀�氳繃骞冲彴杞欢涓婁紶鏂伴┍鍔�
+     *
+     * @param driveCode 椹卞姩缂栧彿鎴栭┍鍔ㄥ悕绉�
+     * @param osImageId 椹卞姩绫诲瀷id
+     * @param callBack  -
+     */
+    public void getNewGatewayDrivers(String driveCode, String osImageId, CloudCallBeak<CloudGatewayDriversBean> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_CloudGatewayDrivers;
+        JsonObject json = new JsonObject();
+        json.addProperty("driveCode", driveCode);
+        json.addProperty("osImageId", osImageId);
+
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new CloudGatewayDriversBean());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<CloudGatewayDriversBean>() {
+                }.getType();
+                CloudGatewayDriversBean cloudGatewayDriversBean = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(cloudGatewayDriversBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+
+
+    }
+
+    /**
+     * 浜戠鍙戣捣銆愯澶囬┍鍔ㄣ�戝崌绾TA鎸囦护
+     *
+     * @param oid             缃戝叧璁惧oid
+     * @param driverVersionId 椹卞姩鐗堟湰id
+     * @param callBack        -
+     */
+    public void upgradeGatewayDriver(String oid, String driverVersionId, CloudCallBeak<Boolean> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GatewayDriverUpgrade;
+        JsonObject json = new JsonObject();
+        json.addProperty("homeId", UserConfigManage.getInstance().getHomeId());
+        json.addProperty("oid", oid);
+        json.addProperty("driverVersionId", driverVersionId);
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+                if (callBack != null) {
+                    callBack.onSuccess(true);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囬┍鍔ㄣ�戝崌绾у寘涓嬭浇鍦板潃
+     *
+     * @param driverVersionId 椹卞姩鐗堟湰Id
+     */
+    public void getDeviceDriverDownloadUrl(String driverVersionId, CloudCallBeak<DownloadUrlBean> callBack) {
+        String requestUrl = HttpApi.POST_OTA_GET_LinkDeviceDriverDownloadUrl;
+        JsonObject json = new JsonObject();
+        json.addProperty("driverVersionId", driverVersionId);
+        HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() {
+            @Override
+            public void onSuccess(String json) {
+
+                if (TextUtils.isEmpty(json)) {
+                    if (callBack != null) {
+                        callBack.onSuccess(new DownloadUrlBean());
+                    }
+                    return;
+                }
+                Gson gson = new Gson();
+                Type typeOfT = new TypeToken<DownloadUrlBean>() {
+                }.getType();
+                DownloadUrlBean downloadUrlBean = gson.fromJson(json, typeOfT);
+                if (callBack != null) {
+                    callBack.onSuccess(downloadUrlBean);
+                }
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                if (callBack != null) {
+                    callBack.onFailure(e);
+                }
+            }
+        });
+    }
+
+
+    //endregion
+}
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
index 9cf071e..ff4307a 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -6,6 +6,11 @@
 
 import com.google.gson.Gson;
 import com.hdl.linkpm.sdk.core.exception.HDLException;
+import com.hdl.linkpm.sdk.device.bean.DeviceOidInfoBean;
+import com.hdl.linkpm.sdk.ota.bean.CloudDeviceFirmwaresBean;
+import com.hdl.linkpm.sdk.ota.bean.CloudGatewayDriversBean;
+import com.hdl.linkpm.sdk.ota.bean.DeviceFirmwareBean;
+import com.hdl.linkpm.sdk.ota.bean.GatewayDriverBean;
 import com.hdl.photovoltaic.HDLApp;
 import com.hdl.photovoltaic.bean.ModBusBean;
 import com.hdl.photovoltaic.config.UserConfigManage;
@@ -187,6 +192,46 @@
                     break;
 
                 }
+            } else if (HDLUniMP.UNI_EVENT_REPLY_OTA_MODEL.equals(event)) {
+                //OTA鍗囩骇妯″潡
+                switch (type) {
+                    //鍚戜簯绔幏鍙杘id鍒楄〃
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_CLOUD_OID_LIST: {
+                        this.uniGetCloudOidList(data, callback);
+                    }
+                    break;
+                    //褰撳墠璁惧鍥轰欢鍒楄〃
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_FIRMWARES_LIST: {
+                        this.uniGetCurrentDeviceFirmwares(data, callback);
+                    }
+                    break;
+                    //璁惧鏂板浐浠跺垪琛�
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_FIRMWARES_NEW_LIST: {
+                        this.uniGetNewDeviceFirmwares(data, callback);
+                    }
+                    break;
+                    //璁惧鍥轰欢鍗囩骇
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_FIRMWARES_UPGRADE: {
+                        this.uniUpgradeDeviceFirmware(data, callback);
+                    }
+                    break;
+                    //褰撳墠璁惧椹卞姩鍒楄〃
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_DRIVER_LIST: {
+                        this.uniGetCurrentGatewayDrivers(data, callback);
+                    }
+                    break;
+                    //璁惧鏂伴┍鍔ㄥ垪琛�
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_DRIVER_NEW: {
+                        this.uniGetNewGatewayDrivers(data, callback);
+                    }
+                    break;
+                    //璁惧椹卞姩鍗囩骇
+                    case HDLUniMP.UNI_EVENT_REPLY_OTA_DRIVER_UPGRADE: {
+                        this.uniUpgradeGatewayDriver(data, callback);
+                    }
+                    break;
+
+                }
             }
             HdlLogLogic.print("uni===鍘熺敓鎺ユ敹uni鍙戞潵鐨勬暟鎹�===" + event + "\r\n" + data, false);
         } catch (Exception e) {
@@ -203,10 +248,9 @@
      * @param jsonObject 闄勪欢鏁版嵁(娌℃湁鏁版嵁濉玭ull)
      */
     public void openUniMP(String path, JSONObject jsonObject) {
-
-        JSONObject json = this.createdJsonDate(jsonObject, true);
-        HdlLogLogic.print("uni===缁勮uni鍙戦�佹暟鎹牸寮�===" + json, false);
+        JSONObject json = this.createdJSONObject(jsonObject, true);
         HDLUniMPSDKManager.getInstance().openUniMP(HDLUniMP.UNI_APP_ID, path, json, HdlUniLogic.this);
+        HdlLogLogic.print("uni===缁勮uni鍙戦�佹暟鎹牸寮�===" + json, false);
     }
 
     /**
@@ -232,7 +276,143 @@
     }
     //endregion
 
-    //region ******uni閫昏緫鏂规硶******
+    //region ******uni鎺ュ彛鏂规硶******
+
+    /**
+     * 鍚戜簯绔幏鍙栭�嗗彉鍣╫id鍒楄〃
+     * 鍓嶆彁鏉′欢:瑕佷笂浼犻�嗗彉鍣╫id鍒楄〃缁欎簯绔�
+     *
+     * @param callback -
+     */
+    private void uniGetCloudOidList(Object data, DCUniMPJSCallback callback) {
+        HdlOtaLogic.getInstance().getCloudOidList(new CloudCallBeak<List<DeviceOidInfoBean>>() {
+            @Override
+            public void onSuccess(List<DeviceOidInfoBean> obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愬綋鍓嶈澶囧浐浠躲�戝垪琛�
+     * 鍓嶆彁鏉′欢:璁惧鑷姩涓婃姤oid淇℃伅缁欎簯绔�
+     */
+    private void uniGetCurrentDeviceFirmwares(Object data, DCUniMPJSCallback callback) {
+        String deviceOidId = getKeyValue("deviceOidId", getKeyValue("data", data));
+        HdlOtaLogic.getInstance().getCurrentDeviceFirmwares(deviceOidId, new CloudCallBeak<List<DeviceFirmwareBean>>() {
+            @Override
+            public void onSuccess(List<DeviceFirmwareBean> obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囨柊鍥轰欢銆戝垪琛�
+     * 鍓嶆彁鏉′欢:瑕侀�氳繃骞冲彴杞欢涓婁紶鏂板浐浠�
+     */
+    private void uniGetNewDeviceFirmwares(Object data, DCUniMPJSCallback callback) {
+        String hardwareModel = getKeyValue("hardwareModel", getKeyValue("data", data));//纭欢鍨嬪彿
+        String osImageId = getKeyValue("osImageId", getKeyValue("data", data));//绯荤粺闀滃儚id
+        HdlOtaLogic.getInstance().getNewDeviceFirmwares(hardwareModel, osImageId, new CloudCallBeak<List<CloudDeviceFirmwaresBean>>() {
+            @Override
+            public void onSuccess(List<CloudDeviceFirmwaresBean> obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔彂璧枫�愯澶囧浐浠躲�戝崌绾TA鎸囦护
+     */
+    private void uniUpgradeDeviceFirmware(Object data, DCUniMPJSCallback callback) {
+        String deviceOidId = getKeyValue("deviceOidId", getKeyValue("data", data));//璁惧id
+        String firmwareVersionId = getKeyValue("firmwareVersionId", getKeyValue("data", data));//鍥轰欢鐗堟湰id
+        HdlOtaLogic.getInstance().upgradeDeviceFirmware(deviceOidId, firmwareVersionId, new CloudCallBeak<Boolean>() {
+            @Override
+            public void onSuccess(Boolean obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愬綋鍓嶈澶囬┍鍔ㄣ�戝垪琛�
+     * 鍓嶆彁鏉′欢:璁惧鑷姩涓婃姤oid淇℃伅缁欎簯绔�
+     */
+    private void uniGetCurrentGatewayDrivers(Object data, DCUniMPJSCallback callback) {
+        String deviceOid = getKeyValue("oid", getKeyValue("data", data));
+        HdlOtaLogic.getInstance().getCurrentGatewayDrivers(deviceOid, new CloudCallBeak<List<GatewayDriverBean>>() {
+            @Override
+            public void onSuccess(List<GatewayDriverBean> obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔幏鍙栥�愯澶囨柊椹卞姩銆戝垪琛�
+     * 鍓嶆彁鏉′欢:瑕侀�氳繃骞冲彴杞欢涓婁紶鏂伴┍鍔�
+     */
+    private void uniGetNewGatewayDrivers(Object data, DCUniMPJSCallback callback) {
+        String driveCode = getKeyValue("driveCode", getKeyValue("data", data));//椹卞姩缂栧彿鎴栭┍鍔ㄥ悕绉�
+        String osImageId = getKeyValue("osImageId", getKeyValue("data", data));//椹卞姩绫诲瀷id
+        HdlOtaLogic.getInstance().getNewGatewayDrivers(driveCode, osImageId, new CloudCallBeak<CloudGatewayDriversBean>() {
+            @Override
+            public void onSuccess(CloudGatewayDriversBean obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
+
+    /**
+     * 鍚戜簯绔彂璧枫�愯澶囬┍鍔ㄣ�戝崌绾TA鎸囦护
+     */
+    private void uniUpgradeGatewayDriver(Object data, DCUniMPJSCallback callback) {
+        String deviceOid = getKeyValue("oid", getKeyValue("data", data));//缃戝叧璁惧oid
+        String driverVersionId = getKeyValue("driverVersionId", getKeyValue("data", data));//椹卞姩鐗堟湰id
+        HdlOtaLogic.getInstance().upgradeGatewayDriver(deviceOid, driverVersionId, new CloudCallBeak<Boolean>() {
+            @Override
+            public void onSuccess(Boolean obj) {
+                uniCallbackData(obj, callback);
+            }
+
+            @Override
+            public void onFailure(HDLException e) {
+                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+            }
+        });
+    }
 
     /**
      * 閫嗗彉鍣ㄦ竻绌轰綇瀹卛d
@@ -354,22 +534,17 @@
                             uniCallbackData(null, -100, "鏈湴鎵句笉鍒扮綉鍏�", callback);
                             return;
                         }
-                        HdlDeviceLogic.getInstance().addInverterDeviceToCloud(mac,
-                                gatewayBean.getGatewayType(),
-                                gatewayBean.getSid(),
-                                gatewayBean.getOid(),
-                                gatewayBean.getDevice_name(),
-                                new CloudCallBeak<Boolean>() {
-                                    @Override
-                                    public void onSuccess(Boolean obj) {
-                                        uniCallbackData(null, callback);
-                                    }
+                        HdlDeviceLogic.getInstance().addInverterDeviceToCloud(mac, gatewayBean.getGatewayType(), gatewayBean.getSid(), gatewayBean.getOid(), gatewayBean.getDevice_name(), new CloudCallBeak<Boolean>() {
+                            @Override
+                            public void onSuccess(Boolean obj) {
+                                uniCallbackData(null, callback);
+                            }
 
-                                    @Override
-                                    public void onFailure(HDLException e) {
-                                        uniCallbackData(null, e.getCode(), e.getMsg(), callback);
-                                    }
-                                });
+                            @Override
+                            public void onFailure(HDLException e) {
+                                uniCallbackData(null, e.getCode(), e.getMsg(), callback);
+                            }
+                        });
                     }
 
                     @Override
@@ -461,11 +636,19 @@
 
     /**
      * 鍙戦�乵odbus鍗忚鏁版嵁
+     * 閫忎紶鍗忚
+     * 涓嬪彂涓婚锛�/user/${gw_id}/custom/native/${driver}/down;
+     * 閫嗗彉鍣ㄥ洖澶嶄富棰橈細/user/${gw_id}/custom/native/${driver}/down_reply;
+     * Modbus ECU鍗忚锛氫簨浠禝D(2涓猙yte)->鍗忚[鍥哄畾:0,0](2涓猙yte)->闀垮害(2byte)->鏍囪瘑绗oid鐨刟ddresses鍊糫(4涓猙yte)->鍔熻兘鐮�(1涓猙yte)->璐熻浇鏁版嵁(N涓猙yte);
+     * 闀垮害(2涓猙yte)=鏍囪瘑绗�(4涓猙yte)+鍔熻兘鐮�(1涓猙yte)+璐熻浇鏁版嵁(N涓猙yte);
+     * 璐熻浇鏁版嵁=瀵勫瓨鍣ㄥ湴鍧�(2涓猙yte)+瀵勫瓨鍣ㄩ暱搴�(2涓猙yte)+鍐呭闀垮害(1涓猙yte)+鍐呭鏁版嵁(N涓猙yte)銆愭敞鎰�:鍗曚釜鍐欏叆瀵勫瓨鍣�-->鍘绘帀<瀵勫瓨鍣ㄩ暱搴�>鍜�<鍐呭闀垮害>銆�;
+     * 瀵勫瓨鍣ㄩ暱搴�=(鍐呭鏁版嵁/2);
+     * 渚嬪瓙:new byte[]{00,01,00,00,00,0x09,00,00,00,01,03,00,00,00,01};
      *
      * @param data     modbus鏁版嵁
      * @param callback 鍥炶皟
      */
-    void sendModBus(Object data, DCUniMPJSCallback callback) {
+    private void sendModBus(Object data, DCUniMPJSCallback callback) {
         String tempData = getKeyValue("data", data);
         if (TextUtils.isEmpty(tempData)) {
             HdlLogLogic.print("data鍐呭涓虹┖", false);
@@ -506,11 +689,11 @@
     /**
      * 缁勮uni鍙戦�佹暟鎹牸寮�
      *
-     * @param data                   -闄勪欢鏁版嵁(娌℃湁鏁版嵁濉玭ull)
+     * @param data                   闄勫姞鏁版嵁(娌℃湁鏁版嵁濉玭ull)
      * @param isTokenAndRefreshToken (true=搴曞眰榛樿娣诲姞token鍜宺efreshToken;false=涓嶅姞)
-     * @return JSONObject
+     * @return JSONObject            uni鏂规硶鍚嶉噷闈㈠弬鏁伴渶瑕佺殑JSONObject瀵硅薄
      */
-    private JSONObject createdJsonDate(JSONObject data, boolean isTokenAndRefreshToken) {
+    private JSONObject createdJSONObject(JSONObject data, boolean isTokenAndRefreshToken) {
         HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
         try {
             if (data == null) {
@@ -604,6 +787,7 @@
         } catch (Exception e) {
             return "";
         }
+
     }
     //endregion
 
diff --git a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
index 82f9b4a..c6adc55 100644
--- a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
+++ b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
@@ -42,6 +42,17 @@
     public final static String UNI_EVENT_REPLY_DEVICE_UPLOADING_DATA = "uploading_data";//璁惧涓婁紶鏁版嵁
     public final static String UNI_EVENT_REPLY_DEVICE_MODBUS_SEND = "modbus_send";//modbus鍗忚
 
+    /*********OTA妯″潡*********/
+    public final static String UNI_EVENT_REPLY_OTA_MODEL = "uni_ota_model";//鍗囩骇妯″潡(澶х被)
+    public final static String UNI_EVENT_REPLY_OTA_CLOUD_OID_LIST = "cloud_oid_list";//鍚戜簯绔幏鍙杘id鍒楄〃
+    public final static String UNI_EVENT_REPLY_OTA_FIRMWARES_LIST = "firmwares_list";//褰撳墠璁惧鍥轰欢鍒楄〃
+    public final static String UNI_EVENT_REPLY_OTA_FIRMWARES_NEW_LIST = "firmwares_new_list";//璁惧鏂板浐浠跺垪琛�
+    public final static String UNI_EVENT_REPLY_OTA_FIRMWARES_UPGRADE = "firmwares_upgrade";//璁惧鍥轰欢鍗囩骇
+    public final static String UNI_EVENT_REPLY_OTA_DRIVER_LIST = "driver_list";//褰撳墠璁惧椹卞姩鍒楄〃
+    public final static String UNI_EVENT_REPLY_OTA_DRIVER_NEW = "driver_new";//璁惧鏂伴┍鍔ㄥ垪琛�
+    public final static String UNI_EVENT_REPLY_OTA_DRIVER_UPGRADE = "driver_upgrade";//璁惧椹卞姩鍗囩骇
+
+
     /*********Wifi妯″潡*********/ //鍗敠瀹氫箟
     public final static String UNI_EVENT_REPLY_WIFI_MODEL = "uni_wifi_model";//wifi妯″潡(澶х被)
     public final static String UNI_EVENT_REPLY_WIFI_LIST = "list";//鑾峰彇wifi鍒楄〃
diff --git a/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java b/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
index f3909c2..955fd3d 100644
--- a/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
+++ b/app/src/main/java/com/hdl/photovoltaic/utils/LocalManageUtil.java
@@ -1,238 +1,23 @@
 package com.hdl.photovoltaic.utils;
 
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.os.Build;
 import android.os.LocaleList;
+import android.text.TextUtils;
+import android.util.DisplayMetrics;
+
+
 import java.util.Locale;
 
 /**
- * Created by hxb on 2022/6/7.
- * desc   : 澶氳瑷�閫傞厤鏂规锛岄�傞厤鍚勭鐗堟湰锛屾牳蹇冩湭鏇挎崲涓婁笅鏂嘋ontext涓殑Local
+ * 澶氳瑷�閫傞厤
  */
 public class LocalManageUtil {
 
-//        private static final String TAG = "LanguageUtil";
-//
-//        /**
-//         * 榛樿鏀寔鐨勮瑷�锛岃嫳璇�佹硶璇�侀樋鎷変集璇�
-//         */
-//        private static HashMap<String, Locale> supportLanguage = new HashMap<String, Locale>(4) {{
-//            put(Language.ENGLISH, Locale.ENGLISH);
-//        }};
-//
-//        /**
-//         * 搴旂敤澶氳瑷�鍒囨崲锛岄噸鍐橞aseActivity涓殑attachBaseContext鍗冲彲
-//         * 閲囩敤鏈湴SP瀛樺偍鐨勮瑷�
-//         *
-//         * @param context 涓婁笅鏂�
-//         * @return context
-//         */
-//        public static Context attachBaseContext(Context context) {
-//            String language = LanguageSp.getLanguage(context);
-//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
-//                return createConfigurationContext(context, language);
-//            } else {
-//                return updateConfiguration(context, language);
-//            }
-//        }
-//
-//    /**
-//         * 搴旂敤澶氳瑷�鍒囨崲锛岄噸鍐橞aseActivity涓殑attachBaseContext鍗冲彲
-//         *
-//         * @param context  涓婁笅鏂�
-//         * @param language 璇█
-//         * @return context
-//         */
-//        public static Context attachBaseContext(Context context, String language) {
-//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
-//                return createConfigurationContext(context, language);
-//            } else {
-//                return updateConfiguration(context, language);
-//            }
-//        }
-//
-//        /**
-//         * 鑾峰彇Local,鏍规嵁language
-//         *
-//         * @param language 璇█
-//         * @return Locale
-//         */
-//        private static Locale getLanguageLocale(String language) {
-//            if (supportLanguage.containsKey(language)) {
-//                return supportLanguage.get(language);
-//            } else {
-//                Locale systemLocal = getSystemLocal();
-//                for (String languageKey : supportLanguage.keySet()) {
-//                    if (TextUtils.equals(supportLanguage.get(languageKey).getLanguage(), systemLocal.getLanguage())) {
-//                        return systemLocal;
-//                    }
-//                }
-//            }
-//            return Locale.ENGLISH;
-//        }
-//
-//        /**
-//         * 鑾峰彇褰撳墠鐨凩ocal锛岄粯璁よ嫳璇�
-//         *
-//         * @param context context
-//         * @return Locale
-//         */
-//        public static Locale getCurrentLocale(Context context) {
-//            String language = LanguageSp.getLanguage(context);
-//            if (supportLanguage.containsKey(language)) {
-//                return supportLanguage.get(language);
-//            } else {
-//                Locale systemLocal = getSystemLocal();
-//                for (String languageKey : supportLanguage.keySet()) {
-//                    if (TextUtils.equals(supportLanguage.get(languageKey).getLanguage(), systemLocal.getLanguage())) {
-//                        return systemLocal;
-//                    }
-//                }
-//            }
-//            return Locale.ENGLISH;
-//        }
-//
-//        /**
-//         * 鑾峰彇绯荤粺鐨凩ocal
-//         *
-//         * @return Locale
-//         */
-//        private static Locale getSystemLocal() {
-//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-//                return Resources.getSystem().getConfiguration().getLocales().get(0);
-//            } else {
-//                return Locale.getDefault();
-//            }
-//        }
-//
-//        /**
-//         * Android 7.1 浠ヤ笅閫氳繃 updateConfiguration
-//         *
-//         * @param context  context
-//         * @param language 璇█
-//         * @return Context
-//         */
-//        private static Context updateConfiguration(Context context, String language) {
-//            Resources resources = context.getResources();
-//            Configuration configuration = resources.getConfiguration();
-//            Locale locale = getLanguageLocale(language);
-//            Log.e(TAG, "updateLocalApiLow==== " + locale.getLanguage());
-//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-//                // apply locale
-//                configuration.setLocales(new LocaleList(locale));
-//            } else {
-//                // updateConfiguration
-//                configuration.locale = locale;
-//                DisplayMetrics dm = resources.getDisplayMetrics();
-//                resources.updateConfiguration(configuration, dm);
-//            }
-//            return context;
-//        }
-//
-//        /**
-//         * Android 7.1浠ヤ笂閫氳繃createConfigurationContext
-//         * N澧炲姞浜嗛�氳繃config.setLocales鍘讳慨鏀瑰璇█
-//         *
-//         * @param context  涓婁笅鏂�
-//         * @param language 璇█
-//         * @return context
-//         */
-//        @RequiresApi(api = Build.VERSION_CODES.N_MR1)
-//        private static Context createConfigurationContext(Context context, String language) {
-//            Resources resources = context.getResources();
-//            Configuration configuration = resources.getConfiguration();
-//            Locale locale = getLanguageLocale(language);
-//            Log.d(TAG, "current Language locale = " + locale);
-//            LocaleList localeList = new LocaleList(locale);
-//            configuration.setLocales(localeList);
-//            return context.createConfigurationContext(configuration);
-//        }
-//
-//        /**
-//         * 鍒囨崲璇█
-//         *
-//         * @param language 璇█
-//         * @param activity 褰撳墠鐣岄潰
-//         * @param cls      璺宠浆鐨勭晫闈�
-//         */
-//        public static void switchLanguage(String language, Activity activity, Class<?> cls) {
-//            LanguageSp.setLanguage(activity, language);
-//            Intent intent = new Intent(activity, cls);
-//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-//            activity.startActivity(intent);
-//            activity.finish();
-//        }
-//
-//        /**
-//         * 鍒囨崲璇█锛屾惡甯︿紶閫掓暟鎹�
-//         *
-//         * @param language 璇█
-//         * @param activity 褰撳墠鐣岄潰
-//         * @param cls      璺宠浆鐨勭晫闈�
-//         */
-//        public static void switchLanguage(String language, Activity activity, Class<?> cls, Bundle bundle) {
-//            LanguageSp.setLanguage(activity, language);
-//            Intent intent = new Intent(activity, cls);
-//            if (bundle != null) {
-//                intent.putExtras(bundle);
-//            }
-//            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
-//            activity.startActivity(intent);
-//            activity.finish();
-//        }
-//
-//        /**
-//         * 鑾峰彇鏂拌瑷�鐨� Context,淇浜哸ndroidx.appCompact 1.2.0鐨勯棶棰�
-//         *
-//         * @param newBase newBase
-//         * @return Context
-//         */
-//        public static Context getNewLocalContext(Context newBase) {
-//            try {
-//                // 澶氳瑷�閫傞厤
-//                Context context = LanguageUtil.attachBaseContext(newBase);
-//                // 鍏煎appcompat 1.2.0鍚庡垏鎹㈣瑷�澶辨晥闂
-//                final Configuration configuration = context.getResources().getConfiguration();
-//                return new ContextThemeWrapper(context, R.style.Theme_AppCompat_Empty) {
-//                    @Override
-//                    public void applyOverrideConfiguration(Configuration overrideConfiguration) {
-//                        if (overrideConfiguration != null) {
-//                            overrideConfiguration.setTo(configuration);
-//                        }
-//                        super.applyOverrideConfiguration(overrideConfiguration);
-//                    }
-//                };
-//            } catch (Exception e) {
-//                e.printStackTrace();
-//            }
-//            return newBase;
-//        }
-//
-//        /**
-//         * 鏇存柊Application鐨凴esource local锛屽簲鐢ㄤ笉閲嶅惎鐨勬儏鍐垫墠璋冪敤锛屽洜涓洪儴鍒嗕細鐢ㄥ埌application涓殑context
-//         * 鍒囪涓嶈兘璧版柊api createConfigurationContext锛屼翰娴�
-//         *
-//         * @param context     context
-//         * @param newLanguage newLanguage
-//         */
-//        public static void updateApplicationLocale(Context context, String newLanguage) {
-//            Resources resources = context.getResources();
-//            Configuration configuration = resources.getConfiguration();
-//            Locale locale = getLanguageLocale(newLanguage);
-//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-//                // apply locale
-//                configuration.setLocales(new LocaleList(locale));
-//            } else {
-//                configuration.setLocale(locale);
-//            }
-//            DisplayMetrics dm = resources.getDisplayMetrics();
-//            resources.updateConfiguration(configuration, dm);
-//        }
-
-    private static Locale locale;
-
+//    private static Locale mLocale;
 
     /**
      * 鑾峰彇绯荤粺鐨刲ocale
@@ -248,28 +33,106 @@
         }
         return locale;
     }
+//
+//    public static Context setLocal(Context context) {
+//        return updateResources(context, mLocale);
+//    }
+//
+//    public static Context updateResources(Context context, Locale locale) {
+//        if (locale == null) {
+//            return context;
+//        }
+//        LocalManageUtil.mLocale = locale;
+//        Locale.setDefault(locale);
+//
+//        Resources res = context.getResources();
+//        Configuration config = new Configuration(res.getConfiguration());
+//        config.setLocale(locale);
+//        context = context.createConfigurationContext(config);
+//        return context;
+//    }
 
-    public static Context setLocal(Context context) {
-        return updateResources(context, locale);
+
+    /**
+     * 搴旂敤鍐呭垏鎹㈣瑷�
+     *
+     * @param language language (zh锛氭眽璇�;en锛氳嫳璇�)
+     * @param context  涓婁笅鏂�
+     */
+    public static void changeAppLanguage(String language, Context context) {
+        Locale locale = getLocale(language);
+        updateResources(locale, context);
     }
 
-    public static Context updateResources(Context context, Locale locale) {
-        if (locale == null) {
-            return context;
-        }
-        LocalManageUtil.locale = locale;
-        Locale.setDefault(locale);
 
-        Resources res = context.getResources();
-        Configuration config = new Configuration(res.getConfiguration());
-        if (Build.VERSION.SDK_INT >= 17) {
-            config.setLocale(locale);
-            context = context.createConfigurationContext(config);
+    /**
+     * 鑾峰彇绯荤粺褰撳墠璇█
+     *
+     * @return _
+     */
+    public static Locale getDefaultLocale() {
+        return Resources.getSystem().getConfiguration().locale;
+    }
+
+    /**
+     * 鑾峰彇Locale
+     *
+     * @param language (zh锛氭眽璇�;en锛氳嫳璇�)
+     * @return Locale
+     */
+    public static Locale getLocale(String language) {
+        try {
+            if (TextUtils.isEmpty(language)) {
+                return getDefaultLocale();
+            }
+            return new Locale(language);
+        } catch (Exception e) {
+            return getDefaultLocale();
+        }
+
+
+    }
+
+    /**
+     * 鏇存柊璧勬簮鏁版嵁
+     *
+     * @param locale  璇█瀹炰綋绫�
+     * @param context 涓婁笅鏂�
+     * @return -
+     */
+    private static void updateResources(Locale locale, Context context) {
+
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
+            //7.0浠ヤ笅绯荤粺
+            DisplayMetrics metrics = context.getResources().getDisplayMetrics();
+            Configuration configuration = context.getResources().getConfiguration();
+            configuration.setLocale(locale);
+            context.getResources().updateConfiguration(configuration, metrics);
+//            Locale.setDefault(locale);
         } else {
-            config.locale = locale;
-            res.updateConfiguration(config, res.getDisplayMetrics());
+            //7.0鍙婁互涓婄郴缁�
+            Configuration configuration = context.getResources().getConfiguration();
+            configuration.setLocale(locale);
+            configuration.setLocales(new LocaleList(locale));
+            context.createConfigurationContext(configuration);
         }
-        return context;
+
     }
+
+    /**
+     * 璁剧疆褰撳墠APP鐨勮瑷�妯″紡
+     *
+     * @param context 涓婁笅鏂�
+     */
+    private static void setCurrLanguageMode(Context context) {
+        String language = SharedPreUtils.getSharedPreferencesKey("languege", context);
+        Locale local = getLocale(language);
+        Resources res = context.getResources();
+        DisplayMetrics dm = res.getDisplayMetrics();
+        Configuration conf = res.getConfiguration();
+        conf.locale = local;
+        res.updateConfiguration(conf, dm);
+    }
+
 }
 
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index e18dc60..4feae6e 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -19,10 +19,10 @@
     <string name="home_login_input_phone">璇疯緭鍏ユ墜鏈哄彿</string>
     <string name="home_login_email_address">閭鍙�</string>
     <string name="home_login_input_psw">璇疯緭鍏ュ瘑鐮�</string>
-    <string name="home_login_register">娉ㄥ唽</string>
+    <string name="home_login_register">register</string>
     <string name="home_login_forget_password">蹇樿瀵嗙爜</string>
     <string name="home_login_change_password">淇敼瀵嗙爜</string>
-    <string name="home_login_logoin">鐧诲綍</string>
+    <string name="home_login_logoin">log in</string>
     <string name="home_login_be_logging_in">鐧诲綍涓��</string>
     <string name="home_login_power_station">浣撻獙鐢电珯</string>
     <string name="home_login_consent_service_agreement">鍚屾剰銆婃湇鍔″崗璁�嬪拰銆婄敤鎴蜂俊鎭繚鎶よ瀹氥��</string>
@@ -65,7 +65,7 @@
 
     <!--鎴戠殑鐢电珯-->
     <string name="power_station">鐢电珯</string>
-    <string name="power_station_me">鎴戠殑</string>
+    <string name="power_station_me">my</string>
     <string name="my_power_station">鎴戠殑鐢电珯</string>
     <string name="power_station_generated_power">鍙戠數鍔熺巼:</string>
     <string name="power_station_Power_generation_today">浠婃棩鍙戠數</string>

--
Gitblit v1.8.0