From fdcf461fbfa3bcd650685743e891ad3357898f0c Mon Sep 17 00:00:00 2001
From: 562935844@qq.com
Date: 星期四, 31 八月 2023 17:36:50 +0800
Subject: [PATCH] 更新sdk

---
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java                |   27 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java                                |   32 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java                        |   55 
 HDLSDK/app/src/main/AndroidManifest.xml                                                                |   67 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/NetworkAccessBroadcastResponse.java |    1 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/MD5Utils.java                               |  121 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java                             |    8 
 HDLSDK/config.gradle                                                                                   |    5 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java                                     |   45 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java             |  269 +
 HDLSDK/app/src/main/res/layout/activity_main.xml                                                       |   18 
 HDLSDK/app/src/main/res/layout/demo_item.xml                                                           |   54 
 HDLSDK_DEMO/settings.gradle                                                                            |    1 
 HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml                                                  |   18 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/AuthenticateResponse.java           |   26 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/HDLSdk.java                                         |    6 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java                         |  220 +
 HDLSDK/app/src/main/res/layout/item_devices_list.xml                                                   |   86 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java                             |   12 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeader.java                |   16 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest2.java                 |   29 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java                     |    5 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java                               |  151 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java                      |   24 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java                              |   16 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java                     |   65 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java                                                       |   66 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java                          |  125 +
 HDLSDK_DEMO/.idea/gradle.xml                                                                           |    1 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java                                |   63 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CheckAppVersionListener.java                |   11 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java                                 |   75 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/DeviceAuthRequest.java               |   48 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/DeleteNetworkListener.java                   |   11 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java                                                  |   56 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java                                      |  222 +
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java                                  |    7 
 HDLSDK/gradle.properties                                                                               |    4 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java                         |   50 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java                                |   12 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceDeleteResponse.java           |   62 
 HDLSDK_DEMO/app/build.gradle                                                                           |    5 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java                           |   10 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java                              |  176 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseInfo.java                               |   48 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java                                    |   51 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java                       |   17 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudLinkCode.java                          |   46 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeaderInterceptor.java     |   27 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLResponse.java                            |   51 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java                                               |   52 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java               |    5 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/LogUtils.java                                 |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java                    |   20 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java                         |   73 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest.java                  |   20 
 HDLSDK_DEMO/.idea/misc.xml                                                                             |    3 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java                                              |  329 ++
 HDLSDK/hdl-common/build.gradle                                                                         |    5 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java                         |   39 
 HDLSDK/hdl-socket/build.gradle                                                                         |    1 
 HDLSDK/app/release/output-metadata.json                                                                |   18 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java                          |   28 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java                         |  239 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java                             |  458 +++
 HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java                                         |  269 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java                          |   26 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store                                          |    0 
 HDLSDK_DEMO.rar                                                                                        |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java                            |   21 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java                               |    6 
 HDLSDK_DEMO/app/src/main/AndroidManifest.xml                                                           |    1 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CallBackListener.java                       |    8 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java                                 |   41 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java                                        |   68 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseCallBack.java                           |   10 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java                                    |  270 ++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkResponse.java                            |    4 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java                                 |  235 +
 HDLSDK/.idea/gradle.xml                                                                                |    3 
 HDLSDK/build.gradle                                                                                    |   18 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListUploadRequest.java               |  127 +
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java                                 |  223 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java                             |    3 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java                             |  124 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java                          |   10 
 HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.1.3.aar                                                            |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/GsonUtils.java                              |  247 ++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BaseLocalCodeResponse.java          |   47 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java                                 |  203 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java                        |   11 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/GatewayInfoRequest.java              |  129 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java                         |   11 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java                  |  163 
 HDLSDK/settings.gradle                                                                                 |    4 
 HDLSDK/hdl-connect/libs/hxhttp_1.0.4_230201.aar                                                        |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java                                    |   52 
 HDLSDK/app/src/main/res/values/strings.xml                                                             |    1 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java                    |   24 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/UpdateInfo.java                     |   90 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/SPUtils.java                                  |   43 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java                            |   30 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java              |   43 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/ParameterizedTypeImpl.java                  |   43 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java                              |  199 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java                         |   51 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java                    |   64 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java         |  175 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java                             |   42 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java                                 |   12 
 HDLSDK/hdl-connect/build.gradle                                                                        |   15 
 HDLSDK/com.hdl.sdk/build.gradle                                                                        |   59 
 HDLSDK_DEMO/config.gradle                                                                              |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java             |   79 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLException.java                           |  114 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store                                          |    0 
 116 files changed, 6,539 insertions(+), 794 deletions(-)

diff --git a/HDLSDK/.idea/gradle.xml b/HDLSDK/.idea/gradle.xml
index 6c18d10..c5f824a 100644
--- a/HDLSDK/.idea/gradle.xml
+++ b/HDLSDK/.idea/gradle.xml
@@ -7,14 +7,13 @@
         <option name="testRunner" value="GRADLE" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="JDK" />
         <option name="modules">
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/app" />
             <option value="$PROJECT_DIR$/com.hdl.sdk" />
-            <option value="$PROJECT_DIR$/hdl-common" />
             <option value="$PROJECT_DIR$/hdl-connect" />
-            <option value="$PROJECT_DIR$/hdl-socket" />
           </set>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />
diff --git a/HDLSDK/app/release/output-metadata.json b/HDLSDK/app/release/output-metadata.json
new file mode 100644
index 0000000..3885049
--- /dev/null
+++ b/HDLSDK/app/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+  "version": 2,
+  "artifactType": {
+    "type": "APK",
+    "kind": "Directory"
+  },
+  "applicationId": "com.hdl.hdlsdk",
+  "variantName": "processReleaseResources",
+  "elements": [
+    {
+      "type": "SINGLE",
+      "filters": [],
+      "versionCode": 1,
+      "versionName": "1.0",
+      "outputFile": "app-release.apk"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/AndroidManifest.xml b/HDLSDK/app/src/main/AndroidManifest.xml
index 964acd6..cd2cfe7 100644
--- a/HDLSDK/app/src/main/AndroidManifest.xml
+++ b/HDLSDK/app/src/main/AndroidManifest.xml
@@ -1,34 +1,35 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    package="com.hdl.hdlsdk">
-
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
-    <uses-permission
-        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
-        tools:ignore="ScopedStorage" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
-    <application
-        android:name=".App"
-        android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/app_name"
-        android:roundIcon="@mipmap/ic_launcher_round"
-        android:supportsRtl="true"
-        android:theme="@style/Theme.HDLSDK">
-        <activity android:name=".device.DevicesListActivity"></activity>
-        <activity
-            android:name=".MainActivity"
-            android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.hdl.hdlsdk">
+
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
+    <uses-permission
+        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        tools:ignore="ScopedStorage" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEM"/>
+
+    <application
+        android:name=".App"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/Theme.HDLSDK">
+        <activity android:name=".device.DevicesListActivity"></activity>
+        <activity
+            android:name=".MainActivity"
+            android:exported="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+
 </manifest>
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java
index 2935d87..5e35853 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/App.java
@@ -1,33 +1,33 @@
-package com.hdl.hdlsdk;
-
-import android.app.Application;
-import android.util.Log;
-
-import com.hdl.sdk.common.HDLSdk;
-import com.hdl.sdk.common.event.EventListener;
-import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.connect.HDLLink;
-import com.hdl.sdk.connect.bean.LinkResponse;
-
-/**
- * Created by Tong on 2021/10/8.
- */
-public class App extends Application {
-
-    private String deviceStatusUpdateTopic;
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        //鍒濆鍖朣DK
-        HDLSdk.getInstance().init(this);
-        //鎺у埗SDK鏃ュ織鎵撳嵃
-        HDLSdk.getInstance().setLogEnabled(true);
-
-    }
-
-    @Override
-    public void onTerminate() {
-        super.onTerminate();
-
-    }
-}
+package com.hdl.hdlsdk;
+
+import android.app.Application;
+import android.util.Log;
+
+import com.hdl.sdk.common.HDLSdk;
+import com.hdl.sdk.common.event.EventListener;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.LinkResponse;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class App extends Application {
+
+    private String deviceStatusUpdateTopic;
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        //鍒濆鍖朣DK
+        HDLSdk.getInstance().init(this);
+        //鎺у埗SDK鏃ュ織鎵撳嵃
+        HDLSdk.getInstance().setLogEnabled(true);
+
+    }
+
+    @Override
+    public void onTerminate() {
+        super.onTerminate();
+
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java
index 18f6d76..20b0fff 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoAdapter.java
@@ -1,26 +1,26 @@
-package com.hdl.hdlsdk;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
-import com.chad.library.adapter.base.BaseQuickAdapter;
-import com.chad.library.adapter.base.viewholder.BaseViewHolder;
-
-import java.util.List;
-
-/**
- * Created by Tong on 2021/10/8.
- */
-public class DemoAdapter extends BaseMultiItemQuickAdapter<DemoBean, BaseViewHolder> {
-
-    public DemoAdapter(@Nullable List<DemoBean> data) {
-        super(data);
-        addItemType(0,R.layout.demo_item);
-    }
-
-    @Override
-    protected void convert(@NonNull BaseViewHolder baseViewHolder, DemoBean demoBean) {
-        baseViewHolder.setText(R.id.tv_title,demoBean.getName());
-    }
-}
+package com.hdl.hdlsdk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.viewholder.BaseViewHolder;
+
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class DemoAdapter extends BaseMultiItemQuickAdapter<DemoBean, BaseViewHolder> {
+
+    public DemoAdapter(@Nullable List<DemoBean> data) {
+        super(data);
+        addItemType(0,R.layout.demo_item);
+    }
+
+    @Override
+    protected void convert(@NonNull BaseViewHolder baseViewHolder, DemoBean demoBean) {
+        baseViewHolder.setText(R.id.tv_title,demoBean.getName());
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java
index ad185fa..18b237e 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/DemoBean.java
@@ -1,28 +1,28 @@
-package com.hdl.hdlsdk;
-
-import com.chad.library.adapter.base.entity.MultiItemEntity;
-
-/**
- * Created by Tong on 2021/10/8.
- */
-public class DemoBean implements MultiItemEntity {
-
-    private String name;
-
-    public DemoBean(String name) {
-        this.name = name;
-    }
-
-    @Override
-    public int getItemType() {
-        return 0;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}
+package com.hdl.hdlsdk;
+
+import com.chad.library.adapter.base.entity.MultiItemEntity;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class DemoBean implements MultiItemEntity {
+
+    private String name;
+
+    public DemoBean(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int getItemType() {
+        return 0;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
index 678a722..d8e4570 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -1,5 +1,19 @@
 package com.hdl.hdlsdk;
 
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
 import androidx.activity.result.ActivityResultCallback;
 import androidx.activity.result.ActivityResultLauncher;
 import androidx.activity.result.contract.ActivityResultContracts;
@@ -9,47 +23,33 @@
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 
-import android.Manifest;
-import android.content.Intent;
-import android.os.Build;
-import android.os.Bundle;
-import android.text.TextUtils;
-import android.util.Log;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
-import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.hdl.hdlsdk.device.DevicesListActivity;
 import com.hdl.sdk.common.config.TopicConstant;
+import com.hdl.sdk.common.event.DeleteNetworkListener;
 import com.hdl.sdk.common.event.EventListener;
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.IdUtils;
-import com.hdl.sdk.common.utils.IpUtils;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
 import com.hdl.sdk.connect.HDLLink;
-import com.hdl.sdk.connect.bean.LinkRequest;
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
-import com.hdl.sdk.connect.bean.request.BroadcastRequest;
-import com.hdl.sdk.connect.bean.request.PropertyReadRequest;
+import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
+import com.hdl.sdk.connect.bean.request.ListUploadRequest;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
 import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
+import com.hdl.sdk.connect.bean.response.UpdateInfo;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.connect.cloud.CallBackListener;
+import com.hdl.sdk.connect.cloud.CheckAppVersionListener;
+import com.hdl.sdk.connect.cloud.HDLException;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.connect.socket.HDLAuthSocket;
-import com.hdl.sdk.connect.socket.HDLSocket;
-import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
-import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
-import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
-import com.hdl.sdk.socket.SocketOptions;
-import com.hdl.sdk.socket.codec.MessagePipeLine;
-import java.util.Base64;
+import com.hdl.sdk.connect.utils.AesUtil;
 
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
@@ -59,9 +59,6 @@
 import java.util.List;
 import java.util.Map;
 
-import static com.hdl.sdk.common.config.TopicConstant.GATEWAY_SEARCH_REPLY;
-import static java.util.Base64.*;
-
 public class MainActivity extends AppCompatActivity {
 
     private static final String TAG = "MainActivity";
@@ -69,35 +66,132 @@
     private RecyclerView rv;
     private TextView tv;
     private TextView responseTv;
+    private TextView localSecret;
+    private EditText editText;
     boolean isOn;
     private EventListener allTopicsListener;
-    private String testLightSid = "0001010D48C71B02020100010101";
+    private String testLightSid = "02010131D9C03D01020300010107";
+    private String secret = "";
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
         removeAllTopicsListener();
     }
-void init() {
-//    HDLLinkConfig.getInstance().setLocalSecret("7d04c4e3c2b7d600");
-//    HDLLinkConfig.getInstance().setGatewayId("1473119283609321473");
-//    HDLLinkConfig.getInstance().setLocalEncrypt(true);
-}
-    @RequiresApi(api = Build.VERSION_CODES.O)
+
+    void applyDeviceSecret() {
+        tv.setText("寮�濮嬬敵璇疯澶囧瘑閽�...");
+        responseTv.setText("");
+
+//        //姝e紡鏈嶅姟鍣�
+        String appKey = "i8hR07jzrIS";//appkey
+        String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret
+
+        //娴嬭瘯鏈嶅姟鍣�
+//        String appKey ="FcRyUJlLJFF";
+//        String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ";
+
+//        String appKey = "L2OZliZRxHc";
+//        String appSecret = "aCIWSvJDOukXfx3kivsKW11x9xdR3IbV";
+        String supplier = "JINMAOYUN";//鍘傚晢
+//        String mac = "AA00000000000100";//璁惧鍞竴MAC鍦板潃
+        String mac = editText.getText().toString();
+        String spk = "screen.touch";//浜у搧spk
+
+        if (TextUtils.isEmpty(mac)) {
+            Toast.makeText(this, "mac涓嶈兘涓虹┖锛�", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() {
+            @Override
+            public void onError(HDLException e) {
+                tv.setText("鐢宠澶辫触");
+                responseTv.setText(e.getMsg());
+                secret = "";
+            }
+
+            @Override
+            public void onSuccess(String msg) {
+                tv.setText("鐢宠鎴愬姛");
+                responseTv.setText(msg.toString());
+                secret = msg.toString();
+            }
+        });
+
+    }
+
+    void checkAppVersion() {
+        tv.setText("寮�濮嬫娴嬫洿鏂�...");
+        responseTv.setText("");
+
+//        //姝e紡鏈嶅姟鍣�
+        String appKey = "i8hR07jzrIS";//appkey
+        String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret
+
+        String appCode = "1697150870315999233";//appCode
+
+        HDLLink.getInstance().checkAppVersion(this, appKey, appSecret, getAppVersionName(this), appCode, new CheckAppVersionListener() {
+            @Override
+            public void onSuccess(UpdateInfo info) {
+                tv.setText("鏈夋柊鏇存柊");
+                responseTv.setText(info.toString());
+            }
+
+            @Override
+            public void onError(HDLException e) {
+                tv.setText("妫�娴嬫洿鏂板け璐�");
+                responseTv.setText(e.getMsg());
+            }
+        });
+
+    }
+
+    public void UploadDeviceAuth(String mac, String result, String message, String auth_code) {
+        //灏嗚璇佺粨鏋滀笂鎶ョ粰缃戝叧
+        HDLLink.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String s) {
+                tv.setText("涓婃姤缁撴灉鎴愬姛");
+                responseTv.setText(s.toString());
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                tv.setText("涓婃姤缁撴灉澶辫触");
+                responseTv.setText(e.getMsg());
+                Log.i(TAG, "onError: 涓婃姤缁撴灉澶辫触");
+            }
+        });
+    }
+
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-
         setContentView(R.layout.activity_main);
         responseTv = findViewById(R.id.response_tv);
+        editText = findViewById(R.id.edittext);
+        localSecret = findViewById(R.id.local_secret);
         tv = findViewById(R.id.state_tv);
         rv = findViewById(R.id.rv);
         rv.setLayoutManager(new LinearLayoutManager(this));
 
-         init();
+        selectnetwork();
         checkIfCertified();
-        initDeviceInfo();//鍒濆鍖栧熀鏈俊鎭紝闈炲父閲嶈锛岃璇佹椂瑕佺敤
+        initDeviceInfo();//鍒濆鍖�
         registerAllTopicsListener();
+        HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() {
+            @Override
+            public void onSuccess(Object msg) {
+                LogUtils.i("setDeleteNetworkListener onSucceed = " + msg);
+            }
+
+            @Override
+            public void onFailure() {
+                LogUtils.i("setDeleteNetworkListener onFailure");
+            }
+        });
 
         ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
             @Override
@@ -108,9 +202,11 @@
 
         launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE});
 
-        final List<DemoBean> beans = new ArrayList<>();
+        final List<DemoBean> beans = new ArrayList<DemoBean>();
+        beans.add(new DemoBean("鐢宠璁惧瀵嗛挜"));
         beans.add(new DemoBean("鍏ョ綉璁よ瘉"));
         beans.add(new DemoBean("鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎"));
+        beans.add(new DemoBean("涓婃姤oid鍒楄〃"));
         beans.add(new DemoBean("鑾峰彇鍔熻兘鍒楄〃"));
         beans.add(new DemoBean("鍔熻兘灞炴�ц鍙�"));
         beans.add(new DemoBean("璁惧鎺у埗"));
@@ -122,6 +218,8 @@
         beans.add(new DemoBean("TCP鍙戦��"));
         beans.add(new DemoBean("UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
         beans.add(new DemoBean("TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
+        beans.add(new DemoBean("閫�缃�"));
+        beans.add(new DemoBean("妫�娴嬫洿鏂�"));
         demoAdapter = new DemoAdapter(beans);
         rv.setAdapter(demoAdapter);
 
@@ -137,56 +235,72 @@
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                 switch (position) {
                     case 0:
+                        //鐢宠璁惧瀵嗛挜
+                        applyDeviceSecret();
+                        break;
+                    case 1:
                         //鍏ョ綉璁よ瘉
                         sendAuthenticateRequest();
                         break;
-                    case 1:
+                    case 2:
                         //鎼滅储缃戝叧
                         searchGatewayBroadcast();
                         break;
-                    case 2:
+                    case 3:
+                        //涓婃姤oid鍒楄〃
+                        UploadOidList();
+                        break;
+                    case 4:
                         //鑾峰彇鍔熻兘鍒楄〃
                         getFunctionList();
                         break;
-                    case 3:
+                    case 5:
                         //鍔熻兘灞炴�ц鍙�
                         getFunctionAttribute();
                         break;
-                    case 4:
+                    case 6:
                         //璁惧鎺у埗
                         controlDecide();
                         break;
-                    case 5:
+                    case 7:
                         //璇诲彇鐘舵��
                         propertyRead();
                         break;
-                    case 6:
+                    case 8:
                         //鑾峰彇鍦烘櫙鍒楄〃
                         getSceneList();
                         break;
-                    case 7:
-                        //鑾峰彇鍦烘櫙鍒楄〃
-                        controlScene();
+                    case 9:
+                        //鍦烘櫙鎺у埗
+                        getScene();
                         break;
-                    case 8:
+                    case 10:
                         //鍔熻兘鍒楄〃
                         startDevicesListActivity();
                         break;
-                    case 9:
+                    case 11:
                         //UDP鍙戦��
                         udpSend();
                         break;
-                    case 10:
+                    case 12:
                         //TCP鍙戦��
                         tcpSend();
                         break;
-                    case 11:
+                    case 13:
                         //UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         udpSendWithCallback();
                         break;
-                    case 12:
+                    case 14:
                         //TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         tcpSendWithCallback();
+                        break;
+                    case 15:
+                        //閫�缃�
+                        deleteNetwork();
+                        break;
+                    case 16:
+                        //妫�娴嬫洿鏂�
+                        checkAppVersion();
                         break;
                 }
             }
@@ -196,6 +310,10 @@
 
     public void showToast(String text) {
         Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
+    }
+
+    void selectnetwork() {
+        HDLLink.getInstance().selectNetwork("wlan0");
     }
 
     /**
@@ -216,7 +334,9 @@
             @Override
             public void onMessage(Object msg) {
                 LinkResponse response = (LinkResponse) msg;
-                handleLinkResponse(response);
+                if ("/user/all/custom/gateway/broadcast_reply".equals(response.getTopic())) {
+                    localSecret.setText("瀵嗛挜锛�" + HDLLinkConfig.getInstance().getLocalSecret());
+                }
             }
         };
         HDLLink.getInstance().registerAllTopicsListener(allTopicsListener);
@@ -361,6 +481,7 @@
      */
     void searchGatewayBroadcast() {
         tv.setText("鎼滅储缃戝叧涓�...");
+        responseTv.setText("");
         HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() {
             @Override
             public void onError(HDLLinkException e) {
@@ -403,6 +524,7 @@
      */
     void getFunctionAttribute() {
         tv.setText("鍔熻兘灞炴�ц鍙�");
+        responseTv.setText("");
         List<String> sids = new ArrayList<>();
         sids.add(testLightSid);
         HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() {
@@ -424,6 +546,7 @@
      */
     void propertyRead() {
         tv.setText("璇诲彇鐘舵�佷腑...");
+        responseTv.setText("");
         List<String> list = new ArrayList<>();
         list.add(testLightSid);//瑕佽鍙栬澶囩殑sid
         HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() {
@@ -447,6 +570,7 @@
      */
     void controlDecide() {
         tv.setText("鎺у埗璁惧");
+        responseTv.setText("");
         isOn = !isOn;
         List<DeviceControlRequest> requestList = new ArrayList<>();
         DeviceControlRequest request = new DeviceControlRequest();
@@ -476,10 +600,12 @@
      */
     void getSceneList() {
         tv.setText("璇诲彇鍦烘櫙鍒楄〃");
+        responseTv.setText("");
         HDLLink.getInstance().getSceneList(new HDLLinkCallBack() {
             @Override
             public void onSuccess(String msg) {
                 responseTv.setText(msg);
+                Log.d("panlili", "MainActivity.java:getSceneList-----> " + msg);
             }
 
             @Override
@@ -493,11 +619,36 @@
     // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"鍥炲妯″紡","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"绂诲妯″紡","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]}
 
     /**
+     * 鑾峰彇鍦烘櫙璇︽儏
+     * 鎵ц鎴愬姛鐨勮瘽 鍝嶅簲code涓�200
+     */
+    void getScene() {
+        tv.setText("鍦烘櫙璇诲彇");
+        responseTv.setText("");
+        //鍦烘櫙sid鍒楄〃锛屾敮鎸佹壒閲忚鍙�
+        List<String> sids = new ArrayList<>();
+        sids.add("0201034C50B53F0A0A0100011100");
+        sids.add("0201037F50B53F0A0A0100021100");
+        HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
      * 鎺у埗鍦烘櫙
      * 鎵ц鎴愬姛鐨勮瘽 鍝嶅簲code涓�200
      */
     void controlScene() {
         tv.setText("鍦烘櫙鎺у埗");
+        responseTv.setText("");
         //鎺у埗鍦烘櫙sid鍒楄〃锛屾敮鎸佹壒閲忔帶鍒�
         List<String> sids = new ArrayList<>();
         isOn = !isOn;
@@ -530,6 +681,7 @@
      */
     private void tcpSend() {
         tv.setText("TCP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr);
@@ -540,6 +692,7 @@
      */
     private void udpSend() {
         tv.setText("UDP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr);
@@ -572,6 +725,7 @@
      */
     private void udpSendWithCallback() {
         tv.setText("UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() {
@@ -593,6 +747,7 @@
      */
     private void tcpSendWithCallback() {
         tv.setText("TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() {
@@ -608,4 +763,76 @@
             }
         });
     }
+
+    private void deleteNetwork() {
+        tv.setText("閫�缃�");
+        responseTv.setText("");
+        String oid = HDLLinkConfig.getInstance().getDeviceInfoBean().getOID();
+        HDLLink.getInstance().deleteNetwork(oid, false, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+                //閫�缃戞垚鍔燂紝鍒犻櫎鏁版嵁
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
+     * 涓婃姤oid鍒楄〃
+     */
+    private void UploadOidList() {
+        tv.setText("涓婃姤oid鍒楄〃...");
+        responseTv.setText("");
+
+        //1.璁剧疆璁惧淇℃伅
+        AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean();
+
+        ListUploadRequest request = new ListUploadRequest();
+        request.setOid(authenticateDeviceInfoBean.getOID());
+        request.setDevice_name(authenticateDeviceInfoBean.getDeviceName());
+        request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel());
+        request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC());
+        request.setSrc("LINK");//鏉ヨ嚜鍝釜椹卞姩锛屽Link璁惧娌℃湁鍒欏~"LINK"
+        request.setFrom(authenticateDeviceInfoBean.getOID());//鏉ヨ嚜鍝釜缃戝叧锛屽鏋滄椂Link缃戠粶璁惧锛屽垯濉嚜韬玱id锛涘鏋滄槸椹卞姩鍒欎笉闇�瑕佹瀛楁
+
+        HDLLink.getInstance().UploadOidList(request, new HDLLinkCallBack() {
+            @Override
+            public void onError(HDLLinkException error) {
+                tv.setText(error.getMsg());
+            }
+
+            @Override
+            public void onSuccess(String data) {
+                tv.setText("涓婃姤oid鍒楄〃鎴愬姛");
+                responseTv.setText(data);
+            }
+        });
+    }
+
+    /**
+     * 鑾峰彇APP鐗堟湰
+     *
+     * @param context
+     * @return
+     */
+    public static String getAppVersionName(Context context) {
+        String versionName = "0";
+        try {
+            PackageManager packageManager = context.getPackageManager();
+            PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
+            versionName = packageInfo.versionName;
+            if (TextUtils.isEmpty(versionName)) {
+                versionName = "0";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return versionName;
+    }
+
 }
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
index f253b34..dc7156d 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
@@ -1,24 +1,20 @@
 package com.hdl.hdlsdk.device;
 
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.OrientationHelper;
-import androidx.recyclerview.widget.RecyclerView;
-
 import android.annotation.SuppressLint;
 import android.os.Bundle;
 import android.util.Log;
 
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
 import com.google.gson.reflect.TypeToken;
-import com.hdl.hdlsdk.DemoAdapter;
 import com.hdl.hdlsdk.R;
 import com.hdl.sdk.common.exception.HDLLinkException;
-import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
 import com.hdl.sdk.connect.HDLLink;
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
-import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 
 import java.util.ArrayList;
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
index d352b7c..773df27 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
@@ -1,118 +1,107 @@
-package com.hdl.hdlsdk.device;
-
-import android.content.Context;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CompoundButton;
-import android.widget.Switch;
-import android.widget.TextView;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.recyclerview.widget.RecyclerView;
-
-import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
-import com.chad.library.adapter.base.viewholder.BaseViewHolder;
-import com.hdl.hdlsdk.DemoBean;
-import com.hdl.hdlsdk.R;
-import com.hdl.sdk.common.config.TopicConstant;
-import com.hdl.sdk.common.exception.HDLLinkException;
-import com.hdl.sdk.common.utils.IdUtils;
-import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.common.utils.gson.GsonConvert;
-import com.hdl.sdk.connect.HDLLink;
-import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
-import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
-import com.hdl.sdk.connect.callback.HDLLinkCallBack;
-import com.hdl.sdk.connect.config.HDLLinkConfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class DevicesListAdapter extends RecyclerView.Adapter<DevicesListAdapter.ViewHolder> {
-
-    private LayoutInflater mInflater;
-    private List<FunctionBean> mList = null;
-
-    public DevicesListAdapter(Context context, List<FunctionBean> devicesList) {
-        this.mInflater = LayoutInflater.from(context);
-        this.mList = devicesList;
-    }
-
-    /**
-     * item鏄剧ず绫诲瀷
-     *
-     * @param parent
-     * @param viewType
-     * @return
-     */
-    @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = mInflater.inflate(R.layout.item_devices_list, parent, false);
-        ViewHolder viewHolder = new ViewHolder(view);
-        return viewHolder;
-    }
-
-    /**
-     * 鏁版嵁鐨勭粦瀹氭樉绀�
-     *
-     * @param holder
-     * @param position
-     */
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        holder.item_tv.setText(mList.get(position).getName());
-        holder.device_on_off_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
-                propertyDown(mList.get(position), isChecked);
-            }
-        });
-    }
-
-    @Override
-    public int getItemCount() {
-        return mList.size();
-    }
-
-    //鑷畾涔夌殑ViewHolder锛屾寔鏈夋瘡涓狪tem鐨勭殑鎵�鏈夌晫闈㈠厓绱�
-    public static class ViewHolder extends RecyclerView.ViewHolder {
-        public TextView item_tv;
-        public Switch device_on_off_switch;
-
-        public ViewHolder(View view) {
-            super(view);
-            item_tv = (TextView) view.findViewById(R.id.device_title_tv);
-            device_on_off_switch = view.findViewById(R.id.device_on_off_switch);
-        }
-    }
-
-    private void propertyDown(FunctionBean functionBean, Boolean isOn){
-        List<DeviceControlRequest> requestList = new ArrayList<>();
-        DeviceControlRequest request = new DeviceControlRequest();
-        request.setSid(functionBean.getSid());
-        List<DeviceControlRequest.StatusBean>  statusBeanList= new ArrayList<>();
-        DeviceControlRequest.StatusBean bean =  new DeviceControlRequest.StatusBean();
-        bean.setKey("on_off");
-        bean.setValue(isOn ? "on" : "off");
-        statusBeanList.add(bean);
-        request.setStatus(statusBeanList);
-        requestList.add(request);
-        String time = String.valueOf(System.currentTimeMillis());
-
-        HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() {
-            @Override
-            public void onSuccess(String data) {
-                Log.i("propertyDown",data);
-            }
-
-            @Override
-            public void onError(HDLLinkException e) {
-                Log.e("propertyDown", "ERROR :"+ e.getMsg());
-            }
-        });
-
-    }
+package com.hdl.hdlsdk.device;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.hdl.hdlsdk.R;
+import com.hdl.sdk.common.exception.HDLLinkException;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
+import com.hdl.sdk.connect.callback.HDLLinkCallBack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DevicesListAdapter extends RecyclerView.Adapter<DevicesListAdapter.ViewHolder> {
+
+    private LayoutInflater mInflater;
+    private List<FunctionBean> mList = null;
+
+    public DevicesListAdapter(Context context, List<FunctionBean> devicesList) {
+        this.mInflater = LayoutInflater.from(context);
+        this.mList = devicesList;
+    }
+
+    /**
+     * item鏄剧ず绫诲瀷
+     *
+     * @param parent
+     * @param viewType
+     * @return
+     */
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View view = mInflater.inflate(R.layout.item_devices_list, parent, false);
+        ViewHolder viewHolder = new ViewHolder(view);
+        return viewHolder;
+    }
+
+    /**
+     * 鏁版嵁鐨勭粦瀹氭樉绀�
+     *
+     * @param holder
+     * @param position
+     */
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        holder.item_tv.setText(mList.get(position).getName());
+        holder.device_on_off_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
+                propertyDown(mList.get(position), isChecked);
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        return mList.size();
+    }
+
+    //鑷畾涔夌殑ViewHolder锛屾寔鏈夋瘡涓狪tem鐨勭殑鎵�鏈夌晫闈㈠厓绱�
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        public TextView item_tv;
+        public Switch device_on_off_switch;
+
+        public ViewHolder(View view) {
+            super(view);
+            item_tv = (TextView) view.findViewById(R.id.device_title_tv);
+            device_on_off_switch = view.findViewById(R.id.device_on_off_switch);
+        }
+    }
+
+    private void propertyDown(FunctionBean functionBean, Boolean isOn){
+        List<DeviceControlRequest> requestList = new ArrayList<>();
+        DeviceControlRequest request = new DeviceControlRequest();
+        request.setSid(functionBean.getSid());
+        List<DeviceControlRequest.StatusBean>  statusBeanList= new ArrayList<>();
+        DeviceControlRequest.StatusBean bean =  new DeviceControlRequest.StatusBean();
+        bean.setKey("on_off");
+        bean.setValue(isOn ? "on" : "off");
+        statusBeanList.add(bean);
+        request.setStatus(statusBeanList);
+        requestList.add(request);
+        String time = String.valueOf(System.currentTimeMillis());
+
+        HDLLink.getInstance().propertyDown(requestList, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String data) {
+                Log.i("propertyDown",data);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                Log.e("propertyDown", "ERROR :"+ e.getMsg());
+            }
+        });
+
+    }
 }
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/res/layout/activity_main.xml b/HDLSDK/app/src/main/res/layout/activity_main.xml
index 6fa6c2b..6bdd2a2 100644
--- a/HDLSDK/app/src/main/res/layout/activity_main.xml
+++ b/HDLSDK/app/src/main/res/layout/activity_main.xml
@@ -40,10 +40,20 @@
             android:layout_height="match_parent"
             android:orientation="vertical">
 
+            <EditText
+                android:id="@+id/edittext"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingStart="10dp"
+                android:hint="璇疯緭鍏ac"
+                android:text="f2c5d8bad48f"
+                />
+
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:paddingStart="10dp"
+                android:layout_marginTop="@dimen/dp_10"
                 android:text="褰撳墠鐘舵�侊細" />
 
             <TextView
@@ -66,6 +76,14 @@
                 android:text="鍝嶅簲锛�" />
 
             <TextView
+                android:id="@+id/local_secret"
+                android:paddingStart="10dp"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="瀵嗛挜锛�" />
+
+            <TextView
                 android:id="@+id/response_tv"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
diff --git a/HDLSDK/app/src/main/res/layout/demo_item.xml b/HDLSDK/app/src/main/res/layout/demo_item.xml
index 84a9aed..3788542 100644
--- a/HDLSDK/app/src/main/res/layout/demo_item.xml
+++ b/HDLSDK/app/src/main/res/layout/demo_item.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="40dp">
-
-    <TextView
-        android:id="@+id/tv_title"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        android:gravity="center"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-
-    <View
-        android:layout_width="0dp"
-        android:layout_height="1dp"
-        android:layout_marginStart="10dp"
-        android:layout_marginEnd="10dp"
-        android:background="#f5f5f5"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
-
-
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="40dp">
+
+    <TextView
+        android:id="@+id/tv_title"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        android:gravity="center"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <View
+        android:layout_width="0dp"
+        android:layout_height="1dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:background="#f5f5f5"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/res/layout/item_devices_list.xml b/HDLSDK/app/src/main/res/layout/item_devices_list.xml
index 345f892..07b7cf4 100644
--- a/HDLSDK/app/src/main/res/layout/item_devices_list.xml
+++ b/HDLSDK/app/src/main/res/layout/item_devices_list.xml
@@ -1,44 +1,44 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:layout_width="match_parent"
-    android:layout_height="50dp"
-    android:orientation="vertical">
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:orientation="horizontal">
-
-        <TextView
-            android:id="@+id/device_title_tv"
-            android:layout_width="0dp"
-            android:layout_height="match_parent"
-            android:layout_marginLeft="@dimen/dp_10"
-            android:gravity="center|left"
-            android:text="璁惧"
-            android:textColor="@color/black"
-            android:layout_weight="1"/>
-
-        <Switch
-            android:id="@+id/device_on_off_switch"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="@dimen/dp_10"
-            />
-    </LinearLayout>
-
-
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="1dp"
-        android:layout_marginStart="10dp"
-        android:layout_marginEnd="10dp"
-        android:background="#f5f5f5"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent" />
-
-
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="50dp"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:orientation="horizontal">
+
+        <TextView
+            android:id="@+id/device_title_tv"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/dp_10"
+            android:gravity="center|left"
+            android:text="璁惧"
+            android:textColor="@color/black"
+            android:layout_weight="1"/>
+
+        <Switch
+            android:id="@+id/device_on_off_switch"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="@dimen/dp_10"
+            />
+    </LinearLayout>
+
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dp"
+        android:layout_marginStart="10dp"
+        android:layout_marginEnd="10dp"
+        android:background="#f5f5f5"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent" />
+
+
 </LinearLayout>
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/res/values/strings.xml b/HDLSDK/app/src/main/res/values/strings.xml
index 192b55f..dc5eb5f 100644
--- a/HDLSDK/app/src/main/res/values/strings.xml
+++ b/HDLSDK/app/src/main/res/values/strings.xml
@@ -1,3 +1,4 @@
 <resources>
     <string name="app_name">HDLSDK</string>
+    <string name="http_unknown">鏈煡缃戠粶閿欒锛岃绋嶅悗鍐嶈瘯</string>
 </resources>
\ No newline at end of file
diff --git a/HDLSDK/build.gradle b/HDLSDK/build.gradle
index 8641fad..9137082 100644
--- a/HDLSDK/build.gradle
+++ b/HDLSDK/build.gradle
@@ -3,7 +3,13 @@
 buildscript {
     repositories {
         google()
+        jcenter()
         mavenCentral()
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url = uri("https://plugins.gradle.org/m2/") }
+        maven {
+            url "https://jitpack.io"
+        }
     }
     dependencies {
         classpath "com.android.tools.build:gradle:4.1.2"
@@ -18,8 +24,20 @@
         maven { url 'https://maven.aliyun.com/repository/google' }
         maven { url 'https://maven.aliyun.com/repository/jcenter' }
         maven { url 'https://maven.aliyun.com/repository/public' }
+        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+        maven { url = uri("https://plugins.gradle.org/m2/") }
         google()
+        jcenter()
+        mavenCentral()
         maven { url "https://jitpack.io" }
+
+        maven {
+            credentials {
+                username rootProject.ext.ALIYUN_USER_NAME
+                password rootProject.ext.ALIYUN_PASSWORD
+            }
+            url 'https://packages.aliyun.com/maven/repository/2012126-release-Mc0DNo/'
+        }
     }
 }
 
diff --git a/HDLSDK/com.hdl.sdk/build.gradle b/HDLSDK/com.hdl.sdk/build.gradle
index 795f57b..00a22db 100644
--- a/HDLSDK/com.hdl.sdk/build.gradle
+++ b/HDLSDK/com.hdl.sdk/build.gradle
@@ -1,6 +1,6 @@
 //鎵撳寘鐨�
 apply plugin: 'com.android.library'
-apply plugin:'com.kezong.fat-aar'
+apply plugin: 'com.kezong.fat-aar'
 
 android {
     compileSdkVersion rootProject.compileSdkVersion
@@ -8,8 +8,8 @@
     defaultConfig {
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
-        versionCode 2
-        versionName "1.0.15"
+        versionCode 6
+        versionName "1.1.4"
     }
     buildTypes {
         debug {
@@ -27,14 +27,32 @@
 
     implementation fileTree(include: ['*.jar'], dir: 'libs')
 
-//    embed 'com.ezviz.sdk:ezviz-sdk:4.16.1'
-//    embed(name: 'hdl-common-release',ext: 'aar')
-//    embed(name: 'hdl-connect-release',ext: 'aar')
-//    embed(name: 'hdl-socket-release',ext: 'aar')
+    embed 'com.hdl.hdlhttp:hxhttp:1.0.4'
 
-    embed project(path: ':hdl-common', configuration:'default')
-    embed project(path: ':hdl-connect', configuration:'default')
-    embed project(path: ':hdl-socket', configuration:'default')
+//    api 'androidx.appcompat:appcompat:1.3.1'
+//    api 'com.google.android.material:material:1.4.0'
+
+    embed 'com.squareup.okhttp3:okhttp:4.9.1'
+    embed 'com.squareup.okhttp3:logging-interceptor:4.9.1'
+    embed 'com.squareup.okio:okio:2.8.0'
+    //retrofit
+    embed 'com.squareup.retrofit2:retrofit:2.9.0'
+    embed 'com.squareup.retrofit2:converter-scalars:2.9.0'
+    embed 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'
+    embed 'io.reactivex.rxjava3:rxandroid:3.0.0'
+    embed 'io.reactivex.rxjava3:rxjava:3.1.1'
+    embed 'com.google.code.gson:gson:2.8.8'
+
+    embed 'com.trello.rxlifecycle4:rxlifecycle:4.0.2'
+    embed 'com.trello.rxlifecycle4:rxlifecycle-android:4.0.2'
+    embed 'com.trello.rxlifecycle4:rxlifecycle-android-lifecycle:4.0.2'
+
+    embed 'org.reactivestreams:reactive-streams:1.0.3'
+
+//    embed(name: 'hxhttp_1.0.4_230201',ext: 'aar')
+
+    embed project(path: ':hdl-connect', configuration: 'default')
+
 }
 
 //鎵撳寘鐨�
@@ -43,7 +61,7 @@
     repositories {
         google()
         jcenter()
-        maven {url "https://plugins.gradle.org/m2/"}
+        maven { url "https://plugins.gradle.org/m2/" }
     }
 
     dependencies {
@@ -52,16 +70,15 @@
     }
 }
 
-//allprojects {
-//    repositories {
-//        flatDir{
-//            dirs 'libs'
-//        }
-//        google()
-//        jcenter()
-//    }
-//}
-
+allprojects {
+    repositories {
+        flatDir {
+            dirs 'libs'
+        }
+        google()
+        jcenter()
+    }
+}
 
 
 ////杩愯鐨�
diff --git a/HDLSDK/config.gradle b/HDLSDK/config.gradle
index 51a8ae6..d665ff3 100644
--- a/HDLSDK/config.gradle
+++ b/HDLSDK/config.gradle
@@ -1,5 +1,8 @@
 ext {
-    minSdkVersion = 16
+    minSdkVersion = 21
     targetSdkVersion = 31
     compileSdkVersion = 31
+
+    ALIYUN_USER_NAME = "611f24277cbfb3c62b5b1d4f"
+    ALIYUN_PASSWORD = "sJA([gwZJ5Y0"
 }
\ No newline at end of file
diff --git a/HDLSDK/gradle.properties b/HDLSDK/gradle.properties
index 52f5917..31a34a4 100644
--- a/HDLSDK/gradle.properties
+++ b/HDLSDK/gradle.properties
@@ -15,5 +15,5 @@
 # Android operating system, and which are packaged with your app"s APK
 # https://developer.android.com/topic/libraries/support-library/androidx-rn
 android.useAndroidX=true
-# Automatically convert third-party libraries to use AndroidX
-android.enableJetifier=true
\ No newline at end of file
+### Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
diff --git a/HDLSDK/hdl-common/build.gradle b/HDLSDK/hdl-common/build.gradle
index f054e96..1f5d91e 100644
--- a/HDLSDK/hdl-common/build.gradle
+++ b/HDLSDK/hdl-common/build.gradle
@@ -11,7 +11,6 @@
         versionCode 2
 
         versionName "1.0.15"
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
     }
 
@@ -25,10 +24,8 @@
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+    
 }
-
 dependencies {
     api 'com.google.code.gson:gson:2.8.8'
-    api 'androidx.annotation:annotation:1.2.0'
-    api 'androidx.collection:collection:1.1.0'
 }
\ No newline at end of file
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/HDLSdk.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/HDLSdk.java
index de346dd..fca6a9b 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/HDLSdk.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/HDLSdk.java
@@ -13,13 +13,14 @@
 
     /**
      * 鑾峰彇褰撳墠鐗堟湰
+     *
      * @return
      */
     public String getVersion() {
         return version;
     }
 
-    private String version="1.0.15";
+    private String version = "1.0.15";
 
     private HDLSdk() {
     }
@@ -43,9 +44,10 @@
 
     /**
      * 璁剧疆鎵撳嵃鏄惁寮�鍚�
+     *
      * @param enable
      */
-    public void setLogEnabled(boolean enable){
+    public void setLogEnabled(boolean enable) {
         LogUtils.setEnabled(enable);
     }
 }
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
index bfb38b3..96adb95 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
@@ -1,8 +1,7 @@
 package com.hdl.sdk.common.event;
 
-import androidx.annotation.NonNull;
-import androidx.collection.ArrayMap;
 
+import android.util.ArrayMap;
 
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
@@ -10,6 +9,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 
 
@@ -21,9 +21,9 @@
 
     private static final List<EventListener> ALL_TOPICS_EVENT = new ArrayList<>();//鎵�鏈変富棰樻秷鎭�
 
-    private static final ArrayMap<Object, List<EventListener>> EVENT = new ArrayMap<>();
+    private static final ConcurrentHashMap<Object, List<EventListener>> EVENT = new ConcurrentHashMap<>();
 
-    private static final ArrayMap<EventListener, Integer> TYPE = new ArrayMap<>();
+    private static final ConcurrentHashMap<EventListener, Integer> TYPE = new ConcurrentHashMap<>();
 
     private static final int MAIN_TYPE = 0;
     private static final int IO_TYPE = 1;
@@ -62,7 +62,7 @@
         }
     }
 
-    public  void registerIo(Object tag, EventListener listener) {
+    public void registerIo(Object tag, EventListener listener) {
         synchronized (this) {
             LogUtils.i("娉ㄥ唽涓婚锛�" + tag);
             if (tag == null) return;
@@ -82,7 +82,7 @@
         }
     }
 
-    public  void remove(Object tag) {
+    public void remove(Object tag) {
         synchronized (this) {
             if (tag == null) {
                 return;
@@ -105,7 +105,7 @@
         }
     }
 
-    public  void remove(Object tag, EventListener listener) {
+    public void remove(Object tag, EventListener listener) {
         synchronized (this) {
             try {
                 if (tag == null || listener == null) {
@@ -125,7 +125,7 @@
         }
     }
 
-    public synchronized void post(Object tag, @NonNull Object o) {
+    public synchronized void post(Object tag, Object o) {
         if (tag == null) {
             LogUtils.i("post tag涓虹┖");
             return;
@@ -147,7 +147,7 @@
                                         listener.onMessage(o);
                                     }
                                 } catch (Exception e) {
-                                    LogUtils.e("post寮傚父1锛�" + e.getMessage());
+//                                    LogUtils.e("post寮傚父1锛�" + e.getMessage());
                                 }
                             }
                         });
@@ -173,17 +173,18 @@
                     });
                 }
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             LogUtils.e("post寮傚父2锛�" + e.getMessage());
         }
     }
 
     /**
      * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
      * @param listener
      */
     public synchronized void registerAllTopicsListener(EventListener listener) {
-        if(listener==null){
+        if (listener == null) {
             return;
         }
         try {
@@ -191,13 +192,14 @@
                 ALL_TOPICS_EVENT.add(listener);
             }
             TYPE.put(listener, MAIN_TYPE);
-        }catch (Exception e){
+        } catch (Exception e) {
             LogUtils.e("registerAllTopicsListener锛�" + e.getMessage());
         }
     }
 
     /**
      * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
      * @param listener
      */
     public synchronized void removeAllTopicsListener(EventListener listener) {
@@ -206,7 +208,7 @@
                 @Override
                 public void run() {
                     try {
-                        if(listener==null){
+                        if (listener == null) {
                             return;
                         }
                         if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
index 715cb3e..5343159 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
@@ -1,6 +1,7 @@
 package com.hdl.sdk.common.exception;
 
-import androidx.annotation.NonNull;
+
+
 
 /**
  * Created by Tong on 2021/11/11.
@@ -39,7 +40,7 @@
         this.code = code;
     }
 
-    public @NonNull
+    public
     String getMsg() {
         return msg;
     }
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/LogUtils.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
index 46b1d5d..b7333d3 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
@@ -57,7 +57,7 @@
 
     public static void e(String msg) {
         if (msg != null && isEnabled) {
-            Log.e(TAG,  msg);
+            Log.e(TAG, msg);
         }
     }
 }
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/SPUtils.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
index bbdd808..6181f68 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
@@ -3,7 +3,6 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 
-import androidx.annotation.NonNull;
 
 import com.hdl.sdk.common.HDLSdk;
 
@@ -26,87 +25,87 @@
 
 
     //======閫氱敤瀛樺偍========
-    public static void put(@NonNull final String key, final String value) {
+    public static void put(final String key, final String value) {
         getAppPreference().edit().putString(key, value).apply();
     }
 
 
-    public static String getString(@NonNull final String key) {
+    public static String getString(final String key) {
         return getString(key, "");
     }
 
 
-    public static String getString(@NonNull final String key, final String defaultValue) {
+    public static String getString(final String key, final String defaultValue) {
         return getAppPreference().getString(key, defaultValue);
     }
 
 
-    public static void put(@NonNull final String key, final int value) {
+    public static void put(final String key, final int value) {
         put(key, value, false);
     }
 
 
-    public static void put(@NonNull final String key, final int value, final boolean isCommit) {
+    public static void put(final String key, final int value, final boolean isCommit) {
         getAppPreference().edit().putInt(key, value).apply();
     }
 
 
-    public static int getInt(@NonNull final String key) {
+    public static int getInt(final String key) {
         return getInt(key, -1);
     }
 
 
-    public static int getInt(@NonNull final String key, final int defaultValue) {
+    public static int getInt(final String key, final int defaultValue) {
         return getAppPreference().getInt(key, defaultValue);
     }
 
 
-    public static void put(@NonNull final String key, final long value) {
+    public static void put(final String key, final long value) {
         getAppPreference().edit().putLong(key, value).apply();
     }
 
 
-    public static long getLong(@NonNull final String key) {
+    public static long getLong(final String key) {
         return getLong(key, -1L);
     }
 
 
-    public static long getLong(@NonNull final String key, final long defaultValue) {
+    public static long getLong(final String key, final long defaultValue) {
         return getAppPreference().getLong(key, defaultValue);
     }
 
 
-    public static void put(@NonNull final String key, final float value) {
+    public static void put(final String key, final float value) {
         getAppPreference().edit().putFloat(key, value).apply();
     }
 
 
-    public static float getFloat(@NonNull final String key) {
+    public static float getFloat(final String key) {
         return getFloat(key, -1f);
     }
 
 
-    public static float getFloat(@NonNull final String key, final float defaultValue) {
+    public static float getFloat(final String key, final float defaultValue) {
         return getAppPreference().getFloat(key, defaultValue);
     }
 
 
-    public static void put(@NonNull final String key, final boolean value) {
+    public static void put(final String key, final boolean value) {
         getAppPreference().edit().putBoolean(key, value).apply();
     }
 
 
-    public static boolean getBoolean(@NonNull final String key) {
+    public static boolean getBoolean(final String key) {
         return getBoolean(key, false);
     }
 
 
-    public static boolean getBoolean(@NonNull final String key, final boolean defaultValue) {
+    public static boolean getBoolean(final String key, final boolean defaultValue) {
         return getAppPreference().getBoolean(key, defaultValue);
     }
 
 
-    public static void put(@NonNull final String key,
+    public static void put(final String key,
                            final Set<String> value
     ) {
 
@@ -115,12 +114,12 @@
     }
 
 
-    public static Set<String> getStringSet(@NonNull final String key) {
+    public static Set<String> getStringSet(final String key) {
         return getStringSet(key, Collections.<String>emptySet());
     }
 
 
-    public static Set<String> getStringSet(@NonNull final String key,
+    public static Set<String> getStringSet(final String key,
                                            final Set<String> defaultValue) {
         return getAppPreference().getStringSet(key, defaultValue);
     }
@@ -131,12 +130,12 @@
     }
 
 
-    public static boolean contains(@NonNull final String key) {
+    public static boolean contains(final String key) {
         return getAppPreference().contains(key);
     }
 
 
-    public static void remove(@NonNull final String key) {
+    public static void remove(final String key) {
         getAppPreference().edit().remove(key).apply();
     }
 
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
index fd122d8..83fd5c6 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
@@ -1,8 +1,6 @@
 package com.hdl.sdk.common.utils.gson;
 
 
-import androidx.annotation.NonNull;
-
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 
@@ -25,14 +23,13 @@
         return new ParameterizedTypeImpl(rawType, actualTypeArguments, null);
     }
 
-    @NonNull
+
     @Override
     public Type[] getActualTypeArguments() {
         return actualTypeArguments;
     }
 
 
-    @NonNull
     @Override
     public Type getRawType() {
         return rawType;
diff --git a/HDLSDK/hdl-connect/build.gradle b/HDLSDK/hdl-connect/build.gradle
index 79e077a..5f8c118 100644
--- a/HDLSDK/hdl-connect/build.gradle
+++ b/HDLSDK/hdl-connect/build.gradle
@@ -8,10 +8,9 @@
     defaultConfig {
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
-        versionCode 2
-        versionName "1.0.15"
+        versionCode 5
+        versionName "1.1.3"
 
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
     }
 
@@ -28,7 +27,11 @@
 }
 
 dependencies {
-    api project(path: ':hdl-socket')
-    implementation 'androidx.appcompat:appcompat:1.2.0'
-    implementation 'com.google.android.material:material:1.3.0'
+//    implementation fileTree(include: ['*.jar'], dir: 'libs')
+
+    api 'com.hdl.hdlhttp:hxhttp:1.0.4'
+    api 'com.squareup.okhttp3:logging-interceptor:4.9.1'
+//    embed(name: 'hxhttp_1.0.4_230201',ext: 'aar')
+
+    api 'com.google.code.gson:gson:2.8.8'
 }
diff --git a/HDLSDK/hdl-connect/libs/hxhttp_1.0.4_230201.aar b/HDLSDK/hdl-connect/libs/hxhttp_1.0.4_230201.aar
new file mode 100644
index 0000000..a436691
--- /dev/null
+++ b/HDLSDK/hdl-connect/libs/hxhttp_1.0.4_230201.aar
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store
new file mode 100644
index 0000000..e90f688
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
new file mode 100644
index 0000000..1db547c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
@@ -0,0 +1,68 @@
+package com.hdl.sdk.common;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.hdl.sdk.common.config.TopicConstant;
+import com.hdl.sdk.common.exception.HDLLinkException;
+import com.hdl.sdk.common.utils.IdUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.LinkResponse;
+import com.hdl.sdk.connect.bean.request.BroadcastRequest;
+import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.connect.config.HDLLinkConfig;
+import com.hdl.sdk.connect.socket.HDLAuthSocket;
+import com.hdl.sdk.connect.socket.HDLSocket;
+
+/**
+ * Created by Tong on 2021/9/28.
+ */
+public class HDLSdk {
+
+    private Context context;
+
+    /**
+     * 鑾峰彇褰撳墠鐗堟湰
+     *
+     * @return
+     */
+    public String getVersion() {
+        return version;
+    }
+
+    private String version = "1.1.0";
+
+    private HDLSdk() {
+    }
+
+    private static class SingletonInstance {
+        private static final HDLSdk INSTANCE = new HDLSdk();
+    }
+
+    public static HDLSdk getInstance() {
+        return SingletonInstance.INSTANCE;
+    }
+
+    public void init(Context context) {
+        this.context = context.getApplicationContext();
+        HDLAuthSocket.getInstance().init();
+        HDLSocket.getInstance().broadcastRequest();
+        LogUtils.i("HDLSdk Version:" + version);
+    }
+
+
+    public Context getContext() {
+        return context;
+    }
+
+    /**
+     * 璁剧疆鎵撳嵃鏄惁寮�鍚�
+     *
+     * @param enable
+     */
+    public void setLogEnabled(boolean enable) {
+        LogUtils.setEnabled(enable);
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java
new file mode 100644
index 0000000..b27f2ab
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java
@@ -0,0 +1,52 @@
+package com.hdl.sdk.common;
+
+/**
+ * Created by Tong on 2021/9/28.
+ * 鍖呭惈鎵�鏈夋搷浣�
+ */
+public interface IHDLClient {
+
+
+    /**
+     * 鎼滅储缃戝叧
+     */
+    void searchGateway();
+
+
+    /**
+     * 鑾峰彇缃戝叧璇︾粏淇℃伅
+     */
+    void getGatewayInfo();
+
+    /**
+     * 鑾峰彇璁惧鍒楄〃
+     */
+    void getDeviceList();
+
+    /**
+     * 鑾峰彇鍔熻兘鍒楄〃
+     */
+    void getFunctionList();
+
+    /**
+     * 鑾峰彇鍔熻兘灞炴��
+     */
+    void getFunctionAttribute();
+
+    /**
+     * 璁惧鎺у埗
+     */
+    void deviceControl();
+
+    /**
+     * 鑾峰彇璁惧鐘舵��
+     */
+    void getDeviceStatus();
+
+    /**
+     * 鏀瑰彉璁惧鐘舵��
+     */
+    void changeDeviceStatus();
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
new file mode 100644
index 0000000..4ad39ac
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
@@ -0,0 +1,125 @@
+package com.hdl.sdk.common.config;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class TopicConstant {
+
+    //缃戝叧骞挎挱鍏ョ綉鎸囦护
+    public static final String GATEWAY_AUTH_BROADCAST = "/user/all/custom/device/network_access/broadcast";
+
+    //璁惧鍏ョ綉鍜岃璇�
+    public static final String DEIVCE_AUTH_REQUEST = "/user/all/custom/device/network_access/request";
+
+    //璁惧鍏ョ綉鍜岃璇佸搷搴�
+    public static final String DEIVCE_AUTH_REQUEST_REPLY = "/user/all/custom/device/network_access/request_reply";
+
+    //鍏ョ綉璁よ瘉缁撴灉鍙嶉
+    public static final String DEIVCE_AUTH_RESULT_NOTIFY = "/user/%s/custom/device/auth/result_notify";
+
+    //鎼滅储缃戝叧
+    public static final String GATEWAY_SEARCH = "/user/all/custom/gateway/search";
+
+    //鎼滅储缃戝叧鍝嶅簲
+    public static final String GATEWAY_SEARCH_REPLY = "/user/all/custom/gateway/search_reply";
+
+    //缃戝叧璇︾粏淇℃伅鑾峰彇s=gw_id
+    public static final String GATEWAY_INFO = "/user/%s/custom/gateway/get";
+
+    //鑾峰彇鐗╃悊璁惧鍒楄〃
+    public static final String GET_DEVICE_LIST = " /user/%s/custom/device/list/get";
+
+    //鑾峰彇鐗╃悊璁惧鍒楄〃鍝嶅簲
+    public static final String GET_DEVICE_LIST_REPLY = " /user/%s/custom/device/list/get_reply";
+
+    //鑾峰彇鍔熻兘鍒楄〃
+    public static final String GET_FUNCTION_LIST = "/user/%s/custom/function/list/get";
+
+    //鑾峰彇鍔熻兘鍝嶅簲
+    public static final String GET_FUNCTION_LIST_REPLY = "/user/%s/custom/function/list/get_reply";
+
+    //鍔熻兘灞炴�ц鍙�
+    public static final String GET_FUNCTION_ATTRIBUTE = "/user/%s/custom/function/attribute/get";
+
+    //鍔熻兘灞炴�у搷搴�
+    public static final String GET_FUNCTION_ATTRIBUTE_REPLY = "/user/%s/custom/function/attribute/get_reply";
+
+    //鎺у埗
+    public static final String PROPERTY_DOWN = "/base/%s/thing/property/down";
+
+    //鎺у埗鍝嶅簲
+    public static final String PROPERTY_DOWN_REPLY = "/base/%s/thing/property/down_reply";
+
+    //鐘舵�佷笂鎶�
+    public static final String PROPERTY_UP = "/base/%s/thing/property/up";
+
+    //鐘舵�佷笂鎶ュ搷搴�
+    public static final String PROPERTY_UP_REPLY = "/base/%s/thing/property/up_reply";
+
+    //璇诲彇鐘舵��
+    public static final String PROPERTY_READ = "/base/%s/thing/property/read";
+
+    //璇诲彇鐘舵�佸搷搴�
+    public static final String PROPERTY_READ_REPLY = "/base/%s/thing/property/read_reply";
+
+    //8.1鑾峰彇鍦烘櫙鍒楄〃
+    public static final String SCENE_LIST_GET = "/user/%s/custom/scene/list/get";
+
+    //8.2鑾峰彇鍦烘櫙
+    public static final String SCENE_GET = "/user/%s/custom/scene/get";
+
+    //8.3鎵ц鍦烘櫙
+    public static final String SCENE_CONTROL = "/user/%s/custom/scene/execute";
+
+    //8.4鍦烘櫙澧炲姞
+    public static final String SCENE_ADD = "/user/%s/custom/scene/add";
+
+    //8.5鍦烘櫙缂栬緫
+    public static final String SCENE_EDIT = "/user/%s/custom/scene/edit";
+
+    //8.6鍦烘櫙鍒犻櫎
+    public static final String SCENE_DELETE = "/user/%s/custom/scene/delete";
+
+    //link tcp 鐧诲綍
+    public static final String GATEWAY_LOGIN = "/user/%s/custom/gateway/login";
+
+    /**
+     * 璁惧杩炴帴TCP涔嬪墠骞挎挱
+     */
+    public static final String BROADCAST = "/user/all/custom/gateway/broadcast";
+
+    /**
+     * 涓荤綉鍏冲洖澶�
+     */
+    public static final String BROADCAST_REPLY = "/user/all/custom/gateway/broadcast_reply";
+
+    public static final String LINK_BROADCAST = "/user/all/custom/gateway/broadcast_reply";
+
+    /**
+     * 蹇冭烦妫�娴�
+     */
+    public static final String HEARTBEAT = "/user/%s/custom/gateway/heartbeat";
+    /**
+     * 蹇冭烦妫�娴嬪洖澶�
+     */
+    public static final String HEARTBEAT_REPLY = "/user/%s/custom/gateway/heartbeat_reply";
+
+    //閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧
+    public static final String DELETE_REQUEST = "/base/%s/thing/topo/delete/request";
+
+    //缃戝叧鍝嶅簲閫�缃戦�氱煡
+    public static final String DELETE_NOTIFY = "/base/%s/thing/topo/delete/notify";
+
+    public static final String DELETE_NOTIFY_REPLY = "/base/%s/thing/topo/delete/notify_reply";
+
+    //缃戝叧鐗╃悊鍒犻櫎(閫�缃�)瀛愯澶囧悗涓婃姤
+    public static final String DELETE_UP = "/base/%s/thing/topo/delete/up";
+
+    //椹卞姩涓婃姤oid鍒楄〃
+    public static final String LIST_UPLOAD = "/user/%s/custom/device/list/upload";
+
+    //椹卞姩涓婃姤oid鍒楄〃鍥炲
+    public static final String LIST_UPLOAD_REPLY = "/user/%s/custom/device/list/upload_reply";
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/DeleteNetworkListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/DeleteNetworkListener.java
new file mode 100644
index 0000000..0fa9a8a
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/DeleteNetworkListener.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.common.event;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface DeleteNetworkListener {
+
+    void onSuccess(Object msg);
+    void onFailure();
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
new file mode 100644
index 0000000..2f59e1d
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
@@ -0,0 +1,239 @@
+package com.hdl.sdk.common.event;
+
+
+import android.util.ArrayMap;
+
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 浜嬩欢鍒嗗彂
+ */
+public class EventDispatcher {
+
+    private static final List<EventListener> ALL_TOPICS_EVENT = new ArrayList<>();//鎵�鏈変富棰樻秷鎭�
+
+    private static final ConcurrentHashMap<Object, List<EventListener>> EVENT = new ConcurrentHashMap<>();
+
+    private static final ConcurrentHashMap<EventListener, Integer> TYPE = new ConcurrentHashMap<>();
+
+    private static final int MAIN_TYPE = 0;
+    private static final int IO_TYPE = 1;
+
+    private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(3);
+
+
+    private EventDispatcher() {
+    }
+
+    //    private static class SingletonInstance {
+    private static final EventDispatcher instance = new EventDispatcher();
+//    }
+
+    public static EventDispatcher getInstance() {
+        return instance;
+    }
+
+    public void register(Object tag, EventListener listener) {
+        synchronized (this) {
+            try {
+                LogUtils.i("娉ㄥ唽涓婚锛�" + tag);
+                if (tag == null) return;
+                if (!EVENT.containsKey(tag)) {
+                    EVENT.put(tag, new ArrayList<>());
+                }
+                if (listener == null) {
+                    LogUtils.i("鐩戝惉浜嬩欢涓虹┖");
+                    return;
+                }
+                Objects.requireNonNull(EVENT.get(tag)).add(listener);
+                TYPE.put(listener, MAIN_TYPE);
+            } catch (Exception e) {
+                LogUtils.e("register锛�" + e.getMessage());
+            }
+        }
+    }
+
+    public void registerIo(Object tag, EventListener listener) {
+        synchronized (this) {
+            LogUtils.i("娉ㄥ唽涓婚锛�" + tag);
+            if (tag == null) return;
+            if (!EVENT.containsKey(tag)) {
+                EVENT.put(tag, new ArrayList<>());
+            }
+            try {
+                if (listener == null) {
+                    LogUtils.i("鐩戝惉浜嬩欢涓虹┖");
+                    return;
+                }
+                Objects.requireNonNull(EVENT.get(tag)).add(listener);
+                TYPE.put(listener, IO_TYPE);
+            } catch (Exception e) {
+                LogUtils.e("registerIo锛�" + e.getMessage());
+            }
+        }
+    }
+
+    public void remove(Object tag) {
+        synchronized (this) {
+            if (tag == null) {
+                return;
+            }
+            try {
+                if (EVENT.containsKey(tag)) {
+                    LogUtils.i("绉婚櫎key锛�" + tag);
+                    List<EventListener> list = EVENT.get(tag);
+                    for (EventListener eventListener : list) {
+                        if (eventListener == null) {
+                            continue;
+                        }
+                        TYPE.remove(eventListener);
+                    }
+                    EVENT.remove(tag);
+                }
+            } catch (Exception ignored) {
+                LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+            }
+        }
+    }
+
+    public void remove(Object tag, EventListener listener) {
+        synchronized (this) {
+            try {
+                if (tag == null || listener == null) {
+                    return;
+                }
+                if (EVENT.containsKey(tag)) {
+                    LogUtils.i("绉婚櫎key锛�" + tag);
+                    List<EventListener> ev = EVENT.get(tag);
+                    if (ev != null && !ev.isEmpty()) {
+                        TYPE.remove(listener);
+                        ev.remove(listener);
+                    }
+                }
+            } catch (Exception ignored) {
+                LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+            }
+        }
+    }
+
+    public synchronized void post(Object tag, Object o) {
+        if (tag == null) {
+            LogUtils.i("post tag涓虹┖");
+            return;
+        }
+        try {
+            if (EVENT.containsKey(tag)) {
+                LogUtils.i("post锛�" + tag);
+                List<EventListener> list = EVENT.get(tag);
+                if (list != null && !list.isEmpty()) {
+                    for (EventListener listener : list) {
+                        if (listener == null) {
+                            continue;
+                        }
+                        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                try {
+                                    if (listener != null) {
+                                        listener.onMessage(o);
+                                    }
+                                } catch (Exception e) {
+                                    LogUtils.e("post寮傚父1锛�" + e.getMessage());
+                                }
+                            }
+                        });
+                    }
+                }
+            }
+            //鎵�鏈変富棰樼殑Listener閫氱煡
+            if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
+                for (EventListener listener : ALL_TOPICS_EVENT) {
+                    if (listener == null) {
+                        continue;
+                    }
+                    ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                if (listener != null) {
+                                    listener.onMessage(o);
+                                }
+                            } catch (Exception e) {
+                            }
+                        }
+                    });
+                }
+            }
+        } catch (Exception e) {
+            LogUtils.e("post寮傚父2锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void registerAllTopicsListener(EventListener listener) {
+        if (listener == null) {
+            return;
+        }
+        try {
+            if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.contains(listener)) {
+                ALL_TOPICS_EVENT.add(listener);
+            }
+            TYPE.put(listener, MAIN_TYPE);
+        } catch (Exception e) {
+            LogUtils.e("registerAllTopicsListener锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void removeAllTopicsListener(EventListener listener) {
+        try {
+            ioThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        if (listener == null) {
+                            return;
+                        }
+                        if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
+                            TYPE.remove(listener);
+                            ALL_TOPICS_EVENT.remove(listener);
+                        }
+                    } catch (Exception ignored) {
+                        LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+                    }
+
+                }
+            });
+        } catch (Exception e) {
+            LogUtils.e("绉婚櫎event寮傚父2锛�" + e.getMessage());
+        }
+    }
+
+    public synchronized void clear() {
+        ALL_TOPICS_EVENT.clear();
+        EVENT.clear();
+        TYPE.clear();
+    }
+
+    public synchronized void release() {
+        clear();
+        ioThread.shutdownNow();
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java
new file mode 100644
index 0000000..b2f9c38
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.common.event;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface EventListener {
+
+    void onMessage(Object msg);
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java
new file mode 100644
index 0000000..079e275
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java
@@ -0,0 +1,50 @@
+package com.hdl.sdk.common.exception;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : HDLError
+ */
+public enum HDLLinkCode {
+
+    HDL_AUTH_124013_ERROR(124013,"璇AC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪"),
+    HDL_AUTH_124015_ERROR(124015,"璁惧鍘傚涓嶅尮閰�"),
+    HDL_DATA_ERROR(-2000,"鍙傛暟寮傚父"),
+    HDL_DATA_NULL_ERROR(-2001,"鍙傛暟涓嶈兘涓虹┖"),
+    HDL_AUTH_ERROR(-2002,"璁よ瘉澶辫触"),
+    HDL_SEND_ERROR(-2003,"鍙戦�佸け璐�"),
+    HDL_TIMEOUT_ERROR(-2004,"瓒呮椂"),
+    HDL_UNAUTHORIZED_ERROR(-2005,"鏈璇侊紝璇峰厛璁よ瘉"),
+    HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED(-2006,"璁よ瘉澶辫触锛岀綉鍏虫湭娉ㄥ唽鍒颁簯绔�"),
+    HDL_SEARCH_GATEWAY_TIMEOUT_ERROR(-2007,"鎼滅储缃戝叧澶辫触锛岃秴鏃�"),
+    HDL_AUTH_MAC_KEY_ERROR_(-2008,"璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪"),
+    HDL_GET_DEVICE_LIST_ERROR(-2100,"鑾峰彇璁惧鍒楄〃澶辫触"),
+    HDL_GET_FUNCTION_LIST_ERROR(-2101,"鑾峰彇鍔熻兘鍒楄〃澶辫触"),
+    HDL_GET_FUNCTION_PROPERTIES_ERROR(-2102,"鑾峰彇鍔熻兘灞炴�уけ璐�"),
+    HDL_CONTROL_FAILURE_ERROR(-2103,"鎺у埗澶辫触"),
+    HDL_UPLOAD_GATEWAYINFO_FAILURE_ERROR(-2104,"涓婃姤澶辫触");
+
+    private String msg;
+    private int code;
+
+    private HDLLinkCode(int code, String msg) {
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
new file mode 100644
index 0000000..b580aae
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
@@ -0,0 +1,64 @@
+package com.hdl.sdk.common.exception;
+
+
+
+
+/**
+ * Created by Tong on 2021/11/11.
+ */
+public class HDLLinkException extends RuntimeException {
+
+    private int code = 0;
+    private String msg = "";
+    private Throwable rawThrowable;
+
+    public HDLLinkException() {
+    }
+
+    public HDLLinkException(String msg) {
+        this.msg = msg;
+    }
+
+    public HDLLinkException(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public HDLLinkException(int code) {
+        this.code = code;
+    }
+
+    public HDLLinkException(Throwable rawThrowable) {
+        this.rawThrowable = rawThrowable;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public
+    String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Throwable getRawThrowable() {
+        return rawThrowable;
+    }
+
+    public void setRawThrowable(Throwable rawThrowable) {
+        this.rawThrowable = rawThrowable;
+    }
+
+    public static HDLLinkException getErrorWithCode(HDLLinkCode code){
+        return new HDLLinkException(code.getCode(), code.getMsg());
+    }
+}
+
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java
new file mode 100644
index 0000000..6122daa
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java
@@ -0,0 +1,151 @@
+package com.hdl.sdk.common.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class ByteUtils {
+
+    public static byte[] toByteArray(List<Byte> list) {
+        Byte[] temps = list.toArray(new Byte[0]);
+        byte[] result = new byte[temps.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = temps[i];
+        }
+        return result;
+
+    }
+
+    public static List<Byte> toByteList(byte[] bytes) {
+        final List<Byte> list = new ArrayList<>();
+        for (byte aByte : bytes) {
+            list.add(aByte);
+        }
+        return list;
+
+    }
+
+    public static byte[] getRangeBytes(List<Byte> list, int start, int end) {
+        Byte[] temps = Arrays.copyOfRange(list.toArray(new Byte[0]), start, end);
+        byte[] result = new byte[temps.length];
+        for (int i = 0; i < temps.length; i++) {
+            result[i] = temps[i];
+        }
+        return result;
+
+    }
+
+    /**
+     * 鎷兼帴byte
+     */
+    public static byte[] concatBytes(byte[] bt1, byte[] bt2) {
+        if (bt1 == null) {
+            return bt2;
+        }
+        if (bt2 == null) {
+            return bt1;
+        }
+        byte[] bt3 = new byte[bt1.length + bt2.length];
+        System.arraycopy(bt1, 0, bt3, 0, bt1.length);
+        System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
+        return bt3;
+    }
+
+
+    public boolean endWith(Byte[] src, byte[] target) {
+        if (src.length < target.length) {
+            return false;
+        }
+        for (int i = 0; i < target.length; i++) {
+            if (target[target.length - i - 1] != src[src.length - i - 1]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    public static int byteIndexOf(byte[] searched, byte[] find, int start) {
+        boolean matched;
+        int end = find.length - 1;
+        int skip = 0;
+        for (int index = start; index <= searched.length - find.length; ++index) {
+            matched = true;
+            if (find[0] != searched[index] || find[end] != searched[index + end]) continue;
+            else skip++;
+            if (end > 10)
+                if (find[skip] != searched[index + skip] || find[end - skip] != searched[index + end - skip])
+                    continue;
+                else skip++;
+            for (int subIndex = skip; subIndex < find.length - skip; ++subIndex) {
+                if (find[subIndex] != searched[index + subIndex]) {
+                    matched = false;
+                    break;
+                }
+            }
+            if (matched) {
+                return index;
+            }
+        }
+        return -1;
+
+    }
+
+    public static int getByteIndexOf(byte[] sources, byte[] src) {
+        return getByteIndexOf(sources, src, 0, sources.length);
+    }
+
+    //鍒ゆ柇涓�涓猙yte鏁板�煎湪鍙﹀涓�涓猙yte鏁扮粍涓搴旂殑娓告爣鍊�
+    public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex) {
+        return getByteIndexOf(sources, src, startIndex, sources.length);
+    }
+
+
+    //鍒ゆ柇涓�涓猙yte鏁板�煎湪鍙﹀涓�涓猙yte鏁扮粍涓搴旂殑娓告爣鍊硷紝鎸囧畾寮�濮嬬殑娓告爣鍜岀粨鏉熺殑娓告爣浣嶇疆
+    public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex, int endIndex) {
+
+        if (sources == null || src == null || sources.length == 0 || src.length == 0) {
+            return -1;
+        }
+
+        if (endIndex > sources.length) {
+            endIndex = sources.length;
+        }
+
+        int i, j;
+        for (i = startIndex; i < endIndex; i++) {
+            if (sources[i] == src[0] && i + src.length < endIndex) {
+                for (j = 1; j < src.length; j++) {
+                    if (sources[i + j] != src[j]) {
+                        break;
+                    }
+                }
+
+                if (j == src.length) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 瀛楃涓瞭o Bytes
+     * @param str 瀛楃涓�
+     * @return
+     */
+    public static byte[] stringToBytes(String str) {
+        try {
+            // 浣跨敤鎸囧畾鐨勫瓧绗﹂泦灏嗘瀛楃涓茬紪鐮佷负byte搴忓垪骞跺瓨鍒颁竴涓猙yte鏁扮粍涓�
+            return str.getBytes("utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return new byte[]{};
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java
new file mode 100644
index 0000000..c053953
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.common.utils;
+
+import java.util.UUID;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class IdUtils {
+    public static String getUUId() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java
new file mode 100644
index 0000000..8fa0785
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java
@@ -0,0 +1,235 @@
+package com.hdl.sdk.common.utils;
+
+import android.content.Context;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.hdl.sdk.connect.config.HDLLinkConfig;
+
+import java.net.InetAddress;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Enumeration;
+
+/**
+ * Created by Tong on 2021/9/27.
+ */
+public class IpUtils {
+
+//    /**
+//     * @return 骞挎挱鍦板潃
+//     */
+    /*public static String getBroadcastAddress() {
+//        try {
+//            for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
+//                 niEnum.hasMoreElements(); ) {
+//                NetworkInterface ni = niEnum.nextElement();
+//                if (!ni.isLoopback()) {
+//                    for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
+//                        if (interfaceAddress.getBroadcast() != null) {
+//                            return interfaceAddress.getBroadcast().toString().substring(1);
+//                        }
+//                    }
+//                }
+//            }
+//        } catch (SocketException e) {
+//            e.printStackTrace();
+//        }
+        return "255.255.255.255";
+    }*/
+
+
+    /**
+     * @return 骞挎挱鍦板潃
+     */
+    public static synchronized String getBroadcastAddress() {
+        try {
+            if (!TextUtils.isEmpty(HDLLinkConfig.getInstance().getNetworkName())) {
+                for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
+                     niEnum.hasMoreElements(); ) {
+                    NetworkInterface ni = niEnum.nextElement();
+                    if (!ni.isLoopback() && ni.getName().equalsIgnoreCase(HDLLinkConfig.getInstance().getNetworkName())) {
+                        for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
+                            if (interfaceAddress.getBroadcast() != null) {
+                                Log.d("TAG", "----->ni.getName()= " + ni.getName() + " ip= " + interfaceAddress.getBroadcast().toString().substring(1));
+                                return interfaceAddress.getBroadcast().toString().substring(1);
+                            }
+                        }
+                    }
+                }
+
+                for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
+                     niEnum.hasMoreElements(); ) {
+                    NetworkInterface ni = niEnum.nextElement();
+                    if (!ni.isLoopback()) {
+                        for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
+                            if (interfaceAddress.getBroadcast() != null) {
+                                Log.d("TAG", "----->ip= " + interfaceAddress.getBroadcast().toString().substring(1));
+                                return interfaceAddress.getBroadcast().toString().substring(1);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch (SocketException e) {
+            e.printStackTrace();
+        }
+        return "255.255.255.255";
+    }
+
+    public static boolean isLocalIpAddress(String ipAddress) {
+        try {
+            for (Enumeration<NetworkInterface> niEnum = NetworkInterface.getNetworkInterfaces();
+                 niEnum.hasMoreElements(); ) {
+                NetworkInterface ni = niEnum.nextElement();
+                for (InterfaceAddress interfaceAddress : ni.getInterfaceAddresses()) {
+                    if (ipAddress.equals(interfaceAddress.getAddress().getHostAddress())) {
+                        return true;
+                    }
+                }
+            }
+        } catch (SocketException e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+
+    public static String getIP(Context application) {
+        WifiManager wifiManager = (WifiManager) application.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        if (!wifiManager.isWifiEnabled()) {
+            try {
+                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()) {
+                            return inetAddress.getHostAddress();
+                        }
+                    }
+                }
+            } catch (SocketException e) {
+                e.printStackTrace();
+            }
+        } else {
+            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+            int ipAddress = wifiInfo.getIpAddress();
+            return intToIp(ipAddress);
+        }
+        return null;
+    }
+
+
+    private static String intToIp(int i) {
+
+        return (i & 0xFF) + "." +
+                ((i >> 8) & 0xFF) + "." +
+                ((i >> 16) & 0xFF) + "." +
+                (i >> 24 & 0xFF);
+    }
+
+    private static String getWifiManagerAddress(Context context) {
+        try {
+            if (context != null) {
+                WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+                if (wifiManager != null && wifiManager.isWifiEnabled()) {
+                    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+                    int ipAddress = wifiInfo.getIpAddress();
+                    return intToIp(ipAddress);
+                }
+            }
+        } catch (Exception ignored) {
+        }
+        return null;
+    }
+
+    public static String getWifiIpV4Address(Context context) {
+        try {
+            //鐩存帴浠巜ifiManager鑾峰彇
+            String managerAddress = getWifiManagerAddress(context);
+            if (!TextUtils.isEmpty(managerAddress)) {
+                return managerAddress;
+            }
+
+            Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
+            while (enumeration.hasMoreElements()) {
+                NetworkInterface network = enumeration.nextElement();
+                if (network == null || network.isVirtual() || !network.isUp() || network.isLoopback() || !network.getName().equalsIgnoreCase("eth0")) {
+                    continue;
+                } else {
+                    Enumeration<InetAddress> addresses = network.getInetAddresses();
+                    while (addresses.hasMoreElements()) {
+                        InetAddress address = addresses.nextElement();
+                        if (!address.isLoopbackAddress() && !address.isAnyLocalAddress()
+                                && !address.isLinkLocalAddress()) {
+                            String hostAddress = address.getHostAddress();
+                            if (hostAddress != null) {
+                                boolean isIPv4 = hostAddress.indexOf(':') < 0;
+                                if (isIPv4) return hostAddress;
+                            }
+
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    public static String getEth0IpV4Address() {
+        try {
+            Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
+            while (enumeration.hasMoreElements()) {
+                NetworkInterface network = enumeration.nextElement();
+                if (network == null || network.isVirtual() || !network.isUp() || network.isLoopback() || !network.getName().equalsIgnoreCase("eth0")) {
+                    continue;
+                } else {
+                    Enumeration<InetAddress> addresses = network.getInetAddresses();
+
+                    while (addresses.hasMoreElements()) {
+                        InetAddress address = addresses.nextElement();
+                        if (!address.isLoopbackAddress() && !address.isAnyLocalAddress()
+                                && !address.isLinkLocalAddress()) {
+                            String hostAddress = address.getHostAddress();
+                            if (hostAddress != null) {
+                                boolean isIPv4 = hostAddress.indexOf(':') < 0;
+                                if (isIPv4) return hostAddress;
+                            }
+
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    /**
+     * @return 鑾峰彇鍏ㄩ儴鏈夋晥ip鍦板潃, 浼樺厛杩斿洖鏈夌嚎ip
+     */
+    public static String getIpV4Address(Context context) {
+
+        try {
+            String eth0IpV4Address = getEth0IpV4Address();
+            if (!TextUtils.isEmpty(eth0IpV4Address)) {
+                return eth0IpV4Address;
+            }
+            String wifiIpV4Address = getWifiIpV4Address(context);
+            if (!TextUtils.isEmpty(wifiIpV4Address)) {
+                return wifiIpV4Address;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
new file mode 100644
index 0000000..40ea989
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
@@ -0,0 +1,63 @@
+package com.hdl.sdk.common.utils;
+
+import android.util.Log;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class LogUtils {
+
+    private static final String TAG = "HDLSDK";
+
+    private static boolean isEnabled = true;
+
+    public static boolean isEnabled() {
+        return isEnabled;
+    }
+
+    public static void setEnabled(boolean enabled) {
+        isEnabled = enabled;
+    }
+
+    public static void d(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.d(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void e(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.e(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void w(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.w(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void v(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.v(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void i(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.i(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void i(String msg) {
+        if (msg != null && isEnabled) {
+            Log.i(TAG, msg);
+        }
+    }
+
+    public static void e(String msg) {
+        if (msg != null && isEnabled) {
+            Log.e(TAG, msg);
+        }
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
new file mode 100644
index 0000000..60f6c5f
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
@@ -0,0 +1,203 @@
+package com.hdl.sdk.common.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Base64;
+
+
+import com.hdl.sdk.common.HDLSdk;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by Tong on 2021/9/28.
+ */
+public class SPUtils {
+    private static final String APP_PREFERENCES_KEY = "profile";
+    private static final SharedPreferences PREFERENCES =
+            HDLSdk.getInstance().getContext().getApplicationContext().getSharedPreferences(APP_PREFERENCES_KEY, Context.MODE_PRIVATE);
+
+    private static SharedPreferences getAppPreference() {
+        return PREFERENCES;
+    }
+
+
+    //======閫氱敤瀛樺偍========
+    public static void put(final String key, final String value) {
+        getAppPreference().edit().putString(key, value).apply();
+    }
+
+
+    public static String getString(final String key) {
+        return getString(key, "");
+    }
+
+
+    public static String getString(final String key, final String defaultValue) {
+        return getAppPreference().getString(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final int value) {
+        put(key, value, false);
+    }
+
+
+    public static void put(final String key, final int value, final boolean isCommit) {
+        getAppPreference().edit().putInt(key, value).apply();
+    }
+
+
+    public static int getInt(final String key) {
+        return getInt(key, -1);
+    }
+
+
+    public static int getInt(final String key, final int defaultValue) {
+        return getAppPreference().getInt(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final long value) {
+        getAppPreference().edit().putLong(key, value).apply();
+    }
+
+
+    public static long getLong(final String key) {
+        return getLong(key, -1L);
+    }
+
+
+    public static long getLong(final String key, final long defaultValue) {
+        return getAppPreference().getLong(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final float value) {
+        getAppPreference().edit().putFloat(key, value).apply();
+    }
+
+
+    public static float getFloat(final String key) {
+        return getFloat(key, -1f);
+    }
+
+
+    public static float getFloat(final String key, final float defaultValue) {
+        return getAppPreference().getFloat(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final boolean value) {
+        getAppPreference().edit().putBoolean(key, value).apply();
+    }
+
+
+    public static boolean getBoolean(final String key) {
+        return getBoolean(key, false);
+    }
+
+
+    public static boolean getBoolean(final String key, final boolean defaultValue) {
+        return getAppPreference().getBoolean(key, defaultValue);
+    }
+
+
+    public static void put(final String key,
+                           final Set<String> value
+    ) {
+
+        getAppPreference().edit().putStringSet(key, value).apply();
+
+    }
+
+
+    public static Set<String> getStringSet(final String key) {
+        return getStringSet(key, Collections.<String>emptySet());
+    }
+
+
+    public static Set<String> getStringSet(final String key,
+                                           final Set<String> defaultValue) {
+        return getAppPreference().getStringSet(key, defaultValue);
+    }
+
+
+    public static Map<String, ?> getAll() {
+        return getAppPreference().getAll();
+    }
+
+
+    public static boolean contains(final String key) {
+        return getAppPreference().contains(key);
+    }
+
+
+    public static void remove(final String key) {
+        getAppPreference().edit().remove(key).apply();
+    }
+
+    public static void clear() {
+        getAppPreference()
+                .edit()
+                .clear()
+                .apply();
+    }
+
+    private static String Object2String(Object object) {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        ObjectOutputStream objectOutputStream = null;
+        try {
+            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
+            objectOutputStream.writeObject(object);
+            String string = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
+            objectOutputStream.close();
+            return string;
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    private static Object String2Object(String objectString) {
+        byte[] mobileBytes = Base64.decode(objectString.getBytes(), Base64.DEFAULT);
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
+        ObjectInputStream objectInputStream = null;
+        try {
+            objectInputStream = new ObjectInputStream(byteArrayInputStream);
+            Object object = objectInputStream.readObject();
+            objectInputStream.close();
+            return object;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static void saveSerializableEntity(String key, Object saveObject) {
+        SharedPreferences.Editor editor = getAppPreference().edit();
+        String string = Object2String(saveObject);
+        editor.putString(key, string);
+        editor.commit();
+    }
+
+    public static Object getSerializableEntity(String key) {
+        String string = getAppPreference().getString(key, null);
+        if (string != null) {
+            Object object = String2Object(string);
+            return object;
+        } else {
+            return null;
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java
new file mode 100644
index 0000000..b7192b0
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java
@@ -0,0 +1,73 @@
+package com.hdl.sdk.common.utils;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * Created by Tong on 2021/9/15.
+ */
+public class ThreadToolUtils {
+
+    private final Handler uiHandler = new Handler(Looper.getMainLooper());
+
+    //cpu 鏈�澶х嚎绋嬪绾抽噺
+    private final int coreSize = Runtime.getRuntime().availableProcessors() + 1;
+
+    private ThreadToolUtils() {
+    }
+
+//    private static class SingletonInstance {
+//    }
+
+    private static final ThreadToolUtils instance = new ThreadToolUtils();
+
+    public static ThreadToolUtils getInstance() {
+        return instance;
+    }
+
+
+    /**
+     * 绾跨▼鏁伴噺鍥哄畾鐨勭嚎绋嬫睜
+     */
+    public ExecutorService newFixedThreadPool(int size) {
+        if (size == 0 || coreSize < size) {
+            return Executors.newFixedThreadPool(coreSize);
+        }
+        return Executors.newFixedThreadPool(size);
+    }
+
+    /**
+     * 瀹氭椂浠诲姟绾跨▼姹�
+     */
+    public ScheduledExecutorService newScheduledThreadPool(int size) {
+        if (size == 0 || coreSize < size) {
+            return Executors.newScheduledThreadPool(coreSize);
+        }
+        return Executors.newScheduledThreadPool(size);
+    }
+
+    /**
+     * 鍗曚竴绾跨▼
+     */
+    public ExecutorService newSingleThreadPool() {
+        return Executors.newSingleThreadExecutor();
+    }
+
+
+    public ExecutorService newCachedThreadPool() {
+        return Executors.newCachedThreadPool();
+    }
+
+    /**
+     * 鍒囨崲鍥炰富绾跨▼
+     */
+    public void runOnUiThread(Runnable run) {
+        uiHandler.post(run);
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java
new file mode 100644
index 0000000..41115ed
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java
@@ -0,0 +1,55 @@
+package com.hdl.sdk.common.utils.gson;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/9/8.
+ */
+public class GsonConvert {
+
+    private static Gson gson = null;
+
+    public static Gson getGson() {
+        if (gson == null) {
+            synchronized (GsonConvert.class) {
+                if (gson == null) {
+                    gson = new GsonBuilder()
+                            .setPrettyPrinting()
+                            .disableHtmlEscaping()
+                            .registerTypeAdapter(String.class, new StringTypeAdapter())
+                            .create();
+                }
+            }
+        }
+        return gson;
+    }
+
+    private static class StringTypeAdapter implements JsonSerializer<String>, JsonDeserializer<String> {
+        @Override
+        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+                throws JsonParseException {
+            if (json instanceof JsonPrimitive) {
+                return json.getAsString();
+            } else {
+                return json.toString();
+            }
+        }
+
+        @Override
+        public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
new file mode 100644
index 0000000..ebdac92
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
@@ -0,0 +1,43 @@
+package com.hdl.sdk.common.utils.gson;
+
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/9/17.
+ */
+public class ParameterizedTypeImpl implements ParameterizedType {
+
+    private final Type[] actualTypeArguments;
+    private final Type rawType;
+    private final Type ownerType;
+
+    public ParameterizedTypeImpl(Type rawType, Type[] actualTypeArguments, Type ownerType) {
+        this.ownerType = ownerType;
+        this.rawType = rawType;
+        this.actualTypeArguments = actualTypeArguments;
+    }
+
+    public static Type getType(Type rawType, Type[] actualTypeArguments) {
+        return new ParameterizedTypeImpl(rawType, actualTypeArguments, null);
+    }
+
+
+    @Override
+    public Type[] getActualTypeArguments() {
+        return actualTypeArguments;
+    }
+
+
+    @Override
+    public Type getRawType() {
+        return rawType;
+    }
+
+
+    @Override
+    public Type getOwnerType() {
+        return ownerType;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
index e5e993b..9ee990e 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -1,10 +1,22 @@
 package com.hdl.sdk.connect;
 
+import android.content.Context;
+
+import com.hdl.hdlhttp.HxHttpConfig;
+import com.hdl.sdk.common.event.DeleteNetworkListener;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
 import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
+import com.hdl.sdk.connect.bean.request.ListUploadRequest;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.connect.cloud.CallBackListener;
+import com.hdl.sdk.connect.cloud.CheckAppVersionListener;
+import com.hdl.sdk.connect.cloud.HdlCloudApi;
+import com.hdl.sdk.connect.cloud.HdlCloudController;
+import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor;
+import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.common.event.EventDispatcher;
 import com.hdl.sdk.common.event.EventListener;
@@ -15,6 +27,9 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import io.reactivex.rxjava3.disposables.Disposable;
+import okhttp3.logging.HttpLoggingInterceptor;
+
 /**
  * Created by jlchen on 11/15/21.
  *
@@ -24,13 +39,17 @@
     /**
      * instance
      */
-    private  static final HDLLink instance=new HDLLink();
+    private static final HDLLink instance = new HDLLink();
+
+    private String appKey, appSecret;
+    public DeleteNetworkListener listener;
+
     /**
      * getInstance
      *
      * @return HDLLink
      */
-    public static  HDLLink getInstance() {
+    public static HDLLink getInstance() {
 //        if (instance == null) {
 //            synchronized (HDLLink.class) {
 //                if (instance == null) {
@@ -41,30 +60,63 @@
         return instance;
     }
 
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public void setAppKey(String appKey) {
+        this.appKey = appKey;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+
     /**
      * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
      * @param listener
      */
-    public synchronized void registerAllTopicsListener(EventListener listener){
+    public synchronized void registerAllTopicsListener(EventListener listener) {
         EventDispatcher.getInstance().registerAllTopicsListener(listener);
     }
+
     /**
      * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
      * @param listener
      */
     public synchronized void removeAllTopicsListener(EventListener listener) {
-        if(listener == null) return;
+        if (listener == null) return;
         EventDispatcher.getInstance().removeAllTopicsListener(listener);
+    }
+
+    /**
+     * 娉ㄥ唽閫�缃戜富棰樼殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void setDeleteNetworkListener(DeleteNetworkListener listener) {
+        this.listener = listener;
     }
 
     /***********************涓夋柟璁惧鍜岀綉鍏抽�氫俊涔嬪墠鐨勮璇佹祦绋�****************************/
     /**
      * 妫�娴嬫槸鍚﹀凡缁忚璇佽繃
      * 璁よ瘉閫氳繃鎵嶈兘杩涜璁惧鎺у埗
+     *
      * @return
      */
-    public boolean checkIfCertified(){
+    public boolean checkIfCertified() {
         return HDLLinkConfig.getInstance().checkIfCertified();
+    }
+
+    public void selectNetwork(String networkName) {
+        HDLLinkConfig.getInstance().setNetworkName(networkName);
     }
 
     /**
@@ -75,7 +127,7 @@
      */
     public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
         LogUtils.i("鍙戦�佽璇佽姹�");
-        HDLAuthSocket.getInstance().startAuthenticateRequest(request,callBack);
+        HDLAuthSocket.getInstance().startAuthenticateRequest(request, callBack);
     }
 
     /**
@@ -89,26 +141,90 @@
         HDLAuthSocket.getInstance().sendAuthenticateRequest(ip, request, callBack);
     }
 
-    //    /**
-//     * 寮�濮嬫悳绱㈡墍鏈夌綉鍏筹紝鏈夌綉鍏冲洖澶嶅氨鍥炶皟锛屼笂灞傝嚜宸卞仛鍘婚噸鍒ゆ柇
-//     *
-//     * @param callBack 鍥炶皟
-//     */
-//    public void startSearchAllGateway(HDLAuthSocket.SearchGatewayCallBack callBack) {
-//
-//    }
-//
-//    /**
-//     * 鏆傚仠鎼滅储缃戝叧
-//     */
-//    public void endSearchAllGateway() {
-//
-//    }
+    /**
+     * 鍏ョ綉璁よ瘉缁撴灉鍙嶉
+     *
+     * @param mac       mac
+     * @param result    缁撴灉0/-1
+     * @param message   璁よ瘉淇℃伅
+     * @param auth_code 浜戠璁よ瘉code
+     * @param callBack  缁撴灉鍥炶皟
+     */
+    public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, callBack);
+    }
+
+    /**
+     * 鐢宠璁惧瀵嗛挜(鏍规嵁璁惧MAC)
+     *
+     * @param supplier 鍘傚晢
+     * @param mac      璁惧mac
+     * @param spk      璁惧spk
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void applyDeviceSecret(Context context, String appKey, String appSecret, String supplier, String mac, String spk, CallBackListener callBack) {
+        LogUtils.i("鐢宠璁惧瀵嗛挜");
+        HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL)
+                .addInterceptor(
+                        new EncryptInterceptor(),
+                        new SmartHeaderInterceptor());
+        this.appKey = appKey;
+        this.appSecret = appSecret;
+
+        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
+        httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
+
+        HxHttpConfig.getInstance()
+                //.addInterceptor(new HttpCacheInterceptor())
+                .addInterceptor(httpLoggingInterceptor).ignoreSSL();
+
+        HdlCloudController.applyDeviceSecret(supplier, mac, spk, callBack);
+    }
+
+    /**
+     * 妫�娴嬫洿鏂�
+     *
+     * @param appKey      appKey
+     * @param appSecret   appSecret
+     * @param versionCode 褰撳墠鐗堟湰
+     * @param appCode     appCode
+     * @param listener    缁撴灉鍥炶皟
+     */
+    public void checkAppVersion(Context context, String appKey, String appSecret, String versionCode, String appCode, CheckAppVersionListener listener) {
+        LogUtils.i("妫�娴嬫洿鏂�");
+        HxHttpConfig.getInstance().init(context, HdlCloudApi.BASE_CHINA_URL)
+                .addInterceptor(
+                        new EncryptInterceptor(),
+                        new SmartHeaderInterceptor());
+        this.appKey = appKey;
+        this.appSecret = appSecret;
+
+        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
+        httpLoggingInterceptor.level(HttpLoggingInterceptor.Level.BODY);
+
+        HxHttpConfig.getInstance()
+                //.addInterceptor(new HttpCacheInterceptor())
+                .addInterceptor(httpLoggingInterceptor).ignoreSSL();
+
+        HdlCloudController.checkAppVersion(versionCode, appCode, listener);
+    }
+
+    /**
+     * 閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧
+     *
+     * @param oid      浠庣綉鍏筹紙璁惧锛塷id
+     * @param isForce  鏄惁寮哄埗閫�缃�
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().deleteNetwork(oid, isForce, callBack);
+    }
 
     /***********************涓夋柟璁惧璇峰厛璁よ瘉鎴愬姛 鍐嶈皟鐢ㄤ笅闈㈢殑鎺ュ彛鍜岀綉鍏抽�氫俊****************************/
     /**
      * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
-     * @param callBack  鍥炶皟
+     *
+     * @param callBack 鍥炶皟
      */
     public void searchGatewayMulticast(HDLAuthSocket.SearchGatewayCallBack callBack) {
         HDLAuthSocket.getInstance().searchGatewayMulticast(callBack);
@@ -116,7 +232,8 @@
 
     /**
      * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
-     * @param callBack  鍥炶皟
+     *
+     * @param callBack 鍥炶皟
      */
     public void searchGatewayBroadcast(HDLAuthSocket.SearchGatewayCallBack callBack) {
         HDLAuthSocket.getInstance().searchGatewayBroadcast(callBack);
@@ -148,7 +265,8 @@
 
     /**
      * 璁惧鎺у埗
-     * @param request 鎺у埗鐘舵�佸弬鏁�
+     *
+     * @param request  鎺у埗鐘舵�佸弬鏁�
      * @param callBack 缁撴灉鍥炶皟
      */
     public void propertyDown(List<DeviceControlRequest> request, HDLLinkCallBack callBack) {
@@ -157,7 +275,8 @@
 
     /**
      * 璇诲彇鐘舵��
-     * @param sids 璇锋眰鍙傛暟 鎸囧畾璇诲彇鐨勮澶噑id鍒楄〃
+     *
+     * @param sids     璇锋眰鍙傛暟 鎸囧畾璇诲彇鐨勮澶噑id鍒楄〃
      * @param callBack 鍥炶皟
      */
     public void propertyRead(List<String> sids, HDLLinkCallBack callBack) {
@@ -172,8 +291,19 @@
     }
 
     /**
+     * 鍦烘櫙璇︽儏
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void getScene(List<String> sids, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().getScene(sids, callBack);
+    }
+
+    /**
      * 鍦烘櫙鎺у埗
-     * @param sids 鍦烘櫙sid鍒楄〃
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
      * @param callBack 鍥炶皟
      */
     public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
@@ -181,25 +311,37 @@
     }
 
     /**
+     * 涓婃姤oid鍒楄〃
+     *
+     * @param request  璁惧淇℃伅
+     * @param callBack 鍥炶皟
+     */
+    public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().UploadOidList(request, callBack);
+    }
+
+    /**
      * 閫氱敤UDP鍙戦�佹寚浠�
      * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
-     * @param topic 鍙戦�佹暟鎹�
-     * @param bodyStr body鍐呭
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param bodyStr  body鍐呭
      * @param callBack 鍥炶皟
      */
     public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false, callBack);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false, callBack);
     }
 
     /**
      * 閫氱敤骞挎挱UDP鍙戦�佹寚浠�
      * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
-     * @param topic 鍙戦�佹暟鎹�
-     * @param bodyStr body鍐呭
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param bodyStr  body鍐呭
      * @param callBack 鍥炶皟
      */
     public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true, callBack);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true, callBack);
     }
 
     /**
@@ -218,28 +360,28 @@
     /**
      * 閫氱敤鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic   鍙戦�佹暟鎹�
+     * @param bodyStr 鍥炲鐨勪富棰�
      */
     public void udpSendMsg(String topic, String bodyStr) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, false);
     }
 
     /**
      * 閫氱敤骞挎挱鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic   鍙戦�佹暟鎹�
+     * @param bodyStr 鍥炲鐨勪富棰�
      */
     public void udpBroadcastSendMsg(String topic, String bodyStr) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, true);
     }
 
     /**
      * 閫氱敤TCP鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic   鍙戦�佹暟鎹�
+     * @param bodyStr 鍥炲鐨勪富棰�
      */
     public void tcpSendMsg(String topic, String bodyStr) {
         HDLAuthSocket.getInstance();//閫氳繃杩欎釜鍙互鍏堝垵濮嬪寲UDP鐩戝惉浜嬩欢
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
index 9a9b5ae..8184536 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
@@ -1,8 +1,8 @@
 package com.hdl.sdk.connect.bean;
 
+
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
 
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
@@ -56,7 +56,6 @@
         this.length = length;
     }
 
-    @NonNull
     @Override
     public String toString() {
         return "Topic:" +
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkResponse.java
index 8364f80..65677eb 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkResponse.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkResponse.java
@@ -1,8 +1,8 @@
 package com.hdl.sdk.connect.bean;
 
+
 import android.text.TextUtils;
 
-import androidx.annotation.NonNull;
 
 import com.hdl.sdk.common.utils.gson.GsonConvert;
 
@@ -57,7 +57,7 @@
         this.length = length;
     }
 
-    @NonNull
+
     @Override
     public String toString() {
         return GsonConvert.getGson().toJson(this);
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java
new file mode 100644
index 0000000..394ad89
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.connect.bean;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2022/09/23.
+ */
+
+public class LoginRequest implements Serializable {
+
+
+    private String clientType;
+    private String version;
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
index e7ba0f3..6aac1aa 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
@@ -1,5 +1,7 @@
 package com.hdl.sdk.connect.bean.request;
 
+import com.hdl.sdk.common.utils.SPUtils;
+
 import java.io.Serializable;
 
 /**
@@ -15,17 +17,37 @@
     private AuthenticateDeviceInfoBean objects;//褰撳墠璁惧鍩烘湰淇℃伅
     private AuthBean auth;//璁よ瘉淇℃伅
 
-    public String getID() { return id; }
-    public void setID(String value) { this.id = value; }
+    public String getID() {
+        return id;
+    }
 
-    public String getTimeStamp() { return time_stamp; }
-    public void setTimeStamp(String value) { this.time_stamp = value; }
+    public void setID(String value) {
+        this.id = value;
+    }
 
-    public AuthenticateDeviceInfoBean getObjects() { return objects; }
-    public void setObjects(AuthenticateDeviceInfoBean value) { this.objects = value; }
+    public String getTimeStamp() {
+        return time_stamp;
+    }
 
-    public AuthBean getAuth() { return auth; }
-    public void setAuth(AuthBean value) { this.auth = value; }
+    public void setTimeStamp(String value) {
+        this.time_stamp = value;
+    }
+
+    public AuthenticateDeviceInfoBean getObjects() {
+        return objects;
+    }
+
+    public void setObjects(AuthenticateDeviceInfoBean value) {
+        this.objects = value;
+    }
+
+    public AuthBean getAuth() {
+        return auth;
+    }
+
+    public void setAuth(AuthBean value) {
+        this.auth = value;
+    }
 
     public AuthenticateRequest(String id, String time_stamp, AuthenticateDeviceInfoBean objects, AuthBean auth) {
         this.id = id;
@@ -53,39 +75,58 @@
 
         /**
          * MAC key
+         *
          * @return
          */
-        public String getMACKey() { return mac_key; }
+        public String getMACKey() {
+            return mac_key;
+        }
 
         /**
          * MACkey
+         *
          * @param value
          */
-        public void setMACKey(String value) { this.mac_key = value; }
+        public void setMACKey(String value) {
+            this.mac_key = value;
+            SPUtils.put("auth_mackey_key", mac_key);
+        }
 
         /**
          * SPK
+         *
          * @return
          */
-        public String getSpk() { return spk; }
+        public String getSpk() {
+            return spk;
+        }
 
         /**
          * SPK
+         *
          * @param value
          */
-        public void setSpk(String value) { this.spk = value; }
+        public void setSpk(String value) {
+            this.spk = value;
+        }
 
-        public RequestBean getRequest() { return request; }
-        public void setRequest(RequestBean value) { this.request = value; }
+        public RequestBean getRequest() {
+            return request;
+        }
+
+        public void setRequest(RequestBean value) {
+            this.request = value;
+        }
 
         public AuthBean() {
 
         }
 
         /**
-         *  璁よ瘉淇℃伅
+         * 璁よ瘉淇℃伅
+         *
          * @param mac_key mac key
-         * @param spk 浜у搧spk
+         * @param spk     浜у搧spk
          * @param request 璇锋眰瀵硅薄
          */
         public AuthBean(String mac_key, String spk, RequestBean request) {
@@ -95,12 +136,17 @@
         }
     }
 
-    public static class RequestBean implements Serializable{
+    public static class RequestBean implements Serializable {
         private String mac;//璁惧mac
         private String supplier;//鍘傚
         private String hardware_model;//璁惧鍨嬪彿
         private String firmware_version;//绋嬪簭鐗堟湰
-        public RequestBean(){};
+
+        public RequestBean() {
+        }
+
+        ;
+
         public RequestBean(String mac, String supplier, String hardware_model, String firmware_version) {
             this.mac = mac;
             this.supplier = supplier;
@@ -110,54 +156,78 @@
 
         /**
          * 璁惧MAC
+         *
          * @return
          */
-        public String getMAC() { return mac; }
+        public String getMAC() {
+            return mac;
+        }
 
         /**
          * 璁惧MAC
+         *
          * @param value
          */
-        public void setMAC(String value) { this.mac = value; }
+        public void setMAC(String value) {
+            this.mac = value;
+        }
 
         /**
          * 鍘傚
+         *
          * @return
          */
-        public String getSupplier() { return supplier; }
+        public String getSupplier() {
+            return supplier;
+        }
 
         /**
          * 鍘傚
+         *
          * @param value
          */
-        public void setSupplier(String value) { this.supplier = value; }
+        public void setSupplier(String value) {
+            this.supplier = value;
+        }
 
         /**
          * 纭欢鐗堟湰
+         *
          * @return
          */
-        public String getHardwareModel() { return hardware_model; }
+        public String getHardwareModel() {
+            return hardware_model;
+        }
 
         /**
          * 纭欢鐗堟湰
+         *
          * @param value
          */
-        public void setHardwareModel(String value) { this.hardware_model = value; }
+        public void setHardwareModel(String value) {
+            this.hardware_model = value;
+        }
 
         /**
          * 杞欢鐗堟湰
+         *
          * @return
          */
-        public String getFirmwareVersion() { return firmware_version; }
+        public String getFirmwareVersion() {
+            return firmware_version;
+        }
 
         /**
          * 杞欢鐗堟湰
+         *
          * @param value
          */
-        public void setFirmwareVersion(String value) { this.firmware_version = value; }
+        public void setFirmwareVersion(String value) {
+            this.firmware_version = value;
+        }
     }
 
-    public static class AuthenticateDeviceInfoBean implements Serializable{
+    public static class AuthenticateDeviceInfoBean implements Serializable {
         private String oid;//璁惧鐨凮id
         private String device_mac;//璁惧鐨凪ac
         private String device_name;//
@@ -173,148 +243,232 @@
         private String gateway_type;
         private String hw_version;
         private String fw_version;
+        private String supplier;//鍘傚晢
 
-        public String getOID() { return oid; }
+        public String getSupplier() {
+            return supplier;
+        }
+
+        public void setSupplier(String supplier) {
+            this.supplier = supplier;
+        }
+
+        public String getOID() {
+            return oid;
+        }
 
         /**
          * 璁惧Oid
+         *
          * @param value
          */
-        public void setOID(String value) { this.oid = value; }
+        public void setOID(String value) {
+            this.oid = value;
+        }
 
-        public String getDeviceMAC() { return device_mac; }
+        public String getDeviceMAC() {
+            return device_mac;
+        }
 
         /**
          * 璁惧Mac
+         *
          * @param value
          */
-        public void setDeviceMAC(String value) { this.device_mac = value; }
+        public void setDeviceMAC(String value) {
+            this.device_mac = value;
+        }
 
         /**
          * 璁惧鍚�
+         *
          * @return
          */
-        public String getDeviceName() { return device_name; }
+        public String getDeviceName() {
+            return device_name;
+        }
 
         /**
          * 璁惧鍚�
+         *
          * @param value
          */
-        public void setDeviceName(String value) { this.device_name = value; }
+        public void setDeviceName(String value) {
+            this.device_name = value;
+        }
 
         /**
          * 璁惧鍨嬪彿
+         *
          * @return
          */
-        public String getDeviceModel() { return device_model; }
+        public String getDeviceModel() {
+            return device_model;
+        }
 
         /**
          * 璁惧鍨嬪彿
+         *
          * @param value
          */
-        public void setDeviceModel(String value) { this.device_model = value; }
+        public void setDeviceModel(String value) {
+            this.device_model = value;
+        }
 
         /**
          * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         *
          * @return
          */
-        public String getAccessMode() { return access_mode; }
+        public String getAccessMode() {
+            return access_mode;
+        }
 
         /**
          * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         *
          * @param value
          */
-        public void setAccessMode(String value) { this.access_mode = value; }
+        public void setAccessMode(String value) {
+            this.access_mode = value;
+        }
 
         /**
          * 璁惧sid
+         *
          * @return
          */
-        public String getSid() { return sid; }
+        public String getSid() {
+            return sid;
+        }
 
         /**
          * 璁惧sid
+         *
          * @param value
          */
-        public void setSid(String value) { this.sid = value; }
+        public void setSid(String value) {
+            this.sid = value;
+        }
 
         /**
          * 璁惧IPMAC
+         *
          * @return
          */
-        public String getIPMAC() { return ip_mac; }
+        public String getIPMAC() {
+            return ip_mac;
+        }
 
         /**
          * 璁惧IPMAC
+         *
          * @param value
          */
-        public void setIPMAC(String value) { this.ip_mac = value; }
+        public void setIPMAC(String value) {
+            this.ip_mac = value;
+        }
 
         /**
          * 璁惧IP鍦板潃
+         *
          * @return
          */
-        public String getIPAddress() { return ip_address; }
+        public String getIPAddress() {
+            return ip_address;
+        }
 
         /**
          * 璁惧IP鍦板潃
+         *
          * @param value
          */
-        public void setIPAddress(String value) { this.ip_address = value; }
+        public void setIPAddress(String value) {
+            this.ip_address = value;
+        }
 
         /**
          * 瀛愮綉鎺╃爜
+         *
          * @return
          */
-        public String getNetmask() { return netmask; }
+        public String getNetmask() {
+            return netmask;
+        }
 
         /**
          * 瀛愮綉鎺╃爜
+         *
          * @param value
          */
-        public void setNetmask(String value) { this.netmask = value; }
+        public void setNetmask(String value) {
+            this.netmask = value;
+        }
 
         /**
          * 缃戝叧IP
+         *
          * @return
          */
-        public String getIPGateway() { return ip_gateway; }
+        public String getIPGateway() {
+            return ip_gateway;
+        }
 
         /**
          * 缃戝叧IP
+         *
          * @param value
          */
-        public void setIPGateway(String value) { this.ip_gateway = value; }
+        public void setIPGateway(String value) {
+            this.ip_gateway = value;
+        }
 
         /**
          * DNS1
+         *
          * @return
          */
-        public String getDns1() { return dns1; }
+        public String getDns1() {
+            return dns1;
+        }
 
         /**
          * DNS1
+         *
          * @param value
          */
-        public void setDns1(String value) { this.dns1 = value; }
+        public void setDns1(String value) {
+            this.dns1 = value;
+        }
 
         /**
          * DNS2
+         *
          * @return
          */
-        public String getDns2() { return dns2; }
+        public String getDns2() {
+            return dns2;
+        }
 
         /**
          * DNS2
+         *
          * @param value
          */
-        public void setDns2(String value) { this.dns2 = value; }
+        public void setDns2(String value) {
+            this.dns2 = value;
+        }
 
-        public VersionBean[] getVersions() {return null;  }
-        public void setVersions(VersionBean[] value) {  }
+        public VersionBean[] getVersions() {
+            return null;
+        }
+
+        public void setVersions(VersionBean[] value) {
+        }
 
         /**
          * 缃戝叧绫诲瀷
+         *
          * @return
          */
         public String getGateway_type() {
@@ -323,6 +477,7 @@
 
         /**
          * 缃戝叧绫诲瀷
+         *
          * @param gateway_type
          */
         public void setGateway_type(String gateway_type) {
@@ -331,6 +486,7 @@
 
         /**
          * 纭欢鐗堟湰
+         *
          * @return
          */
         public String getHw_version() {
@@ -338,7 +494,8 @@
         }
 
         /**
-         *纭欢鐗堟湰
+         * 纭欢鐗堟湰
+         *
          * @param
          */
         public void setHw_version(String hw_version) {
@@ -348,6 +505,7 @@
 
         /**
          * 鍥轰欢鐗堟湰
+         *
          * @return
          */
         public String getFw_version() {
@@ -356,6 +514,7 @@
 
         /**
          * 鍥轰欢鐗堟湰
+         *
          * @param fw_version
          */
         public void setFw_version(String fw_version) {
@@ -363,7 +522,7 @@
         }
     }
 
-    public static class VersionBean implements Serializable{
+    public static class VersionBean implements Serializable {
         private String module;
         private String version;
 
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/DeviceAuthRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/DeviceAuthRequest.java
new file mode 100644
index 0000000..57d8946
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/DeviceAuthRequest.java
@@ -0,0 +1,48 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by panlili on 2023/1/31
+ * description:
+ */
+public class DeviceAuthRequest {
+
+    private String mac;//mac
+    private String result;//0涓烘垚鍔燂紝-1涓哄け璐�
+    private String message;//success
+    private String auth_code;//浜戠璁よ瘉杩斿洖鐨刢ode
+
+    public String getMac() {
+        return mac;
+    }
+
+    public void setMac(String mac) {
+        this.mac = mac;
+    }
+
+    public String getResult() {
+        return result;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getAuth_code() {
+        return auth_code;
+    }
+
+    public void setAuth_code(String auth_code) {
+        this.auth_code = auth_code;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/GatewayInfoRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/GatewayInfoRequest.java
new file mode 100644
index 0000000..c750cc2
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/GatewayInfoRequest.java
@@ -0,0 +1,129 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by panlili on 2023/1/31
+ * description:
+ */
+public class GatewayInfoRequest {
+
+    private String device_model;
+    private String device_mac;//璁惧鐨凪ac
+    private String device_name;
+    private String gateway_type;//杩欓噷濉玸pk
+    private String access_mode;
+    private String oid;//璁惧鐨凮id
+    private String sid;//璁惧鐨剆id
+    private String supplier;//鍘傚晢
+    private String hw_version;
+    private String fw_version;
+    private String ip_address;
+    private String master;
+    private boolean isLocalEncrypt;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getDevice_name() {
+        return device_name;
+    }
+
+    public void setDevice_name(String device_name) {
+        this.device_name = device_name;
+    }
+
+    public String getDevice_model() {
+        return device_model;
+    }
+
+    public void setDevice_model(String device_model) {
+        this.device_model = device_model;
+    }
+
+    public String getDevice_mac() {
+        return device_mac;
+    }
+
+    public void setDevice_mac(String device_mac) {
+        this.device_mac = device_mac;
+    }
+
+    public String getGateway_type() {
+        return gateway_type;
+    }
+
+    public void setGateway_type(String gateway_type) {
+        this.gateway_type = gateway_type;
+    }
+
+    public String getAccess_mode() {
+        return access_mode;
+    }
+
+    public void setAccess_mode(String access_mode) {
+        this.access_mode = access_mode;
+    }
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getHw_version() {
+        return hw_version;
+    }
+
+    public void setHw_version(String hw_version) {
+        this.hw_version = hw_version;
+    }
+
+    public String getFw_version() {
+        return fw_version;
+    }
+
+    public void setFw_version(String fw_version) {
+        this.fw_version = fw_version;
+    }
+
+    public String getIp_address() {
+        return ip_address;
+    }
+
+    public void setIp_address(String ip_address) {
+        this.ip_address = ip_address;
+    }
+
+    public String getMaster() {
+        return master;
+    }
+
+    public void setMaster(String master) {
+        this.master = master;
+    }
+
+    public boolean isLocalEncrypt() {
+        return isLocalEncrypt;
+    }
+
+    public void setLocalEncrypt(boolean localEncrypt) {
+        isLocalEncrypt = localEncrypt;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest.java
new file mode 100644
index 0000000..32b1cd0
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest.java
@@ -0,0 +1,20 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2022/09/23.
+ */
+
+public class ListOidRequest implements Serializable {
+
+    private String oid;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest2.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest2.java
new file mode 100644
index 0000000..24aa094
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListOidRequest2.java
@@ -0,0 +1,29 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2022/09/23.
+ */
+
+public class ListOidRequest2 implements Serializable {
+
+    private String oid;
+    private String mac;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getMac() {
+        return mac;
+    }
+
+    public void setMac(String mac) {
+        this.mac = mac;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListUploadRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListUploadRequest.java
new file mode 100644
index 0000000..03e78a2
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/ListUploadRequest.java
@@ -0,0 +1,127 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by panlili on 2023/1/31
+ * description:
+ */
+public class ListUploadRequest {
+
+    private String oid;//璁惧鐨凮id
+    private String device_name;
+    private String device_model;
+    private String device_mac;//璁惧鐨凪ac
+    private String addresses;//椹卞姩鐢ㄧ殑绉佹湁鍦板潃锛屽娌℃湁鍒欑┖鐫�灏卞彲浠�
+    private String driver_code;//椹卞姩鐢ㄧ殑id锛屽娌℃湁鍒欑┖鐫�灏卞彲浠�
+    private String src;//鏉ヨ嚜鍝釜椹卞姩锛屽Link璁惧娌℃湁鍒欏~"LINK"
+    private String from;//鏉ヨ嚜鍝釜缃戝叧锛屽鏋滄椂Link缃戠粶璁惧锛屽垯濉嚜韬玱id锛涘鏋滄槸椹卞姩鍒欎笉闇�瑕佹瀛楁
+    private List<ImageInfo> image_info;
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getDevice_name() {
+        return device_name;
+    }
+
+    public void setDevice_name(String device_name) {
+        this.device_name = device_name;
+    }
+
+    public String getDevice_model() {
+        return device_model;
+    }
+
+    public void setDevice_model(String device_model) {
+        this.device_model = device_model;
+    }
+
+    public String getDevice_mac() {
+        return device_mac;
+    }
+
+    public void setDevice_mac(String device_mac) {
+        this.device_mac = device_mac;
+    }
+
+    public String getAddresses() {
+        return addresses;
+    }
+
+    public void setAddresses(String addresses) {
+        this.addresses = addresses;
+    }
+
+    public String getDriver_code() {
+        return driver_code;
+    }
+
+    public void setDriver_code(String driver_code) {
+        this.driver_code = driver_code;
+    }
+
+    public String getSrc() {
+        return src;
+    }
+
+    public void setSrc(String src) {
+        this.src = src;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public List<ImageInfo> getImage_info() {
+        return image_info;
+    }
+
+    public void setImage_info(List<ImageInfo> image_info) {
+        this.image_info = image_info;
+    }
+
+    public static class ImageInfo implements Serializable {
+
+        //闀滃儚鍙凤紝鐢ㄤ簬鍗囩骇鍖归厤
+        private String image_info;
+
+        private String hw_version;
+
+        private String fw_version;
+
+        public String getImage_info() {
+            return image_info;
+        }
+
+        public void setImage_info(String image_info) {
+            this.image_info = image_info;
+        }
+
+        public String getHw_version() {
+            return hw_version;
+        }
+
+        public void setHw_version(String hw_version) {
+            this.hw_version = hw_version;
+        }
+
+        public String getFw_version() {
+            return fw_version;
+        }
+
+        public void setFw_version(String fw_version) {
+            this.fw_version = fw_version;
+        }
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/AuthenticateResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/AuthenticateResponse.java
index e2b8b07..1efcb5d 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/AuthenticateResponse.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/AuthenticateResponse.java
@@ -11,21 +11,35 @@
     private String code;
     private GatewayObjects objects;
     private Auth auth;
+    private String ip_address;
 
     public String getCode() { return code; }
     public void setCode(String value) { this.code = value; }
 
     public GatewayObjects getObjects() { return objects; }
-    public void setObjects(GatewayObjects value) { this.objects = value; }
+    public void setObjects(GatewayObjects value) {
+        this.objects = value;
+    }
 
     public Auth getAuth() { return auth; }
     public void setAuth(Auth value) { this.auth = value; }
+
+    public String getIp_address() {
+        return ip_address;
+    }
+
+    public void setIp_address(String ip_address) {
+        this.ip_address = ip_address;
+    }
 
     public class Auth implements Serializable {
         private String localSecret;
 
         public String getLocalSecret() { return localSecret; }
-        public void setLocalSecret(String value) { this.localSecret = value; }
+        public void setLocalSecret(String value) {
+            this.localSecret = value;
+        }
+
     }
 
     public class GatewayObjects implements Serializable  {
@@ -34,10 +48,14 @@
         private String oid;
 
         public String getIPAddress() { return ip_address; }
-        public void setIPAddress(String value) { this.ip_address = value; }
+        public void setIPAddress(String value) {
+            this.ip_address = value;
+        }
 
         public String getGatewayID() { return gatewayId; }
-        public void setGatewayID(String value) { this.gatewayId = value; }
+        public void setGatewayID(String value) {
+            this.gatewayId = value;
+        }
 
         public String getOID() { return oid; }
         public void setOID(String value) { this.oid = value; }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BaseLocalCodeResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BaseLocalCodeResponse.java
new file mode 100644
index 0000000..94ecf31
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/BaseLocalCodeResponse.java
@@ -0,0 +1,47 @@
+package com.hdl.sdk.connect.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class BaseLocalCodeResponse<T> implements Serializable {
+
+
+    private String id;
+    private String time_stamp;
+    private String code;
+    private T objects;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getTime_stamp() {
+        return time_stamp;
+    }
+
+    public void setTime_stamp(String time_stamp) {
+        this.time_stamp = time_stamp;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public T getObjects() {
+        return objects;
+    }
+
+    public void setObjects(T objects) {
+        this.objects = objects;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceDeleteResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceDeleteResponse.java
new file mode 100644
index 0000000..1e9d43c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceDeleteResponse.java
@@ -0,0 +1,62 @@
+package com.hdl.sdk.connect.bean.response;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by jlchen on 11/12/21.
+ *
+ * @Description : DeviceDeleteResponse
+ */
+public class DeviceDeleteResponse extends BaseResponse {
+    private List<GatewayObjects> objects;
+
+    public List<GatewayObjects> getObjects() {
+        return objects;
+    }
+
+    public void setObjects(List<GatewayObjects> objects) {
+        this.objects = objects;
+    }
+
+    public class GatewayObjects implements Serializable {
+        private String device_name;
+        private String oid;
+        private boolean isSaveOidInfo;
+        private boolean isDeletOidInfo;
+
+        public String getOID() {
+            return oid;
+        }
+
+        public void setOID(String value) {
+            this.oid = value;
+        }
+
+        public String getDevice_name() {
+            return device_name;
+        }
+
+        public void setDevice_name(String device_name) {
+            this.device_name = device_name;
+        }
+
+        public boolean isSaveOidInfo() {
+            return isSaveOidInfo;
+        }
+
+        public void setSaveOidInfo(boolean saveOidInfo) {
+            isSaveOidInfo = saveOidInfo;
+        }
+
+        public boolean isDeletOidInfo() {
+            return isDeletOidInfo;
+        }
+
+        public void setDeletOidInfo(boolean deletOidInfo) {
+            isDeletOidInfo = deletOidInfo;
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java
new file mode 100644
index 0000000..a819363
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java
@@ -0,0 +1,79 @@
+package com.hdl.sdk.connect.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/12/21.
+ *
+ * @Description : DeviceInfoResponse
+ */
+public class DeviceInfoResponse extends BaseResponse {
+    private GatewayObjects objects;
+
+    public GatewayObjects getObjects() {
+        return objects;
+    }
+
+    public void setObjects(GatewayObjects value) {
+        this.objects = value;
+    }
+
+    public class GatewayObjects implements Serializable {
+        private String ip_address;
+        private String gatewayId;
+        private String oid;
+        private String homeId;
+        private String mac;
+        private String local_secret;
+
+        public String getIPAddress() {
+            return ip_address;
+        }
+
+        public void setIPAddress(String value) {
+            this.ip_address = value;
+        }
+
+        public String getGatewayID() {
+            return gatewayId;
+        }
+
+        public void setGatewayID(String value) {
+            this.gatewayId = value;
+        }
+
+        public String getOID() {
+            return oid;
+        }
+
+        public void setOID(String value) {
+            this.oid = value;
+        }
+
+        public String getHomeId() {
+            return homeId;
+        }
+
+        public void setHomeId(String homeId) {
+            this.homeId = homeId;
+        }
+
+        public String getMac() {
+            return mac;
+        }
+
+        public void setMac(String mac) {
+            this.mac = mac;
+        }
+
+        public String getLocalSecret() {
+            return local_secret;
+        }
+
+        public void setLocalSecret(String localSecret) {
+            local_secret = localSecret;
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/NetworkAccessBroadcastResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/NetworkAccessBroadcastResponse.java
index 9e01eba..8478008 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/NetworkAccessBroadcastResponse.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/NetworkAccessBroadcastResponse.java
@@ -18,5 +18,4 @@
 
     public String getHomeID() { return homeId; }
     public void setHomeID(String value) { this.homeId = value; }
-
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/UpdateInfo.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/UpdateInfo.java
new file mode 100644
index 0000000..1e94436
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/UpdateInfo.java
@@ -0,0 +1,90 @@
+package com.hdl.sdk.connect.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by panlili on 2023/8/30.
+ */
+public class UpdateInfo implements Serializable {
+
+    private String version;
+    private String appName;
+    private String appCode;
+    //鏄惁寮哄埗鏇存柊
+    private Boolean isEnforce;
+    //绫诲瀷
+    private String releaseSystem;
+    //鏂板寘涓嬭浇璺緞
+    private String packageUrl;
+    //鏇存柊璇存槑
+    private String remark;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getAppName() {
+        return appName;
+    }
+
+    public void setAppName(String appName) {
+        this.appName = appName;
+    }
+
+    public String getAppCode() {
+        return appCode;
+    }
+
+    public void setAppCode(String appCode) {
+        this.appCode = appCode;
+    }
+
+    public Boolean getIsEnforce() {
+        return isEnforce;
+    }
+
+    public void setIsEnforce(Boolean isEnforce) {
+        this.isEnforce = isEnforce;
+    }
+
+    public String getReleaseSystem() {
+        return releaseSystem;
+    }
+
+    public void setReleaseSystem(String releaseSystem) {
+        this.releaseSystem = releaseSystem;
+    }
+
+    public String getPackageUrl() {
+        return packageUrl;
+    }
+
+    public void setPackageUrl(String packageUrl) {
+        this.packageUrl = packageUrl;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "UpdateInfo{" +
+                "version='" + version + '\'' +
+                ", appName='" + appName + '\'' +
+                ", appCode='" + appCode + '\'' +
+                ", isEnforce=" + isEnforce +
+                ", releaseSystem='" + releaseSystem + '\'' +
+                ", packageUrl='" + packageUrl + '\'' +
+                ", remark='" + remark + '\'' +
+                '}';
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseCallBack.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseCallBack.java
new file mode 100644
index 0000000..9573604
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseCallBack.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.connect.cloud;
+
+/**
+ * Created by Tong on 2021/11/8.
+ */
+public interface BaseCallBack {
+
+    void onError(HDLException e);
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseInfo.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseInfo.java
new file mode 100644
index 0000000..b2df913
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/BaseInfo.java
@@ -0,0 +1,48 @@
+package com.hdl.sdk.connect.cloud;
+
+
+import java.io.Serializable;
+
+
+/**
+ * @Author : Zoro.
+ * @Date : 2019/6/9.
+ * @Describe :
+ */
+public class BaseInfo<T> implements Serializable {
+
+    private int code;
+    private T data;
+    private String message;
+
+    public BaseInfo(int code, T data) {
+        this.code = code;
+        this.data = data;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+}
+
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CallBackListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CallBackListener.java
new file mode 100644
index 0000000..76a9346
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CallBackListener.java
@@ -0,0 +1,8 @@
+package com.hdl.sdk.connect.cloud;
+
+/**
+ * Created by panlili on 2022/5/17.
+ */
+public interface CallBackListener extends BaseCallBack {
+    void onSuccess(String message);
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CheckAppVersionListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CheckAppVersionListener.java
new file mode 100644
index 0000000..7841ca8
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CheckAppVersionListener.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.connect.cloud;
+
+
+import com.hdl.sdk.connect.bean.response.UpdateInfo;
+
+/**
+ * Created by panlili on 2023/8/30.
+ */
+public interface CheckAppVersionListener extends BaseCallBack {
+    void onSuccess(UpdateInfo info);
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudLinkCode.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudLinkCode.java
new file mode 100644
index 0000000..516df1d
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/CloudLinkCode.java
@@ -0,0 +1,46 @@
+package com.hdl.sdk.connect.cloud;
+
+/**
+ * Created by Tong on 2021/11/2.
+ */
+
+public @interface CloudLinkCode {
+
+    //鎴愬姛
+    int SUCCEED = 0;
+
+    //绯荤粺绻佸繖
+    int SYSTEM_BUSY = 1;
+
+    //绯荤粺缁存姢 2
+
+    //鏈嶅姟寮傚父 3
+
+    //绛惧悕閿欒 4
+
+    //鍙傛暟寮傚父 5
+
+    //token瓒呮椂
+    int TOKEN_TIMEOUT = 10001;
+    //10002 閲嶆柊鐧诲綍
+    int Re_Login = 10002;
+    //token涓嶅悎娉�
+    int TOKEN_NOT_STANDARD = 10003;
+    //缂哄皯token鍙傛暟
+    int NO_TOKEN = 10004;
+    //鐢ㄦ埛鍚嶆垨鑰呭瘑鐮侀敊璇� 10008
+    //鐢ㄦ埛宸茶绂佺敤 10009
+    //10010	鐢ㄦ埛涓嶅瓨鍦�
+    //10012	鐢ㄦ埛宸插瓨鍦紝涓嶈兘閲嶅娉ㄥ唽
+    //10404	浣忓畢鍞竴鏍囪瘑涓嶅瓨鍦�
+    //10506	缃戝叧涓嶅瓨鍦�
+    //10805	璁惧涓嶅瓨鍦�
+    //12005	搴旂敤涓嶅瓨鍦�
+    //20000	鎺у埗澶辫触
+    //20001	缃戝叧绂荤嚎
+    //20002	璁惧绂荤嚎
+    //20101	spk涓嶆敮鎸佽鍔熻兘灞炴��
+    //20102	spk涓嶆敮鎸佽鍔熻兘灞炴�у��
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/GsonUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/GsonUtils.java
new file mode 100644
index 0000000..22621cb
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/GsonUtils.java
@@ -0,0 +1,247 @@
+package com.hdl.sdk.connect.cloud;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import com.google.gson.JsonSyntaxException;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+import java.io.IOException;
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/11/10.
+ */
+public class GsonUtils {
+
+    private static Gson gson;
+
+    public static <T> T copy(Object o, Class<T> type) {
+        return copy(o, TypeToken.get(type));
+    }
+
+    public static <T> T copy(Object o, TypeToken<T> type) {
+        return copy(o, type.getType());
+    }
+
+    public static <T> T copy(Object o, Type type) {
+        try {
+            Gson gson = getGson();
+            return gson.fromJson(gson.toJson(o), type);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static <T> T fromJson(String json, Type type) {
+        try {
+            Gson gson = getGson();
+            return gson.fromJson(json, type);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static <T> T fromJson(String json, Class<T> type) {
+        try {
+            Gson gson = getGson();
+            return gson.fromJson(json, type);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static <T> T fromJson(String json) {
+        try {
+            Gson gson = getGson();
+            return gson.fromJson(json, new TypeToken<T>() {
+            }.getType());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static String toJson(Object object) {
+        try {
+            return getGson().toJson(object);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static Type getType(@NonNull final Type rawType, @NonNull final Type... typeArguments) {
+        return TypeToken.getParameterized(rawType, typeArguments).getType();
+    }
+
+
+    public static Gson getGson() {
+        if (gson == null) {
+            gson = new GsonBuilder()
+                    .disableHtmlEscaping()
+                    .registerTypeAdapterFactory(new NullStringToEmptyAdapterFactory())
+                    .registerTypeAdapter(String.class, new StringAdapter())
+                    .registerTypeAdapter(Integer.class, new IntegerDefaultAdapter())
+                    .registerTypeAdapter(Double.class, new DoubleDefaultAdapter())
+                    .registerTypeAdapter(Long.class, new LongDefaultAdapter())
+                    .create();
+        }
+        return gson;
+    }
+
+    /**
+     *
+     * @param o
+     * @param <T>
+     * @return
+     */
+    public static <T> JsonArray toJsonArray(Object o) {
+        try {
+            return getGson().fromJson(GsonUtils.toJson(o), new TypeToken<JsonArray>() {
+            }.getType());
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    private static class StringAdapter implements JsonSerializer<String>, JsonDeserializer<String> {
+        @Override
+        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+                throws JsonParseException {
+            if (json instanceof JsonPrimitive) {
+                return json.getAsString();
+            } else {
+                return json.toString();
+            }
+        }
+
+        @Override
+        public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+
+    private static class IntegerDefaultAdapter implements JsonSerializer<Integer>, JsonDeserializer<Integer> {
+        @Override
+        public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+                throws JsonParseException {
+            try {
+                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
+                    return 0;
+                }
+            } catch (Exception ignore) {
+            }
+            try {
+                return json.getAsInt();
+            } catch (NumberFormatException e) {
+                throw new JsonSyntaxException(e);
+            }
+        }
+
+        @Override
+        public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+    private static class DoubleDefaultAdapter implements JsonSerializer<Double>, JsonDeserializer<Double> {
+        @Override
+        public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+            try {
+                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
+                    return 0.00;
+                }
+            } catch (Exception ignore) {
+            }
+            try {
+                return json.getAsDouble();
+            } catch (NumberFormatException e) {
+                throw new JsonSyntaxException(e);
+            }
+        }
+
+        @Override
+        public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+    private static class LongDefaultAdapter implements JsonSerializer<Long>, JsonDeserializer<Long> {
+        @Override
+        public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+                throws JsonParseException {
+            try {
+                if (json.getAsString().equals("") || json.getAsString().equals("null")) {
+                    return 0L;
+                }
+            } catch (Exception ignore) {
+            }
+            try {
+                return json.getAsLong();
+            } catch (NumberFormatException e) {
+                throw new JsonSyntaxException(e);
+            }
+        }
+
+        @Override
+        public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+    private static class NullStringToEmptyAdapterFactory implements TypeAdapterFactory {
+
+        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
+            Class<T> rawType = (Class<T>) type.getRawType();
+            if (rawType != String.class) {
+                return null;
+            }
+            return (TypeAdapter<T>) new StringNullAdapter();
+        }
+    }
+
+    public static class StringNullAdapter extends TypeAdapter<String> {
+
+        @Override
+        public String read(JsonReader reader) throws IOException {
+            if (reader.peek() == JsonToken.NULL) {
+                reader.nextNull();
+                return "";
+            }
+            return reader.nextString();
+        }
+
+        @Override
+        public void write(JsonWriter writer, String value) throws IOException {
+            if (value == null) {
+                writer.nullValue();
+                return;
+            }
+            writer.value(value);
+        }
+
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLException.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLException.java
new file mode 100644
index 0000000..ec6a21a
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLException.java
@@ -0,0 +1,114 @@
+package com.hdl.sdk.connect.cloud;
+
+import android.text.TextUtils;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
+
+import com.hdl.hdlhttp.callback.HxException;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by Tong on 2021/11/8.
+ */
+public class HDLException extends RuntimeException {
+
+    private int code;
+    private String msg;
+
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.FIELD, ElementType.PARAMETER})
+    @IntDef({
+            ErrorCode.UNKNOWN,
+            ErrorCode.PARSE_ERROR,
+            ErrorCode.NETWORK_ERROR,
+            ErrorCode.HTTP_ERROR,
+            ErrorCode.SSL_ERROR,
+            ErrorCode.TIMEOUT_ERROR
+    })
+    public @interface ErrorCode {
+        //鏈煡閿欒
+        int UNKNOWN = -40000;
+        //瑙f瀽閿欒
+        int PARSE_ERROR = -40001;
+        //缃戠粶閿欒
+        int NETWORK_ERROR = -40002;
+        //鍗忚鍑洪敊
+        int HTTP_ERROR = -40003;
+        //璇佷功鍑洪敊
+        int SSL_ERROR = -40004;
+        //杩炴帴瓒呮椂
+        int TIMEOUT_ERROR = -40005;
+
+    }
+
+    private int getHxToErrorCode(@HxException.ErrorCode int hxCode) {
+        switch (hxCode) {
+            case HxException.ErrorCode.UNKNOWN:
+                return ErrorCode.UNKNOWN;
+            case HxException.ErrorCode.PARSE_ERROR:
+                return ErrorCode.PARSE_ERROR;
+            case HxException.ErrorCode.NETWORK_ERROR:
+                return ErrorCode.NETWORK_ERROR;
+            case HxException.ErrorCode.HTTP_ERROR:
+                return ErrorCode.HTTP_ERROR;
+            case HxException.ErrorCode.SSL_ERROR:
+                return ErrorCode.SSL_ERROR;
+            case HxException.ErrorCode.TIMEOUT_ERROR:
+                return ErrorCode.TIMEOUT_ERROR;
+        }
+        return ErrorCode.NETWORK_ERROR;
+    }
+
+    public HDLException(HxException exception) {
+        this.code = getHxToErrorCode(exception.getCode());
+        this.msg = exception.getMsg();
+    }
+
+
+    public HDLException(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+        if (!TextUtils.isEmpty(msg)) {
+            this.msg = msg;
+        } else {
+//            this.msg = HxHttpConfig.getInstance().getString(R.string.network_error);
+            this.msg = "缃戠粶鍙戠敓寮傚父锛岃绋嶅悗鍐嶈瘯";
+        }
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+    @Override
+    public String toString() {
+        return "HDLException{" +
+                "code=" + code +
+                ", msg='" + msg + '\'' +
+                '}';
+    }
+
+    @Nullable
+    @Override
+    public String getMessage() {
+        return msg;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLResponse.java
new file mode 100644
index 0000000..ee682ce
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HDLResponse.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.connect.cloud;
+
+import com.hdl.hdlhttp.callback.HxException;
+import com.hdl.hdlhttp.response.GsonSubscribe;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+
+/**
+ * Created by Tong on 2021/11/8.
+ */
+public abstract class HDLResponse<K> extends GsonSubscribe<BaseInfo<K>> {
+
+    public abstract void onResponse(K response);
+
+    public abstract void onFailure(HDLException e);
+
+    @Override
+    public void onNext(String s) {
+        try {
+            Type type = getClass().getGenericSuperclass();
+            if (type instanceof ParameterizedType) {
+                Type[] types = ((ParameterizedType) type).getActualTypeArguments();
+                ParameterizedTypeImpl parameterizedType = new ParameterizedTypeImpl(BaseInfo.class, types, BaseInfo.class);
+
+                BaseInfo<K> data = GsonUtils.fromJson(s,parameterizedType);
+                onSuccess(data);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            this.onError(HxException.handleException(e));
+        }
+    }
+
+    @Override
+    public final void onSuccess(BaseInfo<K> response) {
+        if (response.getCode() == CloudLinkCode.SUCCEED) {
+            onResponse(response.getData());
+        } else {
+            onFailure(new HDLException(response.getCode(), response.getMessage()));
+        }
+    }
+
+    @Override
+    public final void onError(HxException e) {
+        onFailure(new HDLException(e));
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java
new file mode 100644
index 0000000..5f6256b
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudApi.java
@@ -0,0 +1,21 @@
+package com.hdl.sdk.connect.cloud;
+
+/**
+ * Created by panlili on 2023/1/30
+ * description:
+ */
+public class HdlCloudApi {
+
+    //姝e紡鐜
+    public static final String BASE_CHINA_URL = "https://china-gateway.hdlcontrol.com";
+
+    //娴嬭瘯鐜
+//    public static final String BASE_CHINA_URL = "https://test-gz.hdlcontrol.com";
+
+    //鐢宠璁惧瀵嗛挜(鏍规嵁璁惧MAC)
+    public static final String APPLY_DEVICE_SECRET = "/smart-open/third/device/authByMac";
+
+    //妫�鏌pp鏄惁鏇存柊
+    public static final String CHECK_APP_VERSION_URL = "/basis-footstone/app/appVersion/check";
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java
new file mode 100644
index 0000000..8f05dcf
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/HdlCloudController.java
@@ -0,0 +1,65 @@
+package com.hdl.sdk.connect.cloud;
+
+import com.hdl.hdlhttp.HxHttp;
+import com.hdl.sdk.connect.bean.response.UpdateInfo;
+
+import io.reactivex.rxjava3.disposables.Disposable;
+
+/**
+ * Created by panlili on 2023/1/30
+ * description:
+ */
+public class HdlCloudController {
+
+    public static Disposable applyDeviceSecret(String supplier, String mac, String spk, CallBackListener callBack) {
+        return HxHttp.builder()
+                .url(HdlCloudApi.BASE_CHINA_URL + HdlCloudApi.APPLY_DEVICE_SECRET)
+                .params("supplier", supplier)
+                .params("mac", mac)
+                .params("spk", spk)
+                .build()
+                .post()
+                .subscribeWith(new HDLResponse<String>() {
+                    @Override
+                    public void onResponse(String response) {
+                        if (callBack != null) {
+                            callBack.onSuccess(response);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        if (callBack != null) {
+                            callBack.onError(e);
+                        }
+                    }
+                });
+    }
+
+    /**
+     * 妫�鏌pp鏄惁鏇存柊
+     *
+     * @return
+     */
+    public static Disposable checkAppVersion(String versionCode, String appCode, CheckAppVersionListener listener) {
+        return HxHttp.builder()
+                .url(HdlCloudApi.BASE_CHINA_URL + HdlCloudApi.CHECK_APP_VERSION_URL)
+                .params("version", versionCode)
+                .params("appCode", appCode)
+                .params("releaseSystem", "Android")
+                .build()
+                .post()
+                .subscribeWith(new HDLResponse<UpdateInfo>() {
+                    @Override
+                    public void onResponse(UpdateInfo response) {
+                        listener.onSuccess(response);
+                    }
+
+                    @Override
+                    public void onFailure(HDLException e) {
+                        listener.onError(e);
+                    }
+                });
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/MD5Utils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/MD5Utils.java
new file mode 100644
index 0000000..88cca98
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/MD5Utils.java
@@ -0,0 +1,121 @@
+package com.hdl.sdk.connect.cloud;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Created by Tong on 2021/11/3.
+ */
+public final class MD5Utils {
+
+    /**
+     * MD5杞瓧绗︿覆
+     */
+    public static String encodeMD5(String s) {
+        try {
+            MessageDigest digest = MessageDigest.getInstance("MD5");
+            digest.update(s.getBytes("UTF-8"));
+            byte[] messageDigest = digest.digest();
+            return toHexString(messageDigest);
+        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+    private static String toHexString(byte[] keyData) {
+        if (keyData == null) {
+            return null;
+        }
+        int expectedStringLen = keyData.length * 2;
+        StringBuilder sb = new StringBuilder(expectedStringLen);
+        for (byte keyDatum : keyData) {
+            String hexStr = Integer.toString(keyDatum & 0x00FF, 16);
+            if (hexStr.length() == 1) {
+                hexStr = "0" + hexStr;
+            }
+            sb.append(hexStr);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * MD5杞瓧绗︿覆
+     * 棰濆鍊�
+     */
+    public static String encodeMD52(String s) {
+        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+        try {
+            byte[] btInput = s.getBytes("utf-8");
+            MessageDigest digest = MessageDigest.getInstance("MD5");
+            digest.update(btInput);
+            byte[] md = digest.digest();
+            int j = md.length;
+            char[] str = new char[j * 2];
+            int k = 0;
+            for (byte byte0 : md) {
+                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+                str[k++] = hexDigits[byte0 & 0xf];
+            }
+            return new String(str);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * MD5鏂囦欢杞瓧绗︿覆
+     */
+    public static String encodeMD5(File f) {
+        if (!f.isFile()) {
+            return null;
+        }
+        MessageDigest digest;
+        byte[] buffer = new byte[1024];
+        int len;
+        try {
+            digest = MessageDigest.getInstance("MD5");
+            FileInputStream in = new FileInputStream(f);
+            while ((len = in.read(buffer, 0, 1024)) != -1) {
+                digest.update(buffer, 0, len);
+            }
+            in.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+        BigInteger bigInt = new BigInteger(1, digest.digest());
+        return bigInt.toString(16);
+    }
+
+    public static String encrypt(String raw) {
+        String md5Str = raw;
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5"); // 鍒涘缓涓�涓狹D5绠楁硶瀵硅薄
+            md.update(raw.getBytes()); // 缁欑畻娉曞璞″姞杞藉緟鍔犲瘑鐨勫師濮嬫暟鎹�
+            byte[] encryContext = md.digest(); // 璋冪敤digest鏂规硶瀹屾垚鍝堝笇璁$畻
+            int i;
+            StringBuffer buf = new StringBuffer("");
+            for (int offset = 0; offset < encryContext.length; offset++) {
+                i = encryContext[offset];
+                if (i < 0) {
+                    i += 256;
+                }
+                if (i < 16) {
+                    buf.append("0");
+                }
+                buf.append(Integer.toHexString(i)); // 鎶婂瓧鑺傛暟缁勯�愪綅杞崲涓哄崄鍏繘鍒舵暟
+            }
+            md5Str = buf.toString(); // 鎷艰鍔犲瘑瀛楃涓�
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return md5Str.toUpperCase(); // 杈撳嚭澶у啓鐨勫姞瀵嗕覆
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/ParameterizedTypeImpl.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/ParameterizedTypeImpl.java
new file mode 100644
index 0000000..e4fe075
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/ParameterizedTypeImpl.java
@@ -0,0 +1,43 @@
+package com.hdl.sdk.connect.cloud;
+
+import java.io.Serializable;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/11/8.
+ */
+public class ParameterizedTypeImpl implements ParameterizedType, Serializable {
+
+    private final Type[] actualTypeArguments;
+    private final Type ownerType;
+    private final Type rawType;
+
+    /**
+     * @param rawType             鍘熷绫诲瀷
+     * @param actualTypeArguments 瀹為檯鐨勬硾鍨嬪弬鏁扮被鍨�
+     * @param ownerType           鎷ユ湁鑰呯被鍨�
+     */
+    public ParameterizedTypeImpl(Type rawType, Type[] actualTypeArguments, Type ownerType) {
+        this.actualTypeArguments = actualTypeArguments;
+        this.ownerType = ownerType;
+        this.rawType = rawType;
+    }
+
+    @Override
+    public Type[] getActualTypeArguments() {
+        return actualTypeArguments;
+    }
+
+    @Override
+    public Type getOwnerType() {
+        return ownerType;
+    }
+
+    @Override
+    public Type getRawType() {
+        return rawType;
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java
new file mode 100644
index 0000000..9a83b75
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/EncryptInterceptor.java
@@ -0,0 +1,175 @@
+package com.hdl.sdk.connect.cloud.interceptor;
+
+import android.net.Uri;
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.cloud.GsonUtils;
+import com.hdl.sdk.connect.cloud.MD5Utils;
+
+import java.io.IOException;
+import java.net.URLDecoder;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import okhttp3.FormBody;
+import okhttp3.Headers;
+import okhttp3.Interceptor;
+import okhttp3.MediaType;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+import okio.Buffer;
+
+/**
+ * Created by Tong on 2021/11/4.
+ * 鍔犲瘑骞惰嚜鍔ㄨˉ鍏呭弬鏁�,appKey銆乼imestamp
+ * 鍙敮鎸佽〃鍗曘�乯son
+ * 鏈�缁坖son鏂瑰紡鎻愪氦
+ */
+public class EncryptInterceptor implements Interceptor {
+
+
+    @NonNull
+    @Override
+    public Response intercept(@NonNull Chain chain) throws IOException {
+        Request request = chain.request();
+        Headers headers = request.headers();
+        if (!isIgnoreSignHeader(headers)) {
+            return chain.proceed(encrypt(request));
+        }
+
+        return chain.proceed(request);
+    }
+
+
+    /**
+     * 娣诲姞sign瀛楁
+     */
+    private Request encrypt(Request request) {
+        final String timestamp = String.valueOf(System.currentTimeMillis());
+        final String appKey = HDLLink.getInstance().getAppKey();
+        final String appSecret = HDLLink.getInstance().getAppSecret();
+        final JsonObject json = getBodyJson(request);
+        if (json != null) {
+            json.addProperty("appKey", appKey);
+            json.addProperty("timestamp", timestamp);
+            json.addProperty("sign", getSign(json, appSecret));
+            final RequestBody requestBody = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8"));
+            return request.newBuilder().post(requestBody)
+                    .build();
+        }
+        return request;
+    }
+
+    /**
+     * 闇�瑕佹寜瀛楁瘝鎺掑簭
+     *
+     * @param json 鎵�鏈夊瓧娈典娇鐢╱rlParameter鎷兼帴锛岄櫎浜哸ppSecret
+     */
+    private String getSign(JsonObject json, String appSecret) {
+        String builder = jsonToUrlParameter(json) +
+                appSecret;
+        return MD5Utils.encodeMD5(builder);
+    }
+
+
+    /**
+     * 鏄惁蹇界暐鑷畾涔夌殑鍔犲瘑澶�
+     */
+    private boolean isIgnoreSignHeader(Headers headers) {
+        String signHeader = headers.get(SmartHeader.IGNORE_SIGN_HEADER);
+        return !TextUtils.isEmpty(signHeader);
+    }
+
+    private JsonObject getBodyJson(Request request) {
+        RequestBody body = request.body();
+        if (body instanceof FormBody) {
+            JsonObject object = new JsonObject();
+            FormBody formBody = (FormBody) body;
+            for (int i = 0; i < formBody.size(); i++) {
+                object.addProperty(formBody.name(i), formBody.value(i));
+            }
+            return object;
+        } else {
+            //json鏍煎紡
+            try {
+                String bodyString = getBodyString(request);
+                if (!TextUtils.isEmpty(bodyString)) {
+                    final JsonElement parseString = JsonParser.parseString(bodyString);
+                    return parseString.getAsJsonObject();
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+        return null;
+    }
+
+    private String getBodyString(Request request) {
+        try {
+            RequestBody body = request.body();
+            if (body != null) {
+                Buffer buffer = new Buffer();
+                body.writeTo(buffer);
+                Charset charset = Charset.forName("UTF-8");
+                MediaType contentType = body.contentType();
+                charset = contentType.charset(charset);
+                return buffer.readString(charset);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+
+
+
+
+    private String jsonToUrlParameter(JsonObject object) {
+        final Map<String, String> map = GsonUtils.getGson().fromJson(object, new TypeToken<Map<String, String>>() {
+        }.getType());
+        final Uri.Builder builder = new Uri.Builder();
+        List<String> list = new ArrayList<>(map.keySet());
+        Collections.sort(list);
+        for (String key : list) {
+            String value = map.get(key);
+            if (valueNeedSign(value)) {
+                builder.appendQueryParameter(key, value);
+            }
+        }
+        return builder.build().getQuery();
+    }
+
+
+    /**
+     * 鍒ゆ柇褰撳墠鍊兼槸鍚﹂渶瑕佸弬涓庣鍚嶏紝淇濇寔璺熶簯绔竴鑷�
+     * 绌哄瓧绗︿覆涓嶅弬涓�
+     * 鏁扮粍,闆嗗悎涓嶅弬涓�
+     *
+     * @return ture 闇�瑕佸姞瀵�
+     */
+    private static boolean valueNeedSign(String valueStr) {
+        try {
+            if (TextUtils.isEmpty(valueStr)) return false;
+            final char[] strChar = URLDecoder.decode(valueStr, "utf-8")
+                    .substring(0, 1).toCharArray();
+            final char firstChar = strChar[0];
+            return firstChar != '{' && firstChar != '[';
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return false;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeader.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeader.java
new file mode 100644
index 0000000..8c1616b
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeader.java
@@ -0,0 +1,16 @@
+package com.hdl.sdk.connect.cloud.interceptor;
+
+/**
+ * Created by Tong on 2021/11/8.
+ * 鎷︽埅鍣ㄦ爣璇�
+ */
+public class SmartHeader {
+
+    //榛樿鎼哄甫鍔犲瘑銆佽В瀵嗕互鍙婃椂闂存埑锛屼娇鐢�"IGNORE_SIGN_HEADER"鍙互灞忚斀
+    public static final String IGNORE_SIGN_HEADER = "IgnoreSignHeader";
+
+    //鍦ㄥ埛鏂癟oken
+    public static final String REFRESH_TOKEN_HEADER = "RefreshTokenHeader";
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeaderInterceptor.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeaderInterceptor.java
new file mode 100644
index 0000000..9f7107d
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/cloud/interceptor/SmartHeaderInterceptor.java
@@ -0,0 +1,27 @@
+package com.hdl.sdk.connect.cloud.interceptor;
+
+import androidx.annotation.NonNull;
+
+import java.io.IOException;
+
+import okhttp3.Interceptor;
+import okhttp3.Request;
+import okhttp3.Response;
+
+/**
+ * Created by Tong on 2021/11/9.
+ * 鍒犻櫎鑷畾涔夊ご
+ */
+public class SmartHeaderInterceptor implements Interceptor {
+
+
+    @NonNull
+    @Override
+    public Response intercept(@NonNull Chain chain) throws IOException {
+        Request request = chain.request().newBuilder()
+                .removeHeader(SmartHeader.IGNORE_SIGN_HEADER)
+                .removeHeader(SmartHeader.REFRESH_TOKEN_HEADER).build();
+        return chain.proceed(request);
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
index bfe3d60..5ccf25d 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
@@ -19,13 +19,17 @@
     private static final String AUTHENTICATE_GATEWAYID_KEY = "auth_gatewayid_key";
     private static final String AUTHENTICATE_IPADDRESS_KEY = "auth_ipaddress_key";
     private static final String AUTHENTICATE_IS_LS_KEY = "auth_isls_key";
+    public static final String AUTHENTICATE_IS_DEVICEINFO_KEY = "auth_deviceinfo_key";
 
     private String localSecret;//鏈湴鍔犲瘑瀵嗛挜
     private String gatewayId;
     private String ipAddress;
     private GatewaySearchBean currentGateway;//褰撳墠缃戝叧
+    private String networkName;
 
     private AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean;//褰撳墠璁惧鍩烘湰淇℃伅
+    private AuthenticateRequest.RequestBean requestBean;//褰撳墠璁惧鍩烘湰淇℃伅
+    private AuthenticateRequest.AuthBean authBean;//褰撳墠璁惧璁よ瘉淇℃伅
 
     /**
      * instance
@@ -105,9 +109,10 @@
      */
     public boolean checkIfCertified() {
         //localSecret涓嶄负绌哄苟涓旈暱搴︾瓑浜�16 缃戝叧id涓嶈兘涓虹┖
-        return !TextUtils.isEmpty(localSecret)
-                && localSecret.length() == 16
-                && !TextUtils.isEmpty(gatewayId);
+        return !TextUtils.isEmpty(gatewayId);
+//        return !TextUtils.isEmpty(localSecret)
+//                && localSecret.length() == 16
+//                && !TextUtils.isEmpty(gatewayId);
     }
 
     public void setLocalSecret(String localSecret) {
@@ -131,6 +136,14 @@
     }
     public void setIpAddress(String ipAddress){
         this.ipAddress = ipAddress;
+    }
+
+    public String getNetworkName() {
+        return networkName;
+    }
+
+    public void setNetworkName(String networkName) {
+        this.networkName = networkName;
     }
 
     public GatewaySearchBean getCurrentGateway() {
@@ -175,10 +188,28 @@
     }
 
     public AuthenticateRequest.AuthenticateDeviceInfoBean getDeviceInfoBean() {
-        return deviceInfoBean;
+        AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = (AuthenticateRequest.AuthenticateDeviceInfoBean) SPUtils.getSerializableEntity(AUTHENTICATE_IS_DEVICEINFO_KEY);
+        return infoBean;
     }
 
     public void setDeviceInfoBean(AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean) {
         this.deviceInfoBean = deviceInfoBean;
+        SPUtils.saveSerializableEntity(AUTHENTICATE_IS_DEVICEINFO_KEY, deviceInfoBean);
+    }
+
+    public AuthenticateRequest.RequestBean getRequestBean() {
+        return requestBean;
+    }
+
+    public void setRequestBean(AuthenticateRequest.RequestBean requestBean) {
+        this.requestBean = requestBean;
+    }
+
+    public AuthenticateRequest.AuthBean getAuthBean() {
+        return authBean;
+    }
+
+    public void setAuthBean(AuthenticateRequest.AuthBean authBean) {
+        this.authBean = authBean;
     }
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
index edb326e..4e2cbb0 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
@@ -1,25 +1,38 @@
 package com.hdl.sdk.connect.protocol;
 
 
-import android.annotation.TargetApi;
 import android.os.Build;
+import android.text.TextUtils;
 import android.util.Log;
 
 import androidx.annotation.RequiresApi;
 
-import com.google.gson.internal.bind.DateTypeAdapter;
-import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.connect.config.HDLLinkConfig;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.EventDispatcher;
+import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.ByteUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.SPUtils;
+import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.HDLLink;
 import com.hdl.sdk.connect.bean.LinkResponse;
+import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
+import com.hdl.sdk.connect.bean.response.DeviceDeleteResponse;
+import com.hdl.sdk.connect.bean.response.DeviceInfoResponse;
+import com.hdl.sdk.connect.callback.HDLLinkCallBack;
+import com.hdl.sdk.connect.config.HDLLinkConfig;
+import com.hdl.sdk.connect.socket.HDLAuthSocket;
+import com.hdl.sdk.connect.socket.HDLSocket;
 import com.hdl.sdk.connect.utils.AesUtil;
-import com.hdl.sdk.connect.utils.ProtocolParse;
 import com.hdl.sdk.socket.codec.ByteToMessageDecoder;
 
 import java.util.ArrayList;
-import java.util.Base64;
 import java.util.List;
+
+import android.util.Base64;
+
+import kotlin.ParameterName;
 
 /**
  * Created by Tong on 2021/9/22.
@@ -111,15 +124,16 @@
             }
 
             list.clear();
-            for(int i=0;i<tempList.size();i++){
+            for (int i = 0; i < tempList.size(); i++) {
                 list.add(tempList.get(i));
             }
         }
     }
 
 
+    @RequiresApi(api = Build.VERSION_CODES.O)
     @Override
-    protected synchronized LinkResponse decoder(Object msg,String ipaddress) throws Exception {
+    protected synchronized LinkResponse decoder(Object msg, String ipaddress) throws Exception {
         if (msg instanceof byte[]) {
             bytes.addAll(ByteUtils.toByteList((byte[]) msg));
             //濡傛灉澶氭潯鍛戒护鎵撳寘鍦ㄤ竴鏉℃暟鎹腑锛岄兘闇�瑕佸鐞嗗畬
@@ -169,7 +183,7 @@
                             //涔嬪墠鐨勭増鏈繖鍧楁槸鏄庢枃鐨�
                             if (!topic.contains("heartbeat_reply")) {
                                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
-                                    LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + Base64.getEncoder().encodeToString(body));
+                                    LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + Base64.encodeToString(body, Base64.NO_WRAP));
                                 else {
                                     LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + new String(body, "utf-8"));
                                 }
@@ -181,77 +195,80 @@
 
                 String bodyString = new String(body, "utf-8");
                 response.setData(bodyString);
-                LogUtils.i( "鎺ユ敹鍒版暟鎹�:" + response.getTopic() + "\r\n" + response.getData());
+                LogUtils.i("鎺ユ敹鍒版暟鎹�:" + response.getTopic() + "\r\n" + response.getData());
+
+                String updateLocalSecret = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getGatewayId());
+                String deleteNetwork = "";
+                if (HDLLinkConfig.getInstance().getDeviceInfoBean() != null) {
+                    deleteNetwork = String.format(TopicConstant.DELETE_NOTIFY, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID());
+                }
+
+                if (response.getTopic().equals("/user/all/custom/gateway/search")) {
+                    HDLAuthSocket.getInstance().UploadGatewayInfo(new HDLLinkCallBack() {
+                        @Override
+                        public void onSuccess(String msg) {
+                            LogUtils.i("UploadGatewayInfo onSucceed");
+                        }
+
+                        @Override
+                        public void onError(HDLLinkException e) {
+                            LogUtils.i("UploadGatewayInfo onError");
+                        }
+                    });
+                } else if (response.getTopic().equals(updateLocalSecret) || response.getTopic().equals(TopicConstant.LINK_BROADCAST)) {
+                    try {
+                        DeviceInfoResponse deviceInfoResponse = GsonConvert.getGson().fromJson(response.getData(), new TypeToken<DeviceInfoResponse>() {
+                        }.getType());
+
+                        if (!TextUtils.isEmpty(deviceInfoResponse.getObjects().getLocalSecret())) {
+                            byte[] baseBytes = Base64.decode(deviceInfoResponse.getObjects().getLocalSecret(), Base64.NO_WRAP);
+                            String mackey = "";
+                            if (!TextUtils.isEmpty(SPUtils.getString("auth_mackey_key", ""))) {
+                                mackey = SPUtils.getString("auth_mackey_key", "");
+                                byte[] bodyBytes = AesUtil.aesDecrypt(baseBytes, mackey.substring(mackey.length() - 16));
+                                String localSecret = new String(bodyBytes, "utf-8");
+                                Log.d("panlili", "鏇存柊瀵嗛挜----->localSecret= " + localSecret);
+                                HDLLinkConfig.getInstance().setLocalSecret(localSecret);
+                            }
+                        }
+                    } catch (Exception e) {
+                        LogUtils.i("LinkMessageDecoder.java:getLocalSecret----->e= " + e.getMessage());
+                    }
+                } else if (response.getTopic().equals(deleteNetwork)) {
+                    try {
+                        DeviceDeleteResponse deviceDeleteResponse = GsonConvert.getGson().fromJson(response.getData(), new TypeToken<DeviceDeleteResponse>() {
+                        }.getType());
+                        HDLSocket.getInstance().deleteNetwork(deviceDeleteResponse.getObjects().get(0).getOID(), new HDLLinkCallBack() {
+                            @Override
+                            public void onSuccess(String msg) {
+                                LogUtils.i("deleteNetwork onSucceed");
+                                if (HDLLink.getInstance().listener != null) {
+                                    HDLLink.getInstance().listener.onSuccess(msg);
+                                }
+                            }
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                                LogUtils.i("deleteNetwork onError");
+                                if (HDLLink.getInstance().listener != null) {
+                                    HDLLink.getInstance().listener.onFailure();
+                                }
+                            }
+                        });
+                    } catch (Exception e) {
+                        LogUtils.i("LinkMessageDecoder.java:deleteNetwork----->e= " + e.getMessage());
+                    }
+                }
+
                 //闈炴甯告暟鎹紝杩斿洖
-                if (!((bodyString.startsWith("{") &&bodyString.endsWith("}"))
-                        || (bodyString.startsWith("[")&&bodyString.endsWith("]")))) {
+                if (!((bodyString.startsWith("{") && bodyString.endsWith("}"))
+                        || (bodyString.startsWith("[") && bodyString.endsWith("]")))) {
                     continue;
                 }
                 //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆�
                 EventDispatcher.getInstance().post(response.getTopic(), response);
             }
             return null;
-
-//            //瑙f瀽娴�
-//            byte[] data = (byte[]) msg;
-//            bytes.addAll(ByteUtils.toByteList(data));
-//
-//            byte[] byteArray = ByteUtils.toByteArray(bytes);
-//            int headIndex = ByteUtils.getByteIndexOf(byteArray, head);
-//            if (headIndex > 0) {
-//                //绉诲姩鍒癶ead 寮�濮嬩綅缃�
-//                bytes.subList(0, headIndex).clear();
-//                byteArray = ByteUtils.toByteArray(bytes);
-//            }
-//
-//            int bodyIndex = ByteUtils.getByteIndexOf(byteArray, body);
-//            if (bodyIndex < 0) {
-//                //澶撮儴鏈幏鍙栧畬鎴�
-//                return null;
-//            }
-//            int bodyStartIndex = bodyIndex + body.length;
-//
-//            //瑙f瀽澶撮儴
-//            ProtocolParse parse = new ProtocolParse(byteArray);
-//            response.setTopic(parse.getTopic());
-//
-//            int bodyLength = parse.getLength();
-//            if (bodyLength > 0) {
-//                if (byteArray.length >= bodyLength + bodyStartIndex) {
-//                    byte[] body = ByteUtils.getRangeBytes(bytes, bodyStartIndex, bodyStartIndex + bodyLength);
-//
-//                    if (HDLLinkConfig.getInstance().ifNeedEncrypt(response.getTopic())) {
-//                        //闇�瑕佽В瀵�
-//                        byte[] bodyBytes = AesUtil.aesDecrypt(body, HDLLinkConfig.getInstance().getLocalSecret());
-////                        byte[] bodyBytes = AESUtils.decryptAES(body,AuthenticateConfig.getInstance().getLocalSecret());
-//                        if (bodyBytes != null) {
-//                            response.setData(new String(bodyBytes, "utf-8"));
-////                            LogUtils.i("TAG", "瑙e瘑 涓婚锛�"+response.getTopic()+ " body: "+response.getData());
-//                        } else {
-//                            //瑙e瘑澶辫触锛岃繑鍥炲師鏁版嵁
-//                            response.setData(new String(body, "utf-8"));
-//                        }
-//
-//                    } else {
-//                        response.setData(new String(body, "utf-8"));
-//                    }
-//
-//                    if (byteArray.length >= bodyLength + bodyStartIndex) {
-//                        //淇濆瓨浣欑暀
-//                        byte[] remaining = ByteUtils.getRangeBytes(bytes, bodyStartIndex + bodyLength, byteArray.length);
-//                        bytes.clear();
-//                        for (byte b : remaining) {
-//                            bytes.add(b);
-//                        }
-//                    }
-//                    //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆�
-//                    EventDispatcher.getInstance().post(response.getTopic(), response);
-//                    return response;
-//                }
-//            } else if (bodyLength == 0) {
-//                //body涓虹┖
-//                return response;
-//            }
 
         }
         return null;
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
index 033c552..595c20b 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -1,33 +1,38 @@
 package com.hdl.sdk.connect.socket;
 
+import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST;
+
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.google.gson.Gson;
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.common.HDLSdk;
+import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.EventDispatcher;
 import com.hdl.sdk.common.event.EventListener;
 import com.hdl.sdk.common.exception.HDLLinkCode;
 import com.hdl.sdk.common.exception.HDLLinkException;
+import com.hdl.sdk.common.utils.IdUtils;
+import com.hdl.sdk.common.utils.IpUtils;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
-import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.bean.LinkRequest;
+import com.hdl.sdk.connect.bean.LinkResponse;
+import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
+import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
+import com.hdl.sdk.connect.bean.request.GatewayInfoRequest;
 import com.hdl.sdk.connect.bean.response.AuthenticateResponse;
+import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
+import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
 import com.hdl.sdk.connect.bean.response.NetworkAccessBroadcastResponse;
 import com.hdl.sdk.connect.callback.BaseCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
-import com.hdl.sdk.common.config.TopicConstant;
-import com.hdl.sdk.common.utils.IdUtils;
-import com.hdl.sdk.common.utils.IpUtils;
-import com.hdl.sdk.common.utils.gson.GsonConvert;
-import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
-import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
-import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
-import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
-import com.hdl.sdk.connect.bean.LinkRequest;
-import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
 import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
 import com.hdl.sdk.socket.client.UdpClient;
@@ -35,12 +40,9 @@
 import com.hdl.sdk.socket.udp.UdpSocketBoot;
 import com.hdl.sdk.socket.udp.UdpSocketOptions;
 
-import java.net.InetSocketAddress;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
-
-import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST;
 
 /**
  * Created by jlchen on 11/11/21.
@@ -68,7 +70,7 @@
     /**
      * instance
      */
-    private  static final HDLAuthSocket instance=new HDLAuthSocket();
+    private static final HDLAuthSocket instance = new HDLAuthSocket();
 
     private HDLAuthSocket() {
         initListenerGatewayEvent();
@@ -84,7 +86,7 @@
      *
      * @return HDLAuthSocket
      */
-    public  static HDLAuthSocket getInstance() {
+    public static HDLAuthSocket getInstance() {
 //        if (instance == null) {
 //            synchronized (HDLAuthSocket.class) {
 //        if (instance == null) {
@@ -115,12 +117,18 @@
             if (udpSocketBoot == null) {
                 udpSocketBoot = UdpClient.init(UDP_PORT, getUdpOptions());
                 udpSocketBoot.bind();
+
+                LogUtils.i("鍒濆鍖朣ocket udp");
             }
         } catch (Exception e) {
-              LogUtils.e("鍒濆鍖朣ocket udp寮傚父"+e.getMessage());
+            LogUtils.e("鍒濆鍖朣ocket udp寮傚父" + e.getMessage());
         }
 
         return udpSocketBoot;
+    }
+
+    public void init() {
+        getUdpBoot();
     }
 
     /**
@@ -146,6 +154,7 @@
                     //绉婚櫎鐩戝惉
                     EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST);
                     LogUtils.i("缃戝叧鍏ョ綉骞挎挱IP: " + bean.getIPAddress());
+                    HDLLinkConfig.getInstance().setIpAddress(bean.getIPAddress());
                     String ipStr = bean.getIPAddress();
                     if (!TextUtils.isEmpty(ipStr)) {
                         sendAuthenticateRequest(ipStr, request, callBack);
@@ -162,6 +171,64 @@
     public void endAuthenticateRequest() {
         //绉婚櫎鐩戝惉
         EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST);
+    }
+
+    /**
+     * 涓婃姤浠庣綉鍏充俊鎭�
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void UploadGatewayInfo(HDLLinkCallBack callBack) {
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<GatewayInfoRequest> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+
+        final GatewayInfoRequest request = new GatewayInfoRequest();
+        AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean();
+        request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel());
+        request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC());
+        request.setDevice_name(authenticateDeviceInfoBean.getDeviceName());
+        request.setGateway_type(authenticateDeviceInfoBean.getGateway_type());
+        request.setAccess_mode(authenticateDeviceInfoBean.getAccessMode());
+        request.setOid(authenticateDeviceInfoBean.getOID());
+        request.setSid(authenticateDeviceInfoBean.getSid());
+        request.setSupplier(authenticateDeviceInfoBean.getSupplier());
+
+        if (authenticateDeviceInfoBean.getSupplier() == null) {
+            AuthenticateRequest.RequestBean requestBean = HDLLinkConfig.getInstance().getRequestBean();
+            request.setSupplier(requestBean.getSupplier());
+        }
+
+        request.setHw_version(authenticateDeviceInfoBean.getHw_version());
+        request.setFw_version(HDLSdk.getInstance().getVersion());//sdk鐗堟湰
+        request.setIp_address(authenticateDeviceInfoBean.getIPAddress());
+        request.setMaster("false");
+        request.setLocalEncrypt(false);
+
+        data.setObjects(request);
+
+        String topic = HDLLinkConfig.getInstance().getFullTopic(TopicConstant.GATEWAY_SEARCH_REPLY);
+        LinkRequest message = new LinkRequest(topic,
+                GsonConvert.getGson().toJson(data));
+
+        String ip = IpUtils.getBroadcastAddress();
+        HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("涓婃姤鎴愬姛");
+                LogUtils.i("UploadGatewayInfo onSucceed = " + msg);
+            }
+
+            @Override
+            public void onFailure() {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UPLOAD_GATEWAYINFO_FAILURE_ERROR));
+                LogUtils.i("UploadGatewayInfo onFailure");
+            }
+        });
+
     }
 
     /**
@@ -198,25 +265,105 @@
                                 gatewayId = bean.getObjects().getGatewayID();
                                 ipAddress = bean.getObjects().getIPAddress();
                             }
+                            if (ipAddress == null) {
+                                ipAddress = bean.getIp_address();
+                            }
+                            HDLLinkConfig.getInstance().setAuthBean(request.getAuth());
+
                             //鍒ゆ柇缃戝叧鏄惁宸茬粡娉ㄥ唽鍒颁簯绔�
-                            if (TextUtils.isEmpty(localSecret) || TextUtils.isEmpty(gatewayId)) {
+                            Log.d("panlili", "璁よ瘉鎴愬姛----->localSecret= " + localSecret);
+                            if (TextUtils.isEmpty(localSecret) && TextUtils.isEmpty(gatewayId)) {
                                 //璁よ瘉澶辫触锛岀綉鍏虫湭娉ㄥ唽鍒颁簯绔�
                                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED));
                             } else {
                                 HDLLinkConfig.getInstance().saveConfig(localSecret, gatewayId, ipAddress);
+                                HDLLinkConfig.getInstance().setRequestBean(request.getAuth().getRequest());
                                 callBack.onSuccess("璁よ瘉鎴愬姛");
+
+//                                UploadDeviceAuth(request.getObjects().getDeviceMAC(), "0", "success", bean.getCode(), null);
                             }
-                        } else if (bean.getCode().equals("14013")){
+                        } else if (bean.getCode().equals("14013")) {
                             //璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪
                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_MAC_KEY_ERROR_));
-                        } else{
+
+//                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null);
+                        } else if (bean.getCode().equals("124013")) {
+                            //璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124013_ERROR));
+
+                        } else if (bean.getCode().equals("124015")) {
+                            //璁よ瘉澶辫触锛岃澶囧巶瀹朵笉鍖归厤
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124015_ERROR));
+
+                        } else {
                             //璁よ瘉澶辫触锛岄敊璇爜锛�
                             LogUtils.e("璁よ瘉澶辫触锛岄敊璇爜锛�" + bean.getCode());
                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR));
+
+//                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null);
                         }
                     } else {
                         callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
                     }
+                } catch (Exception e) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
+                }
+            }
+
+            @Override
+            public void onFailure() {
+                LogUtils.i(TAG, "onFailure: ");
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR));
+            }
+        });
+    }
+
+    public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                if (callBack != null) {
+                    callBack.onSuccess(msg);
+                }
+                LogUtils.i(TAG, "onSuccess: " + msg);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                if (callBack != null) {
+                    callBack.onError(e);
+                }
+                LogUtils.i(TAG, "onError: " + e.getMsg() + " " + e.getCode());
+            }
+        });
+    }
+
+
+    public void linkBroadcast(String oid, HDLLinkCallBack callBack) {
+        if (TextUtils.isEmpty(oid)) {
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
+        }
+
+        Gson gs = new Gson();
+        JsonArray jsonArray = new JsonArray();
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("oid", oid);
+        jsonArray.add(jsonObject);
+        String requestStr = gs.toJson(jsonArray);
+
+        String topic = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID());
+        LinkRequest message = new LinkRequest(topic, requestStr);
+
+        String ip = IpUtils.getBroadcastAddress();
+
+        HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                try {
+                    callBack.onSuccess("鏇存柊鎴愬姛");
+                    LogUtils.i(TAG, "onSucceed: msg= " + msg);
                 } catch (Exception e) {
                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
                 }
@@ -360,12 +507,12 @@
      * 閫氱敤鍙戦�佹寚浠�
      * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic     鍙戦�佹暟鎹�
+     * @param bodyStr   鍥炲鐨勪富棰�
      * @param broadcast 鏄惁瑕佸箍鎾�
-     * @param callBack 鍥炶皟
+     * @param callBack  鍥炶皟
      */
-    public void udpSendMsg(String topic, String bodyStr,boolean broadcast,  HDLLinkResponseCallBack callBack) {
+    public void udpSendMsg(String topic, String bodyStr, boolean broadcast, HDLLinkResponseCallBack callBack) {
         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
             if (callBack != null) {
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
@@ -382,7 +529,7 @@
 
         LinkRequest message = new LinkRequest(topic, bodyStr);
         String ip = HDLLinkConfig.getInstance().getIpAddress();
-        if(broadcast) {
+        if (broadcast) {
             ip = IpUtils.getBroadcastAddress();
         }
         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
@@ -404,13 +551,13 @@
     /**
      * 閫氱敤鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic   鍙戦�佹暟鎹�
-     * @param bodyStr 鍥炲鐨勪富棰�
+     * @param topic     鍙戦�佹暟鎹�
+     * @param bodyStr   鍥炲鐨勪富棰�
      * @param broadcast 鏄惁骞挎挱
      */
-    public void udpSendMsg(String topic, String bodyStr,boolean broadcast) {
+    public void udpSendMsg(String topic, String bodyStr, boolean broadcast) {
         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
-            LogUtils.e( "鍙傛暟涓嶈兘涓虹┖锛屼笉鑳藉彂閫乁DP鏁版嵁");
+            LogUtils.e("鍙傛暟涓嶈兘涓虹┖锛屼笉鑳藉彂閫乁DP鏁版嵁");
             return;
         }
         if (!HDLLinkConfig.getInstance().checkIfCertified()) {
@@ -419,7 +566,7 @@
         }
         LinkRequest message = new LinkRequest(topic, bodyStr);
         String ip = HDLLinkConfig.getInstance().getIpAddress();
-        if(broadcast) {
+        if (broadcast) {
             ip = IpUtils.getBroadcastAddress();
         }
         HdlSocketHelper.sendUdpOne(getUdpBoot(), ip, UDP_PORT, message);
@@ -493,9 +640,10 @@
                             final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
                             }.getType());
                             GatewaySearchBean searchBean = response.getObjects();
+
                             if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) {
                                 searchBean.setIp_address(linkResponse.getSource_ipAddress());
-                                if (searchBean.getGatewayId().contains(searchGatewayId)&&!TextUtils.isEmpty(searchGatewayId)) {
+                                if (searchBean.getGatewayId().contains(searchGatewayId) && !TextUtils.isEmpty(searchGatewayId)) {
                                     removeSearchGatewayEvent();//绉婚櫎鎼滅储缃戝叧鐩戝惉
                                     isSearchGatewaySuccess.set(true);//鎼滅储鎴愬姛鏍囪
                                     searchGatewayCount.set(11);//娆℃暟鏍囪
@@ -508,7 +656,7 @@
                         }
                     }
                 } catch (Exception e) {
-
+                    LogUtils.i("panlili锛�" + e.toString());
                 }
             }
         };
@@ -534,8 +682,9 @@
                                 //涓荤綉鍏冲苟涓旀槸褰撳墠缁戝畾鐨勭綉鍏�
                                 if ("true".equals(gateway.getMaster().toLowerCase()) && gateway.getGatewayId().equals(HDLLinkConfig.getInstance().getGatewayId())) {
                                     HDLLinkConfig.getInstance().setCurrentGateway(gateway);//璁剧疆褰撳墠缃戝叧
-                                    if(!TextUtils.isEmpty( gateway.getIp_address())) {
+                                    if (!TextUtils.isEmpty(gateway.getIp_address())) {
                                         HDLLinkConfig.getInstance().setIpAddress(gateway.getIp_address());
+                                        LogUtils.i("鎺ユ敹鍒扮綉鍏充俊鎭細" + HDLLinkConfig.getInstance().getIpAddress());
                                     }
                                     //鏇存柊褰撳墠缃戝叧鐨勪俊鎭�
                                     HDLLinkConfig.getInstance().reSaveConfig();
@@ -544,7 +693,7 @@
                         }
                     }
                 } catch (Exception e) {
-
+                    LogUtils.i("panlili锛�" + e.toString());
                 }
             }
         };
@@ -593,7 +742,8 @@
                         LogUtils.e("鎼滅储缃戝叧", "鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�");
                         //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�
                         callBackSearchGatewayTimeout();
-                    }catch (Exception e){}
+                    } catch (Exception e) {
+                    }
                 }
             }
         }).start();
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
index 23f1583..977fa55 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -1,9 +1,16 @@
 package com.hdl.sdk.connect.socket;
 
+import static com.hdl.sdk.connect.config.HDLLinkConfig.AUTHENTICATE_IS_DEVICEINFO_KEY;
+
+import android.os.Build;
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.RequiresApi;
+
 import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.common.HDLSdk;
 import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.EventDispatcher;
 import com.hdl.sdk.common.event.EventListener;
@@ -11,20 +18,33 @@
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.IdUtils;
 import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.SPUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.LoginRequest;
+import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 import com.hdl.sdk.connect.bean.request.BroadcastRequest;
+import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
+import com.hdl.sdk.connect.bean.request.GatewayInfoRequest;
+import com.hdl.sdk.connect.bean.request.ListOidRequest;
+import com.hdl.sdk.connect.bean.request.ListOidRequest2;
+import com.hdl.sdk.connect.bean.request.ListUploadRequest;
+import com.hdl.sdk.connect.bean.response.AuthenticateResponse;
+import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
 import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
 import com.hdl.sdk.connect.bean.request.FunctionAttributeRequest;
 import com.hdl.sdk.connect.bean.LinkRequest;
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.bean.request.PropertyReadRequest;
+import com.hdl.sdk.connect.bean.response.DeviceInfoResponse;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
 import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
+import com.hdl.sdk.connect.utils.AesUtil;
 import com.hdl.sdk.socket.SocketBoot;
 import com.hdl.sdk.socket.SocketOptions;
 import com.hdl.sdk.socket.client.IHeartbeat;
@@ -34,6 +54,7 @@
 import com.hdl.sdk.socket.listener.SendListener;
 
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -59,7 +80,7 @@
         statusListener = new ConnectStatusListener() {
             @Override
             public void onConnecting() {
-                broadcastRequest();
+                //broadcastRequest();
             }
 
             @Override
@@ -74,43 +95,76 @@
         };
     }
 
+    public boolean isBroadcast = false;
+
+
     /**
      * 骞挎挱鑷韩淇℃伅缁欎富缃戝叧
      */
-    private void broadcastRequest() {
+    public void broadcastRequest() {
+
         new Thread(new Runnable() {
             @Override
             public void run() {
-                try {
-                    LogUtils.i("骞挎挱璁惧鏈韩淇℃伅");
+                while (true) {
+                    try {
+                        Thread.sleep(1000);
+//                        LogUtils.i("checkIfCertified=" + HDLLink.getInstance().checkIfCertified() + " getTcp().connected=" + getTcp().connected);
+                        try {
+                            if (!HDLLink.getInstance().checkIfCertified() || (!TextUtils.isEmpty(getTcpIp()) && getTcp().connected)) {
+                                continue;
+                            }
+                        } catch (Exception e) {
 
-                    String time = String.valueOf(System.currentTimeMillis());
-                    if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
-                        LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
-                        return;
+                        }
+                        LogUtils.i("骞挎挱璁惧鏈韩淇℃伅");
+                        String time = String.valueOf(System.currentTimeMillis());
+                        if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
+                            LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
+                            continue;
+                        }
+                        BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
+                        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
+                            @RequiresApi(api = Build.VERSION_CODES.O)
+                            @Override
+                            public void onSuccess(LinkResponse msg) {
+                                String data = msg.getData();
+                                if (!TextUtils.isEmpty(data)) {
+                                    DeviceInfoResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<DeviceInfoResponse>() {
+                                    }.getType());
+
+                                    if ((response == null) || (response.getObjects() == null) || (response.getObjects().getIPAddress() == null))
+                                        return;
+
+                                    HDLLinkConfig.getInstance().setIpAddress(response.getObjects().getIPAddress());
+                                    LogUtils.i("---getIpAddress=" + HDLLinkConfig.getInstance().getIpAddress());
+
+                                    HDLLinkConfig.getInstance().reSaveConfig();
+                                }
+
+                                isBroadcast = true;
+                                getTcp();
+                                LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧鎴愬姛锛�");
+                            }
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                                isBroadcast = false;
+                                LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧澶辫触锛�---onError=" + e.toString());
+                            }
+                        });
+//                        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+                        //HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+                    } catch (Exception e) {
+                        LogUtils.e("骞挎挱璁惧鏈韩淇℃伅澶辫触锛屽け璐ヤ俊鎭細" + e.getMessage());
                     }
-                    BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
-                        @Override
-                        public void onSuccess(LinkResponse msg) {
-                            LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧鎴愬姛锛�");
-                        }
-
-                        @Override
-                        public void onError(HDLLinkException e) {
-                            LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧澶辫触锛�");
-                        }
-                    });
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
-                } catch (Exception e) {
-                    LogUtils.e("骞挎挱璁惧鏈韩淇℃伅澶辫触锛屽け璐ヤ俊鎭細" + e.getMessage());
                 }
+
             }
         }).start();
     }
 
-//    private static class SingletonInstance {
+    //    private static class SingletonInstance {
 //    }
     private static final HDLSocket instance = new HDLSocket();
 
@@ -119,8 +173,9 @@
     }
 
     SocketOptions options;
+
     private SocketOptions getTcpOptions() {
-        if(null!=options){
+        if (null != options) {
             return options;
         }
         options = new SocketOptions();
@@ -423,13 +478,13 @@
             throw new RuntimeException("璇锋悳绱㈢綉鍏�");
         }
         //濡傛灉娌℃湁鍒濆鍖栵紝鎴栬�呯綉鍏矷P鏇存敼浜嗭紝灏遍噸鏂板垵濮嬪寲
-        if (tcpBoot == null||!getTcpOptions().getIp().equals(getTcpIp())) {
+        if (tcpBoot == null || !getTcpOptions().getIp().equals(getTcpIp())) {
             tcpBoot = TcpClient.init(getTcpIp(), getTcpPort(), getTcpOptions());
             tcpBoot.SetHeartbeat(new IHeartbeat() {
                 @Override
                 public void heartbeat() {
 
-                    if(HDLLinkConfig.getInstance().getDeviceInfoBean()==null||HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()==null) {
+                    if (HDLLinkConfig.getInstance().getDeviceInfoBean() == null || HDLLinkConfig.getInstance().getDeviceInfoBean().getOID() == null) {
                         LogUtils.i("DeviceInfoBean涓虹┖锛岄渶瑕佽缃墠鑳芥甯稿績璺�");
                         return;
                     }
@@ -438,6 +493,10 @@
                     JsonObject jsonObject = new JsonObject();
                     jsonObject.addProperty("id", IdUtils.getUUId());
                     jsonObject.addProperty("time_stamp", time);
+
+                    if (HDLLinkConfig.getInstance().getRequestBean() != null) {
+                        jsonObject.addProperty("mac", HDLLinkConfig.getInstance().getRequestBean().getMAC());
+                    }
 
                     String topic = String.format(TopicConstant.HEARTBEAT, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID());
 
@@ -493,8 +552,56 @@
     }
 
     /**
-     *  鍦烘櫙鎺у埗
-     * @param sids 鍦烘櫙sid鍒楄〃
+     * 鑾峰彇鍦烘櫙鍒楄〃
+     */
+    public void getScene(List<String> sids, HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            List<PropertyReadRequest> list = new ArrayList<>();
+            for (String s : sids) {
+                list.add(new PropertyReadRequest(s));
+            }
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.SCENE_GET, getGatewayId());
+            LinkRequest message = new LinkRequest(topic,
+                    GsonConvert.getGson().toJson(data));
+
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 鍦烘櫙鎺у埗
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
      * @param callBack 鍥炶皟
      */
     public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
@@ -535,6 +642,287 @@
                 }
             }
         } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 涓婃姤oid鍒楄〃
+     *
+     * @param request  璁惧淇℃伅
+     * @param callBack 鍥炶皟
+     */
+    public void UploadOidList(ListUploadRequest request, HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<ListUploadRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            List<ListUploadRequest> list = new ArrayList<>();
+            list.add(request);
+
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.LIST_UPLOAD, getGatewayId());
+            LinkRequest message = new LinkRequest(topic,
+                    GsonConvert.getGson().toJson(data));
+
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 涓婃姤鍏ョ綉璁よ瘉缁撴灉
+     *
+     * @param mac       mac
+     * @param result    缁撴灉0/-1
+     * @param message   璁よ瘉淇℃伅
+     * @param auth_code 浜戠璁よ瘉code
+     * @param callBack  缁撴灉鍥炶皟
+     */
+    public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<DeviceAuthRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            DeviceAuthRequest deviceAuthRequest = new DeviceAuthRequest();
+            deviceAuthRequest.setMac(mac);
+            deviceAuthRequest.setResult(result);
+            deviceAuthRequest.setMessage(message);
+            deviceAuthRequest.setAuth_code(auth_code);
+
+            List<DeviceAuthRequest> list = new ArrayList<>();
+            list.add(deviceAuthRequest);
+
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.DEIVCE_AUTH_RESULT_NOTIFY, getGatewayId());
+            LinkRequest linkRequest = new LinkRequest(topic,
+                    GsonConvert.getGson().toJson(data));
+
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(linkRequest.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+
+    /**
+     * tcp鐧诲綍鏂逛究鑾峰彇鐘舵��
+     *
+     * @param clientType 瀹㈡埛绔被鍨�
+     *                   搴旂敤锛歛pp锛�
+     *                   璋冭瘯杞欢锛歱rogram锛�
+     *                   绗笁鏂癸細third_party锛�
+     *                   缃戝叧锛歡ateway锛�
+     *                   鍏跺畠锛歰ther
+     * @param version    鍗忚鐗堟湰
+     */
+    public void tcpLogin(String clientType, String version, HDLLinkCallBack callBack) {
+        final String msgId = IdUtils.getUUId();
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<LoginRequest> data = new BaseLocalResponse<>();
+        data.setId(msgId);
+        data.setTime_stamp(time);
+
+        final LoginRequest request = new LoginRequest();
+        request.setVersion(version);
+        request.setClientType(clientType);
+
+        data.setObjects(request);
+
+        String topic = String.format(TopicConstant.GATEWAY_LOGIN, HDLLinkConfig.getInstance().getGatewayId());
+        LinkRequest message = new LinkRequest(topic,
+                GsonConvert.getGson().toJson(data));
+
+        String replyTopic = topic + "_reply";
+        try {
+            sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                @Override
+                public void onSucceed() {
+                    LogUtils.i("tcpLogin onSucceed");
+                }
+
+                @Override
+                public void onError() {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                    }
+                }
+            });
+        } catch (Exception e) {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+
+    /**
+     * 閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧
+     *
+     * @param oid      浠庣綉鍏筹紙璁惧锛塷id
+     * @param isForce  鏄惁寮哄埗閫�缃�
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void deleteNetwork(String oid, boolean isForce, HDLLinkCallBack callBack) {
+        if (TextUtils.isEmpty(oid)) {
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
+        }
+
+        final String msgId = IdUtils.getUUId();
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<List<ListOidRequest2>> data = new BaseLocalResponse<>();
+        data.setId(msgId);
+        data.setTime_stamp(time);
+
+        final ListOidRequest2 request = new ListOidRequest2();
+        request.setOid(oid);
+        List<ListOidRequest2> list = new ArrayList<>();
+        list.add(request);
+
+        data.setObjects(list);
+
+        String topic = String.format(TopicConstant.DELETE_REQUEST, HDLLinkConfig.getInstance().getGatewayId());
+        LinkRequest message = new LinkRequest(topic,
+                GsonConvert.getGson().toJson(data));
+
+        String replyTopic = topic + "_reply";
+
+        if (isForce) {//寮哄埗閫�缃戯紝涓嶇瓑缃戝叧鍥炲鐩存帴娓呴櫎鏁版嵁
+            HDLLinkConfig.getInstance().clearConfig();
+        }
+
+        try {
+            sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                @Override
+                public void onSucceed() {
+                    if (callBack == null) return;
+                    try {
+                        callBack.onSuccess("閫�缃戞垚鍔�");
+                        HDLLinkConfig.getInstance().clearConfig();
+
+                    } catch (Exception e) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
+                    }
+                }
+
+                @Override
+                public void onError() {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                    }
+                }
+            });
+        } catch (Exception e) {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧鎷撴墤鍏崇郴
+     *
+     * @param oid      浠庣綉鍏筹紙璁惧锛塷id
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void deleteNetwork(String oid, HDLLinkCallBack callBack) {
+        if (TextUtils.isEmpty(oid)) {
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
+        }
+
+        final String msgId = IdUtils.getUUId();
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalCodeResponse<List<ListOidRequest>> data = new BaseLocalCodeResponse<>();
+        data.setId(msgId);
+        data.setTime_stamp(time);
+        data.setCode("0");
+
+        final ListOidRequest request = new ListOidRequest();
+        request.setOid(oid);
+        List<ListOidRequest> list = new ArrayList<>();
+        list.add(request);
+
+        data.setObjects(list);
+
+        String topic = String.format(TopicConstant.DELETE_NOTIFY_REPLY, HDLLinkConfig.getInstance().getGatewayId());
+        LinkRequest message = new LinkRequest(topic,
+                GsonConvert.getGson().toJson(data));
+
+//        String replyTopic = topic + "_reply";
+
+        try {
+            sendMsg(message.getSendBytes(), topic, callBack, new SendListener() {
+                @Override
+                public void onSucceed() {
+                    if (callBack == null) return;
+                    try {
+                        callBack.onSuccess("閫�缃戞垚鍔�");
+                        HDLLinkConfig.getInstance().clearConfig();
+
+                    } catch (Exception e) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
+                    }
+                }
+
+                @Override
+                public void onError() {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                    }
+                }
+            });
+        } catch (Exception e) {
             if (callBack != null) {
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
             }
@@ -584,19 +972,19 @@
     /**
      * 閫氱敤TCP鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic   鍙戦�佹暟鎹�
+     * @param bodyStr 鍥炲鐨勪富棰�
      */
     public void tcpSendMsg(String topic, String bodyStr) {
         try {
             if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
-                LogUtils.e("udpSendMsg", "鍙傛暟涓嶈兘涓虹┖");
+                LogUtils.e("tcpSendMsg", "鍙傛暟涓嶈兘涓虹┖");
                 return;
             }
             LinkRequest message = new LinkRequest(topic, bodyStr);
             getTcp().sendMsg(message.getSendBytes());
         } catch (Exception e) {
-            LogUtils.e("tcpSendMsg", "鍙戦�佸け璐� :"+e.getMessage());
+            LogUtils.e("tcpSendMsg", "鍙戦�佸け璐� :" + e.getMessage());
         }
     }
 
@@ -607,7 +995,7 @@
     public void sendMsg(byte[] data, String eventTag, HDLLinkCallBack callBack, SendListener sendListener) {
 
         try {
-            if(eventTag!=null) {
+            if (eventTag != null) {
                 final AtomicInteger sendCount = new AtomicInteger(0);
 
                 final ScheduledExecutorService threadPool = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store
new file mode 100644
index 0000000..7062e40
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java
new file mode 100644
index 0000000..3a1647c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -0,0 +1,270 @@
+package com.hdl.sdk.socket;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.HDLSdk;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.connect.socket.HDLSocket;
+import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.client.IClient;
+import com.hdl.sdk.socket.client.IHeartbeat;
+import com.hdl.sdk.socket.client.TcpClient;
+import com.hdl.sdk.socket.listener.SendListener;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+
+/**
+ * Created by Tong on 2021/9/26.
+ * Tcp/Udp 鍚姩鍣�
+ */
+public class SocketBoot {
+
+    private ExecutorService connectThread;
+    private ExecutorService sendThread;
+    private ExecutorService receiveThread;
+    private ExecutorService heartbeatThread;
+
+    private final IClient client;
+    private IHeartbeat iHeartbeat;
+
+    public void SetHeartbeat(IHeartbeat iHeartbeat) {
+        this.iHeartbeat = iHeartbeat;
+    }
+
+    /**
+     * 褰撳墠鎺ユ敹鍒版暟鎹殑鏃堕棿
+     */
+    private static long time = System.currentTimeMillis();
+
+    /**
+     * tcp鏄惁宸茬粡杩炴帴
+     */
+    public boolean connected = false;
+
+    public IClient getClient() {
+        return client;
+    }
+
+    private final BlockingQueue<SocketRequest> mMessageQueue = new LinkedBlockingDeque<>();
+
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
+
+    public SocketBoot(IClient client) {
+        this.client = client;
+        initConnectThread();
+        initReceiveThread();
+        initSendThread();
+        initHeartbeat();
+    }
+
+    /**
+     * 杩炴帴tcp锛屽唴閮ㄧ淮鎶ゆ帀锛屽彲浠ヤ笉鐢ㄥ紑鏀惧閮紝鏍规嵁杩欎釜涓氬姟鎴戠壒鎬у鐞嗗ソ
+     */
+    private synchronized void connect() {
+        try {
+            LogUtils.i("TCP杩炴帴");
+            client.onConnectStatus(ConnectStatus.CONNECTING);
+            Thread.sleep(1000);
+            client.connect();
+            connected = true;
+            HDLSocket.getInstance().tcpLogin("third_party", HDLSdk.getInstance().getVersion(),null);
+            LogUtils.i("TCP杩炴帴鎴愬姛");
+            client.onConnectStatus(ConnectStatus.CONNECTED);
+        } catch (Exception e) {
+            LogUtils.e("杩炴帴寮傚父" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 鍒濆鍖栧彂閫佺嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    private void initSendThread() {
+        if (sendThread == null) {
+            sendThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            sendThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            if (!connected) {
+                                Thread.sleep(200);
+                                continue;
+                            }
+                            SocketRequest socketRequest = mMessageQueue.take();
+//                            final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
+//                            LogUtils.i("鍙戦�佹暟鎹細" + sendStr);
+                            if (System.currentTimeMillis() - socketRequest.getTime() > 10000) {
+                                continue;
+                            }
+                            final String action = socketRequest.getAction();
+                            try {
+
+                                client.sendMsg(socketRequest.getData());
+                                if (!TextUtils.isEmpty(action)) {
+                                    SendListener sendListener = sendMap.get(action);
+                                    if (sendListener != null) {
+                                        sendListener.onSucceed();
+                                    }
+                                }
+                            } catch (Exception e) {
+                                HDLSocket.getInstance().isBroadcast=false;
+                                connected = false;
+
+                                LogUtils.e("鍙戦�佸け璐�:" + e.getMessage());
+                                if (!TextUtils.isEmpty(action)) {
+                                    SendListener sendListener = sendMap.get(action);
+                                    if (sendListener != null) {
+                                        sendListener.onError();
+                                    }
+                                }
+                            }
+                        } catch (Exception e) {
+
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    public void initReceiveThread() {
+        if (receiveThread == null) {
+            receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            receiveThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            if (connected) {
+                                //璇诲彇鏁版嵁
+                                client.onHandleResponse();
+                                time = System.currentTimeMillis();
+                            } else {
+                                try {
+                                    Thread.sleep(1000);
+                                } catch (Exception ee) {
+
+                                }
+                            }
+                        } catch (Exception e) {
+                            HDLSocket.getInstance().isBroadcast= false;
+                            connected = false;
+
+                            LogUtils.e("鎺ユ敹鏁版嵁绾跨▼寮傚父" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栭噸鏂拌繛鎺ョ嚎绋�
+     */
+    private void initConnectThread() {
+        if (connectThread == null) {
+            connectThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            //涓�瀹氭椂闂存娴嬩竴娆¤繛鎺ユ儏鍐碉紝娌℃湁杩炴帴灏辨墽琛岃繛鎺ワ紝杩炴帴缁熶竴鐢辫繖閲岀淮鎶�
+            connectThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+//                            LogUtils.i("initConnectThread: connected=" + connected + " isBroadcast=" + HDLSocket.getInstance().isBroadcast);
+                            if (!connected && HDLSocket.getInstance().isBroadcast) {
+                                reconect();
+                            }
+                            Thread.sleep(3 * 1000);
+                        } catch (Exception e) {
+                            LogUtils.e("瀹氭椂杩炴帴澶辫触:" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栭噸鏂板績璺崇嚎绋�
+     */
+    private void initHeartbeat() {
+        if (heartbeatThread == null) {
+            heartbeatThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            heartbeatThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            //10绉�
+                            if (connected && 10 * 1000 < (System.currentTimeMillis() - time)) {
+                                time = System.currentTimeMillis();
+                                //蹇冭烦妫�娴�
+                                if (iHeartbeat != null)
+                                    iHeartbeat.heartbeat();
+                            }
+                            Thread.sleep(1000);
+                        } catch (Exception e) {
+                            LogUtils.e("瀹氭椂蹇冭烦妫�娴嬬綉鍏冲紓甯革細" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 閲嶆柊杩炴帴
+     */
+    private void reconect() {
+        disconnect();
+        connect();
+    }
+
+    /**
+     * 鍙戦�佹棤闇�鍥炶皟
+     *
+     * @param msg 鍙戦�佺殑鏁版嵁
+     */
+    public void sendMsg(byte[] msg) {
+        sendMsg(msg, null);
+    }
+
+
+    /**
+     * @param listener 涓�鑸儏鍐垫棤闇�鐩戝惉
+     */
+    public void sendMsg(byte[] msg, SendListener listener) {
+        try {
+            SocketRequest request = new SocketRequest(msg);
+            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
+                sendMap.put(request.getAction(), listener);
+            }
+            mMessageQueue.put(request);
+        } catch (Exception e) {
+            LogUtils.e("鍙戦�佹暟鎹け璐ワ細" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    private synchronized void disconnect() {
+        try {
+            client.disconnect();
+            //鏂紑杩炴帴
+            client.onConnectStatus(ConnectStatus.DISCONNECT);
+        } catch (Exception e) {
+
+        }
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java
new file mode 100644
index 0000000..1e300d5
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java
@@ -0,0 +1,75 @@
+package com.hdl.sdk.socket;
+
+
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * socket閰嶇疆
+ */
+public class SocketOptions {
+
+    //鍙戦�佺洰鏍囧湴鍧�IP
+    private String ip="";
+    private int port;
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+
+    //鐩戝惉鐘舵��
+    private List<ConnectStatusListener> mConnectStatusListener;
+
+
+    public String getIp() {
+        return ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+
+    public void clearConnectStatusListener() {
+        if (mConnectStatusListener != null && !mConnectStatusListener.isEmpty()) {
+            mConnectStatusListener.clear();
+        }
+    }
+
+    public void addConnectStatusListener(ConnectStatusListener connectStatusListener) {
+        if (mConnectStatusListener == null) {
+            mConnectStatusListener = new ArrayList<>();
+        }
+        mConnectStatusListener.add(connectStatusListener);
+    }
+
+    public void removeConnectStatusListener(ConnectStatusListener connectStatusListener) {
+        if (mConnectStatusListener != null) {
+            mConnectStatusListener.remove(connectStatusListener);
+        }
+    }
+
+    public List<ConnectStatusListener> getConnectStatusListener() {
+        return mConnectStatusListener;
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java
new file mode 100644
index 0000000..cf07185
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.socket;
+
+import com.hdl.sdk.socket.client.IClient;
+
+import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
+import java.net.SocketException;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by Tong on 2021/10/19.
+ * 璁″垝鍙傝�僩eneric-pool銆丆ommons Pool杩涜瀹屽杽
+ */
+public class SocketPool {
+
+    private final ConcurrentHashMap<String, IClient> mPool;
+    private final ConcurrentHashMap<String, DatagramSocket> mUdpClientPool;
+
+    private SocketPool() {
+        mPool = new ConcurrentHashMap<>();
+        mUdpClientPool = new ConcurrentHashMap<>();
+    }
+
+    private static final SocketPool instance = new SocketPool();
+
+    public static SocketPool getInstance() {
+        return instance;
+    }
+
+    public void clear() {
+        mPool.clear();
+        mUdpClientPool.clear();
+    }
+
+    public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
+        DatagramSocket socket;
+        final String key = address.toString();
+        if (mUdpClientPool.containsKey(key)) {
+            socket = mUdpClientPool.get(key);
+            if (socket != null && !socket.isClosed()) {
+                return socket;
+            } else {
+                socket = new DatagramSocket(address);
+            }
+        } else {
+            socket = new DatagramSocket(address);
+        }
+        mUdpClientPool.put(address.toString(), socket);
+        return socket;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java
new file mode 100644
index 0000000..eaa81fc
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java
@@ -0,0 +1,41 @@
+package com.hdl.sdk.socket;
+
+import java.util.UUID;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class SocketRequest {
+
+    private String action;
+
+    private byte[] data;
+
+    private long time = System.currentTimeMillis();
+
+    public SocketRequest(byte[] data) {
+        this.data = data;
+
+        action = UUID.randomUUID().toString();
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    public void setData(byte[] data) {
+        this.data = data;
+    }
+
+    public long getTime() {
+        return time;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
new file mode 100644
index 0000000..24f6c5c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
@@ -0,0 +1,24 @@
+package com.hdl.sdk.socket.annotation;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+
+public class ConnectStatus {
+
+    /**
+     * 杩炴帴涓�
+     */
+    public static final int CONNECTING = 0;
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    public static final int CONNECTED = 1;
+
+    /**
+     * 杩炴帴鍏抽棴
+     */
+    public static final int DISCONNECT = 2;
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java
new file mode 100644
index 0000000..8fa126e
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java
@@ -0,0 +1,32 @@
+package com.hdl.sdk.socket.client;
+
+
+import com.hdl.sdk.socket.SocketOptions;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface IClient {
+
+    void connect() throws Exception;
+
+    void disconnect();
+
+
+    SocketOptions getOptions();
+
+    /**
+     * 鐩戝惉鏁版嵁
+     */
+    void onHandleResponse() throws Exception;
+
+    /**
+     * 鍙戦�佹秷鎭�
+     */
+    void sendMsg(byte[] msg) throws Exception;
+
+    /**
+     * 杩炴帴鐘舵��
+     */
+    void onConnectStatus(int status);
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java
new file mode 100644
index 0000000..a86a092
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java
@@ -0,0 +1,8 @@
+package com.hdl.sdk.socket.client;
+
+/**
+ * Created by hxb on 2022/2/16.
+ */
+public interface IHeartbeat {
+    void heartbeat();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
new file mode 100644
index 0000000..0e6e5d6
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
@@ -0,0 +1,42 @@
+package com.hdl.sdk.socket.client;
+
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public interface IUdpClient {
+
+    /**
+     * 缁戝畾绔彛
+     */
+    void bind() throws Exception;
+
+    /**
+     * 鍏抽棴褰撳墠杩炴帴
+     * @return
+     */
+    boolean close();
+
+
+    UdpSocketOptions getOptions();
+
+    /**
+     * 鐩戝惉鏁版嵁
+     */
+    void onHandleResponse() throws Exception;
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩爣IP
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     * @throws Exception
+     */
+    void sendMsg(String ipAddress,int port, byte[] msg) throws Exception;
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
new file mode 100644
index 0000000..7469cc3
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
@@ -0,0 +1,199 @@
+package com.hdl.sdk.socket.client;
+
+
+
+import com.hdl.sdk.common.utils.ByteUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.socket.SocketBoot;
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.StandardSocketOptions;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Created by Tong on 2021/9/15.
+ */
+public final class TcpClient implements IClient {
+
+
+    private SocketOptions socketOptions;
+
+    private final String ip;
+    private final int port;
+
+    private Socket mSocket;
+
+    private final static List<TcpClient> tcpClientList = new ArrayList();
+
+    /**
+     * 浠庤繛鎺ユ睜涓壘鍑哄綋鍓岻P鍙婄鍙g殑杩炴帴瀹㈡埛绔�
+     * @param ipAdderss 杩炴帴IP鍦板潃
+     * @param port 杩炴帴绔彛
+     * @return
+     */
+    public static TcpClient getTcpClientByIP(String ipAdderss,int port) {
+        for(TcpClient tcpClient:tcpClientList){
+            if(tcpClient.ip.equals(ipAdderss)&&tcpClient.port==port)
+            {
+                return tcpClient;
+            }
+        }
+        return  null;
+    }
+
+    private byte[] readBuffer = new byte[4*1024];
+
+    private TcpClient(String ip, int port, SocketOptions socketOptions) {
+        this.socketOptions = socketOptions;
+        this.ip = ip;
+        this.port = port;
+        socketOptions.setIp(ip);
+        socketOptions.setPort(port);
+    }
+
+    public static SocketBoot init(String ip, int port, SocketOptions options) {
+        return new SocketBoot(new TcpClient(ip, port, options));
+    }
+
+
+    @Override
+    public void connect() throws Exception {
+
+        mSocket = getSocket();
+//        SocketOptions options = getOptions();
+        mSocket.connect(new InetSocketAddress(ip, port), 3 * 1000);
+        mSocket.setTcpNoDelay(true);
+        mSocket.setReuseAddress(true);
+//        mSocket.setKeepAlive(true);
+        mSocket.setSoTimeout(25 * 1000);
+
+        tcpClientList.add(this);
+    }
+
+
+
+
+    @Override
+    public void disconnect() {
+        if (mSocket != null) {
+            try {
+                mSocket.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public synchronized SocketOptions getOptions() {
+        if (socketOptions == null) {
+            socketOptions = new SocketOptions();
+        }
+        return socketOptions;
+    }
+
+    @Override
+    public void onHandleResponse() throws Exception {
+        final InputStream stream = getInputStream();
+        if (stream != null && getOptions() != null) {
+            while ( true) {
+                int len=getInputStream().read(readBuffer);
+                if(len<=0){
+                    throw  new Exception("鎺ユ敹寮傚父锛屾帴鏀舵暟鎹暱搴en="+len);
+                }
+
+                IHandleMessage handleMessage = getOptions().getHandleMessage();
+                if (handleMessage != null) {
+                    byte []bytes = new byte[len];
+                    System.arraycopy(readBuffer,0,bytes,0,len);
+                    //瀹屾暣鐨勬暟鎹墠鍥炶皟
+                    handleMessage.read(bytes,ip);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void sendMsg(byte[] msg) throws Exception {
+        final OutputStream outputStream = getOutStream();
+        if (outputStream != null && getOptions() != null) {
+                IHandleMessage handleMessage = getOptions().getHandleMessage();
+                handleMessage.write(handleMessage.write(msg));
+                outputStream.write(msg);
+                outputStream.flush();
+        }
+    }
+
+
+    /**
+     * 澶勭悊杩炴帴鐘舵��
+     */
+    public void onConnectStatus(int status) {
+        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final List<ConnectStatusListener> list = getOptions().getConnectStatusListener();
+                if (list != null && !list.isEmpty()) {
+                    for (ConnectStatusListener listener : list) {
+                        switch (status) {
+                            case ConnectStatus
+                                    .CONNECTING:
+                                listener.onConnecting();
+                                break;
+                            case ConnectStatus
+                                    .CONNECTED:
+                                listener.onConnected();
+                                break;
+                            case ConnectStatus
+                                    .DISCONNECT:
+                                listener.onConnectFailed();
+                                break;
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+
+    private synchronized Socket getSocket() {
+        return new Socket();
+    }
+
+    private InputStream getInputStream() {
+        if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
+            try {
+                return mSocket.getInputStream();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+    private OutputStream getOutStream() {
+        if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
+            try {
+                return mSocket.getOutputStream();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
new file mode 100644
index 0000000..c6a3aff
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -0,0 +1,176 @@
+package com.hdl.sdk.socket.client;
+
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.utils.IpUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.socket.SocketBoot;
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.SocketPool;
+import com.hdl.sdk.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
+import com.hdl.sdk.socket.codec.IHandleMessage;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpClient implements IUdpClient {
+
+    /**
+     * 褰撳墠socket
+     */
+    private  DatagramSocket mSocket;
+
+    /**
+     * 鎺ユ敹鏁版嵁鍖�
+     */
+    private DatagramPacket receivePacket;
+
+    /**
+     * 缂撳啿鍖哄ぇ灏�
+     */
+    private final int BUFFER = 2 * 1024;
+
+    /**
+     * 鏈湴鐩戝惉IP鍦板潃
+     */
+    private String ipAddress;
+    /**
+     * 鏈湴鐩戝惉绔彛
+     */
+    private int port;
+
+    /**
+     * socket閰嶇疆淇℃伅
+     */
+    private UdpSocketOptions socketOptions;
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉绔彛
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param socketOptions
+     */
+    private UdpClient(String ipAddress,int port, UdpSocketOptions socketOptions) {
+        this.ipAddress = ipAddress;
+        this.port = port;
+        this.socketOptions = socketOptions;
+        byte[] receiveByte = new byte[BUFFER];
+        receivePacket = new DatagramPacket(receiveByte, receiveByte.length);
+    }
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉IP鍦板潃
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(String ipAddress, int port, UdpSocketOptions options) {
+        return new UdpSocketBoot(new UdpClient(ipAddress, port, options));
+    }
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(int port, UdpSocketOptions options) {
+        return init("0.0.0.0", port, options);
+    }
+
+
+    @Override
+    public void bind() throws Exception {
+        try {
+            //宸茬粡缁戝畾杩囧氨涓嶇敤鍐嶇粦瀹�
+            if (null != mSocket) {
+                return;
+            }
+            if (TextUtils.isEmpty(ipAddress)) {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port));
+            }else {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(ipAddress,port));
+            }
+            mSocket.setBroadcast(true);
+//            mSocket.setReuseAddress(true);
+
+        } catch (Exception e) {
+            LogUtils.e("鍒濆鍖朣ocket 澶辫触锛�" + e.getMessage());
+            throw e;
+        }
+    }
+
+    @Override
+    public boolean close() {
+        try {
+            mSocket.close();
+        } catch (Exception e) {
+
+        }
+        mSocket = null;
+        return true;
+    }
+
+    @Override
+    public UdpSocketOptions getOptions() {
+        return this.socketOptions;
+    }
+
+    @Override
+    public void onHandleResponse() throws Exception {
+        if (mSocket == null) {
+            return;
+        }
+        try {
+            mSocket.receive(receivePacket);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        if (receivePacket.getLength() == 0) {
+            return;
+        }
+        //鎺掗櫎鑷繁鍙戝嚭鍘荤殑
+        try {
+            if (IpUtils.isLocalIpAddress(receivePacket.getAddress().getHostAddress()))
+                return;
+        } catch (Exception ignored) {
+
+        }
+
+        try {
+//            LogUtils.i("鎺ユ敹鍒癠dp鏁版嵁鍖咃紝缃戠粶鍦板潃锛�" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
+
+            IHandleMessage handleMessage = getOptions().getHandleMessage();
+            if (handleMessage != null) {
+                byte[] data = new byte[receivePacket.getLength()];
+                System.arraycopy(receivePacket.getData(), 0, data, 0, data.length);
+                handleMessage.read(data,receivePacket.getAddress().getHostAddress());
+            }
+
+        } catch (Exception e) {
+
+        }
+    }
+
+
+    @Override
+    public void sendMsg(String ipAddress,int port, byte[] msg) throws Exception {
+        if (msg == null) {
+            return;
+        }
+        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ipAddress), port);
+        mSocket.send(sendPacket);
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java
new file mode 100644
index 0000000..4bcbe40
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java
@@ -0,0 +1,20 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class ByteToMessageDecoder<T> implements IHandleFlow<T> {
+
+    protected abstract T decoder(Object msg,String ipaddress)
+            throws Exception;
+
+    @Override
+    public final T read(Object data,String ipaddress) throws Exception {
+        return decoder(data,ipaddress);
+    }
+
+    @Override
+    public final byte[] write(byte[] data) {
+        return data;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java
new file mode 100644
index 0000000..39f1f6c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IHandleFlow<T> {
+
+    T read(Object data,String ipaddress) throws Exception;
+
+    byte[] write(byte[] data) throws Exception;
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java
new file mode 100644
index 0000000..f86f0b1
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/27.
+ */
+public interface IHandleMessage {
+    void read(byte[] data,String ipaddress) throws Exception;
+
+    byte[] write(byte[] data) throws Exception;
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java
new file mode 100644
index 0000000..4fdc975
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IMessagePipeLine {
+
+    void add(IHandleFlow flow);
+
+    void clear();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java
new file mode 100644
index 0000000..2f874e0
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.socket.codec;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class MessagePipeLine implements IMessagePipeLine, IHandleMessage {
+
+    public final List<IHandleFlow> queue = new ArrayList<>();
+
+    @Override
+    public void add(IHandleFlow flow) {
+        queue.add(flow);
+    }
+
+    @Override
+    public synchronized void clear() {
+        queue.clear();
+    }
+
+    @Override
+    public void read(byte[] data,String ipaddress) throws Exception {
+        Object out = data;
+        for (int i = 0; i < queue.size(); i++) {
+            IHandleFlow flow = queue.get(i);
+            Object read = flow.read(out,ipaddress);
+            try {
+                out = Objects.requireNonNull(read);
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    @Override
+    public byte[] write(byte[] data) throws Exception {
+        byte[] out = data;
+        for (int i = 0; i < queue.size(); i++) {
+            IHandleFlow flow = queue.get(i);
+            byte[] write = flow.write(out);
+            try {
+                out = Objects.requireNonNull(write);
+            } catch (Exception ignored) {
+
+            }
+        }
+        return new byte[0];
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java
new file mode 100644
index 0000000..515be13
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java
@@ -0,0 +1,24 @@
+package com.hdl.sdk.socket.codec;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class MessageToByteEncoder implements IHandleFlow {
+
+
+    protected abstract byte[] encode(byte[] data)
+            throws Exception;
+
+    @Override
+    public final Object read(Object data,String ipaddress) {
+        return data;
+    }
+
+    @Override
+    public byte[] write(byte[] data) throws Exception {
+        return encode(data);
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java
new file mode 100644
index 0000000..6bd77b1
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java
@@ -0,0 +1,27 @@
+package com.hdl.sdk.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 杩炴帴鐘舵��
+ */
+public interface ConnectStatusListener {
+
+    /**
+     * 杩炴帴涓�
+     */
+    default void onConnecting() {
+    }
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    default void onConnected() {
+    }
+
+    /**
+     * 杩炴帴澶辫触
+     */
+    default void onConnectFailed() {
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java
new file mode 100644
index 0000000..7f2a9ea
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface SendListener {
+
+    void onSucceed();
+
+    void onError();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
new file mode 100644
index 0000000..be4e1a4
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
@@ -0,0 +1,124 @@
+package com.hdl.sdk.socket.udp;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.socket.SocketRequest;
+import com.hdl.sdk.socket.client.IUdpClient;
+import com.hdl.sdk.socket.listener.SendListener;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketBoot {
+
+    private final IUdpClient client;
+
+    private final AtomicBoolean isOpenRetry = new AtomicBoolean(false);
+
+    private final AtomicInteger resendCount = new AtomicInteger(0);
+
+    private ExecutorService receiveThread;
+
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
+
+    public UdpSocketBoot(IUdpClient client) {
+        this.client = client;
+    }
+
+    /**
+     * 缁戝畾 socket
+     * @throws Exception 鍙兘绔彛鍐茬獊
+     */
+    public void bind() throws Exception {
+        client.bind();
+        initReceiveThread();
+    }
+
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋�
+     */
+    private void initReceiveThread() {
+        if(null!=receiveThread){
+            return;
+        }
+        receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+        receiveThread.execute(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        client.onHandleResponse();
+                    } catch (Exception e) {
+                       LogUtils.i("鎺ユ敹绾跨▼寮傚父锛�"+e.getMessage());
+                    }
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑鐨処P鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(String ipAddress,int port,byte[] msg, SendListener listener) {
+        sendMsg(ipAddress,port, msg, true, listener);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑鐨処P鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     */
+    public void sendMsg(String ipAddress,int port,byte[] msg) {
+        sendMsg(ipAddress,port, msg, true, null);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑IP鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佺殑鏁版嵁
+     * @param isRefreshRetry 鏄惁瑕侀噸鍙�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(String ipAddress,int port, byte[] msg, boolean isRefreshRetry, SendListener listener) {
+        if (isRefreshRetry) {
+            //閲嶇疆杩炴帴娆℃暟
+            resendCount.set(0);
+        }
+        try {
+            SocketRequest request = new SocketRequest(msg);
+            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
+                sendMap.put(request.getAction(), listener);
+            }
+            LogUtils.i("鍙戦�佺洰鏍嘔P鍜岀鍙�", ipAddress + ":" + port);
+            client.sendMsg(ipAddress, port, msg);
+        } catch (Exception e) {
+            LogUtils.i("鍙戦�佸け璐�:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴褰撳墠socket
+     */
+    public synchronized void close() {
+        isOpenRetry.set(false);
+        sendMap.clear();
+        receiveThread.shutdown();
+        receiveThread=null;
+        client.close();
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
new file mode 100644
index 0000000..e61818c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
@@ -0,0 +1,26 @@
+package com.hdl.sdk.socket.udp;
+
+
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketOptions {
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+}
diff --git a/HDLSDK/hdl-socket/build.gradle b/HDLSDK/hdl-socket/build.gradle
index 5c35438..8d3b834 100644
--- a/HDLSDK/hdl-socket/build.gradle
+++ b/HDLSDK/hdl-socket/build.gradle
@@ -11,7 +11,6 @@
         versionCode 2
         versionName "1.0.15"
 
-        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
     }
 
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
index 92f8f84..3f45e3a 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -1,13 +1,7 @@
 package com.hdl.sdk.socket;
 
 import android.text.TextUtils;
-import android.util.Log;
 
-import androidx.collection.ArrayMap;
-
-import com.google.gson.JsonObject;
-import com.hdl.sdk.common.config.TopicConstant;
-import com.hdl.sdk.common.utils.IdUtils;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.socket.annotation.ConnectStatus;
@@ -15,15 +9,11 @@
 import com.hdl.sdk.socket.client.IHeartbeat;
 import com.hdl.sdk.socket.listener.SendListener;
 
-import java.net.ConnectException;
-import java.util.Date;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * Created by Tong on 2021/9/26.
@@ -38,18 +28,20 @@
 
     private final IClient client;
     private IHeartbeat iHeartbeat;
-    public void SetHeartbeat(IHeartbeat iHeartbeat){
-        this.iHeartbeat=iHeartbeat;
+
+    public void SetHeartbeat(IHeartbeat iHeartbeat) {
+        this.iHeartbeat = iHeartbeat;
     }
+
     /**
      * 褰撳墠鎺ユ敹鍒版暟鎹殑鏃堕棿
      */
-    private static long time=System.currentTimeMillis();
+    private static long time = System.currentTimeMillis();
 
     /**
      * tcp鏄惁宸茬粡杩炴帴
      */
-    private boolean connected=false;
+    private boolean connected = false;
 
     public IClient getClient() {
         return client;
@@ -57,7 +49,7 @@
 
     private final BlockingQueue<SocketRequest> mMessageQueue = new LinkedBlockingDeque<>();
 
-    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
 
     public SocketBoot(IClient client) {
         this.client = client;
@@ -76,11 +68,11 @@
             client.onConnectStatus(ConnectStatus.CONNECTING);
             Thread.sleep(1000);
             client.connect();
-            connected=true;
+            connected = true;
             LogUtils.i("TCP杩炴帴鎴愬姛");
             client.onConnectStatus(ConnectStatus.CONNECTED);
-        }catch(Exception e) {
-            LogUtils.e("杩炴帴寮傚父"+e.getMessage());
+        } catch (Exception e) {
+            LogUtils.e("杩炴帴寮傚父" + e.getMessage());
         }
     }
 
@@ -96,11 +88,19 @@
                 public void run() {
                     while (true) {
                         try {
+                            if (!connected) {
+                                Thread.sleep(200);
+                                continue;
+                            }
                             SocketRequest socketRequest = mMessageQueue.take();
 //                            final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
 //                            LogUtils.i("鍙戦�佹暟鎹細" + sendStr);
+                            if (System.currentTimeMillis() - socketRequest.getTime() > 5000) {
+                                continue;
+                            }
                             final String action = socketRequest.getAction();
                             try {
+
                                 client.sendMsg(socketRequest.getData());
                                 if (!TextUtils.isEmpty(action)) {
                                     SendListener sendListener = sendMap.get(action);
@@ -141,7 +141,7 @@
                             if (connected) {
                                 //璇诲彇鏁版嵁
                                 client.onHandleResponse();
-                                time= System.currentTimeMillis();
+                                time = System.currentTimeMillis();
                             } else {
                                 try {
                                     Thread.sleep(1000);
@@ -174,7 +174,7 @@
                             if (!connected) {
                                 reconect();
                             }
-                            Thread.sleep(3*1000);
+                            Thread.sleep(3 * 1000);
                         } catch (Exception e) {
                             LogUtils.e("瀹氭椂杩炴帴澶辫触:" + e.getMessage());
                         }
@@ -223,6 +223,7 @@
 
     /**
      * 鍙戦�佹棤闇�鍥炶皟
+     *
      * @param msg 鍙戦�佺殑鏁版嵁
      */
     public void sendMsg(byte[] msg) {
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java
index 924719e..956f8c9 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketRequest.java
@@ -11,8 +11,11 @@
 
     private byte[] data;
 
+    private long time = System.currentTimeMillis();
+
     public SocketRequest(byte[] data) {
         this.data = data;
+
         action = UUID.randomUUID().toString();
     }
 
@@ -31,4 +34,8 @@
     public void setData(byte[] data) {
         this.data = data;
     }
+
+    public long getTime() {
+        return time;
+    }
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
index 2ec7809..962fb2e 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
@@ -1,31 +1,24 @@
 package com.hdl.sdk.socket.annotation;
 
-import androidx.annotation.IntDef;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
 
 /**
  * Created by Tong on 2021/9/22.
  */
-@Target({ElementType.TYPE_PARAMETER, ElementType.PARAMETER})
-@IntDef({ConnectStatus.CONNECTING,
-        ConnectStatus.CONNECTED,
-        ConnectStatus.DISCONNECT})
-public @interface ConnectStatus {
+
+public class ConnectStatus {
 
     /**
      * 杩炴帴涓�
      */
-    int CONNECTING = 0;
+    public static final int CONNECTING = 0;
 
     /**
      * 杩炴帴鎴愬姛
      */
-    int CONNECTED = 1;
+    public static final int CONNECTED = 1;
 
     /**
      * 杩炴帴鍏抽棴
      */
-    int DISCONNECT = 2;
+    public static final int DISCONNECT = 2;
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
index 07d368d..8a78384 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -87,7 +87,7 @@
      * @return
      */
     public static UdpSocketBoot init(int port, UdpSocketOptions options) {
-        return init(null, port, options);
+        return init("0.0.0.0", port, options);
     }
 
 
@@ -100,9 +100,11 @@
             }
             if (TextUtils.isEmpty(ipAddress)) {
                 mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port));
+            }else {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(ipAddress,port));
             }
             mSocket.setBroadcast(true);
-            mSocket.setReuseAddress(true);
+//            mSocket.setReuseAddress(true);
 
         } catch (Exception e) {
             LogUtils.e("鍒濆鍖朣ocket 澶辫触锛�" + e.getMessage());
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
index 17471bb..2d37ac5 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
@@ -2,25 +2,15 @@
 
 import android.text.TextUtils;
 
-import androidx.collection.ArrayMap;
-
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.socket.SocketRequest;
-import com.hdl.sdk.socket.annotation.ConnectStatus;
-import com.hdl.sdk.socket.client.IClient;
 import com.hdl.sdk.socket.client.IUdpClient;
 import com.hdl.sdk.socket.listener.SendListener;
 
-import java.net.ConnectException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -37,7 +27,7 @@
 
     private ExecutorService receiveThread;
 
-    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
 
     public UdpSocketBoot(IUdpClient client) {
         this.client = client;
diff --git a/HDLSDK/settings.gradle b/HDLSDK/settings.gradle
index fc35c16..b974e52 100644
--- a/HDLSDK/settings.gradle
+++ b/HDLSDK/settings.gradle
@@ -1,6 +1,6 @@
 
 include ':app'
-include ':hdl-socket'
+//include ':hdl-socket'
 include ':hdl-connect'
-include ':hdl-common'
+//include ':hdl-common'
 include ':com.hdl.sdk'
diff --git a/HDLSDK_DEMO.rar b/HDLSDK_DEMO.rar
new file mode 100644
index 0000000..c293162
--- /dev/null
+++ b/HDLSDK_DEMO.rar
Binary files differ
diff --git a/HDLSDK_DEMO/.idea/gradle.xml b/HDLSDK_DEMO/.idea/gradle.xml
index 3123843..9885452 100644
--- a/HDLSDK_DEMO/.idea/gradle.xml
+++ b/HDLSDK_DEMO/.idea/gradle.xml
@@ -7,6 +7,7 @@
         <option name="testRunner" value="GRADLE" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
+        <option name="gradleJvm" value="1.8" />
         <option name="modules">
           <set>
             <option value="$PROJECT_DIR$" />
diff --git a/HDLSDK_DEMO/.idea/misc.xml b/HDLSDK_DEMO/.idea/misc.xml
index 6852866..1be33d1 100644
--- a/HDLSDK_DEMO/.idea/misc.xml
+++ b/HDLSDK_DEMO/.idea/misc.xml
@@ -3,6 +3,9 @@
   <component name="DesignSurface">
     <option name="filePathToZoomLevelMap">
       <map>
+        <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/activity_devices_list.xml" value="0.3536458333333333" />
+        <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml" value="0.3538301198540907" />
+        <entry key="..\:/HDL/ProjectCode/HDLSDK/HDLSDK_A_Android/HDLSDK_DEMO/app/src/main/res/layout/item_devices_list.xml" value="0.3536458333333333" />
         <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/activity_main.xml" value="0.1" />
         <entry key="..\:/job/me/Android/HDLSDK/app/src/main/res/layout/demo_item.xml" value="0.28958333333333336" />
       </map>
diff --git a/HDLSDK_DEMO/app/build.gradle b/HDLSDK_DEMO/app/build.gradle
index 51fe626..93ec83c 100644
--- a/HDLSDK_DEMO/app/build.gradle
+++ b/HDLSDK_DEMO/app/build.gradle
@@ -38,7 +38,12 @@
     androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
 
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6'
+<<<<<<< HEAD
     implementation 'com.google.code.gson:gson:2.8.8'
     implementation files('libs\\com.hdl.sdk-v1.0.16.aar')
+=======
+//    implementation 'com.google.code.gson:gson:2.8.8'
+>>>>>>> not_androidx
 //    implementation project(path: ':hdl-connect')
+    implementation files('libs\\com.hdl.sdk-v1.1.3.aar')
 }
\ No newline at end of file
diff --git a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.1.3.aar b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.1.3.aar
new file mode 100644
index 0000000..457d626
--- /dev/null
+++ b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.1.3.aar
Binary files differ
diff --git a/HDLSDK_DEMO/app/src/main/AndroidManifest.xml b/HDLSDK_DEMO/app/src/main/AndroidManifest.xml
index 964acd6..f6e37e6 100644
--- a/HDLSDK_DEMO/app/src/main/AndroidManifest.xml
+++ b/HDLSDK_DEMO/app/src/main/AndroidManifest.xml
@@ -29,6 +29,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
index d332fdc..bc5e1a0 100644
--- a/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
+++ b/HDLSDK_DEMO/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -1,50 +1,49 @@
 package com.hdl.hdlsdk;
 
-import androidx.activity.result.ActivityResultCallback;
-import androidx.activity.result.ActivityResultLauncher;
-import androidx.activity.result.contract.ActivityResultContracts;
-import androidx.annotation.NonNull;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-
 import android.Manifest;
 import android.content.Intent;
+import android.os.Build;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
+import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.activity.result.ActivityResultCallback;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
-import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
 import com.hdl.hdlsdk.device.DevicesListActivity;
 import com.hdl.sdk.common.config.TopicConstant;
+import com.hdl.sdk.common.event.DeleteNetworkListener;
 import com.hdl.sdk.common.event.EventListener;
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.IdUtils;
-import com.hdl.sdk.common.utils.IpUtils;
+import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
 import com.hdl.sdk.connect.HDLLink;
-import com.hdl.sdk.connect.bean.LinkRequest;
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
-import com.hdl.sdk.connect.bean.request.PropertyReadRequest;
+import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
+import com.hdl.sdk.connect.bean.request.ListUploadRequest;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
 import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.connect.cloud.CallBackListener;
+import com.hdl.sdk.connect.cloud.HDLException;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.connect.socket.HDLAuthSocket;
-import com.hdl.sdk.connect.socket.HDLSocket;
-import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
-import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
-import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
-import com.hdl.sdk.socket.SocketOptions;
-import com.hdl.sdk.socket.codec.MessagePipeLine;
 
 import java.io.UnsupportedEncodingException;
 import java.security.MessageDigest;
@@ -53,8 +52,6 @@
 import java.util.List;
 import java.util.Map;
 
-import static com.hdl.sdk.common.config.TopicConstant.GATEWAY_SEARCH_REPLY;
-
 public class MainActivity extends AppCompatActivity {
 
     private static final String TAG = "MainActivity";
@@ -62,9 +59,12 @@
     private RecyclerView rv;
     private TextView tv;
     private TextView responseTv;
+    private TextView localSecret;
+    private EditText editText;
     boolean isOn;
     private EventListener allTopicsListener;
-    private String testLightSid = "0001010D48C71B02020100010101";
+    private String testLightSid = "02010131D9C03D01020300010107";
+    private String secret = "";
 
     @Override
     protected void onDestroy() {
@@ -72,22 +72,77 @@
         removeAllTopicsListener();
     }
 
-    void initDeviceInfo()
-    {
+    void initDeviceInfo() {
         AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean();
+<<<<<<< HEAD
         infoBean.setDeviceMAC("AA00000000000100");
         infoBean.setIPMAC("AA00000000000100");
+=======
+        infoBean.setDeviceMAC("f2c5d8bad48f");
+        infoBean.setIPMAC("f2c5d8bad48f");
+>>>>>>> not_androidx
         infoBean.setDeviceName("闊充箰鎾斁鍣�");//璁惧鍚嶅瓧
         infoBean.setDeviceModel("MCLog.431");//璁惧鍨嬪彿
         infoBean.setAccessMode("WIFI");
         infoBean.setIPGateway("192.168.1.1");
+<<<<<<< HEAD
         infoBean.setIPAddress("192.168.1.116");
         infoBean.setGateway_type("music.standard");
+=======
+        infoBean.setIPAddress("192.168.1.103");
+        infoBean.setGateway_type("screen.touch");
+>>>>>>> not_androidx
         infoBean.setHw_version("HW2.0");
         infoBean.setFw_version("Fw1.0");
         infoBean.setOID("010105000000FE11");//姣忎釜璁惧oid閮借涓嶄竴鏍�
         infoBean.setSid("110105000000FE08110100000011");//姣忎釜璁惧鐨剆id閮借涓嶄竴鏍�
+<<<<<<< HEAD
+=======
+        infoBean.setSupplier("JINMAOYUN");
+>>>>>>> not_androidx
         HDLLinkConfig.getInstance().setDeviceInfoBean(infoBean);
+    }
+
+    void applyDeviceSecret() {
+        tv.setText("寮�濮嬬敵璇疯澶囧瘑閽�...");
+        responseTv.setText("");
+
+//        //姝e紡鏈嶅姟鍣�
+        String appKey = "i8hR07jzrIS";//appkey
+        String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret
+
+        //娴嬭瘯鏈嶅姟鍣�
+//        String appKey ="FcRyUJlLJFF";
+//        String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ";
+
+//        String appKey = "L2OZliZRxHc";
+//        String appSecret = "aCIWSvJDOukXfx3kivsKW11x9xdR3IbV";
+        String supplier = "JINMAOYUN";//鍘傚晢
+//        String mac = "AA00000000000100";//璁惧鍞竴MAC鍦板潃
+        String mac = editText.getText().toString();
+        String spk = "screen.touch";//浜у搧spk
+
+        if (TextUtils.isEmpty(mac)) {
+            Toast.makeText(this, "mac涓嶈兘涓虹┖锛�", Toast.LENGTH_SHORT).show();
+            return;
+        }
+
+        HDLLink.getInstance().applyDeviceSecret(this, appKey, appSecret, supplier, mac, spk, new CallBackListener() {
+            @Override
+            public void onError(HDLException e) {
+                tv.setText("鐢宠澶辫触");
+                responseTv.setText(e.getMsg());
+                secret = "";
+            }
+
+            @Override
+            public void onSuccess(String msg) {
+                tv.setText("鐢宠鎴愬姛");
+                responseTv.setText(msg.toString());
+                secret = msg.toString();
+            }
+        });
+
     }
 
     /**
@@ -95,47 +150,80 @@
      */
     void sendAuthenticateRequest() {
         tv.setText("寮�濮嬪叆缃戣璇�...");
+        responseTv.setText("");
         //璁よ瘉鎻愪氦鍙傛暟鍑嗗
 //
-//        //娴嬭瘯鏈嶅姟
-//        String spkStr = "ir.module";//浜у搧spk
+//        //娴嬭瘯鏈嶅姟鍣�
+//        String spkStr = "music.standard";//浜у搧spk
 //        String macStr = "AA000000000000AF";//璁惧鍞竴MAC鍦板潃
 //        String secret = "44b360eb74b7ba64";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret
 
 //        姝e紡鏈嶅姟鍣�
+<<<<<<< HEAD
         String spkStr = "screen.mirror";//浜у搧spk
         String macStr = "AA00000000000100";//璁惧鍞竴MAC鍦板潃
         String secret = "e186beeb7974998e";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret
+=======
+        String spkStr = "screen.touch";//浜у搧spk
+//        String macStr = "AA00000000000100";//璁惧鍞竴MAC鍦板潃
+        String macStr = editText.getText().toString();//璁惧鍞竴MAC鍦板潃
+//        String secret = "e186beeb7974998e";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret
+>>>>>>> not_androidx
 
         String mac_key = stringToMD5(stringToMD5(macStr + secret));
         String versionString = "HDL_V1.0.1";//
         String time = String.valueOf(System.currentTimeMillis());
         HDLLinkConfig.getInstance().getDeviceInfoBean().setDeviceMAC(macStr);
+//        HDLLinkConfig.getInstance().setCurrentGateway(infoBean);
 
         //1.璁剧疆璁よ瘉淇℃伅
         AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean();
         requestBean.setMAC(macStr);
-        requestBean.setSupplier("WISE");
+        requestBean.setSupplier("JINMAOYUN");
         requestBean.setFirmwareVersion(versionString);
         requestBean.setHardwareModel("1956F");
+//        HDLLinkConfig.getInstance().setRequestBean(requestBean);
+
         AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean();
         authbean.setSpk(spkStr);
         authbean.setMACKey(mac_key);
         authbean.setRequest(requestBean);
+        HDLLinkConfig.getInstance().setAuthBean(authbean);
+
         //HDLLinkConfig.getInstance().getDeviceInfoBean()杩欎釜鍒濆鍖栫殑鏃跺�欒鍏堣缃ソ
         AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), authbean);
         HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() {
             @Override
             public void onError(HDLLinkException e) {
-                tv.setText("璁よ瘉澶辫触");
+                tv.setText("璁よ瘉澶辫触" + e.getCode());
                 responseTv.setText(e.getMsg());
-                Log.i("TAG", "onError: 璁よ瘉澶辫触");
+                Log.e(TAG, "onError: 璁よ瘉澶辫触 " + e.getCode());
             }
 
+            @RequiresApi(api = Build.VERSION_CODES.O)
             @Override
             public void onSuccess(String msg) {
                 tv.setText("璁よ瘉鎴愬姛");
                 responseTv.setText(msg.toString());
+                localSecret.setText("瀵嗛挜锛�" + HDLLinkConfig.getInstance().getLocalSecret());
+            }
+        });
+    }
+
+    public void UploadDeviceAuth(String mac, String result, String message, String auth_code) {
+        //灏嗚璇佺粨鏋滀笂鎶ョ粰缃戝叧
+        HDLLink.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String s) {
+                tv.setText("涓婃姤缁撴灉鎴愬姛");
+                responseTv.setText(s.toString());
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                tv.setText("涓婃姤缁撴灉澶辫触");
+                responseTv.setText(e.getMsg());
+                Log.i(TAG, "onError: 涓婃姤缁撴灉澶辫触");
             }
         });
     }
@@ -146,13 +234,27 @@
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         responseTv = findViewById(R.id.response_tv);
+        editText = findViewById(R.id.edittext);
+        localSecret = findViewById(R.id.local_secret);
         tv = findViewById(R.id.state_tv);
         rv = findViewById(R.id.rv);
         rv.setLayoutManager(new LinearLayoutManager(this));
 
+        selectnetwork();
         checkIfCertified();
         initDeviceInfo();//鍒濆鍖�
         registerAllTopicsListener();
+        HDLLink.getInstance().setDeleteNetworkListener(new DeleteNetworkListener() {
+            @Override
+            public void onSuccess(Object msg) {
+                LogUtils.i("setDeleteNetworkListener onSucceed = " + msg);
+            }
+
+            @Override
+            public void onFailure() {
+                LogUtils.i("setDeleteNetworkListener onFailure");
+            }
+        });
 
         ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
             @Override
@@ -163,9 +265,11 @@
 
         launcher.launch(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE});
 
-        final List<DemoBean> beans = new ArrayList<>();
+        final List<DemoBean> beans = new ArrayList<DemoBean>();
+        beans.add(new DemoBean("鐢宠璁惧瀵嗛挜"));
         beans.add(new DemoBean("鍏ョ綉璁よ瘉"));
         beans.add(new DemoBean("鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎"));
+        beans.add(new DemoBean("涓婃姤oid鍒楄〃"));
         beans.add(new DemoBean("鑾峰彇鍔熻兘鍒楄〃"));
         beans.add(new DemoBean("鍔熻兘灞炴�ц鍙�"));
         beans.add(new DemoBean("璁惧鎺у埗"));
@@ -177,6 +281,7 @@
         beans.add(new DemoBean("TCP鍙戦��"));
         beans.add(new DemoBean("UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
         beans.add(new DemoBean("TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
+        beans.add(new DemoBean("閫�缃�"));
         demoAdapter = new DemoAdapter(beans);
         rv.setAdapter(demoAdapter);
 
@@ -192,56 +297,68 @@
             public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                 switch (position) {
                     case 0:
+                        //鐢宠璁惧瀵嗛挜
+                        applyDeviceSecret();
+                        break;
+                    case 1:
                         //鍏ョ綉璁よ瘉
                         sendAuthenticateRequest();
                         break;
-                    case 1:
+                    case 2:
                         //鎼滅储缃戝叧
                         searchGatewayBroadcast();
                         break;
-                    case 2:
+                    case 3:
+                        //涓婃姤oid鍒楄〃
+                        UploadOidList();
+                        break;
+                    case 4:
                         //鑾峰彇鍔熻兘鍒楄〃
                         getFunctionList();
                         break;
-                    case 3:
+                    case 5:
                         //鍔熻兘灞炴�ц鍙�
                         getFunctionAttribute();
                         break;
-                    case 4:
+                    case 6:
                         //璁惧鎺у埗
                         controlDecide();
                         break;
-                    case 5:
+                    case 7:
                         //璇诲彇鐘舵��
                         propertyRead();
                         break;
-                    case 6:
+                    case 8:
                         //鑾峰彇鍦烘櫙鍒楄〃
                         getSceneList();
                         break;
-                    case 7:
-                        //鑾峰彇鍦烘櫙鍒楄〃
+                    case 9:
+                        //鍦烘櫙鎺у埗
                         controlScene();
                         break;
-                    case 8:
+                    case 10:
                         //鍔熻兘鍒楄〃
                         startDevicesListActivity();
                         break;
-                    case 9:
+                    case 11:
                         //UDP鍙戦��
                         udpSend();
                         break;
-                    case 10:
+                    case 12:
                         //TCP鍙戦��
                         tcpSend();
                         break;
-                    case 11:
+                    case 13:
                         //UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         udpSendWithCallback();
                         break;
-                    case 12:
+                    case 14:
                         //TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         tcpSendWithCallback();
+                        break;
+                    case 15:
+                        //閫�缃�
+                        deleteNetwork();
                         break;
                 }
             }
@@ -251,6 +368,10 @@
 
     public void showToast(String text) {
         Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
+    }
+
+    void selectnetwork() {
+        HDLLink.getInstance().selectNetwork("wlan0");
     }
 
     /**
@@ -271,6 +392,9 @@
             @Override
             public void onMessage(Object msg) {
                 LinkResponse response = (LinkResponse) msg;
+                if ("/user/all/custom/gateway/broadcast_reply".equals(response.getTopic())){
+                    localSecret.setText("瀵嗛挜锛�" + HDLLinkConfig.getInstance().getLocalSecret());
+                }
             }
         };
         HDLLink.getInstance().registerAllTopicsListener(allTopicsListener);
@@ -320,7 +444,6 @@
     }
 
 
-
     String stringToMD5(String text) {
         byte[] hash;
         try {
@@ -349,6 +472,7 @@
      */
     void searchGatewayBroadcast() {
         tv.setText("鎼滅储缃戝叧涓�...");
+        responseTv.setText("");
         HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() {
             @Override
             public void onError(HDLLinkException e) {
@@ -391,6 +515,7 @@
      */
     void getFunctionAttribute() {
         tv.setText("鍔熻兘灞炴�ц鍙�");
+        responseTv.setText("");
         List<String> sids = new ArrayList<>();
         sids.add(testLightSid);
         HDLLink.getInstance().getFunctionAttribute(sids, new HDLLinkCallBack() {
@@ -412,6 +537,7 @@
      */
     void propertyRead() {
         tv.setText("璇诲彇鐘舵�佷腑...");
+        responseTv.setText("");
         List<String> list = new ArrayList<>();
         list.add(testLightSid);//瑕佽鍙栬澶囩殑sid
         HDLLink.getInstance().propertyRead(list, new HDLLinkCallBack() {
@@ -435,6 +561,7 @@
      */
     void controlDecide() {
         tv.setText("鎺у埗璁惧");
+        responseTv.setText("");
         isOn = !isOn;
         List<DeviceControlRequest> requestList = new ArrayList<>();
         DeviceControlRequest request = new DeviceControlRequest();
@@ -464,6 +591,7 @@
      */
     void getSceneList() {
         tv.setText("璇诲彇鍦烘櫙鍒楄〃");
+        responseTv.setText("");
         HDLLink.getInstance().getSceneList(new HDLLinkCallBack() {
             @Override
             public void onSuccess(String msg) {
@@ -486,6 +614,7 @@
      */
     void controlScene() {
         tv.setText("鍦烘櫙鎺у埗");
+        responseTv.setText("");
         //鎺у埗鍦烘櫙sid鍒楄〃锛屾敮鎸佹壒閲忔帶鍒�
         List<String> sids = new ArrayList<>();
         isOn = !isOn;
@@ -518,6 +647,7 @@
      */
     private void tcpSend() {
         tv.setText("TCP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr);
@@ -528,6 +658,7 @@
      */
     private void udpSend() {
         tv.setText("UDP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr);
@@ -560,6 +691,7 @@
      */
     private void udpSendWithCallback() {
         tv.setText("UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() {
@@ -581,6 +713,7 @@
      */
     private void tcpSendWithCallback() {
         tv.setText("TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�");
+        responseTv.setText("");
         String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId());
         String bodyStr = getPropertyDownBodyStr();
         HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() {
@@ -596,4 +729,54 @@
             }
         });
     }
+
+    private void deleteNetwork() {
+        tv.setText("閫�缃�");
+        responseTv.setText("");
+        String oid = HDLLinkConfig.getInstance().getDeviceInfoBean().getOID();
+        HDLLink.getInstance().deleteNetwork(oid, false, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+                //閫�缃戞垚鍔燂紝鍒犻櫎鏁版嵁
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
+     * 涓婃姤oid鍒楄〃
+     */
+    private void UploadOidList() {
+        tv.setText("涓婃姤oid鍒楄〃...");
+        responseTv.setText("");
+
+        //1.璁剧疆璁惧淇℃伅
+        AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean();
+
+        ListUploadRequest request = new ListUploadRequest();
+        request.setOid(authenticateDeviceInfoBean.getOID());
+        request.setDevice_name(authenticateDeviceInfoBean.getDeviceName());
+        request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel());
+        request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC());
+        request.setSrc("LINK");//鏉ヨ嚜鍝釜椹卞姩锛屽Link璁惧娌℃湁鍒欏~"LINK"
+        request.setFrom(authenticateDeviceInfoBean.getOID());//鏉ヨ嚜鍝釜缃戝叧锛屽鏋滄椂Link缃戠粶璁惧锛屽垯濉嚜韬玱id锛涘鏋滄槸椹卞姩鍒欎笉闇�瑕佹瀛楁
+
+        HDLLink.getInstance().UploadOidList(request, new HDLLinkCallBack() {
+            @Override
+            public void onError(HDLLinkException error) {
+                tv.setText(error.getMsg());
+            }
+
+            @Override
+            public void onSuccess(String data) {
+                tv.setText("涓婃姤oid鍒楄〃鎴愬姛");
+                responseTv.setText(data);
+            }
+        });
+    }
 }
\ No newline at end of file
diff --git a/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml b/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml
index 6fa6c2b..6bdd2a2 100644
--- a/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml
+++ b/HDLSDK_DEMO/app/src/main/res/layout/activity_main.xml
@@ -40,10 +40,20 @@
             android:layout_height="match_parent"
             android:orientation="vertical">
 
+            <EditText
+                android:id="@+id/edittext"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingStart="10dp"
+                android:hint="璇疯緭鍏ac"
+                android:text="f2c5d8bad48f"
+                />
+
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:paddingStart="10dp"
+                android:layout_marginTop="@dimen/dp_10"
                 android:text="褰撳墠鐘舵�侊細" />
 
             <TextView
@@ -66,6 +76,14 @@
                 android:text="鍝嶅簲锛�" />
 
             <TextView
+                android:id="@+id/local_secret"
+                android:paddingStart="10dp"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:text="瀵嗛挜锛�" />
+
+            <TextView
                 android:id="@+id/response_tv"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
diff --git a/HDLSDK_DEMO/config.gradle b/HDLSDK_DEMO/config.gradle
index 582d32b..6c1835a 100644
--- a/HDLSDK_DEMO/config.gradle
+++ b/HDLSDK_DEMO/config.gradle
@@ -1,5 +1,5 @@
 ext {
-    minSdkVersion = 16
+    minSdkVersion = 21
     targetSdkVersion = 31
     compileSdkVersion = 31
     versionName = "1.0.0"
diff --git a/HDLSDK_DEMO/settings.gradle b/HDLSDK_DEMO/settings.gradle
index 5a72944..c31d9c0 100644
--- a/HDLSDK_DEMO/settings.gradle
+++ b/HDLSDK_DEMO/settings.gradle
@@ -3,4 +3,3 @@
 include ':hdl-socket'
 include ':hdl-connect'
 include ':hdl-common'
-

--
Gitblit v1.8.0