From 14de918a79943e4961b09fa01ed320c6cad41f2e Mon Sep 17 00:00:00 2001
From: wjc <1243177876@qq.com>
Date: 星期三, 28 六月 2023 17:14:51 +0800
Subject: [PATCH] Revert "Revert "Merge branch 'hxb' into wjc""

---
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyUpRequest.java                    |   50 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java                                 |   93 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkIrDeviceBean.java                                  |   81 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/SendListener.java                           |   11 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ErrorUtils.java                                |   30 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageBean.java                          |   49 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/AesUtil.java                                |  286 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyGetGateWayInfo.java           |   11 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyReadRequest.java                  |   22 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageEncoder.java                       |   18 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/TimeDataBean.java                               |   21 
 HDLLinkLocalSdk/src/main/res/values-zh/strings_code.xml                                                    |   27 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java                          |  191 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkLogicBean.java                                     |   73 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/NetworkAccessBroadcastResponse.java      |   22 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IHeartbeat.java                               |    8 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/TcpClient.java                                |  176 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java                                  |  150 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionBean.java                                  |  135 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java                          |  432 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java                              |  392 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/ZigbeeResponse.java                               |   88 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputConditionBean.java                 |   49 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IpUtils.java                                   |   89 
 HDLLinkLocalSdk/.gitignore                                                                                 |    1 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/HexUtil.java                                     |  449 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/ConnectStatusListener.java                  |   27 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesBean.java             |  102 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/AesUtil.java                                     |  150 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkException.java                      |   67 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IMessagePipeLine.java                          |   11 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java                                  |  134 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBBaseSendBean.java                             |   42 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java                                     |  103 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ProtocolParse.java                               |   74 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionControlAttrsBean.java           |   45 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventIRCodeStudySuccessInfo.java         |   36 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketRequest.java                                   |   34 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalResponse.java                   |   37 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessageToByteEncoder.java                      |   26 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidNameBean.java                                   |   33 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java                         |  412 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/ZBDeviceListCallBack.java                   |   13 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteUtils.java                                   |   20 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/bean/GatewaySearchBean.java                         |   10 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java                            |  312 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidUidBean.java                                    |   36 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketPool.java                                      |   54 
 app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java                                              |   33 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java                           |  239 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleFlow.java                               |   14 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/FileRequest.java                                  |   44 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZBDeviceType.java                             |  161 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicBean.java                               |  122 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/UdpClient.java                                |  191 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/GsonConvert.java                          |   59 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkTCallBack.java                         |   11 
 HDLLinkLocalSdk/consumer-rules.pro                                                                         |    0 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceBean.java                               |  565 ++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageToCloudBean.java                   |   40 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/GatewayCallBack.java                          |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageDecoder.java                       |  323 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseResponse.java                        |   30 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkStatusBean.java                                    |   33 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/HouseIdSecretUtil.java                      |   30 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockArrayMap.java                              |   31 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LinkResponseUtils.java                           |   73 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventCloseSearchDeviceActivityInfo.java  |   12 
 .idea/deploymentTargetDropDown.xml                                                                         |   17 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IdUtils.java                                   |   20 
 app/src/main/java/com/hdl/photovoltaic/HDLApp.java                                                         |    9 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java                          |   10 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ZigbeeCallBack.java                           |   10 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLTcpConnect.java                             |  143 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketBoot.java                               |  128 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/FunctionAttributeRequest.java             |   24 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalWithCodeResponse.java           |   39 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java                               |  122 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBindBean.java                                  |   51 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LanguageUtils.java                               |    8 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBean.java                                      |   71 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneGroupInfo.java                    |   31 
 local.properties                                                                                           |    2 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesEnumerationsBean.java |   31 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkReNameGWBean.java                                  |   17 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionWithRoomBean.java                          |  154 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyDebugModeInfo.java            |   27 
 HDLLinkLocalSdk/build.gradle                                                                               |   55 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/AuthenticateRequest.java                  |  310 +
 app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java                                           |   16 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleMessage.java                            |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/ByteToMessageDecoder.java                      |   22 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/bean/Packet.java                                     |   45 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/AuthenticateResponse.java                |   47 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/BaseCallBack.java                             |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/type/GatewayMasterType.java                         |   21 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLZigbeeConnect.java                          |  358 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceModuleBean.java                         |   32 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyRefreshGatewayAesKeyInfo.java |   23 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZigBee.java                                   |   88 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/annotation/ConnectStatus.java                        |   31 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/IHDLClient.java                                      |   52 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOtaBean.java                                       |   78 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java                                 |  243 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IClient.java                                  |   32 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkAttributesBean.java                                |   68 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkPacket.java                                   |   52 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableSecurityBean.java                            |   51 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/EncryptUtil.java                                 |   69 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkUploadOidBean.java                                 |   95 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicCycleBean.java                          |   45 
 app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java                                                   |    1 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessagePipeLine.java                           |   45 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/NoticeConfigInfo.java                                  |   31 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkResponseCallBack.java                  |   13 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventMqttAesFailInfo.java                |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java                         |  179 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/PanelVibrationBean.java                         |   37 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneCanDeleteInfo.java                |   33 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/config/HDLLinkConfig.java                              |  211 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java                          |  349 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/ParameterizedTypeImpl.java                |   46 
 HDLLinkLocalSdk/src/main/res/values/strings_code.xml                                                       |   27 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkResponseBean.java                                  |   40 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOidBean.java                                       |  174 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java                            |  799 ++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java                       |  159 
 .gitignore                                                                                                 |    4 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/GatewaySearchBean.java                   |  109 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLUdpConnect.java                             |  619 ++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventListener.java                             |   10 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketOptions.java                                   |   74 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteBufferUtils.java                             |   37 
 HDLLinkLocalSdk/src/main/AndroidManifest.xml                                                               |    5 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockList.java                                  |   37 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LogUtils.java                                  |   63 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/GatewayLocationBean.java                               |   31 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputStatusBean.java                   |   50 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableLogicBean.java                               |   36 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IUdpClient.java                               |   38 
 HDLLinkLocalSdk/src/main/res/values/arrays-error.xml                                                       |    6 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/SPUtils.java                                   |  154 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ThreadToolUtils.java                           |   72 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketOptions.java                            |   32 
 settings.gradle                                                                                            |    1 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionStatusBean.java                 |   58 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventBindMiniRemoteSuccessInfo.java      |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BaseLocalRequest.java                     |   47 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/DeviceControlRequest.java                 |   51 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BroadcastRequest.java                     |   54 
 HDLLinkLocalSdk/proguard-rules.pro                                                                         |   21 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/HDLZBCallBack.java                          |   12 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java                                   |  281 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java                                        | 2407 ++++++++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java                           |   64 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidStrBean.java                                    |   30 
 156 files changed, 16,093 insertions(+), 4 deletions(-)

diff --git a/.gitignore b/.gitignore
index b186b24..77bc4c1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -46,4 +46,6 @@
 *.log
 .idea/libraries/Gradle__com_bulong_rudeness_rudeness_0_1_4_aar.xml
 .DS_Store
-app/.DS_Store
\ No newline at end of file
+app/.DS_Store
+
+local.properties
\ No newline at end of file
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..39f0014
--- /dev/null
+++ b/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="deploymentTargetDropDown">
+    <runningDeviceTargetSelectedWithDropDown>
+      <Target>
+        <type value="RUNNING_DEVICE_TARGET" />
+        <deviceKey>
+          <Key>
+            <type value="SERIAL_NUMBER" />
+            <value value="M7BBB18B19152766" />
+          </Key>
+        </deviceKey>
+      </Target>
+    </runningDeviceTargetSelectedWithDropDown>
+    <timeTargetWasSelectedWithDropDown value="2023-06-28T02:02:14.854309Z" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/.gitignore b/HDLLinkLocalSdk/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/HDLLinkLocalSdk/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/build.gradle b/HDLLinkLocalSdk/build.gradle
new file mode 100644
index 0000000..3fbd9cc
--- /dev/null
+++ b/HDLLinkLocalSdk/build.gradle
@@ -0,0 +1,55 @@
+plugins {
+    id 'com.android.library'
+}
+
+android {
+    compileSdkVersion 29
+
+    defaultConfig {
+        minSdkVersion 21
+        targetSdkVersion 29
+        versionCode 102
+        versionName "1.0.2"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        consumerProguardFiles "consumer-rules.pro"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
+    /**
+     * 鎵撳寘鑷姩鍛藉悕
+     */
+    android.libraryVariants.all { variant ->
+        variant.outputs.all {
+            outputFileName = "hdl-link-V" + defaultConfig.versionName  + ".aar"
+        }
+    }
+}
+
+dependencies {
+    implementation 'com.google.code.gson:gson:2.8.8'
+    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'com.google.android.material:material:1.3.0'
+    implementation 'com.alibaba:fastjson:1.2.66'
+    api 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'
+    api 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
+    implementation 'org.bouncycastle:bcpg-jdk16:1.46'
+    //浜嬩欢鎬荤嚎 Eventbus
+    api 'org.greenrobot:eventbus:3.2.0'
+    //HDLLinkPMSdk SDK
+//    api project(path: ':HDLLinkPMSdk')
+
+//    //鍔犲瘑
+//    implementation 'cn.hutool:hutool-all:5.6.5'
+//    implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/consumer-rules.pro b/HDLLinkLocalSdk/consumer-rules.pro
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/HDLLinkLocalSdk/consumer-rules.pro
diff --git a/HDLLinkLocalSdk/proguard-rules.pro b/HDLLinkLocalSdk/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/HDLLinkLocalSdk/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/AndroidManifest.xml b/HDLLinkLocalSdk/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..71bb242
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.hdl.sdk.link">
+
+</manifest>
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
new file mode 100644
index 0000000..f8d8c8c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
@@ -0,0 +1,2407 @@
+package com.hdl.sdk.link;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.link.bean.GatewayLocationBean;
+import com.hdl.sdk.link.bean.LinkIrDeviceBean;
+import com.hdl.sdk.link.bean.LinkOtaBean;
+import com.hdl.sdk.link.bean.LinkSidNameBean;
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.ErrorUtils;
+import com.hdl.sdk.link.common.utils.IdUtils;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+import com.hdl.sdk.link.bean.LinkCreateLogicBean;
+import com.hdl.sdk.link.bean.LinkCreateSceneBean;
+import com.hdl.sdk.link.bean.LinkEnableLogicBean;
+import com.hdl.sdk.link.bean.LinkEnableSecurityBean;
+import com.hdl.sdk.link.bean.LinkFunctionBean;
+import com.hdl.sdk.link.bean.LinkLogicBean;
+import com.hdl.sdk.link.bean.LinkOidBean;
+import com.hdl.sdk.link.bean.LinkReNameGWBean;
+import com.hdl.sdk.link.bean.LinkRoomBean;
+import com.hdl.sdk.link.bean.LinkRoomBindBean;
+import com.hdl.sdk.link.bean.LinkSceneBean;
+import com.hdl.sdk.link.bean.LinkSidStrBean;
+import com.hdl.sdk.link.bean.LinkSidUidBean;
+import com.hdl.sdk.link.core.bean.FileRequest;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.request.AuthenticateRequest;
+import com.hdl.sdk.link.core.bean.request.DeviceControlRequest;
+import com.hdl.sdk.link.core.bean.request.FunctionAttributeRequest;
+import com.hdl.sdk.link.core.bean.request.PropertyReadRequest;
+import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
+import com.hdl.sdk.link.core.bean.scenebatch.SceneCanDeleteInfo;
+import com.hdl.sdk.link.core.bean.scenebatch.SceneGroupInfo;
+import com.hdl.sdk.link.core.callback.GatewayCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.core.callback.HDLLinkTCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.connect.HDLUdpConnect;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.connect.HDLConnectHelper;
+import com.hdl.sdk.link.core.utils.LinkResponseUtils;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : HDLLink
+ */
+public class HDLLinkLocalSdk {
+    /**
+     * instance
+     */
+    private volatile static HDLLinkLocalSdk instance;
+
+    /**
+     * getInstance
+     *
+     * @return HDLLink
+     */
+    public static synchronized HDLLinkLocalSdk getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkLocalSdk.class) {
+                if (instance == null) {
+                    instance = new HDLLinkLocalSdk();
+                }
+            }
+        }
+        return instance;
+    }
+
+    private Context context;
+
+
+    public void init(Context context) {
+        this.context = context.getApplicationContext();
+
+        String[] gatewayErrors = context.getResources().getStringArray(R.array.gateway);
+        Map<String, String> codeAndMsgMap = new HashMap<>();
+        for (String gatewayError : gatewayErrors) {
+            String codeMsg[] = gatewayError.split("=");
+            codeAndMsgMap.put(codeMsg[0], codeMsg[1]);
+        }
+        //鍒濆鍖栫姸鎬佺爜澶氳瑷�淇℃伅
+        ErrorUtils.errorsMap.putAll(codeAndMsgMap);
+    }
+
+    public Context getContext() {
+        return context;
+    }
+
+    public boolean isZh() {
+        Locale locale = getContext().getResources().getConfiguration().locale;
+        String language = locale.getLanguage();
+        if (language.endsWith("zh"))
+            return true;
+        else
+            return false;
+    }
+
+    /**
+     * 璁剧疆鎵撳嵃鏄惁寮�鍚�
+     *
+     * @param enable
+     */
+    public void setLogEnabled(boolean enable) {
+        LogUtils.setEnabled(enable);
+    }
+
+    /**
+     * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void registerAllTopicsListener(EventListener listener) {
+        EventDispatcher.getInstance().registerAllTopicsListener(listener);
+    }
+
+    /**
+     * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void removeAllTopicsListener(EventListener listener) {
+        if (listener == null) return;
+        EventDispatcher.getInstance().removeAllTopicsListener(listener);
+    }
+
+    /***********************涓夋柟璁惧鍜岀綉鍏抽�氫俊涔嬪墠鐨勮璇佹祦绋�****************************/
+    /**
+     * 妫�娴嬫槸鍚﹀凡缁忚璇佽繃
+     * 璁よ瘉閫氳繃鎵嶈兘杩涜璁惧鎺у埗
+     *
+     * @return
+     */
+    public boolean checkIfCertified() {
+        return HDLLinkConfig.getInstance().checkIfCertified();
+    }
+
+    /**
+     * 寮�濮嬬洃鍚拰鍙戣捣鍏ョ綉鍙婅璇佽姹�
+     *
+     * @param request  璁よ瘉璇锋眰淇℃伅
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
+        HDLUdpConnect.getInstance().startAuthenticateRequest(request, callBack);
+    }
+
+    /**
+     * 鍙戦�佸叆缃戝強璁よ瘉璇锋眰
+     *
+     * @param ip       缃戝叧IP
+     * @param request  璁よ瘉璇锋眰淇℃伅
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void sendAuthenticateRequest(String ip, AuthenticateRequest request, HDLLinkCallBack callBack) {
+        HDLUdpConnect.getInstance().sendAuthenticateRequest(ip, request, callBack);
+    }
+
+    /***********************涓夋柟璁惧璇峰厛璁よ瘉鎴愬姛 鍐嶈皟鐢ㄤ笅闈㈢殑鎺ュ彛鍜岀綉鍏抽�氫俊****************************/
+    /**
+     * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void searchGatewayMulticast(HDLUdpConnect.SearchGatewayCallBack callBack) {
+        HDLUdpConnect.getInstance().searchGatewayMulticast(callBack);
+    }
+
+    /**
+     * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void searchGatewayBroadcast(HDLUdpConnect.SearchGatewayCallBack callBack) {
+        HDLUdpConnect.getInstance().searchGatewayBroadcast(callBack);
+    }
+
+    /**
+     * 鑾峰彇璁惧鍒楄〃
+     */
+    public void getDeviceList(HDLLinkTCallBack<List<LinkOidBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            String topic = String.format(TopicConstant.GET_DEVICE_LIST, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getDeviceList onSuccess");
+                        Type type = new TypeToken<BaseLocalResponse<List<LinkOidBean>>>() {
+                        }.getType();
+                        List<LinkOidBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹�/閬ユ帶鍣ㄥ畾浣�
+     */
+    public void locationIr(String sid, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            List<JSONObject> stringList = new ArrayList<>();
+            JSONObject jsonObject1 = new JSONObject();
+            jsonObject1.put("sid", sid);
+            jsonObject1.put("duration_time", "5");
+            stringList.add(jsonObject1);
+            jsonObject.put("objects", stringList);
+            String topic = String.format(TopicConstant.IR_FIND_REMOTE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("locationIr onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹濆垹闄わ紙閲囩敤link鍗忚閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧鎷撴墤鍏崇郴锛�
+     */
+    public void deleteLinkDevice(String oid, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            List<JSONObject> stringList = new ArrayList<>();
+            JSONObject jsonObject1 = new JSONObject();
+            jsonObject1.put("oid", oid);
+            stringList.add(jsonObject1);
+            jsonObject.put("objects", stringList);
+            String topic = String.format(TopicConstant.DELETING_GATEWAY_SLAVE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("deleteLinkDevice onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 閬ユ帶鍣ㄥ垹闄わ紙閲囩敤link鍗忚閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧鎷撴墤鍏崇郴锛�
+     */
+    public void deleteIrControlDevice(String sid, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            List<JSONObject> stringList = new ArrayList<>();
+            JSONObject jsonObject1 = new JSONObject();
+            jsonObject1.put("sid", sid);
+            stringList.add(jsonObject1);
+            jsonObject.put("objects", stringList);
+            String topic = String.format(TopicConstant.DELETING_GATEWAY_SLAVE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("deleteIrControlDevice onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 璁惧鎺у埗
+     */
+    public void controlDevice(Object object, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            List<Object> stringList = new ArrayList<>();
+            stringList.add(object);
+            jsonObject.put("objects", stringList);
+            String topic = String.format(TopicConstant.PROPERTY_DOWN, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("controlDevice onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鏇存敼涓荤綉鍏冲娉ㄥ悕
+     */
+    public void changeGWName(String gateWayName, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<LinkReNameGWBean> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
+            linkReNameGWBean.setDevice_name(gateWayName);
+            data.setObjects(linkReNameGWBean);
+            String topic = String.format(TopicConstant.GATEWAY_RENAME, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("changeGWName onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鏇存敼浠庣綉鍏冲娉ㄥ悕
+     */
+    public void changeCongGWName(String gateWayName, String gatewayId, String ipAddress, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<LinkReNameGWBean> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
+            linkReNameGWBean.setDevice_name(gateWayName);
+            data.setObjects(linkReNameGWBean);
+            String topic = String.format(TopicConstant.GATEWAY_RENAME, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            request.setCloudTopic(String.format(TopicConstant.NATIVE_LINK_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayId));
+            new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("changeCongGWName onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * sid鏇存敼鍚嶅瓧
+     */
+    public void sidNameChange(List<LinkSidNameBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidNameBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.EDIT_FUNCTION, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("sidNameChange onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * sid缁戝畾鎴块棿
+     */
+    public void sidBindUid(List<LinkSidUidBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidUidBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SID_BIND_ROOM, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("sidBindUid onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * sid鍒犻櫎缁戝畾鎴块棿鍏崇郴
+     */
+    public void sidDeleteUid(List<LinkSidUidBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidUidBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SID_DELETE_ROOM, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("sidDeleteUid onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍒涘缓鍦烘櫙
+     */
+    public void createScene(List<LinkCreateSceneBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkCreateSceneBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.CREATE_SCENE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("createScene onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缂栬緫鍦烘櫙 鎵归噺澶勭悊缁�
+     */
+    public void editSceneBatchGroup(List<SceneGroupInfo> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<SceneGroupInfo>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("editSceneBatchGroup onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缂栬緫鍦烘櫙 鎵归噺澶勭悊鍒犻櫎
+     */
+    public void editSceneBatchDelete(List<SceneCanDeleteInfo> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<SceneCanDeleteInfo>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("editSceneBatchDelete onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缂栬緫鍦烘櫙
+     */
+    public void editScene(List<LinkCreateSceneBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkCreateSceneBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SCENE_EDIT, gatewayId);
+            for (int i = 0; i < data.getObjects().size(); i++) {
+                if (data.getObjects().get(i).getFunctions().size() == 0) {
+                    data.getObjects().get(i).setFunctions(null);
+                }
+//                if (data.getObjects().get(i).getUids().size() == 0) {
+//                    data.getObjects().get(i).setUids(null);
+//                }
+            }
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("editScene onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎鍦烘櫙
+     */
+    public void deleteScene(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SCENE_DELETE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("deleteScene onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栧垪琛�
+     */
+    public void getLogicList(HDLLinkTCallBack<List<LinkLogicBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            String topic = String.format(TopicConstant.LOGIC_LIST_GET, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getLogicList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkLogicBean>>>() {
+                            }.getType();
+                            List<LinkLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栬鎯�
+     */
+    public void getLogicDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateLogicBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(list);
+            String topic = String.format(TopicConstant.LOGIC_GET, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getLogicDetail onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateLogicBean>>>() {
+                            }.getType();
+                            List<LinkCreateLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鏂板缓鑷姩鍖�
+     */
+    public void createLogic(List<LinkCreateLogicBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkCreateLogicBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.LOGIC_EDIT, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("createLogic onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 寮�鍚叧闂嚜鍔ㄥ寲
+     */
+    public void enableLogic(List<LinkEnableLogicBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkEnableLogicBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.LOGIC_ENABLE_EDIT, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("enableLogic onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎鑷姩鍖�
+     */
+    public void deleteLogic(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.LOGIC_DELETE, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("deleteLogic onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹濊瘯鐮�
+     */
+    public void irCodeTest(JSONObject content, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray jsonArray = new JSONArray();
+            jsonArray.add(content);
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            jsonObject.put("objects", jsonArray);
+            String topic = String.format(TopicConstant.IR_CODE_TEST, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("irCodeTest onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹濇坊鍔犻仴鎺у櫒
+     */
+    public void irDeviceAdd(JSONObject content, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray jsonArray = new JSONArray();
+            jsonArray.add(content);
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            jsonObject.put("objects", jsonArray);
+            String topic = String.format(TopicConstant.IR_DEVICE_ADD, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneList onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹濊嚜瀛︾爜
+     */
+    public void irCodeStudy(JSONObject content, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray jsonArray = new JSONArray();
+            jsonArray.add(content);
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            jsonObject.put("objects", jsonArray);
+            String topic = String.format(TopicConstant.IR_CODE_STUDY, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("irCodeStudy onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 绾㈠瀹濊嚜瀛︾爜鍒犻櫎
+     */
+    public void irCodeRemove(JSONObject content, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray jsonArray = new JSONArray();
+            jsonArray.add(content);
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            jsonObject.put("objects", jsonArray);
+            String topic = String.format(TopicConstant.IR_CODE_REMOVE, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("irCodeRemove onSuccess");
+                        callBack.onSuccess("");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /**
+     * 绾㈠瀹濋仴鎺у櫒鍒楄〃鑾峰彇
+     */
+    public void irDeviceList(JSONObject content, HDLLinkTCallBack<List<LinkIrDeviceBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray jsonArray = new JSONArray();
+            jsonArray.add(content);
+            jsonObject.put("id", IdUtils.getUUId());
+            jsonObject.put("time_stamp", time);
+            jsonObject.put("objects", jsonArray);
+            String topic = String.format(TopicConstant.IR_DEVICE_LIST, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("irDeviceList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkIrDeviceBean>>>() {
+                            }.getType();
+                            List<LinkIrDeviceBean> response = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (response == null) {
+                                callBack.onSuccess(new ArrayList<>());
+                            } else {
+                                callBack.onSuccess(response);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /**
+     * 鑾峰彇瀹夐槻鍒楄〃
+     */
+    public void getSecurityList(HDLLinkTCallBack<List<LinkLogicBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.SECURITY_LIST_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSecurityList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkLogicBean>>>() {
+                            }.getType();
+                            List<LinkLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栬鎯�
+     */
+    public void getSecurityDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateLogicBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.SECURITY_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSecurityDetail onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateLogicBean>>>() {
+                            }.getType();
+                            List<LinkCreateLogicBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鏂板缓瀹夐槻
+     */
+    public void createSecurity(List<LinkCreateLogicBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkCreateLogicBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SECURITY_EDIT, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("createSecurity onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎瀹夐槻
+     */
+    public void deleteSecurity(List<LinkSidStrBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SECURITY_DELETE, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("deleteSecurity onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 寮�鍚叧闂嚜鍔ㄥ寲
+     */
+    public void enableSecurity(List<LinkEnableSecurityBean> bean, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkEnableSecurityBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.SECURITY_STATUS_SET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("enableSecurity onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /**
+     * 鑾峰彇鍔熻兘鍒楄〃
+     */
+    public void getFunctionList(HDLLinkTCallBack<List<LinkFunctionBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.GET_FUNCTION_LIST, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getFunctionList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkFunctionBean>>>() {
+                            }.getType();
+                            List<LinkFunctionBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 妯℃嫙浜戠ota
+     */
+    public void otaDeviceUpgradeDown(String oid, String module, HDLLinkTCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkOtaBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            List<LinkOtaBean> bean = new ArrayList<>();
+            LinkOtaBean linkOtaBean = new LinkOtaBean();
+            linkOtaBean.setOid(oid);
+            linkOtaBean.setModule(module);
+            linkOtaBean.setSize(291710);
+            linkOtaBean.setSign_method("md5");
+            linkOtaBean.setSign("05afc42e715b724e01b4ecd0ee2bde5d");
+            linkOtaBean.setUrl("https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2023/05/37886160-375a-4bf0-8a32-4093dac38679.ota");
+            linkOtaBean.setVersion("V02.04.16");
+            bean.add(linkOtaBean);
+            data.setObjects(bean);
+            String topic = String.format(TopicConstant.OTA_UPGRADE_DOWN, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getFunctionList onSuccess");
+                        if (callBack != null) {
+                            callBack.onSuccess("Success");
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /**
+     * 鏇存敼Sid澶囨敞鍚�
+     */
+    public void editSidName(BaseLocalResponse<List<JsonObject>> data, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+//            LinkReNameGWBean linkReNameGWBean = new LinkReNameGWBean();
+//            linkReNameGWBean.setDevice_name(sidName);
+//            data.setObjects(linkReNameGWBean);
+            String topic = String.format(TopicConstant.EDIT_FUNCTION_ATTRIBUTE, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("editSidName onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鍔熻兘灞炴��
+     * 鏀寔鎵归噺
+     *
+     * @param sids
+     * @param callBack
+     */
+    public void getFunctionAttribute(List<String> sids, HDLLinkTCallBack<List<LinkFunctionBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+
+            final BaseLocalResponse<List<FunctionAttributeRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            List<FunctionAttributeRequest> list = new ArrayList<>();
+            for (String s : sids) {
+                list.add(new FunctionAttributeRequest(s));
+            }
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.GET_FUNCTION_ATTRIBUTE, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getFunctionAttribute onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkFunctionBean>>>() {
+                            }.getType();
+                            List<LinkFunctionBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 璁惧鎺у埗
+     *
+     * @param requestList 鎺у埗鐘舵�佸弬鏁�
+     * @param callBack    缁撴灉鍥炶皟
+     */
+    public void propertyDown(List<DeviceControlRequest> requestList, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+
+            final BaseLocalResponse<List<DeviceControlRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(requestList);
+            String topic = String.format(TopicConstant.PROPERTY_DOWN, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("propertyDown onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+
+    }
+
+    /**
+     * 璇诲彇鐘舵��
+     *
+     * @param sids     璇锋眰鍙傛暟 鎸囧畾璇诲彇鐨勮澶噑id鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void propertyRead(List<String> sids, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            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.PROPERTY_READ, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("propertyRead onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鍦烘櫙鍒楄〃
+     */
+    public void getSceneList(HDLLinkTCallBack<List<LinkSceneBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.SCENE_LIST_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkSceneBean>>>() {
+                            }.getType();
+                            List<LinkSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鍦烘櫙璇︽儏
+     */
+    public void getSceneDetail(List<LinkSidStrBean> list, HDLLinkTCallBack<List<LinkCreateSceneBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkSidStrBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(list);
+            String topic = String.format(TopicConstant.SCENE_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneDetail onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkCreateSceneBean>>>() {
+                            }.getType();
+                            List<LinkCreateSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍦烘櫙鎺у埗
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            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_CONTROL, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("controlScene onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 閫氱敤UDP鍙戦�佹寚浠�
+     * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param bodyStr  body鍐呭
+     * @param callBack 鍥炶皟
+     */
+    public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
+        HDLUdpConnect.getInstance().udpSendMsg(topic, bodyStr, false, callBack);
+    }
+
+    /**
+     * 閫氱敤骞挎挱UDP鍙戦�佹寚浠�
+     * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param bodyStr  body鍐呭
+     * @param callBack 鍥炶皟
+     */
+    public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
+        HDLUdpConnect.getInstance().udpSendMsg(topic, bodyStr, true, callBack);
+    }
+
+    /**
+     * 閫氱敤TCP鍙戦�佹寚浠�
+     * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param body     body鍐呭
+     * @param callBack 鍥炶皟
+     */
+    public void tcpSendMsg(String topic, String body, HDLLinkCallBack callBack) {
+
+        LinkRequest request = new LinkRequest(topic, body, HDLLinkConfig.getInstance().isLocalEncrypt());
+        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("sendMsg onSuccess");
+                    if (callBack != null) {
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
+    }
+
+    /**
+     * 閫氱敤TCP鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
+     *
+     * @param topic 鍙戦�佹暟鎹�
+     * @param body  鍥炲鐨勪富棰�
+     */
+    public void tcpSendMsg(String topic, String body) {
+        LinkRequest request = new LinkRequest(topic, body, HDLLinkConfig.getInstance().isLocalEncrypt());
+        new HDLConnectHelper(1, HDLLinkConfig.getInstance().getIpAddress(), request, true);
+    }
+
+    /**
+     * 鍒涙柊缃戝叧鍒楄〃锛岄噸鏂拌鍙�
+     *
+     * @param homeId   浣忓畢Id
+     * @param callBack 鍥炶皟鎵�鏈夎鍙栧埌鐨勭綉鍏冲垪琛�
+     */
+    public void refreshGatewayByHome(String homeId, GatewayCallBack callBack) {
+        HDLLinkLocalGateway.getInstance().refreshGatewayByHome(homeId, callBack);
+    }
+
+    /**
+     * 鍒涙柊缃戝叧鍒楄〃锛岄噸鏂拌鍙�
+     *
+     * @param callBack 鍥炶皟鎵�鏈夎鍙栧埌鐨勭綉鍏冲垪琛�
+     */
+    public void refreshGateway(GatewayCallBack callBack) {
+        HDLLinkLocalGateway.getInstance().refreshGateway(callBack);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠浣忓畢缂撳瓨鐨勬墍鏈夌綉鍏筹紝涓�鑸槸璋冭瘯杞欢浣跨敤锛屼笁鏂逛笉鐢ㄨ皟璇曟鏂规硶
+     * 濡傛灉涔嬪墠杩樻病鏈夎鍙栬繃缃戝叧锛屽厛璋冪敤鏂规硶refreshGatewayByHome璇诲彇涓�娆�
+     *
+     * @return
+     */
+    public List<GatewayBean> getGatewayByHome() {
+        return HDLLinkLocalGateway.getInstance().getGatewayList();
+    }
+
+
+    /**
+     * 鑾峰彇鎴块棿鍒楄〃
+     *
+     * @param callBack
+     */
+    public void getRoomList(HDLLinkTCallBack<List<LinkRoomBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.ROOM_LIST_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getRoomList onSuccess");
+                        Type type = new TypeToken<BaseLocalResponse<List<LinkRoomBean>>>() {
+                        }.getType();
+                        List<LinkRoomBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍏ㄩ噺鏇存柊鎴块棿鍒楄〃
+     *
+     * @param list
+     * @param callBack
+     */
+    public void coverAddRoomList(List<LinkRoomBean> list, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkRoomBean>> senData = new BaseLocalResponse<>();
+            senData.setId(IdUtils.getUUId());
+            senData.setTime_stamp(time);
+            senData.setObjects(list);
+
+            String topic = String.format(TopicConstant.ROOM_COVER_ADD, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(senData), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("coverAddRoomList onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鎴块棿缁戝畾鍏崇郴
+     */
+    public void getRoomBindList(HDLLinkTCallBack<List<LinkRoomBindBean>> callBack, List<String> uidRoomList) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            JsonArray array = new JsonArray();
+            for (String uid : uidRoomList) {
+                array.add(uid);
+            }
+            jsonObject.add("objects", array);
+            String topic = String.format(TopicConstant.ROOM_BIND_LIST_GET, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getRoomBindList onSuccess");
+                        Type type = new TypeToken<BaseLocalResponse<List<LinkRoomBindBean>>>() {
+                        }.getType();
+                        List<LinkRoomBindBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 璇诲彇缃戝叧缁忕含搴�
+     */
+    public void getGatewayLocation(String gatewayId, HDLLinkTCallBack<GatewayLocationBean> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            String topic = String.format(TopicConstant.GATEWAY_LOCATION_GET, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getGatewayLocation onSuccess");
+                        Type type = new TypeToken<BaseLocalResponse<GatewayLocationBean>>() {
+                        }.getType();
+                        GatewayLocationBean list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 璁剧疆缃戝叧缁忕含搴�
+     */
+    public void gatewayLocation(GatewayBean bean, String longitude, String lat, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = bean.getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            JsonObject jsonObject1 = new JsonObject();
+            jsonObject1.addProperty("longitude", longitude);
+            jsonObject1.addProperty("latitude", lat);
+            jsonObject.add("objects", jsonObject1);
+            String topic = String.format(TopicConstant.GATEWAY_LOCATION_EDIT, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getRoomBindList onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鍒氬垰缁戝畾缃戝叧鐨勬椂鍊欒缃綉鍏崇粡绾害  涓嶉渶瑕佸姞瀵�
+     */
+    public void gatewayLocation(String mGatewayId, String longitude, String lat, boolean isEncrypt,HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = mGatewayId;
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+            JsonObject jsonObject1 = new JsonObject();
+            jsonObject1.addProperty("longitude", longitude);
+            jsonObject1.addProperty("latitude", lat);
+            jsonObject.add("objects", jsonObject1);
+            String topic = String.format(TopicConstant.GATEWAY_LOCATION_EDIT, gatewayId);
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), isEncrypt);
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("gatewayLocation onSuccess");
+                        callBack.onSuccess("Success");
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /*********************** 鏂囦欢浼犺緭 ****************************/
+    /**
+     * 鏂囦欢鐢ㄩ�旈�氱煡
+     *
+     * @param fileId   鏂囦欢Id
+     * @param fileName 鏂囦欢鍚嶇О
+     * @param purpose  鐢ㄩ�� 鐢ㄩ�旀灇涓�
+     *                 zigbee璁惧閰嶇疆鎭㈠锛� ConfigRecoveryForZigbeeDevices
+     *                 鏁版嵁澶囦唤锛欴ataBackup
+     *                 鏁版嵁鎭㈠锛欴ataRecovery
+     * @param callBack
+     */
+    public void sendFileUserNotification(String fileId, String fileName, String purpose, HDLLinkCallBack callBack) {
+        //甯ф牸寮忥細head+鍛戒护瀛�+鏁版嵁闀垮害+浜岃繘鍒舵暟鎹�
+        String time = String.valueOf(System.currentTimeMillis());
+        String data = "hex" + "0001" + fileId + "\r\n" + fileName + "\r\n" + purpose;
+        byte[] dataBytes = data.getBytes(StandardCharsets.UTF_8);
+        FileRequest linkRequest = new FileRequest(fileId, 0x0011, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
+        linkRequest.setReplyTopic(linkRequest.getAckTopic());
+        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), linkRequest, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+
+            }
+        }, true).send();
+    }
+
+    /**
+     * 鍙戦�佹枃浠剁浉鍏冲懡浠�
+     */
+    public void sendFileCommand(byte[] dataBytes, Integer command, HDLLinkCallBack callBack) {
+        //甯ф牸寮忥細head+鍛戒护瀛�+鏁版嵁闀垮害+浜岃繘鍒舵暟鎹�
+        String time = String.valueOf(System.currentTimeMillis());
+//        byte []dataBytes=data.getBytes(StandardCharsets.UTF_8);
+        FileRequest linkRequest = new FileRequest("65531", command, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
+        linkRequest.setReplyTopic(linkRequest.getAckTopic());
+        linkRequest.setCloudTopic(String.format(TopicConstant.NATIVE_LINK_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
+        new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), linkRequest, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+
+            }
+        }, true).send();
+    }
+
+
+    /********************************椹卞姩鍗囩骇***********************************/
+    /**
+     * 鍙戦�佹枃浠剁浉鍏冲懡浠�
+     */
+    public void sendFileCommand(String ipAddress, byte[] dataBytes, String fileId, Integer command, HDLLinkCallBack callBack) {
+        //甯ф牸寮忥細head+鍛戒护瀛�+鏁版嵁闀垮害+浜岃繘鍒舵暟鎹�
+        FileRequest linkRequest = new FileRequest(fileId, command, dataBytes, HDLLinkConfig.getInstance().isLocalEncrypt());
+        linkRequest.setReplyTopic(linkRequest.getAckTopic());
+        new HDLConnectHelper(ipAddress, linkRequest, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+
+            }
+        }, true).send();
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/GatewayLocationBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/GatewayLocationBean.java
new file mode 100644
index 0000000..3e0d993
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/GatewayLocationBean.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/5/18
+ * description:
+ */
+public class GatewayLocationBean implements Serializable {
+    private String longitude;
+    private String latitude;
+
+    public String getLongitude() {
+        return longitude == null ? "" : longitude;
+    }
+
+    public void setLongitude(@NonNull String longitude) {
+        this.longitude = longitude;
+    }
+
+    public String getLatitude() {
+        return latitude == null ? "" : latitude;
+    }
+
+    public void setLatitude(@NonNull String latitude) {
+        this.latitude = latitude;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkAttributesBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkAttributesBean.java
new file mode 100644
index 0000000..f233869
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkAttributesBean.java
@@ -0,0 +1,68 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jlchen on 1/13/22.
+ *
+ */
+public class LinkAttributesBean implements Serializable {
+
+    private String key;
+    private String data_type;
+    private List<String> value = new ArrayList<>();
+    private String max;
+    private String min;
+
+
+    public List<String> getValue() {
+        if (value == null) {
+            return new ArrayList<>();
+        }
+        return value;
+    }
+
+    public void setValue(@NonNull List<String> value) {
+        this.value = value;
+    }
+
+    public String getMax() {
+        return max == null ? "" : max;
+    }
+
+    public void setMax(String max) {
+        this.max = max;
+    }
+
+    public String getMin() {
+        return min == null ? "" : min;
+    }
+
+    public void setMin(String min) {
+        this.min = min;
+    }
+
+    @NonNull
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    @NonNull
+    public String getData_type() {
+        return data_type == null ? "" : data_type;
+    }
+
+    public void setData_type(@NonNull String data_type) {
+        this.data_type = data_type;
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicBean.java
new file mode 100644
index 0000000..204248f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicBean.java
@@ -0,0 +1,122 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicBean implements Serializable {
+    private String sid;
+    private String name;
+    private String relation;
+    private String enable;
+    //enable甯冮槻銆乨isable鎾掗槻
+    private String status;
+    //"all"--鍏ㄥ畢甯冮槻锛�"normal"--鏅�氭ā寮�,"all_day":24灏忔椂,"mute"锛氶潤闊�
+    private String type;
+    private String gatewayId;
+    private LinkCreateLogicCycleBean cycle = new LinkCreateLogicCycleBean();
+    private List<LinkCreateLogicInputBean> input = new ArrayList<>();
+    private List<LinkCreateLogicOutputBean> output = new ArrayList<>();
+    private NoticeConfigInfo noticeConfig = new NoticeConfigInfo();
+
+    public NoticeConfigInfo getNoticeConfig() {
+        return noticeConfig;
+    }
+
+    public void setNoticeConfig(@NonNull NoticeConfigInfo noticeConfig) {
+        this.noticeConfig = noticeConfig;
+    }
+
+    public String getGateWayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGateWayId(@NonNull String gateWayId) {
+        this.gatewayId = gateWayId;
+    }
+
+    public String getStatus() {
+        return status == null ? "" : status;
+    }
+
+    public void setStatus(@NonNull String status) {
+        this.status = status;
+    }
+
+    public String getType() {
+        return type == null ? "" : type;
+    }
+
+    public void setType(@NonNull String type) {
+        this.type = type;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getRelation() {
+        return relation == null ? "" : relation;
+    }
+
+    public void setRelation(@NonNull String relation) {
+        this.relation = relation;
+    }
+
+    public String getEnable() {
+        return enable == null ? "" : enable;
+    }
+
+    public void setEnable(@NonNull String enable) {
+        this.enable = enable;
+    }
+
+    public LinkCreateLogicCycleBean getCycle() {
+        return cycle;
+    }
+
+    public void setCycle(@NonNull LinkCreateLogicCycleBean cycle) {
+        this.cycle = cycle;
+    }
+
+    public List<LinkCreateLogicInputBean> getInput() {
+        if (input == null) {
+            return new ArrayList<>();
+        }
+        return input;
+    }
+
+    public void setInput(@NonNull List<LinkCreateLogicInputBean> input) {
+        this.input = input;
+    }
+
+    public List<LinkCreateLogicOutputBean> getOutput() {
+        if (output == null) {
+            return new ArrayList<>();
+        }
+        return output;
+    }
+
+    public void setOutput(@NonNull List<LinkCreateLogicOutputBean> output) {
+        this.output = output;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicCycleBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicCycleBean.java
new file mode 100644
index 0000000..869f035
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicCycleBean.java
@@ -0,0 +1,45 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicCycleBean implements Serializable {
+    private String type;
+    private String desc;
+    private List<String> value = new ArrayList<>();
+
+    public String getType() {
+        return type == null ? "" : type;
+    }
+
+    public void setType(@NonNull String type) {
+        this.type = type;
+    }
+
+    public String getDesc() {
+        return desc == null ? "" : desc;
+    }
+
+    public void setDesc(@NonNull String desc) {
+        this.desc = desc;
+    }
+
+    public List<String> getValue() {
+        if (value == null) {
+            return new ArrayList<>();
+        }
+        return value;
+    }
+
+    public void setValue(@NonNull List<String> value) {
+        this.value = value;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java
new file mode 100644
index 0000000..17b4870
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java
@@ -0,0 +1,191 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicInputBean implements Serializable {
+    private String sid;
+    /**
+     * 鏃堕棿鐐规潯浠�  1
+     * 鏃堕棿娈垫潯浠�	2
+     * 璁惧鐘舵�佸彉鍖栨潯浠�	3
+     * 鐜淇℃伅	4
+     * 瀹夐槻鏉′欢	5 涓嶅仛
+     * 浜戠澶╂皵鏉′欢	6
+     * 鏌愪釜閫昏緫/鍦烘櫙鐨勮緭鍑烘潯浠�	7
+     * 鍦扮悊鍥存爮	8 涓嶅仛
+     */
+    private String condition_type;
+    //true:涓存椂bypass涓�乫alse:鍚敤涓�  鏄惁杩囨护
+    private String bypass;
+    private List<LinkCreateLogicInputConditionBean> condition = new ArrayList<>();
+    private String statusDesc;
+    private String src;
+    private String omodel;
+    private String choose;
+    private String oid;
+    private String spk;
+    private String delay;
+    private String name;
+    private String online;
+    private LinkCreateSceneImageBean sceneImage = new LinkCreateSceneImageBean();
+    private List<LinkCreateSceneFunctionStatusBean> status = new ArrayList<>();
+    private LinkCreateSceneFunctionControlAttrsBean controlAttrs;
+    private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
+
+    public String getBypass() {
+        return bypass == null ? "" : bypass;
+    }
+
+    public void setBypass(@NonNull String bypass) {
+        this.bypass = bypass;
+    }
+
+    public String getStatusDesc() {
+        return statusDesc == null ? "" : statusDesc;
+    }
+
+    public void setStatusDesc(@NonNull String statusDesc) {
+        this.statusDesc = statusDesc;
+    }
+
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    public String getChoose() {
+        return choose == null ? "" : choose;
+    }
+
+    public void setChoose(@NonNull String choose) {
+        this.choose = choose;
+    }
+
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public String getDelay() {
+        return delay == null ? "" : delay;
+    }
+
+    public void setDelay(@NonNull String delay) {
+        this.delay = delay;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    public LinkCreateSceneImageBean getSceneImage() {
+        if (sceneImage == null) {
+            sceneImage = new LinkCreateSceneImageBean("0", "https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/material/appdebug/scene0.png", "/static/images/scene/scene0.png");
+        }
+        return sceneImage;
+    }
+
+    public void setSceneImage(@NonNull LinkCreateSceneImageBean sceneImage) {
+        this.sceneImage = sceneImage;
+    }
+
+    public List<LinkCreateSceneFunctionStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkCreateSceneFunctionStatusBean> status) {
+        this.status = status;
+    }
+
+    public LinkCreateSceneFunctionControlAttrsBean getControlAttrs() {
+        return controlAttrs;
+    }
+
+    public void setControlAttrs(@NonNull LinkCreateSceneFunctionControlAttrsBean controlAttrs) {
+        this.controlAttrs = controlAttrs;
+    }
+
+    public List<LinkCreateSceneFunctionattributesBean> getAttributes() {
+        if (attributes == null) {
+            return new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkCreateSceneFunctionattributesBean> attributes) {
+        this.attributes = attributes;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getCondition_type() {
+        return condition_type == null ? "" : condition_type;
+    }
+
+    public void setCondition_type(@NonNull String condition_type) {
+        this.condition_type = condition_type;
+    }
+
+    public List<LinkCreateLogicInputConditionBean> getCondition() {
+        if (condition == null) {
+            return new ArrayList<>();
+        }
+        return condition;
+    }
+
+    public void setCondition(@NonNull List<LinkCreateLogicInputConditionBean> condition) {
+        this.condition = condition;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputConditionBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputConditionBean.java
new file mode 100644
index 0000000..800a6f2
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputConditionBean.java
@@ -0,0 +1,49 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicInputConditionBean implements Serializable {
+    private String key;
+    private String comparator;
+    private String data_type;
+    private String value;
+
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    public String getComparator() {
+        return comparator == null ? "" : comparator;
+    }
+
+    public void setComparator(@NonNull String comparator) {
+        this.comparator = comparator;
+    }
+
+    public String getData_type() {
+        return data_type == null ? "" : data_type;
+    }
+
+    public void setData_type(@NonNull String data_type) {
+        this.data_type = data_type;
+    }
+
+    public String getValue() {
+        return value == null ? "" : value;
+    }
+
+    public void setValue(@NonNull String value) {
+        this.value = value;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java
new file mode 100644
index 0000000..9b43655
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java
@@ -0,0 +1,179 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicOutputBean implements Serializable {
+    /**
+     * 璁惧=1
+     * 鍦烘櫙=2
+     * 瀹夐槻=3
+     */
+    private String target_type;
+    private String delay;
+    private String sid;
+    private String name;
+    private List<LinkCreateLogicOutputStatusBean> status = new ArrayList<>();
+    //鍦烘櫙
+    private List<LinkCreateSceneBean> detailInfo = new ArrayList<>();
+
+    //璁惧
+    private String statusDesc;
+    private String src;
+    private String omodel;
+    private String choose;
+    private String oid;
+    private String spk;
+    private String online;
+    private LinkCreateSceneImageBean sceneImage;
+    private LinkCreateSceneFunctionControlAttrsBean controlAttrs;
+    private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
+
+    public String getStatusDesc() {
+        return statusDesc == null ? "" : statusDesc;
+    }
+
+    public void setStatusDesc(@NonNull String statusDesc) {
+        this.statusDesc = statusDesc;
+    }
+
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    public String getChoose() {
+        return choose == null ? "" : choose;
+    }
+
+    public void setChoose(@NonNull String choose) {
+        this.choose = choose;
+    }
+
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    public LinkCreateSceneImageBean getSceneImage() {
+        if (sceneImage == null) {
+            sceneImage = new LinkCreateSceneImageBean("0", "https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/material/appdebug/scene0.png", "/static/images/scene/scene0.png");
+        }
+        return sceneImage;
+    }
+
+    public void setSceneImage(@NonNull LinkCreateSceneImageBean sceneImage) {
+        this.sceneImage = sceneImage;
+    }
+
+    public LinkCreateSceneFunctionControlAttrsBean getControlAttrs() {
+        return controlAttrs;
+    }
+
+    public void setControlAttrs(@NonNull LinkCreateSceneFunctionControlAttrsBean controlAttrs) {
+        this.controlAttrs = controlAttrs;
+    }
+
+    public List<LinkCreateSceneFunctionattributesBean> getAttributes() {
+        if (attributes == null) {
+            return new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkCreateSceneFunctionattributesBean> attributes) {
+        this.attributes = attributes;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public List<LinkCreateSceneBean> getDetailInfo() {
+        if (detailInfo == null) {
+            return new ArrayList<>();
+        }
+        return detailInfo;
+    }
+
+    public void setDetailInfo(@NonNull List<LinkCreateSceneBean> detailInfo) {
+        this.detailInfo = detailInfo;
+    }
+
+    public String getTarget_type() {
+        return target_type == null ? "" : target_type;
+    }
+
+    public void setTarget_type(@NonNull String target_type) {
+        this.target_type = target_type;
+    }
+
+    public String getDelay() {
+        return delay == null ? "" : delay;
+    }
+
+    public void setDelay(@NonNull String delay) {
+        this.delay = delay;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public List<LinkCreateLogicOutputStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkCreateLogicOutputStatusBean> status) {
+        this.status = status;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputStatusBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputStatusBean.java
new file mode 100644
index 0000000..eff3608
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputStatusBean.java
@@ -0,0 +1,50 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:
+ */
+public class LinkCreateLogicOutputStatusBean implements Serializable {
+    //鈿狅笍 杩欒竟闇�瑕佹坊鍔犲叾浠栧瓧娈�  鍥犱负鍗曠函杩欎簺涓嶅鐢�
+    private String value;
+    private String key;
+    private String attrName;
+    private String desc;
+
+    public String getAttrName() {
+        return attrName == null ? "" : attrName;
+    }
+
+    public void setAttrName(@NonNull String attrName) {
+        this.attrName = attrName;
+    }
+
+    public String getDesc() {
+        return desc == null ? "" : desc;
+    }
+
+    public void setDesc(@NonNull String desc) {
+        this.desc = desc;
+    }
+
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value == null ? "" : value;
+    }
+
+    public void setValue(@NonNull String value) {
+        this.value = value;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java
new file mode 100644
index 0000000..7b3bb69
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java
@@ -0,0 +1,122 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneBean implements Serializable {
+    private String delay;
+    private String name;
+    private String sid;
+    private String group;
+    private String can_delete;
+    private String gatewayId;
+    private String image;
+    private List<LinkCreateSceneImageToCloudBean> imageBeans = new ArrayList<>();
+    private List<String> uids = new ArrayList<>();
+    private List<LinkCreateSceneFunctionBean> functions = new ArrayList<>();
+
+    public String getGatewayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGatewayId(@NonNull String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getImage() {
+        return image == null ? "" : image;
+    }
+
+    public void setImage(@NonNull String image) {
+        this.image = image;
+    }
+
+    public String getGroup() {
+        return group == null ? "" : group;
+    }
+
+    public void setGroup(@NonNull String group) {
+        this.group = group;
+    }
+
+    public List<LinkCreateSceneImageToCloudBean> getImageBeans() {
+        if (imageBeans == null) {
+            return imageBeans = new ArrayList<>();
+        }
+        return imageBeans;
+    }
+
+    public void setImageBeans(@NonNull List<LinkCreateSceneImageToCloudBean> imageBeans) {
+        this.imageBeans = imageBeans;
+    }
+
+    public String getGateWayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGateWayId(@NonNull String gateWayId) {
+        this.gatewayId = gateWayId;
+    }
+
+    public String getCan_delete() {
+        return can_delete == null ? "" : can_delete;
+    }
+
+    public void setCan_delete(@NonNull String can_delete) {
+        this.can_delete = can_delete;
+    }
+
+    public String getDelay() {
+        return delay == null ? "" : delay;
+    }
+
+    public void setDelay(@NonNull String delay) {
+        this.delay = delay;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public List<String> getUids() {
+        if (uids == null) {
+            return new ArrayList<>();
+        }
+        return uids;
+    }
+
+    public void setUids(@NonNull List<String> uids) {
+        this.uids = uids;
+    }
+
+    public List<LinkCreateSceneFunctionBean> getFunctions() {
+        if (functions == null) {
+            return new ArrayList<>();
+        }
+        return functions;
+    }
+
+    public void setFunctions(@NonNull List<LinkCreateSceneFunctionBean> functions) {
+        this.functions = functions;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java
new file mode 100644
index 0000000..1d588dc
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java
@@ -0,0 +1,159 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneFunctionBean implements Serializable {
+    private String statusDesc;
+    private String src;
+    private String omodel;
+    private String choose;
+    private String oid;
+    private String sid;
+    private String spk;
+    private String delay;
+    private String name;
+    private String online;
+    private String type;
+    private LinkCreateSceneImageBean sceneImage = new LinkCreateSceneImageBean();
+    private List<LinkCreateSceneFunctionStatusBean> status = new ArrayList<>();
+    private LinkCreateSceneFunctionControlAttrsBean controlAttrs = new LinkCreateSceneFunctionControlAttrsBean();
+    private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
+
+    public LinkCreateSceneImageBean getSceneImage() {
+        if (sceneImage == null) {
+            sceneImage = new LinkCreateSceneImageBean("0", "https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/material/appdebug/scene0.png", "/static/images/scene/scene0.png");
+        }
+        return sceneImage;
+    }
+
+    public String getType() {
+        return type == null ? "" : type;
+    }
+
+    public void setType(@NonNull String type) {
+        this.type = type;
+    }
+
+    public void setSceneImage(@NonNull LinkCreateSceneImageBean sceneImage) {
+        this.sceneImage = sceneImage;
+    }
+
+    public String getStatusDesc() {
+        return statusDesc == null ? "" : statusDesc;
+    }
+
+    public void setStatusDesc(@NonNull String statusDesc) {
+        this.statusDesc = statusDesc;
+    }
+
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    public String getChoose() {
+        return choose == null ? "" : choose;
+    }
+
+    public void setChoose(@NonNull String choose) {
+        this.choose = choose;
+    }
+
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public String getDelay() {
+        return delay == null ? "" : delay;
+    }
+
+    public void setDelay(@NonNull String delay) {
+        this.delay = delay;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    public List<LinkCreateSceneFunctionStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkCreateSceneFunctionStatusBean> status) {
+        this.status = status;
+    }
+
+    public LinkCreateSceneFunctionControlAttrsBean getControlAttrs() {
+        return controlAttrs;
+    }
+
+    public void setControlAttrs(@NonNull LinkCreateSceneFunctionControlAttrsBean controlAttrs) {
+        this.controlAttrs = controlAttrs;
+    }
+
+    public List<LinkCreateSceneFunctionattributesBean> getAttributes() {
+        if (attributes == null) {
+            return new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkCreateSceneFunctionattributesBean> attributes) {
+        this.attributes = attributes;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionControlAttrsBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionControlAttrsBean.java
new file mode 100644
index 0000000..b57338c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionControlAttrsBean.java
@@ -0,0 +1,45 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneFunctionControlAttrsBean implements Serializable {
+    private String delay1;
+    private String sid;
+    private List<LinkCreateSceneFunctionStatusBean> status = new ArrayList<>();
+
+    public String getDelay1() {
+        return delay1 == null ? "" : delay1;
+    }
+
+    public void setDelay1(@NonNull String delay1) {
+        this.delay1 = delay1;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public List<LinkCreateSceneFunctionStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkCreateSceneFunctionStatusBean> status) {
+        this.status = status;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionStatusBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionStatusBean.java
new file mode 100644
index 0000000..0e10c49
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionStatusBean.java
@@ -0,0 +1,58 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneFunctionStatusBean implements Serializable {
+    private String value;
+    private String key;
+    private String attrName;
+    private String desc;
+    private String comparator;
+
+    public String getComparator() {
+        return comparator == null ? "" : comparator;
+    }
+
+    public void setComparator(@NonNull String comparator) {
+        this.comparator = comparator;
+    }
+
+    public String getValue() {
+        return value == null ? "" : value;
+    }
+
+    public void setValue(@NonNull String value) {
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    public String getAttrName() {
+        return attrName == null ? "" : attrName;
+    }
+
+    public void setAttrName(@NonNull String attrName) {
+        this.attrName = attrName;
+    }
+
+    public String getDesc() {
+        return desc == null ? "" : desc;
+    }
+
+    public void setDesc(@NonNull String desc) {
+        this.desc = desc;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesBean.java
new file mode 100644
index 0000000..f4f46c1
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesBean.java
@@ -0,0 +1,102 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneFunctionattributesBean implements Serializable {
+    private String data_type;
+    private String accessMode;
+    private String key;
+    private String desc;
+    private String maxValue;
+    private String minValue;
+    private String unit;
+    private List<String> value = new ArrayList<>();
+    private List<LinkCreateSceneFunctionattributesEnumerationsBean> enumerations = new ArrayList<>();
+
+    public String getData_type() {
+        return data_type == null ? "" : data_type;
+    }
+
+    public void setData_type(@NonNull String data_type) {
+        this.data_type = data_type;
+    }
+
+    public String getAccessMode() {
+        return accessMode == null ? "" : accessMode;
+    }
+
+    public void setAccessMode(@NonNull String accessMode) {
+        this.accessMode = accessMode;
+    }
+
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    public String getDesc() {
+        return desc == null ? "" : desc;
+    }
+
+    public void setDesc(@NonNull String desc) {
+        this.desc = desc;
+    }
+
+    public String getMaxValue() {
+        return maxValue == null ? "" : maxValue;
+    }
+
+    public void setMaxValue(@NonNull String maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    public String getMinValue() {
+        return minValue == null ? "" : minValue;
+    }
+
+    public void setMinValue(@NonNull String minValue) {
+        this.minValue = minValue;
+    }
+
+    public String getUnit() {
+        return unit == null ? "" : unit;
+    }
+
+    public void setUnit(@NonNull String unit) {
+        this.unit = unit;
+    }
+
+    public List<String> getValue() {
+        if (value == null) {
+            return new ArrayList<>();
+        }
+        return value;
+    }
+
+    public void setValue(@NonNull List<String> value) {
+        this.value = value;
+    }
+
+    public List<LinkCreateSceneFunctionattributesEnumerationsBean> getEnumerations() {
+        if (enumerations == null) {
+            return new ArrayList<>();
+        }
+        return enumerations;
+    }
+
+    public void setEnumerations(@NonNull List<LinkCreateSceneFunctionattributesEnumerationsBean> enumerations) {
+        this.enumerations = enumerations;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesEnumerationsBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesEnumerationsBean.java
new file mode 100644
index 0000000..f73d61c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionattributesEnumerationsBean.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneFunctionattributesEnumerationsBean implements Serializable {
+    private String value;
+    private String desc;
+
+    public String getValue() {
+        return value == null ? "" : value;
+    }
+
+    public void setValue(@NonNull String value) {
+        this.value = value;
+    }
+
+    public String getDesc() {
+        return desc == null ? "" : desc;
+    }
+
+    public void setDesc(@NonNull String desc) {
+        this.desc = desc;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageBean.java
new file mode 100644
index 0000000..8df6d7b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageBean.java
@@ -0,0 +1,49 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneImageBean implements Serializable {
+    private String id;
+    private String url;
+    private String local;
+
+    public LinkCreateSceneImageBean(String id, String url, String local) {
+        this.id = id;
+        this.url = url;
+        this.local = local;
+    }
+
+    public LinkCreateSceneImageBean() {
+    }
+
+    public String getId() {
+        return id == null ? "" : id;
+    }
+
+    public void setId(@NonNull String id) {
+        this.id = id;
+    }
+
+    public String getUrl() {
+        return url == null ? "" : url;
+    }
+
+    public void setUrl(@NonNull String url) {
+        this.url = url;
+    }
+
+    public String getLocal() {
+        return local == null ? "" : local;
+    }
+
+    public void setLocal(@NonNull String local) {
+        this.local = local;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageToCloudBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageToCloudBean.java
new file mode 100644
index 0000000..09e64db
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneImageToCloudBean.java
@@ -0,0 +1,40 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/23
+ * description:
+ */
+public class LinkCreateSceneImageToCloudBean implements Serializable {
+    private String imageId;
+    private String cloudUrl;
+    private String localUrl;
+
+    public String getImageId() {
+        return imageId == null ? "" : imageId;
+    }
+
+    public void setImageId(@NonNull String imageId) {
+        this.imageId = imageId;
+    }
+
+    public String getCloudUrl() {
+        return cloudUrl == null ? "" : cloudUrl;
+    }
+
+    public void setCloudUrl(@NonNull String cloudUrl) {
+        this.cloudUrl = cloudUrl;
+    }
+
+    public String getLocalUrl() {
+        return localUrl == null ? "" : localUrl;
+    }
+
+    public void setLocalUrl(@NonNull String localUrl) {
+        this.localUrl = localUrl;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableLogicBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableLogicBean.java
new file mode 100644
index 0000000..cfb835e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableLogicBean.java
@@ -0,0 +1,36 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/21
+ * description:
+ */
+public class LinkEnableLogicBean implements Serializable {
+    private String sid;
+    private String enable;
+
+    public LinkEnableLogicBean(String sid, String enable) {
+        this.sid = sid;
+        this.enable = enable;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getEnable() {
+        return enable == null ? "" : enable;
+    }
+
+    public void setEnable(@NonNull String enable) {
+        this.enable = enable;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableSecurityBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableSecurityBean.java
new file mode 100644
index 0000000..3558569
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkEnableSecurityBean.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/21
+ * description:
+ */
+public class LinkEnableSecurityBean implements Serializable {
+    private String sid;
+    private String status;
+    private String alarm;
+
+    public LinkEnableSecurityBean(String sid, String status) {
+        this.sid = sid;
+        this.status = status;
+    }
+
+    public LinkEnableSecurityBean(String sid, String status, String alarm) {
+        this.sid = sid;
+        this.status = status;
+        this.alarm = alarm;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getStatus() {
+        return status == null ? "" : status;
+    }
+
+    public void setStatus(@NonNull String status) {
+        this.status = status;
+    }
+
+    public String getAlarm() {
+        return alarm == null ? "" : alarm;
+    }
+
+    public void setAlarm(@NonNull String alarm) {
+        this.alarm = alarm;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionBean.java
new file mode 100644
index 0000000..e7a86c8
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionBean.java
@@ -0,0 +1,135 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jlchen on 1/6/22.
+ */
+public class LinkFunctionBean implements Serializable {
+    private String sid;//鍔熻兘鐨剆id
+    private String oid;//妯″潡鐨刼id
+    private String name;//鍔熻兘鍥炶矾鍚嶅瓧
+    private String spk;//spk
+    private String omodel;
+    private String src;
+    private String online;
+    private List<LinkAttributesBean> attributes = new ArrayList<>();//鍔熻兘灞炴�э紝闇�瑕佸崟鐙彂閫佸姛鑳藉睘鎬ц鍙栫殑鎸囦护璇诲洖鏉�
+    private List<LinkStatusBean> status = new ArrayList<>();//褰撳墠璁惧鐘舵�佸�硷紝璁惧鎺у埗鐨勬椂鍊欐墠鐢ㄥ埌
+
+    private boolean templateFlag = false;//妯℃澘鏍囪
+
+    /**
+     * 1:灞曠ず 2:涓嶅睍绀�
+     */
+    private String show;
+
+    public String getShow() {
+        return show == null ? "1" : show;
+    }
+
+    public void setShow(@NonNull String show) {
+        this.show = show;
+    }
+
+
+    public boolean isTemplateFlag() {
+        return templateFlag;
+    }
+
+    public void setTemplateFlag(boolean templateFlag) {
+        this.templateFlag = templateFlag;
+    }
+
+
+    @NonNull
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    @NonNull
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    @NonNull
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    @NonNull
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    @NonNull
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    @NonNull
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    @NonNull
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    @NonNull
+    public List<LinkStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkStatusBean> status) {
+        this.status = status;
+    }
+
+    @NonNull
+    public List<LinkAttributesBean> getAttributes() {
+        if (attributes == null) {
+            return new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkAttributesBean> attributes) {
+        this.attributes = attributes;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionWithRoomBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionWithRoomBean.java
new file mode 100644
index 0000000..dfb6b22
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkFunctionWithRoomBean.java
@@ -0,0 +1,154 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by jlchen on 1/6/22.
+ */
+public class LinkFunctionWithRoomBean implements Serializable {
+    private String sid;//鍔熻兘鐨剆id
+    private String oid;//妯″潡鐨刼id
+    private String name;//鍔熻兘鍥炶矾鍚嶅瓧
+    private String spk;//spk
+    private String omodel;
+    private String src;
+    private String online;
+    private String roomName;
+    private List<LinkAttributesBean> attributes = new ArrayList<>();//鍔熻兘灞炴�э紝闇�瑕佸崟鐙彂閫佸姛鑳藉睘鎬ц鍙栫殑鎸囦护璇诲洖鏉�
+    private List<LinkStatusBean> status = new ArrayList<>();//褰撳墠璁惧鐘舵�佸�硷紝璁惧鎺у埗鐨勬椂鍊欐墠鐢ㄥ埌
+
+    private boolean templateFlag = false;//妯℃澘鏍囪
+
+    /**
+     * 1:灞曠ず 2:涓嶅睍绀�
+     */
+    private String show;
+
+    private boolean hasRoom;
+
+    public boolean isHasRoom() {
+        return hasRoom;
+    }
+
+    public void setHasRoom(@NonNull boolean hasRoom) {
+        this.hasRoom = hasRoom;
+    }
+
+    public String getRoomName() {
+        return roomName == null ? "" : roomName;
+    }
+
+    public void setRoomName(@NonNull String roomName) {
+        this.roomName = roomName;
+    }
+
+    public String getShow() {
+        return show == null ? "1" : show;
+    }
+
+    public void setShow(@NonNull String show) {
+        this.show = show;
+    }
+
+
+    public boolean isTemplateFlag() {
+        return templateFlag;
+    }
+
+    public void setTemplateFlag(boolean templateFlag) {
+        this.templateFlag = templateFlag;
+    }
+
+
+    @NonNull
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    @NonNull
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    @NonNull
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    @NonNull
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    @NonNull
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    @NonNull
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    @NonNull
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    @NonNull
+    public List<LinkStatusBean> getStatus() {
+        if (status == null) {
+            return new ArrayList<>();
+        }
+        return status;
+    }
+
+    public void setStatus(@NonNull List<LinkStatusBean> status) {
+        this.status = status;
+    }
+
+    @NonNull
+    public List<LinkAttributesBean> getAttributes() {
+        if (attributes == null) {
+            return new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkAttributesBean> attributes) {
+        this.attributes = attributes;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkIrDeviceBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkIrDeviceBean.java
new file mode 100644
index 0000000..df0dd4e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkIrDeviceBean.java
@@ -0,0 +1,81 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/3/13
+ * description:
+ */
+public class LinkIrDeviceBean implements Serializable {
+    private String sid;
+    private String name;
+    private String spk;
+    private String oid;
+    private String omodel;
+    private String online;
+    private List<LinkAttributesBean> attributes = new ArrayList<>();
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    public String getOmodel() {
+        return omodel == null ? "" : omodel;
+    }
+
+    public void setOmodel(@NonNull String omodel) {
+        this.omodel = omodel;
+    }
+
+    public String getOnline() {
+        return online == null ? "" : online;
+    }
+
+    public void setOnline(@NonNull String online) {
+        this.online = online;
+    }
+
+    public List<LinkAttributesBean> getAttributes() {
+        if (attributes == null) {
+            return attributes = new ArrayList<>();
+        }
+        return attributes;
+    }
+
+    public void setAttributes(@NonNull List<LinkAttributesBean> attributes) {
+        this.attributes = attributes;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkLogicBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkLogicBean.java
new file mode 100644
index 0000000..d0e6f69
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkLogicBean.java
@@ -0,0 +1,73 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/2/16
+ * description:   鏄惁鍚屾椂琛ㄧず瀹夐槻璺熻嚜鍔ㄥ寲???  闇�瑕佹爣娉ㄤ竴涓�????鏄惁闇�瑕佹洿鏂颁竴涓被鍚�
+ */
+public class LinkLogicBean implements Serializable {
+    private String sid;
+    private String name;
+    /**
+     * 鑷姩鍖栧紑鍚叧闂�
+     */
+    private String enable;
+    /**
+     * 瀹夐槻甯冮槻鎾ら槻浣跨敤
+     */
+    private String status;
+    private String gatewayId;
+    private LinkCreateLogicBean detailInfo = new LinkCreateLogicBean();
+
+    public String getGateWayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGateWayId(@NonNull String gateWayId) {
+        this.gatewayId = gateWayId;
+    }
+
+    public String getStatus() {
+        return status == null ? "" : status;
+    }
+
+    public void setStatus(@NonNull String status) {
+        this.status = status;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getEnable() {
+        return enable == null ? "" : enable;
+    }
+
+    public void setEnable(@NonNull String enable) {
+        this.enable = enable;
+    }
+
+    public LinkCreateLogicBean getDetailInfo() {
+        return detailInfo;
+    }
+
+    public void setDetailInfo(@NonNull LinkCreateLogicBean detailInfo) {
+        this.detailInfo = detailInfo;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOidBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOidBean.java
new file mode 100644
index 0000000..ecea4da
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOidBean.java
@@ -0,0 +1,174 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jlchen on 1/10/22.
+ * Link Oid妯″潡瀵硅薄
+ */
+public class LinkOidBean implements Serializable {
+
+    private String oid;//oid
+    private String device_name;//妯″潡鍚嶅瓧
+    private String device_mac;//妯″潡Mac鍦板潃銆乑igBee鐨凞eviceAddr
+    private String device_model;//ZigBee鐨凪odelIdentifier
+    private String addresses;//
+    private String driver_code;//
+    private String hw_version;//纭欢鐗堟湰
+    private String fw_version;
+    private String src;//鏉ヨ嚜閭d釜椹卞姩
+    private String from;//鏉ヨ嚜閭d釜缃戝叧
+    private final String protocolType="zigbee";//鍗忚绫诲瀷(bus銆乲nx銆亃igbee)
+    private String parentOid;//鐖惰澶噊id
+    private List<ImageInfoBean> image_info = new ArrayList<>();// 涓�涓澶囧彲鑳藉涓浐浠剁増鏈� 鍥轰欢鐗堟湰鍒楄〃
+
+    //    private boolean templateFlag = false;//妯℃澘鏍囪
+//
+//    public boolean isTemplateFlag() {
+//        return templateFlag;
+//    }
+//
+//    public void setTemplateFlag(boolean templateFlag) {
+//        this.templateFlag = templateFlag;
+//    }
+    @NonNull
+    public String getParentOid() {
+        return parentOid == null ? "" : parentOid;
+    }
+
+    public void setParentOid(String parentOid) {
+        this.parentOid = parentOid;
+    }
+
+    @NonNull
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    @NonNull
+    public String getDevice_name() {
+        return device_name == null ? "" : device_name;
+    }
+
+    public void setDevice_name(@NonNull String device_name) {
+        this.device_name = device_name;
+    }
+
+    @NonNull
+    public String getDevice_mac() {
+        return device_mac == null ? "" : device_mac;
+    }
+
+    public void setDevice_mac(@NonNull String device_mac) {
+        this.device_mac = device_mac;
+    }
+
+    @NonNull
+    public String getDevice_model() {
+        return device_model == null ? "" : device_model;
+    }
+
+    public void setDevice_model(@NonNull String device_model) {
+        this.device_model = device_model;
+    }
+
+    @NonNull
+    public String getAddresses() {
+        return addresses == null ? "" : addresses;
+    }
+
+    public void setAddresses(@NonNull String addresses) {
+        this.addresses = addresses;
+    }
+
+    @NonNull
+    public String getDriver_code() {
+        return driver_code == null ? "" : driver_code;
+    }
+
+    public void setDriver_code(@NonNull String driver_code) {
+        this.driver_code = driver_code;
+    }
+
+    @NonNull
+    public String getHw_version() {
+        return hw_version == null ? "" : hw_version;
+    }
+
+    public void setHw_version(@NonNull String hw_version) {
+        this.hw_version = hw_version;
+    }
+
+    @NonNull
+    public String getFw_version() {
+        return fw_version == null ? "" : fw_version;
+    }
+
+    public void setFw_version(@NonNull String fw_version) {
+        this.fw_version = fw_version;
+    }
+
+    @NonNull
+    public String getSrc() {
+        return src == null ? "" : src;
+    }
+
+    public void setSrc(@NonNull String src) {
+        this.src = src;
+    }
+
+    @NonNull
+    public String getFrom() {
+        return from == null ? "" : from;
+    }
+
+    public void setFrom(@NonNull String from) {
+        this.from = from;
+    }
+
+    @NonNull
+    public List<ImageInfoBean> getImage_info() {
+        if (image_info == null) {
+            return new ArrayList<>();
+        }
+        return image_info;
+    }
+
+    public void setImage_info(@NonNull List<ImageInfoBean> image_info) {
+        this.image_info = image_info;
+    }
+
+    /**
+     * 鍥轰欢鍜岀‖浠剁増鏈�
+     */
+    public static class ImageInfoBean implements Serializable {
+        private String imageId;
+        private String fw_version;
+
+        @NonNull
+        public String getImageId() {
+            return imageId == null ? "" : imageId;
+        }
+
+        public void setImageId(@NonNull String imageId) {
+            this.imageId = imageId;
+        }
+
+        @NonNull
+        public String getFw_version() {
+            return fw_version == null ? "" : fw_version;
+        }
+
+        public void setFw_version(@NonNull String fw_version) {
+            this.fw_version = fw_version;
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOtaBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOtaBean.java
new file mode 100644
index 0000000..4e72b64
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkOtaBean.java
@@ -0,0 +1,78 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by jlchen on 1/13/22.
+ *
+ */
+public class LinkOtaBean implements Serializable {
+
+    private String oid;
+    private String module;
+    private long size;
+    private String version;
+    private String url;
+    private String sign_method;
+    private String sign;
+
+    public String getSign_method() {
+        return sign_method == null ? "" : sign_method;
+    }
+
+    public void setSign_method(@NonNull String sign_method) {
+        this.sign_method = sign_method;
+    }
+
+    public String getSign() {
+        return sign == null ? "" : sign;
+    }
+
+    public void setSign(@NonNull String sign) {
+        this.sign = sign;
+    }
+
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    public String getModule() {
+        return module == null ? "" : module;
+    }
+
+    public void setModule(@NonNull String module) {
+        this.module = module;
+    }
+
+    public long getSize() {
+        return size;
+    }
+
+    public void setSize(@NonNull long size) {
+        this.size = size;
+    }
+
+    public String getVersion() {
+        return version == null ? "" : version;
+    }
+
+    public void setVersion(@NonNull String version) {
+        this.version = version;
+    }
+
+    public String getUrl() {
+        return url == null ? "" : url;
+    }
+
+    public void setUrl(@NonNull String url) {
+        this.url = url;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkReNameGWBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkReNameGWBean.java
new file mode 100644
index 0000000..3e50f5c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkReNameGWBean.java
@@ -0,0 +1,17 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+
+public class LinkReNameGWBean implements Serializable {
+    private String device_name;
+
+    public String getDevice_name() {
+        return device_name == null ? "" : device_name;
+    }
+
+    public void setDevice_name(@NonNull String device_name) {
+        this.device_name = device_name;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkResponseBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkResponseBean.java
new file mode 100644
index 0000000..ef27efd
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkResponseBean.java
@@ -0,0 +1,40 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/13
+ * description:
+ */
+public class LinkResponseBean implements Serializable {
+    private String id;
+    private String code;
+    private String time_stamp;
+
+    public String getId() {
+        return id == null ? "" : id;
+    }
+
+    public void setId(@NonNull String id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code == null ? "" : code;
+    }
+
+    public void setCode(@NonNull String code) {
+        this.code = code;
+    }
+
+    public String getTime_stamp() {
+        return time_stamp == null ? "" : time_stamp;
+    }
+
+    public void setTime_stamp(@NonNull String time_stamp) {
+        this.time_stamp = time_stamp;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBean.java
new file mode 100644
index 0000000..cec4779
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBean.java
@@ -0,0 +1,71 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 12/20/21.
+ */
+public class LinkRoomBean implements Serializable {
+
+    private String uid;//鎴块棿鎴栬�呮ゼ灞傜殑Id
+    private String name;//鎴块棿鎴栬�呮ゼ灞傚悕瀛�
+    private String roomType;//绫诲瀷 FLOOR = 妤煎眰 ROOM = 鎴块棿
+    private String roomImage;//鎴块棿鍥剧墖
+    private String parentId;//鐖惰妭鐐笽d锛屾埧闂村垎閰嶇殑妤煎眰鐨処D
+
+    public LinkRoomBean(String name) {
+        this.name = name;
+    }
+
+    public LinkRoomBean() {
+
+    }
+
+    @NonNull
+    public String getUid() {
+        return uid == null ? "" : uid;
+    }
+
+    public void setUid(@NonNull String uid) {
+        this.uid = uid;
+    }
+
+    @NonNull
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    @NonNull
+    public String getRoomType() {
+        return roomType == null ? "" : roomType;
+    }
+
+    public void setRoomType(@NonNull String roomType) {
+        this.roomType = roomType;
+    }
+
+    @NonNull
+    public String getRoomImage() {
+        return roomImage == null ? "" : roomImage;
+    }
+
+    public void setRoomImage(@NonNull String roomImage) {
+        this.roomImage = roomImage;
+    }
+
+    @NonNull
+    public String getParentId() {
+        return parentId == null ? "" : parentId;
+    }
+
+    public void setParentId(@NonNull String parentId) {
+        this.parentId = parentId;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBindBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBindBean.java
new file mode 100644
index 0000000..1d0dd28
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkRoomBindBean.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jlchen on 1/10/22.
+ */
+public class LinkRoomBindBean implements Serializable{
+
+    private String uid;//鎴块棿uid
+    private List<LinkSidStrBean> functions = new ArrayList<>();//鍔熻兘鍒楄〃
+    private List<LinkSidStrBean> scenes = new ArrayList<>();//鍦烘櫙鍒楄〃鍒楄〃
+
+    @NonNull
+    public String getUid() {
+        return uid == null ? "" : uid;
+    }
+
+    public void setUid(@NonNull String uid) {
+        this.uid = uid;
+    }
+
+    @NonNull
+    public List<LinkSidStrBean> getFunctions() {
+        if (functions == null) {
+            return new ArrayList<>();
+        }
+        return functions;
+    }
+
+    public void setFunctions(@NonNull List<LinkSidStrBean> functions) {
+        this.functions = functions;
+    }
+
+    @NonNull
+    public List<LinkSidStrBean> getScenes() {
+        if (scenes == null) {
+            return new ArrayList<>();
+        }
+        return scenes;
+    }
+
+    public void setScenes(@NonNull List<LinkSidStrBean> scenes) {
+        this.scenes = scenes;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java
new file mode 100644
index 0000000..623f2f0
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java
@@ -0,0 +1,103 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by jlchen on 1/10/22.
+ */
+public class LinkSceneBean implements Serializable {
+
+    private String sid;//鍦烘櫙sid
+    private String name;//鍦烘櫙鍚嶅瓧
+    private String status;//鐘舵��
+    private String group;//
+    private String delay;//寤惰繜
+    private String modify_time;//淇敼鏃堕棿
+    private String gatewayId;
+    private LinkCreateSceneBean detailInfo = new LinkCreateSceneBean();//璇︽儏
+    /**
+     * 涓撻棬缁欏満鏅壒閲忔搷浣滃仛澶勭悊
+     */
+    private boolean isChoose = false;
+
+    public boolean isChoose() {
+        return isChoose;
+    }
+
+    public void setChoose(@NonNull boolean choose) {
+        isChoose = choose;
+    }
+
+    public String getGateWayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGateWayId(@NonNull String gateWayId) {
+        this.gatewayId = gateWayId;
+    }
+
+    @NonNull
+    public LinkCreateSceneBean getDetailInfo() {
+        return detailInfo== null ? new LinkCreateSceneBean() : detailInfo;
+    }
+
+    public void setDetailInfo(@NonNull LinkCreateSceneBean detailInfo) {
+        this.detailInfo = detailInfo;
+    }
+
+    @NonNull
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    @NonNull
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    @NonNull
+    public String getStatus() {
+        return status == null ? "" : status;
+    }
+
+    public void setStatus(@NonNull String status) {
+        this.status = status;
+    }
+
+    @NonNull
+    public String getGroup() {
+        return group == null ? "" : group;
+    }
+
+    public void setGroup(@NonNull String group) {
+        this.group = group;
+    }
+
+    @NonNull
+    public String getDelay() {
+        return delay == null ? "" : delay;
+    }
+
+    public void setDelay(@NonNull String delay) {
+        this.delay = delay;
+    }
+
+    @NonNull
+    public String getModify_time() {
+        return modify_time == null ? "" : modify_time;
+    }
+
+    public void setModify_time(@NonNull String modify_time) {
+        this.modify_time = modify_time;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidNameBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidNameBean.java
new file mode 100644
index 0000000..666f534
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidNameBean.java
@@ -0,0 +1,33 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/13
+ * description:
+ */
+public class LinkSidNameBean implements Serializable {
+    private String sid;
+    private String name;
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidStrBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidStrBean.java
new file mode 100644
index 0000000..a6d99a5
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidStrBean.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.link.bean;
+
+import androidx.annotation.NonNull;
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 1/10/22.
+ *
+ * 璁惧鎴栬�呭満鏅痵id
+ */
+public class LinkSidStrBean implements Serializable {
+
+    private String sid;//璁惧鎴栬�呭満鏅痵id
+
+    public LinkSidStrBean() {
+    }
+
+    public LinkSidStrBean(String sid) {
+        this.sid = sid;
+    }
+
+    @NonNull
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidUidBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidUidBean.java
new file mode 100644
index 0000000..f52f858
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidUidBean.java
@@ -0,0 +1,36 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/1/13
+ * description:
+ */
+public class LinkSidUidBean implements Serializable {
+    private String uid;
+    private List<LinkSidStrBean> functions = new ArrayList<>();
+
+    public String getUid() {
+        return uid == null ? "" : uid;
+    }
+
+    public void setUid(@NonNull String uid) {
+        this.uid = uid;
+    }
+
+    public List<LinkSidStrBean> getFunctions() {
+        if (functions == null) {
+            return new ArrayList<>();
+        }
+        return functions;
+    }
+
+    public void setFunctions(@NonNull List<LinkSidStrBean> functions) {
+        this.functions = functions;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkStatusBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkStatusBean.java
new file mode 100644
index 0000000..3528ea8
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkStatusBean.java
@@ -0,0 +1,33 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by jlchen on 1/13/22.
+ */
+public class LinkStatusBean implements Serializable {
+
+    private String key;
+    private String value;
+
+    @NonNull
+    public String getKey() {
+        return key == null ? "" : key;
+    }
+
+    public void setKey(@NonNull String key) {
+        this.key = key;
+    }
+
+    @NonNull
+    public String getValue() {
+        return value == null ? "" : value;
+    }
+
+    public void setValue(@NonNull String value) {
+        this.value = value;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkUploadOidBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkUploadOidBean.java
new file mode 100644
index 0000000..4ab629e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkUploadOidBean.java
@@ -0,0 +1,95 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+public class LinkUploadOidBean implements Serializable{
+
+    private String oid;//oid
+    private String device_name;//妯″潡鍚嶅瓧
+    private String device_mac;//妯″潡Mac鍦板潃銆乑igBee鐨凞eviceAddr
+    private String device_model;//ZigBee鐨凪odelIdentifier
+    private String addresses;//
+    private String driver_code;//
+    private String hw_version;//纭欢鐗堟湰
+    private String fw_version;
+
+    @NonNull
+    public String getOid() {
+        return oid == null ? "" : oid;
+    }
+
+    public void setOid(@NonNull String oid) {
+        this.oid = oid;
+    }
+
+    @NonNull
+    public String getDevice_name() {
+        return device_name == null ? "" : device_name;
+    }
+
+    public void setDevice_name(@NonNull String device_name) {
+        this.device_name = device_name;
+    }
+
+    @NonNull
+    public String getDevice_mac() {
+        return device_mac == null ? "" : device_mac;
+    }
+
+    public void setDevice_mac(@NonNull String device_mac) {
+        this.device_mac = device_mac;
+    }
+
+    @NonNull
+    public String getDevice_model() {
+        return device_model == null ? "" : device_model;
+    }
+
+    public void setDevice_model(@NonNull String device_model) {
+        this.device_model = device_model;
+    }
+
+    @NonNull
+    public String getAddresses() {
+        return addresses == null ? "" : addresses;
+    }
+
+    public void setAddresses(@NonNull String addresses) {
+        this.addresses = addresses;
+    }
+
+    @NonNull
+    public String getDriver_code() {
+        return driver_code == null ? "" : driver_code;
+    }
+
+    public void setDriver_code(@NonNull String driver_code) {
+        this.driver_code = driver_code;
+    }
+
+    @NonNull
+    public String getHw_version() {
+        return hw_version == null ? "" : hw_version;
+    }
+
+    public void setHw_version(@NonNull String hw_version) {
+        this.hw_version = hw_version;
+    }
+
+    @NonNull
+    public String getFw_version() {
+        return fw_version == null ? "" : fw_version;
+    }
+
+    public void setFw_version(@NonNull String fw_version) {
+        this.fw_version = fw_version;
+    }
+
+
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/NoticeConfigInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/NoticeConfigInfo.java
new file mode 100644
index 0000000..8381b75
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/NoticeConfigInfo.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/7/29
+ * description:
+ */
+public class NoticeConfigInfo implements Serializable {
+    private boolean enable;
+    private String noticeContent;
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(@NonNull boolean enable) {
+        this.enable = enable;
+    }
+
+    public String getNoticeContent() {
+        return noticeContent == null ? "" : noticeContent;
+    }
+
+    public void setNoticeContent(@NonNull String noticeContent) {
+        this.noticeContent = noticeContent;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/IHDLClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/IHDLClient.java
new file mode 100644
index 0000000..2ba494a
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/IHDLClient.java
@@ -0,0 +1,52 @@
+package com.hdl.sdk.link.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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
new file mode 100644
index 0000000..e87278f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
@@ -0,0 +1,312 @@
+package com.hdl.sdk.link.common.config;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class TopicConstant {
+
+
+    /*
+     *閫氱煡鍒犻櫎骞堕��缃戝瓙璁惧鎷撴墤鍏崇郴
+     *鍒犻櫎浠庣綉鍏�
+     * */
+    public static final String DELETING_GATEWAY_SLAVE="/base/%s/thing/topo/delete/notify";
+
+    /*
+     *缃戝叧鐗╃悊閫�缃戝悗涓婃姤鍒犻櫎(閫�缃�)瀛愯澶�
+     * */
+    public static final String DELETING_GATEWAY_SLAVE_RESULT="/base/%s/thing/topo/delete/up";
+
+
+
+    /*
+    缃戝叧鏁版嵁澶囦唤杩樺師
+     * */
+    public static final String GATEWAY_BACKUP_RESTORE_DOWN = "/base/%s/device/backup/restore/down";
+
+    /*
+   璋冭瘯浜哄憳涓诲姩閫氱煡缃戝叧澶囦唤鏁版嵁
+    * */
+    public static final String GATEWAY_BACKUP_NOTICE_DOWN = "/base/%s/device/backup/notice/down";
+    /*
+   澶囦唤杩樺師杩涘害鑾峰彇
+    * */
+    public static final String GATEWAY_BACKUP_PROGRESS_GET = "/base/%s/device/backup/restore/progress/get";
+
+    /*
+    * 缃戝叧缂栬緫鍛戒护
+    * 鍐欒繙绋嬩俊鎭殑锛屼緥濡傛湇鍔″櫒鍦板潃銆丠omeId銆佸瘑閽ヤ箣绫�
+    * 涓庢湇鍔″櫒鐩稿叧鐨�
+    * */
+    public static final String GATEWAY_EDIT_REMOTE = "/user/%s/custom/gateway/remote/edit";
+
+    /*
+     * 缃戝叧鎭㈠鍑哄満璁剧疆鍛戒护
+     * */
+    public static final String GATEWAY_INITIALIZE_REMOTE = "/user/%s/custom/gateway/initialize";
+    public static final String GATEWAY_FIND_REMOTE = "/base/%s/thing/service/mmv_device_find/down";
+
+    /**
+     * 绾㈠瀹濈殑瀹氫綅
+     */
+    public static final String IR_FIND_REMOTE = "/base/%s/thing/service/irDeviceFind/down";
+    /**
+     * 绾㈠瀹濊瘯鐮�
+     */
+    public static final String IR_CODE_TEST = "/base/%s/thing/service/irCodeTest/down";
+    /**
+     * 绾㈠瀹濋仴鎺у櫒娣诲姞
+     */
+    public static final String IR_DEVICE_ADD = "/base/%s/thing/service/irDeviceAdd/down";
+    /**
+     * 绾㈠瀹濋仴鎺у櫒鍒楄〃鑾峰彇
+     */
+    public static final String IR_DEVICE_LIST = "/base/%s/thing/service/irDeviceListGet/down";
+    /**
+     * 绾㈠瀹濊嚜瀛︾爜
+     * */
+    public static final String IR_CODE_STUDY = "/base/%s/thing/service/irCodeStudy/down";
+    /**
+     * 绾㈠瀹濊嚜瀛︾爜鍒犻櫎
+     * */
+    public static final String IR_CODE_REMOVE = "/base/%s/thing/service/irCodeRemove/down";
+
+
+    /*
+    * 缃戝叧缂栬緫鍛戒护
+    * 涓庢湇鍔″櫒鏃犲叧鐨�
+    * */
+    public static final String GATEWAY_EDIT_LOCAL = "/user/%s/custom/gateway/edit";
+
+    /**
+     * 璁剧疆缃戝叧鍏ョ綉妯″紡
+     * 鍏ョ綉浠庢満璁惧浣跨敤
+     * 浠庣綉鍏炽�佺孩澶栧疂绛夌綉缁滆澶�
+     */
+    public static final String GATEWAY_AUTH  = "/user/%s/custom/device/auth_gateway";
+    //鑾峰彇缃戝叧淇℃伅
+    public static final String GATEWAY_GET = "/user/%s/custom/gateway/remote/get";
+
+    //缃戝叧骞挎挱鍏ョ綉鎸囦护
+    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 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";
+
+    //妯℃嫙浜戠ota
+    public static final String OTA_UPGRADE_DOWN = "/base/%s/ota/device/upgrade/down";
+
+    /**
+     * 缂栬緫sid
+     */
+    public static final String EDIT_FUNCTION = "/user/%s/custom/function/attribute/edit";
+
+    //鑾峰彇鍔熻兘鍝嶅簲
+    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 EDIT_FUNCTION_ATTRIBUTE = "/user/%s/custom/function/attribute/edit";
+
+    //鍔熻兘灞炴�у搷搴�
+    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";
+
+    //鏇存敼缃戝叧澶囨敞鍚�
+    public static final String GATEWAY_RENAME = "/user/%s/custom/gateway/edit";
+
+    //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 CREATE_SCENE = "/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";
+
+    //9.1 鎴块棿淇℃伅鍒楄〃鑾峰彇
+    public static final String ROOM_LIST_GET = "/user/%s/custom/room/list/get";
+
+    //9.2 鎴块棿淇℃伅娣诲姞锛堝閲忥級
+    public static final String ROOM_ADD = "/user/%s/custom/room/add";
+
+    //9.2.1 鎴块棿淇℃伅娣诲姞锛堝叏閲忥級
+    public static final String ROOM_COVER_ADD = "/user/%s/custom/room/cover/add";
+
+    //9.3 鎴块棿淇℃伅缂栬緫
+    public static final String ROOM_EDIT = "/user/%s/custom/room/edit";
+
+    //9.4 鎴块棿淇℃伅鍒犻櫎
+    public static final String ROOM_DELETE = "/user/%s/custom/room/delete";
+
+    //9.5 鎴块棿缁戝畾鍏崇郴鍒楄〃鑾峰彇
+    public static final String ROOM_BIND_LIST_GET = "/user/%s/custom/room/bind/list/get";
+
+    //9.6 鎴块棿缁戝畾鍏崇郴娣诲姞锛堝閲忥級
+    public static final String ROOM_BIND_ADD = "/user/%s/custom/room/bind/add";
+
+    //9.6.1 鎴块棿缁戝畾鍏崇郴娣诲姞(鍏ㄩ噺)
+    public static final String ROOM_BIND_COVER_ADD = "/user/%s/custom/room/bind/cover/add";
+
+    //9.7 鎴块棿缁戝畾鍏崇郴鍒犻櫎
+    public static final String ROOM_BIND_DELETE = "/user/%s/custom/room/bind/delete";
+
+    //10.1 鑷姩鍖栧垪琛ㄨ幏鍙�
+    public static final String LOGIC_LIST_GET = "/user/%s/custom/logic/list/get";
+
+    //10.2 鑷姩鍖栨墜鍔ㄦ墽琛�
+    public static final String LOGIC_execute = "/user/%s/custom/logic/execute";
+
+    //10.3 鑷姩鍖栬幏鍙� 鍒楄〃涓�娆℃�ц鍏�
+    public static final String LOGIC_GET = "/user/%s/custom/logic/get";
+
+    //10.4 鑷姩鍖栨柊澧�/缂栬緫
+    public static final String LOGIC_EDIT = "/user/%s/custom/logic/edit";
+
+    //10.5 鑷姩鍖栧垹闄�
+    public static final String LOGIC_DELETE = "/user/%s/custom/logic/delete";
+
+    //10.6 鑷姩鍖栧惎鐢ㄧ鐢�
+    public static final String LOGIC_ENABLE_EDIT = "/user/%s/custom/logic/enable/edit";
+
+    //10.7 鑷姩鍖栫姸鎬佷笂鎶� 鎵ц缁撴灉銆佹湰鍦板惎鐢ㄧ鐢ㄧ姸鎬佷笂鎶�
+    public static final String LOGIC_STATUS_UP = "/user/%s/custom/logic/status/up";
+
+    //11.1 瀹夐槻鍒楄〃鑾峰彇
+    public static final String SECURITY_LIST_GET = "/user/%s/custom/security/list/get";
+
+    //11.2 瀹夐槻鑾峰彇
+    public static final String SECURITY_GET = "/user/%s/custom/security/get";
+
+    //11.3 瀹夐槻鏂板/缂栬緫
+    public static final String SECURITY_EDIT= "/user/%s/custom/security/edit";
+
+    //11.4 瀹夐槻鍒犻櫎
+    public static final String SECURITY_DELETE = "/user/%s/custom/security/delete";
+
+    //11.5 甯冮槻璁剧疆
+    public static final String SECURITY_STATUS_SET = "/user/%s/custom/security/status/set";
+
+    //11.6 瀹夐槻闃插尯鐘舵�佽鍙�
+    public static final String SECURITY_STATUS_GET = "/user/%s/custom/security/status/get";
+
+    //11.7 瀹夐槻闃插尯鎶ヨ鐘舵�佷笂鎶�
+    public static final String SECURITY_STATUS_UP = "/user/%s/custom/security/status/up";
+
+    //11.8 瀹夐槻Bypass璇诲彇
+    public static final String SECURITY_BYPASS_GET = "/user/%s/custom/security/bypass/get";
+
+    //11.9 瀹夐槻Bypass璁剧疆
+    public static final String SECURITY_BYPASS_SET = "/user/%s/custom/security/bypass/set";
+
+    /**
+     * 璁惧杩炴帴TCP涔嬪墠骞挎挱
+     */
+    public static final String BROADCAST="/user/all/custom/gateway/broadcast";
+
+    /**
+     * 涓荤綉鍏冲洖澶�
+     */
+    public static final String BROADCAST_REPLY="/user/all/custom/gateway/broadcast_reply";
+
+    /**
+     * sid缁戝畾鎴块棿
+     */
+    public static final String SID_BIND_ROOM = "/user/%s/custom/room/bind/add";
+
+    /**
+     * sid瑙g粦鎴块棿
+     */
+    public static final String SID_DELETE_ROOM = "/user/%s/custom/room/bind/delete";
+
+    /**
+     * 蹇冭烦妫�娴�
+     */
+    public static final String HEARTBEAT="/user/%s/custom/gateway/heartbeat";
+//    public static final String HEARTBEAT="/user/%s/custom/gateway1/qqheartbeat";
+    /**
+     * 蹇冭烦妫�娴嬪洖澶�
+     */
+    public static final String HEARTBEAT_REPLY="/user/%s/custom/gateway/heartbeat_reply";
+
+    public static final String NATIVE_ZIGBEE_DOWN ="/user/%s/custom/native/zigbee/down";
+
+    public static final String NATIVE_ZIGBEE_DOWN_REPLY ="/user/%s/custom/native/zigbee/down_reply";
+
+    public static final String NATIVE_ZIGBEE_UP ="/user/%s/custom/native/zigbee/up";
+
+    public static final String NATIVE_ZIGBEE_DOWN_SLAVE ="/user/%s/custom/native/zigbee/down/slaveoid/%s";
+
+    public static final String NATIVE_ZIGBEE_DOWN_SLAVE_REPLY ="/user/%s/custom/native/zigbee/down_reply/slaveoid/%s";
+
+    public static final String NATIVE_ZIGBEE_UP_SLAVE ="/user/%s/custom/native/zigbee/up/slaveoid/%s";
+
+    public static final String NATIVE_LINK_DOWN ="/user/%s/custom/native/a/down";
+
+    public static final String NATIVE_LINK_DOWN_REPLY ="/user/%s/custom/native/a/down_reply";
+
+    public static final String NATIVE_LINK_UP ="/user/%s/custom/native/a/up";
+
+    public static final String NATIVE_LINK_DOWN_SLAVE ="/user/%s/custom/native/a/down/slaveoid/%s";
+
+    public static final String NATIVE_LINK_DOWN_SLAVE_REPLY ="/user/%s/custom/native/a/down_reply/slaveoid/%s";
+
+    public static final String NATIVE_LINK_UP_SLAVE ="/user/%s/custom/native/a/up/slaveoid/%s";
+
+    public static final String GATEWAY_LOCATION_EDIT ="/user/%s/custom/gateway/location/edit";
+
+    public static final String GATEWAY_LOCATION_GET ="/user/%s/custom/gateway/location/get";
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java
new file mode 100644
index 0000000..37f8b50
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java
@@ -0,0 +1,239 @@
+package com.hdl.sdk.link.common.event;
+
+import androidx.annotation.NonNull;
+import androidx.collection.ArrayMap;
+
+
+import com.hdl.sdk.link.common.utils.LockArrayMap;
+import com.hdl.sdk.link.common.utils.LockList;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 浜嬩欢鍒嗗彂
+ */
+public class EventDispatcher {
+
+    private static final LockList<EventListener> ALL_TOPICS_EVENT = new LockList<EventListener>();//鎵�鏈変富棰樻秷鎭�
+
+//    private static final ArrayMap<String, List<EventListener>> EVENT = new ArrayMap<>();
+    private static final LockArrayMap<String, List<EventListener>> EVENT = new LockArrayMap<String, List<EventListener>>();
+
+    private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(2);
+
+    private EventDispatcher() {
+    }
+
+    private static class SingletonInstance {
+        private static final EventDispatcher INSTANCE = new EventDispatcher();
+    }
+
+    public static EventDispatcher getInstance() {
+        return SingletonInstance.INSTANCE;
+    }
+
+    public synchronized void register(String tag, EventListener listener) {
+        try {
+            if (!EVENT.containsKey(tag)) {
+                EVENT.put(tag, new ArrayList<>());
+            }
+            List<EventListener> events = EVENT.get(tag);
+            if (events != null && !events.contains(listener)) {
+                events.add(listener);
+                LogUtils.i(String.format("澧炲姞璁㈤槄涓婚:%s,褰撳墠鍥炶皟鏁伴噺:%s", tag, events.size()));
+            }
+        } catch (Exception e) {
+            LogUtils.e(e.getMessage());
+        }
+    }
+
+    public synchronized void registerIo(String tag, EventListener listener) {
+        try {
+            if (!EVENT.containsKey(tag)) {
+                EVENT.put(tag, new ArrayList<>());
+            }
+            List<EventListener> events = EVENT.get(tag);
+            if (events != null && !events.contains(listener)) {
+                events.add(listener);
+            }
+        } catch (Exception e) {
+            LogUtils.e(e.getMessage());
+        }
+    }
+
+    public synchronized void remove(Object tag) {
+        ioThread.execute(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if (EVENT.containsKey(tag)) {
+//                        List<EventListener> list = EVENT.get(tag);
+//                        for (EventListener eventListener : list) {
+//                            TYPE.remove(eventListener);
+//                        }
+                        EVENT.remove(tag);
+                    }
+                } catch (Exception e) {
+                    LogUtils.e(e.getMessage());
+                }
+
+            }
+        });
+    }
+
+    public synchronized void remove(Object tag, EventListener listener) {
+        ioThread.execute(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if (EVENT.containsKey(tag)) {
+                        List<EventListener> ev = EVENT.get(tag);
+                        if (ev != null && !ev.isEmpty()) {
+//                            TYPE.remove(listener);
+                            ev.remove(listener);
+                            LogUtils.i(String.format("绉婚櫎璁㈤槄涓婚:%s,褰撳墠鍥炶皟鏁伴噺:%s",tag,ev.size()));
+                        }
+                    }
+                } catch (Exception e) {
+                    LogUtils.e(e.getMessage());
+                }
+
+            }
+        });
+    }
+
+    /**
+     * 涓や釜涓婚鏄惁鍖归厤
+     * @param desString 瀛楀吀涓殑涓婚
+     * @param sourceString 鎺ユ敹鍒扮殑涓婚
+     * @return
+     */
+    boolean isMatch(String desString,String sourceString) {
+        String[] des = desString.split("/");
+        String[] source = sourceString.split("/");
+        if (des.length != source.length) {
+            return false;
+        }
+        for (int i = 0; i < des.length; i++) {
+            if (!(des[i].equals(source[i]) || des[i].equals("+"))) {
+                if (i != 2) {
+                    //缃戝叧id涓嶅垽鏂紝鍙兘鏄疧id,涔熷彲鑳芥槸mac
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 浜嬩欢鍒嗗彂鍣紝鍒嗗彂鎵�鏈夊湪鎺ュ彛鍒楄〃涓殑浜嬩欢
+     * @param topicTag
+     * @param o
+     */
+    public synchronized void post(String topicTag, @NonNull Object o) {
+        try {
+            for (String key : EVENT.keySet()) {
+                if (!isMatch(key, topicTag)) {
+                    continue;
+                }
+                List<EventListener> list = EVENT.get(key);
+                if (list != null && !list.isEmpty()) {
+                    for (EventListener listener : list) {
+                        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                try {
+                                    if (listener != null) {
+                                        listener.onMessage(o);
+                                    }
+                                } catch (Exception e) {
+                                    LogUtils.e("post鏁版嵁寮傚父", o + " " + e.getMessage());
+                                }
+                            }
+                        });
+                    }
+                }
+            }
+            //鎵�鏈変富棰樼殑Listener閫氱煡
+            if (ALL_TOPICS_EVENT == null || ALL_TOPICS_EVENT.isEmpty()) {
+                return;
+            }
+            //寮�鍙戝垎鍙戜簨浠�
+            for (EventListener listener : ALL_TOPICS_EVENT) {
+                ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (listener != null) {
+                            listener.onMessage(o);
+                        }
+                    }
+                });
+            }
+        }catch (Exception e){
+            LogUtils.e(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 鏂囦欢鍙戦�侀�氱煡 wxr 2022-03-08 15:38:59
+     */
+    public synchronized void filePost() {
+        //TODO
+    }
+    /**
+     * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     * @param listener
+     */
+    public synchronized void registerAllTopicsListener(EventListener listener) {
+        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(e.getMessage());
+        }
+    }
+
+    /**
+     * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     * @param listener
+     */
+    public synchronized void removeAllTopicsListener(EventListener listener) {
+        ioThread.execute(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
+//                        TYPE.remove(listener);
+                        ALL_TOPICS_EVENT.remove(listener);
+                    }
+                } catch (Exception e) {
+                    LogUtils.e(e.getMessage());
+                }
+            }
+        });
+    }
+
+    public synchronized void clear() {
+        ALL_TOPICS_EVENT.clear();
+        EVENT.clear();
+//        TYPE.clear();
+    }
+
+    public synchronized void release() {
+        clear();
+        ioThread.shutdownNow();
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventListener.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventListener.java
new file mode 100644
index 0000000..e2b3cdf
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventListener.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.link.common.event;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface EventListener {
+
+    void onMessage(Object msg);
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java
new file mode 100644
index 0000000..a041d71
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java
@@ -0,0 +1,64 @@
+package com.hdl.sdk.link.common.exception;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.R;
+
+import java.util.HashMap;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : HDLError
+ */
+public class HDLLinkCode {
+    public static final HDLLinkCode HDL_UNKOWN_CODE=new HDLLinkCode(-1000,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNKOWN_CODE));
+    public static final HDLLinkCode HDL_DATA_ERROR =new HDLLinkCode(-2000, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_ERROR)) ;
+    public static final HDLLinkCode HDL_DATA_NULL_ERROR=new HDLLinkCode(-2001, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_NULL_ERROR));
+    public static final HDLLinkCode HDL_AUTH_ERROR=new HDLLinkCode(2002,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR) );
+    public static final HDLLinkCode HDL_SEND_ERROR=new HDLLinkCode(2003, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEND_ERROR));
+    public static final HDLLinkCode HDL_TIMEOUT_ERROR=new HDLLinkCode(2004, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TIMEOUT_ERROR));
+    public static final HDLLinkCode HDL_UNAUTHORIZED_ERROR=new HDLLinkCode(-2005,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNAUTHORIZED_ERROR));
+    public static final HDLLinkCode HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED=new HDLLinkCode(-2006, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED));
+    public static final HDLLinkCode HDL_SEARCH_GATEWAY_TIMEOUT_ERROR=new HDLLinkCode(-2007, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEARCH_GATEWAY_TIMEOUT_ERROR));
+    public static final HDLLinkCode HDL_AUTH_MAC_KEY_ERROR=new HDLLinkCode(-2008, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_MAC_KEY_ERROR));
+    public static final HDLLinkCode HDL_DATA_PARSING_ERROR=new HDLLinkCode(-2009, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_PARSING_ERROR));
+    public static final HDLLinkCode HDL_GET_DEVICE_LIST_ERROR=new HDLLinkCode(-2100, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_DEVICE_LIST_ERROR));
+    public static final HDLLinkCode HDL_GET_FUNCTION_LIST_ERROR=new HDLLinkCode(-2101, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_LIST_ERROR));
+    public static final HDLLinkCode HDL_GET_FUNCTION_PROPERTIES_ERROR=new HDLLinkCode(-2102, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_PROPERTIES_ERROR));
+    public static final HDLLinkCode HDL_CONTROL_FAILURE_ERROR=new HDLLinkCode(-2103, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_CONTROL_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GET_GATEWAY_FAILURE_ERROR=new HDLLinkCode(-2104, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_GATEWAY_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GET_Zigbee_FAILURE_ERROR=new HDLLinkCode(-2105, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GATEWAY_NOT_EXIST=new HDLLinkCode(-2106,HDLLinkLocalSdk.getInstance().getContext().getString( R.string.HDL_GATEWAY_NOT_EXIST));
+    public static final HDLLinkCode HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR=new HDLLinkCode(-2107, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_MILLIMETER_NOT_EXIST=new HDLLinkCode(-2108, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_MILLIMETER_NOT_EXIST));
+    public static final HDLLinkCode HDL_APPLICATION_CODE=new HDLLinkCode(-2109,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_APPLICATION_EXCEPTION));
+    public static final HDLLinkCode HDL_TOPIC_NOT_RIGHT=new HDLLinkCode(-2110,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TOPIC_NOT_RIGHT));
+    public static final HDLLinkCode HDL_OBJECT_NOT_SUPPORT=new HDLLinkCode(-2111,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_OBJECT_NOT_SUPPORT));
+    public static final HDLLinkCode HDL_GATEWAY_REMOTE_NOT_RESPONSE=new HDLLinkCode(-2112,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GATEWAY_REMOTE_NOT_RESPONSE));
+
+    private String msg;
+    private int code;
+
+    public 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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkException.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkException.java
new file mode 100644
index 0000000..040ff3b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkException.java
@@ -0,0 +1,67 @@
+package com.hdl.sdk.link.common.exception;
+
+import androidx.annotation.NonNull;
+
+/**
+ * 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 @NonNull
+    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());
+    }
+
+    public static HDLLinkException getErrorWithCode(int code,String msg){
+        return new HDLLinkException(code,msg);
+    }
+}
+
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java
new file mode 100644
index 0000000..e4f6a9d
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java
@@ -0,0 +1,243 @@
+package com.hdl.sdk.link.common.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * 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;
+
+    }
+
+    public static byte[] copyBytes(byte bytes[], int index, int length) {
+        byte[] result = new byte[length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = bytes[index + 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[]{};
+    }
+
+    public static String byte2hex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        String tmp = null;
+        for (byte b : bytes) {
+            //灏嗘瘡涓瓧鑺備笌0xFF杩涜涓庤繍绠楋紝鐒跺悗杞寲涓�10杩涘埗锛岀劧鍚庡�熷姪浜嶪nteger鍐嶈浆鍖栦负16杩涘埗
+            tmp = Integer.toHexString(0xFF & b);
+            if (tmp.length() == 1) {
+                tmp = "0" + tmp;
+            }
+            sb.append(tmp + " ");
+        }
+        return sb.toString();
+    }
+
+
+    public static int bytes2int(byte[] bytes) {
+        return bytes[3] & 0xFF | //
+                (bytes[2] & 0xFF) << 8 | //
+                (bytes[1] & 0xFF) << 16 | //
+                (bytes[0] & 0xFF) << 24; //
+    }
+
+
+    public static byte[] intToByteArray(int i) {
+        byte[] result = new byte[4];
+        result[0] = (byte) ((i >> 24) & 0xFF);
+        result[1] = (byte) ((i >> 16) & 0xFF);
+        result[2] = (byte) ((i >> 8) & 0xFF);
+        result[3] = (byte) (i & 0xFF);
+        return result;
+    }
+
+    public static int byteArrayToInt(byte[] b) {
+        int i = (b[0] & 0xFF) * 256 * 256 * 256 + (b[1] & 0xFF) * 256 * 256 + (b[2] & 0xFF) * 256 + (b[3] & 0xFF);
+        return i;
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param contentByte 寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param contentByte 瀵嗛挜
+     * @return
+     */
+    public static byte[] decrypt(byte[] contentByte) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec("HDLRDCENTER1985.".getBytes(), "AES");
+            //瑙e瘑
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            IvParameterSpec ivps = new IvParameterSpec("HDLRDCENTER1985.".getBytes());
+            cipher.init(Cipher.DECRYPT_MODE, key, ivps);
+            byte[] result = cipher.doFinal(contentByte);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ErrorUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ErrorUtils.java
new file mode 100644
index 0000000..52bc4cd
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ErrorUtils.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.link.common.utils;
+
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.R;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+
+import java.util.HashMap;
+
+/**
+ * Created by hxb on 2023/4/22.
+ */
+public class ErrorUtils {
+    //閿�:code 鍊硷細涓嫳鏂囨弿杩�
+    public static final HashMap<String, String> errorsMap = new HashMap<>();
+
+
+
+    /**
+     * 閫氳繃鐘舵�佺爜鑾峰彇寮傚父瀵硅薄
+     * @param code 鐘舵�佺爜
+     * @return 寮傚父瀵硅薄
+     */
+    public static HDLLinkCode getByCode(int code) {
+        String msg = errorsMap.get(code + "");
+        if (msg == null) {
+            msg = "unkown";
+        }
+        return new HDLLinkCode(code, msg);
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IdUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IdUtils.java
new file mode 100644
index 0000000..2b8e659
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IdUtils.java
@@ -0,0 +1,20 @@
+package com.hdl.sdk.link.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("-", "");
+    }
+
+    /**
+     * Uid 鍒楄〃鍒涘缓浣跨敤
+     * @return
+     */
+    public static String getUUIdWithBar() {
+        return UUID.randomUUID().toString();
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IpUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IpUtils.java
new file mode 100644
index 0000000..aadb63e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/IpUtils.java
@@ -0,0 +1,89 @@
+package com.hdl.sdk.link.common.utils;
+
+import android.content.Context;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+
+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";
+    }
+
+    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);
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockArrayMap.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockArrayMap.java
new file mode 100644
index 0000000..aa75a6e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockArrayMap.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.common.utils;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.collection.ArrayMap;
+
+/**
+ * Created by hxb on 2022/10/17.
+ */
+public class LockArrayMap<K,V> extends ArrayMap<K, V> {
+    @Nullable
+    @Override
+    public V put(K key, V value) {
+        synchronized (this) {
+            return super.put(key, value);
+        }
+    }
+
+    @Override
+    public boolean remove(Object key, Object value) {
+        synchronized (this) {
+            return super.remove(key, value);
+        }
+    }
+
+    @Override
+    public boolean containsKey(@Nullable Object key) {
+        synchronized (this) {
+            return super.containsKey(key);
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockList.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockList.java
new file mode 100644
index 0000000..715d63d
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LockList.java
@@ -0,0 +1,37 @@
+package com.hdl.sdk.link.common.utils;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.collection.ArrayMap;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Created by hxb on 2022/10/17.
+ */
+public class LockList<T> extends ArrayList<T> {
+
+    @Override
+    public boolean add(T t) {
+        synchronized (this) {
+            return super.add(t);
+        }
+    }
+
+    @Override
+    public T remove(int index) {
+        synchronized (this) {
+            return super.remove(index);
+        }
+    }
+
+    @Override
+    public boolean contains(@Nullable Object o) {
+        synchronized (this) {
+            return super.contains(o);
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LogUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LogUtils.java
new file mode 100644
index 0000000..1228aad
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/LogUtils.java
@@ -0,0 +1,63 @@
+package com.hdl.sdk.link.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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/SPUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/SPUtils.java
new file mode 100644
index 0000000..f5b8810
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/SPUtils.java
@@ -0,0 +1,154 @@
+package com.hdl.sdk.link.common.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import androidx.annotation.NonNull;
+
+
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+
+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 SharedPreferences PREFERENCES =
+            HDLLinkLocalSdk.getInstance().getContext().getApplicationContext().getSharedPreferences(APP_PREFERENCES_KEY, Context.MODE_PRIVATE);
+
+    private static SharedPreferences getAppPreference() {
+        if (PREFERENCES == null) {
+            PREFERENCES = HDLLinkLocalSdk.getInstance().getContext().getApplicationContext().getSharedPreferences(APP_PREFERENCES_KEY, Context.MODE_PRIVATE);
+        }
+        return PREFERENCES;
+    }
+
+
+    //======閫氱敤瀛樺偍========
+    public static void put(@NonNull final String key, final String value) {
+        getAppPreference().edit().putString(key, value).apply();
+    }
+
+
+    public static String getString(@NonNull final String key) {
+        return getString(key, "");
+    }
+
+
+    public static String getString(@NonNull final String key, final String defaultValue) {
+        return getAppPreference().getString(key, defaultValue);
+    }
+
+
+    public static void put(@NonNull final String key, final int value) {
+        put(key, value, false);
+    }
+
+
+    public static void put(@NonNull final String key, final int value, final boolean isCommit) {
+        getAppPreference().edit().putInt(key, value).apply();
+    }
+
+
+    public static int getInt(@NonNull final String key) {
+        return getInt(key, -1);
+    }
+
+
+    public static int getInt(@NonNull final String key, final int defaultValue) {
+        return getAppPreference().getInt(key, defaultValue);
+    }
+
+
+    public static void put(@NonNull final String key, final long value) {
+        getAppPreference().edit().putLong(key, value).apply();
+    }
+
+
+    public static long getLong(@NonNull final String key) {
+        return getLong(key, -1L);
+    }
+
+
+    public static long getLong(@NonNull final String key, final long defaultValue) {
+        return getAppPreference().getLong(key, defaultValue);
+    }
+
+
+    public static void put(@NonNull final String key, final float value) {
+        getAppPreference().edit().putFloat(key, value).apply();
+    }
+
+
+    public static float getFloat(@NonNull final String key) {
+        return getFloat(key, -1f);
+    }
+
+
+    public static float getFloat(@NonNull final String key, final float defaultValue) {
+        return getAppPreference().getFloat(key, defaultValue);
+    }
+
+
+    public static void put(@NonNull final String key, final boolean value) {
+        getAppPreference().edit().putBoolean(key, value).apply();
+    }
+
+
+    public static boolean getBoolean(@NonNull final String key) {
+        return getBoolean(key, false);
+    }
+
+
+    public static boolean getBoolean(@NonNull final String key, final boolean defaultValue) {
+        return getAppPreference().getBoolean(key, defaultValue);
+    }
+
+
+    public static void put(@NonNull final String key,
+                           final Set<String> value
+    ) {
+
+        getAppPreference().edit().putStringSet(key, value).apply();
+
+    }
+
+
+    public static Set<String> getStringSet(@NonNull final String key) {
+        return getStringSet(key, Collections.<String>emptySet());
+    }
+
+
+    public static Set<String> getStringSet(@NonNull final String key,
+                                           final Set<String> defaultValue) {
+        return getAppPreference().getStringSet(key, defaultValue);
+    }
+
+
+    public static Map<String, ?> getAll() {
+        return getAppPreference().getAll();
+    }
+
+
+    public static boolean contains(@NonNull final String key) {
+        return getAppPreference().contains(key);
+    }
+
+
+    public static void remove(@NonNull final String key) {
+        getAppPreference().edit().remove(key).apply();
+    }
+
+    public static void clear() {
+        getAppPreference()
+                .edit()
+                .clear()
+                .apply();
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ThreadToolUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ThreadToolUtils.java
new file mode 100644
index 0000000..5110598
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ThreadToolUtils.java
@@ -0,0 +1,72 @@
+package com.hdl.sdk.link.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 SingletonInstance.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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/GsonConvert.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/GsonConvert.java
new file mode 100644
index 0000000..4ba481b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/GsonConvert.java
@@ -0,0 +1,59 @@
+package com.hdl.sdk.link.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;
+    }
+
+    public static <T> T copyProperties(Object o, Type type) {
+        return getGson().fromJson(getGson().toJson(o), type);
+    }
+
+    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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/ParameterizedTypeImpl.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/ParameterizedTypeImpl.java
new file mode 100644
index 0000000..642c191
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/gson/ParameterizedTypeImpl.java
@@ -0,0 +1,46 @@
+package com.hdl.sdk.link.common.utils.gson;
+
+
+import androidx.annotation.NonNull;
+
+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);
+    }
+
+    @NonNull
+    @Override
+    public Type[] getActualTypeArguments() {
+        return actualTypeArguments;
+    }
+
+
+    @NonNull
+    @Override
+    public Type getRawType() {
+        return rawType;
+    }
+
+
+    @Override
+    public Type getOwnerType() {
+        return ownerType;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/FileRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/FileRequest.java
new file mode 100644
index 0000000..03e7995
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/FileRequest.java
@@ -0,0 +1,44 @@
+package com.hdl.sdk.link.core.bean;
+
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class FileRequest extends LinkRequest {
+
+    private String fileId;
+    private Integer command;
+    private byte []fileData;
+
+//    private static int info_number;
+    public FileRequest(String topic, String data, boolean encrypt) {
+        super(topic, data, encrypt);
+    }
+
+
+    public FileRequest(String fileId, Integer command, byte []fileData,boolean encrypt) {
+        this.fileId = fileId;
+        this.command = command;
+        this.fileData = fileData;
+//        super.setEncrypt(encrypt);
+        super.setEncrypt(false);
+//        info_number++;
+//        byte[] headBytes = ("hex" + info_number).getBytes();
+//        byte[] sendDataBytes = ByteUtils.concatBytes(headBytes, fileData);
+        super.setData(fileData);
+    }
+
+    @Override
+    public byte [] getSendBytes() {
+        return getData();
+    }
+
+    public String getTopic() {
+        return fileId + "_" + command;
+    }
+
+    public String getAckTopic() {
+        return fileId + "_" + ++command;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkPacket.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkPacket.java
new file mode 100644
index 0000000..088f82f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkPacket.java
@@ -0,0 +1,52 @@
+package com.hdl.sdk.link.core.bean;
+
+/**
+ * Created by hxb on 2022/8/4.
+ */
+public class LinkPacket {
+    /**
+     * 涓婚鍐呭
+     */
+    private String topic;
+    /**
+     * 鍘熷鎺ユ敹鐨勬暟鎹紝鍙兘闇�瑕佽В瀵�
+     */
+    private byte []body;
+
+    private boolean cloudPacket;
+
+    public LinkPacket(String topic, byte[] body) {
+        this(topic,body,false);
+    }
+
+    public LinkPacket(String topic, byte[] body,boolean cloudPacket) {
+        this.topic = topic;
+        this.body = body;
+        this.cloudPacket=cloudPacket;
+    }
+
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public byte[] getBody() {
+        return body;
+    }
+
+    public void setBody(byte[] body) {
+        this.body = body;
+    }
+
+    public boolean isCloudPacket() {
+        return cloudPacket;
+    }
+
+    public void setCloudPacket(boolean cloudPacket) {
+        this.cloudPacket = cloudPacket;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java
new file mode 100644
index 0000000..2f8e8d7
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java
@@ -0,0 +1,150 @@
+package com.hdl.sdk.link.core.bean;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.utils.ByteUtils;
+
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class LinkRequest {
+    private String topic;
+    private String replyTopic;
+    protected byte []data;
+    private int length=0;
+
+    private boolean encrypt;
+
+    public String getCloudTopic() {
+        if(TextUtils.isEmpty(cloudTopic)){
+            return topic;
+        }
+        return cloudTopic;
+    }
+
+    /**
+     * 骞冲彴topic
+     * @param cloudTopic
+     */
+    public void setCloudTopic(String cloudTopic) {
+        this.cloudTopic = cloudTopic;
+    }
+
+    private String cloudTopic;
+
+
+    public LinkRequest(String topic,String replyTopic, String data, boolean encrypt) {
+        this.topic = topic;
+        this.replyTopic=replyTopic;
+        setData(data);
+        this.encrypt = encrypt;
+    }
+
+    public LinkRequest(String topic, String data, boolean encrypt) {
+        this(topic,null,data,encrypt);
+    }
+    public LinkRequest(String topic, byte []data, boolean encrypt) {
+        this.topic = topic;
+        setData(data);
+        this.encrypt = encrypt;
+    }
+
+    protected LinkRequest(){}
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        if (!TextUtils.isEmpty(data)) {
+            this.data = ByteUtils.stringToBytes(data);
+            setLength(this.data.length);
+        }
+    }
+
+    public void setData(byte []data) {
+        this.data = data;
+        if(data!=null){
+            setLength(data.length);
+        }
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    private void setLength(int length) {
+        this.length = length;
+    }
+
+    /**
+     * 鍔犲瘑鏍囪瘑
+     *
+     * @return
+     */
+    public boolean isEncrypt() {
+        return encrypt;
+    }
+
+    /**
+     * 鍔犲瘑鏍囪瘑
+     *
+     * @param encrypt
+     */
+    public void setEncrypt(boolean encrypt) {
+        this.encrypt = encrypt;
+    }
+
+    public String getReplyTopic() {
+        if(TextUtils.isEmpty(replyTopic)){
+            return topic+"_reply";
+        }
+        return replyTopic;
+    }
+
+    public void setReplyTopic(String replyTopic) {
+        this.replyTopic = replyTopic;
+    }
+
+    public byte [] getSendBytes() {
+        try {
+            String header = "Topic:" +
+                    getTopic() +
+                    "\r\n" +
+                    "Length:" +
+                    getLength() +
+                    "\r\n\r\n";
+            return ByteUtils.concatBytes(header.getBytes("utf-8"), getData());
+        } catch (Exception e) {
+            return new byte[]{};
+        }
+    }
+
+    public byte [] getCloudSendBytes() {
+        try {
+            //link閫忎紶鍛戒护锛屽唴瀹归渶瑕佸寘鍚富棰橈紝闀垮害
+            if(getCloudTopic().contains("/native/a/down/slaveoid/")){
+                return getSendBytes();
+            }else {
+                return getData();
+            }
+        } catch (Exception e) {
+            return new byte[]{};
+        }
+    }
+
+
+    private int getBytesLength(String str) {
+        return ByteUtils.stringToBytes(str).length;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java
new file mode 100644
index 0000000..ad2f655
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java
@@ -0,0 +1,93 @@
+package com.hdl.sdk.link.core.bean;
+
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/9/27.
+ */
+public class LinkResponse implements Serializable {
+
+    private String topic;
+    private String data;
+    private int length;
+    private byte []byteData;
+    private int code;
+    private int msg;
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setByteData(byte []data) {
+        this.byteData = data;
+        this.data = new String(data);
+        this.length=data.length;
+    }
+
+    public byte []getByteData() {
+        return byteData;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+        if (!TextUtils.isEmpty(data)) {
+            this.byteData = data.getBytes();
+            setLength(data.length());
+        } else {
+            setLength(0);
+        }
+
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    private void setLength(int length) {
+        this.length = length;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return GsonConvert.getGson().toJson(this);
+    }
+
+    /**
+     * 鍝嶅簲鐘舵�佺爜
+     * @return
+     */
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    /**
+     * 鍝嶅簲娑堟伅
+     * @return
+     */
+    public int getMsg() {
+        return msg;
+    }
+
+    public void setMsg(int msg) {
+        this.msg = msg;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/ZigbeeResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/ZigbeeResponse.java
new file mode 100644
index 0000000..718facb
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/ZigbeeResponse.java
@@ -0,0 +1,88 @@
+package com.hdl.sdk.link.core.bean;
+
+import androidx.annotation.NonNull;
+
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+
+import java.io.Serializable;
+
+/**
+ * Created by hxb on 2021/12/19.
+ */
+public class ZigbeeResponse implements Serializable {
+
+    /**
+     * 鍘熺敓涓婚
+     */
+    private String topic;
+    /**
+     * 鍘熺敓鏁版嵁
+     */
+    private String data;
+
+    /**
+     * 缃戝叧Oid
+     */
+    private String oid;
+
+
+    /**
+     * 鑾峰彇鍘熺敓涓婚
+     *
+     * @return
+     */
+    public String getTopic() {
+        return topic;
+    }
+
+    /**
+     * 璁剧疆鍘熺敓涓婚
+     *
+     * @param topic
+     */
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    /**
+     * 鑾峰彇鍘熺敓鏁版嵁
+     *
+     * @return
+     */
+    public String getData() {
+        return data;
+    }
+
+    /**
+     * 璁剧疆鍘熺敓鏁版嵁
+     *
+     * @param data
+     */
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    /**
+     * 鑾峰彇缃戝叧涓昏淇℃伅锛屽彲鑳芥槸oid锛屽彲鑳芥槸缃戝叧Id锛屽彲鑳芥槸mac
+     *
+     * @return
+     */
+    public String getOid() {
+        return oid;
+    }
+
+    /**
+     * 璁剧疆Oid
+     *
+     * @param
+     */
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    @NonNull
+    @Override
+    public String toString() {
+        return GsonConvert.getGson().toJson(this);
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventBindMiniRemoteSuccessInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventBindMiniRemoteSuccessInfo.java
new file mode 100644
index 0000000..16817ea
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventBindMiniRemoteSuccessInfo.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2021/5/24
+ * description:
+ */
+public class EventBindMiniRemoteSuccessInfo implements Serializable {
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventCloseSearchDeviceActivityInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventCloseSearchDeviceActivityInfo.java
new file mode 100644
index 0000000..256df37
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventCloseSearchDeviceActivityInfo.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2021/5/24
+ * description:
+ */
+public class EventCloseSearchDeviceActivityInfo implements Serializable {
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventIRCodeStudySuccessInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventIRCodeStudySuccessInfo.java
new file mode 100644
index 0000000..bf18b72
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventIRCodeStudySuccessInfo.java
@@ -0,0 +1,36 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2021/5/24
+ * description:
+ */
+public class EventIRCodeStudySuccessInfo implements Serializable {
+    private String topic;
+    private String content;
+
+    public EventIRCodeStudySuccessInfo(String topic, String content) {
+        this.topic = topic;
+        this.content = content;
+    }
+
+    public String getTopic() {
+        return topic == null ? "" : topic;
+    }
+
+    public void setTopic(@NonNull String topic) {
+        this.topic = topic;
+    }
+
+    public String getContent() {
+        return content == null ? "" : content;
+    }
+
+    public void setContent(@NonNull String content) {
+        this.content = content;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventMqttAesFailInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventMqttAesFailInfo.java
new file mode 100644
index 0000000..868de85
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventMqttAesFailInfo.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2021/5/24
+ * description:
+ */
+public class EventMqttAesFailInfo implements Serializable {
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyDebugModeInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyDebugModeInfo.java
new file mode 100644
index 0000000..29839f4
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyDebugModeInfo.java
@@ -0,0 +1,27 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2021/5/24
+ * description:
+ */
+public class EventNotifyDebugModeInfo implements Serializable {
+
+    private boolean isRemote;
+
+    public boolean isRemote() {
+        return isRemote;
+    }
+
+    public void setRemote(@NonNull boolean remote) {
+        isRemote = remote;
+    }
+
+    public EventNotifyDebugModeInfo(boolean isRemote) {
+        this.isRemote = isRemote;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyGetGateWayInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyGetGateWayInfo.java
new file mode 100644
index 0000000..5b06130
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyGetGateWayInfo.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2022/6/29
+ * description:
+ */
+public class EventNotifyGetGateWayInfo implements Serializable {
+} 
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyRefreshGatewayAesKeyInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyRefreshGatewayAesKeyInfo.java
new file mode 100644
index 0000000..3029952
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyRefreshGatewayAesKeyInfo.java
@@ -0,0 +1,23 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2022/6/29
+ * description:
+ */
+public class EventNotifyRefreshGatewayAesKeyInfo implements Serializable {
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    private     String gatewayId;
+
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java
new file mode 100644
index 0000000..df81b6b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java
@@ -0,0 +1,349 @@
+package com.hdl.sdk.link.core.bean.gateway;
+
+import android.text.TextUtils;
+
+import androidx.annotation.NonNull;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/15.
+ * 缃戝叧瀵硅薄
+ */
+public class GatewayBean implements Serializable {
+
+
+
+    /**
+     * true-鍦ㄧ嚎
+     * false-绂荤嚎
+     */
+    private boolean online=true;
+    /**
+     * 缃戝叧鍨嬪彿
+     */
+    private String device_model;
+    /**
+     * 缃戝叧澶囨敞
+     */
+    private String device_name;
+    /**
+     * 缃戝叧Mac
+     */
+    private String device_mac;
+    /**
+     * 缃戝叧Id
+     */
+    private String gatewayId;
+    /**
+     * 缃戝叧绫诲瀷
+     */
+    private String gatewayType;
+    private String gateway_type;
+    /**
+     * 缃戝叧oid
+     */
+    private String oid;
+    /**
+     * IP鍦板潃
+     */
+    private String ip_address;
+    /**
+     * 杩炴帴鐨勭綉鍏崇被鍨� LAN WIFI
+     */
+    private String access_mode;
+    /**
+     * 鏄惁涓荤綉鍏� true false
+     */
+    private String master;
+    /**
+     * 鏄惁鍔犲瘑
+     */
+    private boolean isLocalEncrypt;
+    /**
+     * 鏄惁鏈湴缃戝叧
+     */
+    private boolean isLocalGateWay;
+    /**
+     * 浣忓畢Id
+     */
+    private String homeId;
+
+    /**
+     * 浣跨敤mqtt鐨勬椂鍊欓渶瑕佽В瀵�
+     */
+    private String aesKey;
+    private String deviceId;
+
+    /**
+     * 姣背娉id
+     */
+    private String sid;
+
+
+    /**
+     * 璁惧鏉ユ簮(鑷畾涔�:0=琛ㄧず缃戝叧;1=琛ㄧず骞冲彴)
+     */
+    private String src;
+
+    public String getSrc() {
+        return src==null?"":this.src;
+    }
+
+    public void setSrc(String src) {
+        this.src = src;
+    }
+
+    public String getAesKey() {
+        return aesKey == null ? "" : aesKey;
+    }
+
+    public void setAesKey(@NonNull String aesKey) {
+        this.aesKey = aesKey;
+    }
+
+    public String getDeviceId() {
+        return deviceId == null ? "" : deviceId;
+    }
+
+    public void setDeviceId(@NonNull String deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public boolean getOnline() {
+        return online;
+    }
+
+    public void setOnline(boolean online) {
+        this.online = online;
+    }
+    /**
+     * 缃戝叧鍨嬪彿
+     */
+    public String getDevice_model() {
+        return device_model == null ? "" : device_model;
+    }
+    /**
+     * 缃戝叧鍨嬪彿
+     */
+    public void setDevice_model(String device_model) {
+        this.device_model = device_model;
+    }
+    /**
+     * 缃戝叧澶囨敞
+     */
+    public String getDevice_name() {
+        if(TextUtils.isEmpty(device_name)){
+            return getDevice_model();
+        }else {
+
+        }
+        return device_name;
+    }
+
+    /**
+     * 妯℃澘鍖归厤鏍囪 wxr 鑷畾涔� 2022-02-23 16:09:44
+     */
+    private boolean templateSettingFlag = false;
+
+    public boolean isTemplateSettingFlag() {
+        return templateSettingFlag;
+    }
+
+    public void setTemplateSettingFlag(boolean templateSettingFlag) {
+        this.templateSettingFlag = templateSettingFlag;
+    }
+    private String templateAddr ;
+
+    public String getTemplateAddr() {
+        return templateAddr == null ? "" : templateAddr;
+    }
+
+    public void setTemplateAddr(String templateAddr) {
+        this.templateAddr = templateAddr;
+    }
+
+
+
+    /**
+     * 缃戝叧澶囨敞
+     */
+    public void setDevice_name(String device_name) {
+        this.device_name = device_name;
+    }
+
+    /**
+     * 缃戝叧Mac
+     * @return
+     */
+    @NonNull
+    public String getDevice_mac() {
+        return TextUtils.isEmpty(device_mac) ? "" : device_mac;
+    }
+
+    /**
+     * 缃戝叧Mac
+     */
+    public void setDevice_mac(String device_mac) {
+        this.device_mac = device_mac;
+    }
+    /**
+     * 缃戝叧Id
+     */
+    @NonNull
+    public String getGatewayId() {
+        return TextUtils.isEmpty(gatewayId) ? getOid() : gatewayId;
+    }
+
+    /**
+     * 缃戝叧Id
+     */
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+    /**
+     * 缃戝叧绫诲瀷
+     */
+    @NonNull
+    public String getGatewayType() {
+        return gatewayType == null ? "" : gatewayType;
+    }
+
+    /**
+     * 缃戝叧绫诲瀷
+     */
+    public void setGatewayType(String gatewayType) {
+        this.gatewayType = gatewayType;
+    }
+
+    @NonNull
+    public String getGateway_type() {
+        return gateway_type == null ? "" : gateway_type;
+    }
+
+    public void setGateway_type(String gateway_type) {
+        this.gateway_type = gateway_type;
+    }
+    /**
+     * 缃戝叧Oid
+     */
+    @NonNull
+    public String getOid() {
+        return TextUtils.isEmpty(oid) ? getDevice_mac() : oid;
+    }
+
+    /**
+     * 缃戝叧Oid
+     */
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+    /**
+     * IP鍦板潃
+     */
+    @NonNull
+    public String getIp_address() {
+        return ip_address == null ? "" : ip_address;
+    }
+
+    /**
+     * IP鍦板潃
+     */
+    public void setIp_address(String ip_address) {
+        this.ip_address = ip_address;
+    }
+    /**
+     * 杩炴帴鐨勭綉鍏崇被鍨� LAN WIFI
+     */
+    @NonNull
+    public String getAccess_mode() {
+        return access_mode == null ? "" : access_mode;
+    }
+
+    /**
+     * 杩炴帴鐨勭綉鍏崇被鍨� LAN WIFI
+     */
+    public void setAccess_mode(String access_mode) {
+        this.access_mode = access_mode;
+    }
+    /**
+     * 鏄惁涓荤綉鍏� true false
+     */
+    public String getMaster() {
+        return master == null ? "" : master;
+    }
+
+    /**
+     * 鏄惁涓荤綉鍏� true false no_config
+     */
+    public void setMaster(String master) {
+        this.master = master;
+    }
+    /**
+     * 鏄惁鍔犲瘑
+     */
+    public boolean getIsLocalEncrypt() {
+        return isLocalEncrypt;
+    }
+    /**
+     * 鏄惁鍔犲瘑
+     */
+    public void setIsLocalEncrypt(boolean localEncrypt) {
+        isLocalEncrypt = localEncrypt;
+    }
+    /**
+     * 鑾峰彇浣忓畢Id
+     */
+    @NonNull
+    public String getHomeId() {
+        return homeId == null ? "" : homeId;
+    }
+
+    /**
+     * 璁剧疆浣忓畢Id
+     */
+    public void setHomeId(String homeId) {
+        this.homeId = homeId;
+    }
+
+    /**
+     * 鑾峰彇姣背娉id
+     * @return sid
+     */
+    public String getSid() {
+        return sid==null?"":this.sid;
+    }
+    /**
+     * 璁剧疆姣背娉id
+     */
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+    /**
+     * 鏄惁鏈湴缃戝叧 true false
+     */
+    public void setIsLocalGateWay(boolean isLocalGateWay) {
+        this.isLocalGateWay = isLocalGateWay;
+    }
+    /**
+     * 鑾峰彇缃戝叧鏄惁鏈湴缃戝叧
+     */
+    public boolean getIsLocalGateway() {
+        return this.isLocalGateWay;
+    }
+
+
+    /*
+    * 妯℃澘鏍囪 wxr
+    * */
+    private boolean templateFlag = false;
+    public boolean isLocalEncrypt() {
+        return isLocalEncrypt;
+    }
+
+    public void setLocalEncrypt(boolean localEncrypt) {
+        isLocalEncrypt = localEncrypt;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/AuthenticateRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/AuthenticateRequest.java
new file mode 100644
index 0000000..a77548c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/AuthenticateRequest.java
@@ -0,0 +1,310 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/11/21.
+ *
+ * @Description : AuthenticateRequest
+ * 涓夋柟缃戠粶璁惧鍏ョ綉鍙婅璇� 璇锋眰鍙傛暟
+ * 璇锋眰topic:/user/all/custom/deivce/network_access/request
+ */
+public class AuthenticateRequest implements Serializable {
+    private String id;
+    private String time_stamp;
+    private AuthenticateDeviceInfoBean objects;//褰撳墠璁惧鍩烘湰淇℃伅
+    private AuthBean auth;//璁よ瘉淇℃伅
+
+    public String getID() { return id; }
+    public void setID(String value) { this.id = value; }
+
+    public String getTimeStamp() { return time_stamp; }
+    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;
+        this.time_stamp = time_stamp;
+        this.objects = objects;
+        this.auth = auth;
+    }
+
+    public static class AuthBean implements Serializable {
+        private String mac_key;//(mac+secret)鐨勪袱娆d5鍊�
+        private String spk;
+        private RequestBean request;//璁惧鐩稿叧淇℃伅
+
+        public String getMACKey() { return mac_key; }
+        public void setMACKey(String value) { this.mac_key = value; }
+
+        public String getSpk() { return spk; }
+        public void setSpk(String value) { this.spk = value; }
+
+        public RequestBean getRequest() { return request; }
+        public void setRequest(RequestBean value) { this.request = value; }
+
+        public AuthBean() {
+
+        }
+        public AuthBean(String mac_key, String spk, RequestBean request) {
+            this.mac_key = mac_key;
+            this.spk = spk;
+            this.request = request;
+        }
+    }
+
+    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(String mac, String supplier, String hardware_model, String firmware_version) {
+            this.mac = mac;
+            this.supplier = supplier;
+            this.hardware_model = hardware_model;
+            this.firmware_version = firmware_version;
+        }
+
+        public String getMAC() { return mac; }
+        public void setMAC(String value) { this.mac = value; }
+
+        public String getSupplier() { return supplier; }
+        public void setSupplier(String value) { this.supplier = value; }
+
+        public String getHardwareModel() { return hardware_model; }
+        public void setHardwareModel(String value) { this.hardware_model = value; }
+
+        public String getFirmwareVersion() { return firmware_version; }
+        public void setFirmwareVersion(String value) { this.firmware_version = value; }
+    }
+
+    public static class AuthenticateDeviceInfoBean implements Serializable{
+        private String oid;//璁惧鐨凮id
+        private String device_mac;//璁惧鐨凪ac
+        private String device_name;//
+        private String device_model;
+        private String access_mode;
+        private String sid;
+        private String ip_mac;
+        private String ip_address;
+        private String netmask = "255.255.255.0";
+        private String ip_gateway;
+        private String dns1 = "114.114.114.114";
+        private String dns2 = "8.8.8.8";
+        private String gateway_type;
+        private String hw_version;
+        private String fw_version;
+
+        public String getOID() { return oid; }
+
+        /**
+         * 璁惧Oid
+         * @param value
+         */
+        public void setOID(String value) { this.oid = value; }
+
+        public String getDeviceMAC() { return device_mac; }
+
+        /**
+         * 璁惧Mac
+         * @param value
+         */
+        public void setDeviceMAC(String value) { this.device_mac = value; }
+
+        /**
+         * 璁惧鍚�
+         * @return
+         */
+        public String getDeviceName() { return device_name; }
+
+        /**
+         * 璁惧鍚�
+         * @param value
+         */
+        public void setDeviceName(String value) { this.device_name = value; }
+
+        /**
+         * 璁惧鍨嬪彿
+         * @return
+         */
+        public String getDeviceModel() { return device_model; }
+
+        /**
+         * 璁惧鍨嬪彿
+         * @param value
+         */
+        public void setDeviceModel(String value) { this.device_model = value; }
+
+        /**
+         * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         * @return
+         */
+        public String getAccessMode() { return access_mode; }
+
+        /**
+         * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         * @param value
+         */
+        public void setAccessMode(String value) { this.access_mode = value; }
+
+        /**
+         * 璁惧sid
+         * @return
+         */
+        public String getSid() { return sid; }
+
+        /**
+         * 璁惧sid
+         * @param value
+         */
+        public void setSid(String value) { this.sid = value; }
+
+        /**
+         * 璁惧IPMAC
+         * @return
+         */
+        public String getIPMAC() { return ip_mac; }
+
+        /**
+         * 璁惧IPMAC
+         * @param value
+         */
+        public void setIPMAC(String value) { this.ip_mac = value; }
+
+        /**
+         * 璁惧IP鍦板潃
+         * @return
+         */
+        public String getIPAddress() { return ip_address; }
+
+        /**
+         * 璁惧IP鍦板潃
+         * @param value
+         */
+        public void setIPAddress(String value) { this.ip_address = value; }
+
+        /**
+         * 瀛愮綉鎺╃爜
+         * @return
+         */
+        public String getNetmask() { return netmask; }
+
+        /**
+         * 瀛愮綉鎺╃爜
+         * @param value
+         */
+        public void setNetmask(String value) { this.netmask = value; }
+
+        /**
+         * 缃戝叧IP
+         * @return
+         */
+        public String getIPGateway() { return ip_gateway; }
+
+        /**
+         * 缃戝叧IP
+         * @param value
+         */
+        public void setIPGateway(String value) { this.ip_gateway = value; }
+
+        /**
+         * DNS1
+         * @return
+         */
+        public String getDns1() { return dns1; }
+
+        /**
+         * DNS1
+         * @param value
+         */
+        public void setDns1(String value) { this.dns1 = value; }
+
+        /**
+         * DNS2
+         * @return
+         */
+        public String getDns2() { return dns2; }
+
+        /**
+         * DNS2
+         * @param value
+         */
+        public void setDns2(String value) { this.dns2 = value; }
+
+        public VersionBean[] getVersions() {return null;  }
+        public void setVersions(VersionBean[] value) {  }
+
+        /**
+         * 缃戝叧绫诲瀷
+         * @return
+         */
+        public String getGateway_type() {
+            return gateway_type;
+        }
+
+        /**
+         * 缃戝叧绫诲瀷
+         * @param gateway_type
+         */
+        public void setGateway_type(String gateway_type) {
+            this.gateway_type = gateway_type;
+        }
+
+        /**
+         * 纭欢鐗堟湰
+         * @return
+         */
+        public String getHw_version() {
+            return hw_version;
+        }
+
+        /**
+         *纭欢鐗堟湰
+         * @param
+         */
+        public void setHw_version(String hw_version) {
+            this.hw_version = hw_version;
+        }
+
+
+        /**
+         * 鍥轰欢鐗堟湰
+         * @return
+         */
+        public String getFw_version() {
+            return fw_version;
+        }
+
+        /**
+         * 鍥轰欢鐗堟湰
+         * @param fw_version
+         */
+        public void setFw_version(String fw_version) {
+            this.fw_version = fw_version;
+        }
+    }
+
+    public static class VersionBean implements Serializable{
+        private String module;
+        private String version;
+
+        public VersionBean(String module, String version) {
+            this.module = module;
+            this.version = version;
+        }
+
+        public String getModule() {
+            return module;
+        }
+
+        public void setModule(String value) {
+            this.module = value;
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BaseLocalRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BaseLocalRequest.java
new file mode 100644
index 0000000..44fcccf
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BaseLocalRequest.java
@@ -0,0 +1,47 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class BaseLocalRequest<T> implements Serializable {
+
+
+    private String id;
+    private String code;
+    private String time_stamp;
+    private T objects;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getTime_stamp() {
+        return time_stamp;
+    }
+
+    public void setTime_stamp(String time_stamp) {
+        this.time_stamp = time_stamp;
+    }
+
+    public T getObjects() {
+        return objects;
+    }
+
+    public void setObjects(T objects) {
+        this.objects = objects;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BroadcastRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BroadcastRequest.java
new file mode 100644
index 0000000..d760638
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/BroadcastRequest.java
@@ -0,0 +1,54 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/11/21.
+ *
+ * /user/all/custom/gateway/broadcast
+ */
+public class BroadcastRequest implements Serializable {
+    private String id;
+    private String time_stamp;
+    private AuthenticateRequest.AuthenticateDeviceInfoBean objects;//褰撳墠璁惧鍩烘湰淇℃伅
+    private String code;//
+
+    public BroadcastRequest(String id, String time_stamp, AuthenticateRequest.AuthenticateDeviceInfoBean objects, String code) {
+        this.id = id;
+        this.time_stamp = time_stamp;
+        this.objects = objects;
+        this.code = code;
+    }
+
+    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 AuthenticateRequest.AuthenticateDeviceInfoBean getObjects() {
+        return objects;
+    }
+
+    public void setObjects(AuthenticateRequest.AuthenticateDeviceInfoBean objects) {
+        this.objects = objects;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/DeviceControlRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/DeviceControlRequest.java
new file mode 100644
index 0000000..5c4c800
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/DeviceControlRequest.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class DeviceControlRequest implements Serializable {
+
+    private String sid;
+    private List<StatusBean> status;
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public List<StatusBean> getStatus() {
+        return status;
+    }
+
+    public void setStatus(List<StatusBean> status) {
+        this.status = status;
+    }
+
+    public static class StatusBean implements Serializable {
+        private String key;
+        private String value;
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/FunctionAttributeRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/FunctionAttributeRequest.java
new file mode 100644
index 0000000..b274fde
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/FunctionAttributeRequest.java
@@ -0,0 +1,24 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class FunctionAttributeRequest implements Serializable {
+
+    private String sid;
+
+    public FunctionAttributeRequest(String sid) {
+        this.sid = sid;
+    }
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyReadRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyReadRequest.java
new file mode 100644
index 0000000..4136322
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyReadRequest.java
@@ -0,0 +1,22 @@
+package com.hdl.sdk.link.core.bean.request;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class PropertyReadRequest {
+
+    private String sid;
+
+    public PropertyReadRequest(String sid) {
+        this.sid = sid;
+    }
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyUpRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyUpRequest.java
new file mode 100644
index 0000000..dfd46b4
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/request/PropertyUpRequest.java
@@ -0,0 +1,50 @@
+package com.hdl.sdk.link.core.bean.request;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class PropertyUpRequest implements Serializable {
+
+    private String sid;
+    private List<StatusBean> status;
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public List<StatusBean> getStatus() {
+        return status;
+    }
+
+    public void setStatus(List<StatusBean> status) {
+        this.status = status;
+    }
+
+    public static class StatusBean implements Serializable{
+        private String key;
+        private String value;
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/AuthenticateResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/AuthenticateResponse.java
new file mode 100644
index 0000000..ea7d429
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/AuthenticateResponse.java
@@ -0,0 +1,47 @@
+package com.hdl.sdk.link.core.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/12/21.
+ *
+ * @Description : AuthenticateResponseBean
+ */
+public class AuthenticateResponse extends BaseResponse {
+    private String code;
+    private GatewayObjects objects;
+    private Auth auth;
+
+    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 Auth getAuth() { return auth; }
+    public void setAuth(Auth value) { this.auth = value; }
+
+    public class Auth implements Serializable {
+        private String localSecret;
+
+        public String getLocalSecret() { return localSecret; }
+        public void setLocalSecret(String value) { this.localSecret = value; }
+    }
+
+    public class GatewayObjects implements Serializable  {
+        private String ip_address;
+        private String gatewayId;
+        private String oid;
+
+        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; }
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalResponse.java
new file mode 100644
index 0000000..2000807
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalResponse.java
@@ -0,0 +1,37 @@
+package com.hdl.sdk.link.core.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class BaseLocalResponse<T> implements Serializable {
+
+    private String id;
+    private String time_stamp;
+    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 T getObjects() {
+        return objects;
+    }
+
+    public void setObjects(T objects) {
+        this.objects = objects;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalWithCodeResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalWithCodeResponse.java
new file mode 100644
index 0000000..cfd555a
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseLocalWithCodeResponse.java
@@ -0,0 +1,39 @@
+package com.hdl.sdk.link.core.bean.response;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Tong on 2021/9/29.
+ */
+public class BaseLocalWithCodeResponse<T> implements Serializable {
+
+    private String id;
+    private String time_stamp;
+    private T code;
+
+    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 T getCode() {
+        return code;
+    }
+
+    public void setCode(@NonNull T code) {
+        this.code = code;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseResponse.java
new file mode 100644
index 0000000..3337610
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/BaseResponse.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.link.core.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : BaseResponse
+ */
+public class BaseResponse implements Serializable {
+
+    private String id;
+    private String time_stamp;
+
+    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;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/GatewaySearchBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/GatewaySearchBean.java
new file mode 100644
index 0000000..b574beb
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/GatewaySearchBean.java
@@ -0,0 +1,109 @@
+package com.hdl.sdk.link.core.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/9/29.
+ * 缃戝叧鎼滅储
+ */
+public class GatewaySearchBean implements Serializable {
+    private String device_model;
+    private String device_name;
+    private String device_mac;
+    private String gatewayId;
+    private String gatewayType;
+    private String gateway_type;
+    private String oid;
+    private String ip_address;
+    private String access_mode;
+    private String master;
+    private boolean isLocalEncrypt;//2021-11-11 鏂板
+
+    public String getDevice_model() {
+        return device_model;
+    }
+
+    public void setDevice_model(String device_model) {
+        this.device_model = device_model;
+    }
+
+    public String getDevice_name() {
+        return device_name;
+    }
+
+    public void setDevice_name(String device_name) {
+        this.device_name = device_name;
+    }
+
+    public String getDevice_mac() {
+        return device_mac;
+    }
+
+    public void setDevice_mac(String device_mac) {
+        this.device_mac = device_mac;
+    }
+
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public String getGatewayType() {
+        return gatewayType;
+    }
+
+    public void setGatewayType(String gatewayType) {
+        this.gatewayType = gatewayType;
+    }
+
+    public String getGateway_type() {
+        return gateway_type;
+    }
+
+    public void setGateway_type(String gateway_type) {
+        this.gateway_type = gateway_type;
+    }
+
+    public String getOid() {
+        return oid;
+    }
+
+    public void setOid(String oid) {
+        this.oid = oid;
+    }
+
+    public String getIp_address() {
+        return ip_address;
+    }
+
+    public void setIp_address(String ip_address) {
+        this.ip_address = ip_address;
+    }
+
+    public String getAccess_mode() {
+        return access_mode;
+    }
+
+    public void setAccess_mode(String access_mode) {
+        this.access_mode = access_mode;
+    }
+
+    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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/NetworkAccessBroadcastResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/NetworkAccessBroadcastResponse.java
new file mode 100644
index 0000000..23a16c4
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/response/NetworkAccessBroadcastResponse.java
@@ -0,0 +1,22 @@
+package com.hdl.sdk.link.core.bean.response;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : NetworkAccessBroadcastResponse
+ */
+public class NetworkAccessBroadcastResponse extends BaseResponse {
+    private String ip_address;
+    private String oid;
+    private String homeId;
+
+    public String getIPAddress() { return ip_address; }
+    public void setIPAddress(String value) { this.ip_address = value; }
+
+    public String getOID() { return oid; }
+    public void setOID(String value) { this.oid = value; }
+
+    public String getHomeID() { return homeId; }
+    public void setHomeID(String value) { this.homeId = value; }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneCanDeleteInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneCanDeleteInfo.java
new file mode 100644
index 0000000..ff13772
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneCanDeleteInfo.java
@@ -0,0 +1,33 @@
+package com.hdl.sdk.link.core.bean.scenebatch;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/12/9
+ * description:
+ */
+public class SceneCanDeleteInfo implements Serializable {
+    private String sid;
+    private String can_delete;
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getCan_delete() {
+        return can_delete == null ? "" : can_delete;
+    }
+
+    public void setCan_delete(@NonNull String can_delete) {
+        this.can_delete = can_delete;
+    }
+
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneGroupInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneGroupInfo.java
new file mode 100644
index 0000000..cb7a93d
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/scenebatch/SceneGroupInfo.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.core.bean.scenebatch;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/12/9
+ * description:
+ */
+public class SceneGroupInfo implements Serializable {
+    private String sid;
+    private String group;
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getGroup() {
+        return group == null ? "" : group;
+    }
+
+    public void setGroup(@NonNull String group) {
+        this.group = group;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/BaseCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/BaseCallBack.java
new file mode 100644
index 0000000..88d979b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/BaseCallBack.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.callback;
+
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+
+/**
+ * Created by Tong on 2021/11/11.
+ */
+public interface BaseCallBack {
+
+    void onError(HDLLinkException e);
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/GatewayCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/GatewayCallBack.java
new file mode 100644
index 0000000..5299977
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/GatewayCallBack.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.core.callback;
+
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/15.
+ */
+public interface GatewayCallBack extends BaseCallBack {
+    void onSuccess(List<GatewayBean> gatewayBeanList);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java
new file mode 100644
index 0000000..4bdf82f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.link.core.callback;
+
+/**
+ * Created by jlchen on 11/16/21.
+ *
+ * @Description : HDLLinkCallBack
+ */
+public interface HDLLinkCallBack extends BaseCallBack{
+    void onSuccess(String msg);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkResponseCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkResponseCallBack.java
new file mode 100644
index 0000000..418152a
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkResponseCallBack.java
@@ -0,0 +1,13 @@
+package com.hdl.sdk.link.core.callback;
+
+
+import com.hdl.sdk.link.core.bean.LinkResponse;
+
+/**
+ * Created by jlchen on 11/16/21.
+ *
+ * @Description : HDLLinkResponseCallBack
+ */
+public interface HDLLinkResponseCallBack extends BaseCallBack{
+    void onSuccess(LinkResponse msg);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkTCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkTCallBack.java
new file mode 100644
index 0000000..dfa9885
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkTCallBack.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.link.core.callback;
+
+/**
+ * Created by jlchen on 1/6/22.
+ * 鏈湴閫氫俊閫氱敤CallBack
+ */
+public interface HDLLinkTCallBack<T> extends BaseCallBack{
+
+    void onSuccess(T data);
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ZigbeeCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ZigbeeCallBack.java
new file mode 100644
index 0000000..5d29b40
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/ZigbeeCallBack.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.link.core.callback;
+
+import org.json.JSONException;
+
+/**
+ * Created by hxb on 2021/12/15.
+ */
+public interface ZigbeeCallBack extends BaseCallBack {
+    void onSuccess(String body);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/config/HDLLinkConfig.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/config/HDLLinkConfig.java
new file mode 100644
index 0000000..195ea25
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/config/HDLLinkConfig.java
@@ -0,0 +1,211 @@
+package com.hdl.sdk.link.core.config;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.SPUtils;
+import com.hdl.sdk.link.core.bean.request.AuthenticateRequest;
+import com.hdl.sdk.link.core.bean.response.GatewaySearchBean;
+
+import androidx.annotation.NonNull;
+
+
+/**
+ * Created by jlchen on 11/11/21.
+ *
+ * @Description : HDLLinkConfig
+ */
+public class HDLLinkConfig {
+    private static final String AUTHENTICATE_LS_KEY = "auth_ls_key";
+    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";
+    private static final String AUTHENTICATE_IS_CLOUD_ENCRYPT_KEY = "cloud_isencrypt_key";
+    private static final String AUTHENTICATE_CLOUD_ENCRYPT_KEY = "cloud_encrypt_key";
+    private static final String HOME_ID="home_id";
+
+    private String localSecret;//鏈湴鍔犲瘑瀵嗛挜
+    private String gatewayId;
+    private String ipAddress;
+    private boolean isLocalEncrypt;//缃戝叧鏄惁闇�瑕佸姞瀵嗛�氳
+    private String  homeId;
+    private GatewaySearchBean currentGateway;//褰撳墠缃戝叧
+    private String  aesKey;
+    //浜戠缃戝叧鏄惁鍔犲瘑
+    private boolean isCloudEncrypt = true;
+
+    private AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean;//褰撳墠璁惧鍩烘湰淇℃伅
+
+    /**
+     * instance
+     */
+    private volatile static HDLLinkConfig instance;
+
+    /**
+     * getInstance
+     *
+     * @return AuthenticateConfig
+     */
+    public static synchronized HDLLinkConfig getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkConfig.class) {
+                if (instance == null) {
+                    instance = new HDLLinkConfig();
+                    instance.loadConfig();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 娓呯┖缂撳瓨
+     */
+    public void clearConfig() {
+        this.gatewayId = "";
+        this.ipAddress = "";
+        this.localSecret = "";
+        this.isLocalEncrypt = false;
+        this.homeId="";
+        SPUtils.remove(AUTHENTICATE_LS_KEY);
+        SPUtils.remove(AUTHENTICATE_GATEWAYID_KEY);
+        SPUtils.remove(AUTHENTICATE_IPADDRESS_KEY);
+        SPUtils.remove(AUTHENTICATE_IS_LS_KEY);
+        SPUtils.remove(HOME_ID);
+    }
+
+    /**
+     * 鍔犺浇缂撳瓨
+     */
+    void loadConfig() {
+        localSecret = SPUtils.getString(AUTHENTICATE_LS_KEY, "");
+//        gatewayId = SPUtils.getString(AUTHENTICATE_GATEWAYID_KEY, "");
+//        ipAddress = SPUtils.getString(AUTHENTICATE_IPADDRESS_KEY, "");
+        isLocalEncrypt = SPUtils.getBoolean(AUTHENTICATE_IS_LS_KEY, false);
+        isCloudEncrypt = SPUtils.getBoolean(AUTHENTICATE_IS_CLOUD_ENCRYPT_KEY, false);
+        aesKey = SPUtils.getString(AUTHENTICATE_CLOUD_ENCRYPT_KEY, "");
+        homeId=SPUtils.getString(HOME_ID, "");
+    }
+
+
+
+    /**
+     * 淇濆瓨閰嶇疆
+     *
+     * @param localSecret
+     * @param gatewayId
+     * @param ipAddress
+     */
+    public void saveConfig(String localSecret, String gatewayId, String ipAddress) {
+        this.localSecret = localSecret;
+        this.gatewayId = gatewayId;
+        this.ipAddress = ipAddress;
+        SPUtils.put(AUTHENTICATE_LS_KEY, localSecret);
+        SPUtils.put(AUTHENTICATE_GATEWAYID_KEY, gatewayId);
+        SPUtils.put(AUTHENTICATE_IPADDRESS_KEY, ipAddress);
+    }
+
+    /**
+     * 閲嶆柊淇濆瓨
+     */
+    public void reSaveConfig() {
+        this.saveConfig(this.localSecret, this.gatewayId, this.ipAddress);
+    }
+
+    public String getAesKey() {
+        return aesKey == null ? "" : aesKey;
+    }
+
+    public void setAesKey(@NonNull String aesKey) {
+        this.aesKey = aesKey;
+        SPUtils.put(AUTHENTICATE_CLOUD_ENCRYPT_KEY, aesKey);
+    }
+
+
+    public boolean isCloudEncrypt() {
+        return isCloudEncrypt;
+    }
+
+    public void setCloudEncrypt(@NonNull boolean cloudEncrypt) {
+        isCloudEncrypt = cloudEncrypt;
+        SPUtils.put(AUTHENTICATE_IS_CLOUD_ENCRYPT_KEY, cloudEncrypt);
+    }
+
+    /**
+     * 妫�娴嬫槸鍚﹀凡缁忚璇佽繃
+     *
+     * @return
+     */
+    public boolean checkIfCertified() {
+        //localSecret涓嶄负绌哄苟涓旈暱搴︾瓑浜�16 缃戝叧id涓嶈兘涓虹┖
+        return true;//!TextUtils.isEmpty(localSecret)
+                //&& localSecret.length() == 16
+                //&& !TextUtils.isEmpty(gatewayId);
+    }
+
+    public void setLocalSecret(String localSecret) {
+        this.localSecret = localSecret;
+        SPUtils.put(AUTHENTICATE_LS_KEY, localSecret);
+    }
+
+    public String getLocalSecret() {
+        return localSecret;
+    }
+
+    /**
+     * 褰撳墠浣忓畢缃戝叧Id,oid,mac
+     * @return
+     */
+    public String getGatewayId() {
+        return gatewayId;
+    }
+
+    /**
+     * 褰撳墠浣忓畢缃戝叧Id
+     * @param gatewayId
+     */
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId= gatewayId;
+    }
+
+    public String getHomeId() {
+        return homeId;
+    }
+
+    public void setHomeId(String homeId) {
+        this.homeId = homeId;
+    }
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+    public void setIpAddress(String ipAddress){
+        this.ipAddress = ipAddress;
+    }
+
+    public boolean isLocalEncrypt() {
+        return isLocalEncrypt;
+    }
+
+    public void setLocalEncrypt(boolean localEncrypt) {
+        isLocalEncrypt = localEncrypt;
+        SPUtils.put(AUTHENTICATE_IS_LS_KEY, isLocalEncrypt);
+    }
+
+
+    /**
+     * 鎷兼帴缃戝叧ID鑾峰彇瀹屾暣鐨勪富棰�
+     *
+     * @param topicStr
+     * @return
+     */
+    public String getFullTopic(String topicStr) {
+        return String.format(topicStr, gatewayId);
+    }
+
+    public AuthenticateRequest.AuthenticateDeviceInfoBean getDeviceInfoBean() {
+        return deviceInfoBean;
+    }
+
+    public void setDeviceInfoBean(AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean) {
+        this.deviceInfoBean = deviceInfoBean;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java
new file mode 100644
index 0000000..18967d5
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java
@@ -0,0 +1,432 @@
+package com.hdl.sdk.link.core.connect;
+
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.utils.ErrorUtils;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.ZigbeeResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.utils.EncryptUtil;
+import com.hdl.sdk.link.core.utils.mqtt.MqttRecvClient;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+
+import java.util.ArrayList;
+import java.util.List;
+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/11/11.
+ */
+public class HDLConnectHelper {
+
+    private static final Long DEF_SEND_TIMEOUT = 8000L;
+    private static final int DEF_MAX_RETRY = 1;//鏈�澶ч噸鍙戞暟
+    private static final int DEF_SEND_ONE = 1;
+    private static final int TCP_PORT = 8586;
+    private static final int UDP_PORT = 8585;
+
+    private final Long sendAwaitTime;
+    private final int maxRetry;
+
+    /**
+     * 鏄惁tcp鍙戦�佺被鍨�
+     */
+    private boolean isTcp;
+    /**
+     * 璁惧mac
+     */
+    private String mac;
+    /**
+     * 鍙戦�佺殑鐩爣IP
+     */
+    private String ipAddress;
+    /**
+     * 鍙戦�佺殑鐩爣鍦板潃
+     */
+    private int port;
+    private final LinkRequest linkRequest;
+    private final EventListener eventListener;
+
+    private final AtomicInteger sendNumber = new AtomicInteger(0);
+
+    private final AtomicBoolean isSend = new AtomicBoolean(false);
+
+    private HdlSocketListener listener;
+
+    private ScheduledExecutorService sendThread;
+
+    private String replyTopic;
+
+    public interface HdlSocketListener {
+        void onSucceed(Object msg);
+
+        void onFailure(HDLLinkCode hdlLinkCode);
+    }
+
+    /**
+     * 鍙戦�乁DP鎴栬�匱CP鏁版嵁
+     *
+     * @param sendAwaitTime 姣忔鍙戦�佺瓑寰呮椂闂�
+     * @param maxRetry      閲嶈瘯娆℃暟
+     * @param ipAddress     鍙戦�佺洰鏍嘔P
+     * @param port          鍙戦�佺洰鏍囩鍙�
+     * @param linkRequest   鍙戦�佸璞�
+     * @param listener      鍥炶皟
+     * @param isTcp         鏄惁TCP
+     */
+    public HDLConnectHelper(Long sendAwaitTime, int maxRetry, String ipAddress, int port,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp) {
+        this.sendAwaitTime = sendAwaitTime;
+        this.maxRetry = maxRetry;
+        this.ipAddress = ipAddress;
+        this.port = port;
+        this.linkRequest = linkRequest;
+        this.replyTopic = linkRequest.getReplyTopic();
+        this.listener = listener;
+        this.isTcp = isTcp;
+
+
+        eventListener = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                isSend.set(true);
+                try {
+                    if (msg instanceof LinkResponse) {
+                        LinkResponse linkResponse = (LinkResponse) msg;
+                        JSONObject jsonObject = JSON.parseObject(linkResponse.getData());
+                        String id = jsonObject.getString("id");
+                        Integer code = jsonObject.getInteger("code");
+                        /**
+                         * 鍙兘杩斿洖code灞炴�у彲鑳芥病鏈�   娌℃湁鐨勮瘽鐩存帴鎴愬姛  鏈夌殑璇濆彧鏈�200鎵嶄細鎴愬姛
+                         */
+                        if (code == null || code.intValue() == 200 || code.intValue() == 0) {
+                            notifySucceed(msg);
+                        }else {
+                            notifyFailure(ErrorUtils.getByCode(code));
+                        }
+                    }
+                    else if (msg instanceof ZigbeeResponse) {
+                        ZigbeeResponse linkResponse = (ZigbeeResponse) msg;
+                        //TODO 濡傛灉閰嶇疆浠庣綉鍏崇殑淇℃伅锛岄�氳繃涓荤綉鍏宠浆杈撅紝杩欓噷oid瑕佸垽鏂笅
+                        if (replyTopic.equals(linkResponse.getTopic())) {
+                            notifySucceed(linkResponse.getData());
+                        }
+                        else{
+                            notifyFailure(HDLLinkCode.HDL_TOPIC_NOT_RIGHT);
+                        }
+                    }
+                    else{
+                        notifyFailure(new HDLLinkCode(HDLLinkCode.HDL_OBJECT_NOT_SUPPORT.getCode(), "Object Name:" + msg));
+                    }
+                } catch (Exception e) {
+                    notifyFailure(new HDLLinkCode(HDLLinkCode.HDL_APPLICATION_CODE.getCode(), e.getMessage()));
+                }
+            }
+        };
+        //娉ㄥ唽鐩戝惉
+        registerListener();
+    }
+
+    /**
+     * 鍙戦�乁DP鎴栬�匱CP鏁版嵁(鍙傛暟鏈塵ac)
+     *
+     * @param sendAwaitTime 姣忔鍙戦�佺瓑寰呮椂闂�
+     * @param maxRetry      閲嶈瘯娆℃暟
+     * @param ipAddress     鍙戦�佺洰鏍嘔P
+     * @param port          鍙戦�佺洰鏍囩鍙�
+     * @param linkRequest   鍙戦�佸璞�
+     * @param listener      鍥炶皟
+     * @param isTcp         鏄惁TCP
+     * @param mac           璁惧mac
+     */
+    public HDLConnectHelper(Long sendAwaitTime, int maxRetry, String ipAddress, int port,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp,String mac) {
+        this(sendAwaitTime,maxRetry,ipAddress,port,linkRequest,listener,isTcp);
+        this.mac = mac;
+    }
+
+    /**
+     * 鎸夌収鎸囧畾娆℃暟鍙戯紝鍥炶皟
+     *
+     * @param maxRetry    閲嶈瘯娆℃暟
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param port        鍙戦�佺洰鏍囩鍙�
+     * @param linkRequest 鍙戦�佸璞�
+     * @param listener    鍥炶皟
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(int maxRetry, String ipAddress, int port,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp) {
+        this(DEF_SEND_TIMEOUT, maxRetry, ipAddress, port, linkRequest, listener, isTcp);
+    }
+
+    /**
+     * 鎸夌収鎸囧畾娆℃暟鍙戯紝鍥炶皟
+     *
+     * @param maxRetry    閲嶈瘯娆℃暟
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param listener    鍥炶皟
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(int maxRetry, String ipAddress,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp) {
+        this(maxRetry, ipAddress, isTcp ? TCP_PORT : UDP_PORT, linkRequest, listener, isTcp);
+    }
+
+    /**
+     * 鎸夌収鎸囧畾娆℃暟鍙戯紝涓嶅洖璋�
+     *
+     * @param maxRetry    閲嶈瘯娆℃暟
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(int maxRetry, String ipAddress,
+                            LinkRequest linkRequest, boolean isTcp) {
+        this(maxRetry, ipAddress, linkRequest, null, isTcp);
+    }
+
+    /**
+     * 鎸夌収榛樿閲嶅彂鏈哄埗鍙戦��
+     *
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param port        鍙戦�佺洰鏍囩鍙�
+     * @param linkRequest 鍙戦�佸璞�
+     * @param listener    鍥炶皟
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(String ipAddress, int port,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp) {
+        this(DEF_MAX_RETRY, ipAddress, port, linkRequest, listener, isTcp);
+    }
+
+    /**
+     * 榛樿绔彛鍙戦��
+     *
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param listener    鍥炶皟
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(String ipAddress,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp) {
+        this(DEF_SEND_TIMEOUT, DEF_MAX_RETRY, ipAddress, isTcp ? TCP_PORT : UDP_PORT, linkRequest, listener, isTcp);
+    }
+
+    /**
+     * 榛樿绔彛鍙戦��(鍙傛暟鏈塵ac)
+     *
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param listener    鍥炶皟
+     * @param isTcp       鏄惁TCP
+     * @param mac         璁惧mac
+     */
+    public HDLConnectHelper(String ipAddress,
+                            LinkRequest linkRequest, HdlSocketListener listener, boolean isTcp,String mac) {
+        this(DEF_SEND_TIMEOUT, DEF_MAX_RETRY, ipAddress, isTcp ? TCP_PORT : UDP_PORT, linkRequest, listener, isTcp,mac);
+    }
+
+
+
+    /**
+     * 鍙戦�佷竴娆�
+     *
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(String ipAddress, LinkRequest linkRequest, boolean isTcp) {
+        this(DEF_SEND_TIMEOUT, DEF_SEND_ONE, ipAddress, isTcp ? TCP_PORT : UDP_PORT, linkRequest, null, isTcp);
+    }
+
+    /**
+     * 鍙戦�佷竴娆�
+     *
+     * @param ipAddress   鍙戦�佺洰鏍嘔P
+     * @param linkRequest 鍙戦�佸璞�
+     * @param isTcp       鏄惁TCP
+     */
+    public HDLConnectHelper(Long timeout,String ipAddress, LinkRequest linkRequest, boolean isTcp) {
+        this(timeout, DEF_SEND_ONE, ipAddress, isTcp ? TCP_PORT : UDP_PORT, linkRequest, null, isTcp);
+    }
+
+
+
+    /**
+     * 娉ㄥ唽鐩戝惉
+     */
+    private void registerListener() {
+        if (!TextUtils.isEmpty(replyTopic) && null != listener) {
+            EventDispatcher.getInstance().register(replyTopic, eventListener);
+        }
+    }
+
+    /**
+     * 绉婚櫎鐩戝惉
+     */
+    private void removeListener() {
+        if (!TextUtils.isEmpty(replyTopic)) {
+            EventDispatcher.getInstance().remove(replyTopic, eventListener);
+        }
+    }
+
+    public static boolean isLocal() {
+        String ip = HDLLinkConfig.getInstance().getIpAddress();
+        if (ip == null) {
+            //濡傛槸鏈湴鏄彲浠ユ悳绱㈠埌ip鐨�
+            return false;
+        }
+
+        //鏈湴鏄彲浠ヨ繙绋嬫垚鍔熺殑
+        return HDLTcpConnect.getTcpSocketBoot(ip).isConnected();
+    }
+
+    public void send() {
+
+        getSendThread().scheduleWithFixedDelay(new Runnable() {
+            @Override
+            public void run() {
+                //鍙戦�佹鏁板皬浜庨噸鍙戞鏁�
+                if ((sendNumber.get() < maxRetry)) {
+                    try {
+
+                        //杩樻病鏈夋敹鍒板洖澶嶏紝鍐嶅彂閫�
+                        if (!isSend.get()) {
+                            sendNumber.set(sendNumber.get() + 1);
+
+                            //濡傛槸tcp鎴栬�卪qtt
+                            if (isTcp) {
+                                //mqtt
+                                if (TextUtils.isEmpty(ipAddress) || !HDLTcpConnect.getTcpSocketBoot(ipAddress).isConnected()) {
+                                    if (!linkRequest.getTopic().endsWith("heartbeat")) {//蹇冭烦涓婚鏁版嵁杩囧锛岃繃婊や笅
+                                        //LogUtils.i("蹇冭烦鍖呭彂閫佹暟鎹細\r\n" + new String(linkRequest.getCloudSendBytes()));
+                                    } else {
+                                        return;//浜戠鎯呭喌涓嬶紝蹇冭烦鍙互涓嶇敤
+                                    }
+                                    String requestTopic = linkRequest.getCloudTopic();
+                                    byte[] encryBytes = null;
+                                    GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getLocalGateway(mac);
+                                    if (gatewayBean != null && getGatewayTypeList().contains(gatewayBean.getGatewayType())) {
+                                        //姣背娉㈣繙绋媘qtt绉橀挜涓嶄竴鏍�
+                                        encryBytes = EncryptUtil.encryBytes(linkRequest.getCloudSendBytes(), gatewayBean.getAesKey());
+                                    } else {
+                                        encryBytes = EncryptUtil.encryBytes(linkRequest.getCloudSendBytes(), HDLLinkConfig.getInstance().getAesKey());
+                                    }
+                                    if (MqttRecvClient.getInstance() != null) {
+                                        MqttRecvClient.getInstance().send(requestTopic, encryBytes);
+                                    }
+                                    LogUtils.i("杩滅▼鍙戦�佹暟鎹細" + linkRequest.getCloudTopic() + "\r\n" + new String(linkRequest.getCloudSendBytes()));
+                                }
+                                //鏈湴TCP
+                                else {
+                                    if (!linkRequest.getTopic().endsWith("heartbeat")) {//蹇冭烦涓婚鏁版嵁杩囧锛岃繃婊や笅
+                                        LogUtils.i("鏈湴鍙戦�佹暟鎹細\r\n" + new String(linkRequest.getSendBytes()));
+                                    }
+                                    HDLTcpConnect.getTcpSocketBoot(ipAddress).sendMsg(EncryptUtil.getEncryBytes(linkRequest));
+                                }
+                            } else {
+                                //濡傛灉鏄痷dp
+                                LogUtils.i("鏈湴鍙戦�佹暟鎹甎DP锛�" + new String(linkRequest.getSendBytes()));
+                                HDLUdpConnect.getInstance().getUdpBoot().sendMsg(ipAddress, port, EncryptUtil.getEncryBytes(linkRequest));
+                            }
+                        }
+                    } catch (Exception e) {
+                        LogUtils.e("鏁版嵁鍙戦�佸紓甯革細", e.getMessage());
+                    }
+                } else {
+                    //瓒呭嚭閲嶅彂娆℃暟骞舵病鏈夋敹鍒板洖澶�
+                    if (!isSend.get()) {
+                        if (linkRequest.getTopic().endsWith("heartbeat")) {//蹇冭烦涓婚鍏堜笉閫氱煡
+                            notifyFailure(null);
+                        } else {
+                            if (!TextUtils.isEmpty(replyTopic) && null != listener) {//闇�瑕佹墦鍗板嚭澶辫触鐨勬棩蹇�
+                                LogUtils.e("鍙戦�佸け璐ユ暟鎹富棰�:" + linkRequest.getTopic());
+                            }
+                            if (isTcp) {
+                                //mqtt
+                                if (TextUtils.isEmpty(ipAddress) || !HDLTcpConnect.getTcpSocketBoot(ipAddress).isConnected()) {
+                                    notifyFailure(HDLLinkCode.HDL_GATEWAY_REMOTE_NOT_RESPONSE);
+                                }
+                                //鏈湴TCP锛屽苟鏄繛鎺ョ姸鎬�
+                                else {
+                                    notifyFailure(HDLLinkCode.HDL_TIMEOUT_ERROR);
+                                }
+                            } else {
+                                notifyFailure(HDLLinkCode.HDL_TIMEOUT_ERROR);
+                            }
+                        }
+                    }
+                }
+            }
+        }, 0, sendAwaitTime, TimeUnit.MILLISECONDS);
+        //initialdelay - 棣栨鎵ц鐨勫欢杩熸椂闂� 0
+        //delay - 涓�娆℃墽琛岀粓姝㈠拰涓嬩竴娆℃墽琛屽紑濮嬩箣闂寸殑寤惰繜
+    }
+
+    /**
+     * 鑾峰彇鍙戦�佺嚎绋�
+     *
+     * @return 杩斿洖鑾峰彇鍒扮殑绾跨▼
+     */
+    private ScheduledExecutorService getSendThread() {
+        if (sendThread == null) {
+            sendThread = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+        }
+        return sendThread;
+    }
+
+    /**
+     * 鍙戦�佸け璐�
+     */
+    private void notifyFailure(HDLLinkCode hdlLinkCode) {
+        //绉婚櫎鐩戝惉
+        removeListener();
+        if (sendThread != null) {
+            sendThread.shutdownNow();
+            sendThread = null;
+        }
+        if (listener != null && hdlLinkCode != null) {
+            listener.onFailure(hdlLinkCode);
+            listener = null;
+        }
+    }
+
+    /**
+     * 鏀寔姣背绫诲瀷
+     *
+     * @return 绫诲瀷鍒楄〃
+     */
+    public static List<String> getGatewayTypeList() {
+        List<String> typeList = new ArrayList<>();
+        typeList.add("sensor.mmv_sleep");//鐫$湢姣背娉pk
+        typeList.add("sensor.mmv_pose");//濮挎�佹绫虫尝spk
+        return typeList;
+    }
+
+    private void notifySucceed(Object msg) {
+        //绉婚櫎鐩戝惉
+        removeListener();
+        if (sendThread != null) {
+            sendThread.shutdownNow();
+            sendThread = null;
+        }
+        if (listener != null) {
+            listener.onSucceed(msg);
+            listener = null;
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLTcpConnect.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLTcpConnect.java
new file mode 100644
index 0000000..9ddf6ad
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLTcpConnect.java
@@ -0,0 +1,143 @@
+package com.hdl.sdk.link.core.connect;
+
+import com.google.gson.JsonObject;
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.IdUtils;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.bean.request.BroadcastRequest;
+import com.hdl.sdk.link.core.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.protocol.LinkMessageDecoder;
+import com.hdl.sdk.link.core.protocol.LinkMessageEncoder;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+import com.hdl.sdk.link.socket.TcpSocketBoot;
+import com.hdl.sdk.link.socket.SocketOptions;
+import com.hdl.sdk.link.socket.client.IHeartbeat;
+import com.hdl.sdk.link.socket.client.TcpClient;
+import com.hdl.sdk.link.socket.codec.MessagePipeLine;
+import com.hdl.sdk.link.socket.listener.ConnectStatusListener;
+
+/**
+ * Created by Tong on 2021/9/26.
+ * 1銆侀�氳繃Udp 缁勬挱鎴栬�呭箍鎾悳绱㈢綉鍏�
+ * 2銆侀�氳繃Udp 鑾峰彇Tcp ip 绔彛缁熶竴8586
+ */
+public class HDLTcpConnect {
+
+    /**
+     * tcp榛樿绔彛
+     */
+    private static final int TCP_PORT = 8586;
+
+
+    private ConnectStatusListener statusListener;
+
+    private HDLTcpConnect() {
+        statusListener = new ConnectStatusListener() {
+            @Override
+            public void onConnecting() {
+                broadcastRequest();
+            }
+
+            @Override
+            public void onConnected() {
+
+            }
+
+            @Override
+            public void onConnectFailed() {
+
+            }
+        };
+    }
+
+    /**
+     * 骞挎挱鑷韩淇℃伅缁欎富缃戝叧
+     */
+    private void broadcastRequest() {
+        String time = String.valueOf(System.currentTimeMillis());
+        if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
+            LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
+            return;
+        }
+        BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
+        HDLUdpConnect.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+        HDLUdpConnect.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) {
+
+            }
+        });
+        HDLUdpConnect.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+    }
+
+    private static class SingletonInstance {
+        private static final HDLTcpConnect INSTANCE = new HDLTcpConnect();
+    }
+
+    public static HDLTcpConnect getInstance() {
+        return SingletonInstance.INSTANCE;
+    }
+
+    /**
+     * 閫氳繃IP鍙婄鍙f壘鍑鸿繛鎺ュ鎴风锛屽鏋滃綋鍓嶆病鏈夎繛鎺ャ�備富瑕佹槸閽堝璋冭瘯杞欢浣跨敤锛屾敮鎸佽繛鎺ヤ富缃戝叧銆佷粠缃戝叧
+     *
+     * @param ip 杩炴帴鐨勭綉鍏矷P
+     * @return
+     */
+    public static synchronized TcpSocketBoot getTcpSocketBoot(String ip) {
+        return initTcp(ip);
+    }
+
+    static  int dddd;
+    /**
+     * 鍒濆鍖杢cp杩炴帴
+     *
+     * @param ip 杩炴帴鐨勭綉鍏矷P
+     * @return
+     */
+    public static synchronized TcpSocketBoot initTcp(String ip) {
+        int port = TCP_PORT;
+        TcpSocketBoot tcpSocketBoot = TcpSocketBoot.getByEndPoint(ip, port);
+
+        if (null == tcpSocketBoot) {
+            final SocketOptions options = new SocketOptions();
+            final MessagePipeLine pipeLine = new MessagePipeLine();
+            pipeLine.add(new LinkMessageDecoder());
+            pipeLine.add(new LinkMessageEncoder());
+            options.setHandleMessage(pipeLine);
+            tcpSocketBoot = TcpClient.init(ip, port, options);
+            tcpSocketBoot.SetHeartbeat(new IHeartbeat() {
+                @Override
+                public void heartbeat() {
+
+                    String time = String.valueOf(System.currentTimeMillis());
+
+                    JsonObject jsonObject = new JsonObject();
+                    jsonObject.addProperty("id", IdUtils.getUUId());
+                    jsonObject.addProperty("time_stamp", time);
+
+                    GatewayBean gatewayBean= HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(ip);
+                    if(gatewayBean==null){
+                        return;
+                    }
+                    String topic = String.format(TopicConstant.HEARTBEAT, gatewayBean.getOid());
+
+                    LinkRequest request = new LinkRequest(topic, jsonObject.toString(), false);
+                    new HDLConnectHelper(ip, request, null, true).send();
+                }
+            });
+        }
+        return tcpSocketBoot;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLUdpConnect.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLUdpConnect.java
new file mode 100644
index 0000000..cff6a99
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLUdpConnect.java
@@ -0,0 +1,619 @@
+package com.hdl.sdk.link.core.connect;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.IpUtils;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.bean.request.AuthenticateRequest;
+import com.hdl.sdk.link.core.bean.response.AuthenticateResponse;
+import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
+import com.hdl.sdk.link.core.bean.response.GatewaySearchBean;
+import com.hdl.sdk.link.core.bean.response.NetworkAccessBroadcastResponse;
+import com.hdl.sdk.link.core.callback.BaseCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.utils.IdUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.protocol.LinkMessageDecoder;
+import com.hdl.sdk.link.core.protocol.LinkMessageEncoder;
+import com.hdl.sdk.link.socket.client.UdpClient;
+import com.hdl.sdk.link.socket.codec.MessagePipeLine;
+import com.hdl.sdk.link.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.link.socket.udp.UdpSocketOptions;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static com.hdl.sdk.link.common.config.TopicConstant.DEIVCE_AUTH_REQUEST;
+
+/**
+ * Created by jlchen on 11/11/21.
+ *
+ * @Description : HDLAuthSocket 鐢变簬鍓嶆湡宸茬粡鍛藉悕濂斤紝涓嶅仛鏇存敼锛屽彲鐢ㄤ綔Udp鏈嶅姟绔娇鐢�
+ */
+public class HDLUdpConnect {
+    private static final String TAG = "HDLAuth";
+    /**
+     * udp榛樿绔彛
+     */
+    public static final int UDP_PORT = 8585;
+    /**
+     * 鍥犱负鑰冭檻鍒颁娇鐢ㄤ竴涓鍙o紝瑕佹敮鎸佹帴鏀跺缃戝叧鐨勬暟鎹紝鎵�浠ュ彧鍏佽浣跨敤涓�涓�
+     */
+    private static UdpSocketBoot udpSocketBoot;
+    //    private EventListener authEvent;
+    //鎼滅储缃戝叧
+    private EventListener searchGatewayEvent;
+    /**
+     * udp榛樿缁勬挱ip
+     */
+    private static final String UDP_GROUP_IP = "239.0.168.188";
+
+    private static boolean bindSuccess;
+
+    public static boolean isBindSuccess() {
+        return bindSuccess;
+    }
+
+    /**
+     * instance
+     */
+    private volatile static HDLUdpConnect instance;
+
+    private HDLUdpConnect() {
+        initListenerGatewayEvent();
+        initSearchGatewayEvent();
+    }
+
+    /**
+     * getInstance
+     *
+     * @return HDLAuthSocket
+     */
+    public static synchronized HDLUdpConnect getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkConfig.class) {
+                if (instance == null) {
+                    instance = new HDLUdpConnect();
+                }
+            }
+        }
+        return instance;
+    }
+
+    private UdpSocketOptions getUdpOptions() {
+        final UdpSocketOptions options = new UdpSocketOptions();
+        WifiManager manager = (WifiManager) HDLLinkLocalSdk.getInstance().getContext().getApplicationContext()
+                .getSystemService(Context.WIFI_SERVICE);
+        options.setWifiManager(manager);
+        final MessagePipeLine pipeLine = new MessagePipeLine();
+        pipeLine.add(new LinkMessageDecoder());
+        pipeLine.add(new LinkMessageEncoder());
+        options.setHandleMessage(pipeLine);
+        return options;
+    }
+
+
+    /**
+     * 鑾峰彇褰撳墠udp瀵硅薄锛屽鏋滀笉瀛樺湪灏卞垱寤�
+     *
+     * @return 杩斿洖褰撳墠瀵硅薄
+     */
+    public synchronized UdpSocketBoot getUdpBoot() {
+        if (null == initUdp()) {
+            return null;
+        }
+        return udpSocketBoot;
+    }
+
+
+    /**
+     * 鍒濆鍖杣dp 鐩戝惉鍔熻兘
+     *
+     * @return 杩斿洖褰撳墠瀵硅薄
+     */
+    public synchronized UdpSocketBoot initUdp() {
+        try {
+            if (udpSocketBoot == null) {
+                udpSocketBoot = UdpClient.init("0.0.0.0",UDP_PORT, getUdpOptions());
+                udpSocketBoot.bind();
+                bindSuccess=true;
+            }
+        } catch (Exception e) {
+            LogUtils.e("鍒濆鍖栫綉鍏冲け璐�:"+e.getMessage());
+            return null;
+        }
+
+        return udpSocketBoot;
+    }
+
+
+    /**
+     * 寮�濮嬬洃鍚拰鍙戣捣鍏ョ綉鍙婅璇佽姹�
+     *
+     * @param request  璁よ瘉璇锋眰淇℃伅
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
+        HDLLinkConfig.getInstance().clearConfig();
+        //1.鍚姩Socket 寮�鍚洃鍚�
+        getUdpBoot();
+        //2.鏋勫缓鐩戝惉Listener
+//        authEvent =
+        //3.鐩戝惉缃戝叧骞挎挱鐨勫叆缃戞寚浠�
+        EventDispatcher.getInstance().register(TopicConstant.GATEWAY_AUTH_BROADCAST, new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                NetworkAccessBroadcastResponse bean = getNetworkAccessBroadcastResponse(msg);
+                if (bean != null) {
+                    LogUtils.i(TAG, "缃戝叧鍏ョ綉骞挎挱IP: " + bean.getIPAddress());
+                    String ipStr = bean.getIPAddress();
+                    if (!TextUtils.isEmpty(ipStr)) {
+                        sendAuthenticateRequest(ipStr, request, callBack);
+                    }
+                }
+                //绉婚櫎鐩戝惉
+                EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST);
+                LogUtils.i(TAG, "绉婚櫎鐩戝惉 authEvent");
+            }
+        });
+    }
+
+    /**
+     * 缁撴潫鐩戝惉鍏ョ綉鍙婅璇佸箍鎾�
+     */
+    public void endAuthenticateRequest() {
+        //绉婚櫎鐩戝惉
+        EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST);
+    }
+
+    /**
+     * 鍙戦�佸叆缃戝強璁よ瘉璇锋眰
+     *
+     * @param ip       缃戝叧IP
+     * @param request  璁よ瘉璇锋眰淇℃伅
+     * @param callBack 缁撴灉鍥炶皟
+     */
+    public void sendAuthenticateRequest(String ip, AuthenticateRequest request, HDLLinkCallBack callBack) {
+        if (request == null) {
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
+        }
+        String topic = DEIVCE_AUTH_REQUEST;
+        Gson gs = new Gson();
+        String requestStr = gs.toJson(request);
+        LinkRequest linkRequest = new LinkRequest(topic, requestStr, false);
+//        linkRequest.setReplyTopic(requestStr + "_reply");
+        new HDLConnectHelper(ip, linkRequest, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                try {
+                    AuthenticateResponse bean = getAuthenticateResponseBean(msg);
+                    if (bean != null) {
+                        if (bean.getCode().equals("200")) {
+                            String localSecret = "";
+                            String gatewayId = "";
+                            String ipAddress = "";
+                            if (bean.getAuth() != null) {
+                                localSecret = bean.getAuth().getLocalSecret();
+                            }
+                            if (bean.getObjects() != null) {
+                                gatewayId = bean.getObjects().getGatewayID();
+                                ipAddress = bean.getObjects().getIPAddress();
+                            }
+                            //鍒ゆ柇缃戝叧鏄惁宸茬粡娉ㄥ唽鍒颁簯绔�
+                            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);
+                                callBack.onSuccess("璁よ瘉鎴愬姛");
+                            }
+                        } else if (bean.getCode().equals("14013")) {
+                            //璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_MAC_KEY_ERROR));
+                        } else {
+                            //璁よ瘉澶辫触锛岄敊璇爜锛�
+                            LogUtils.e("璁よ瘉澶辫触锛岄敊璇爜锛�" + bean.getCode());
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR));
+                        }
+                    } else {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
+                    }
+                } catch (Exception e) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR));
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                LogUtils.i(TAG, "onFailure: ");
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, false).send();
+    }
+
+//    /**
+//     * 鍙戦�佸叆缃戝強璁よ瘉璇锋眰
+//     *
+//     * @param callBack 缁撴灉鍥炶皟
+//     */
+//    public void sendAuthenticateRequest(CallBack callBack) {
+//        String macStr = "AA000000000000BB";
+//        String secret = "87ae414b7a853f65";
+//        String mac_key = stringToMD5(stringToMD5(macStr + secret));
+//
+//        String versionString = "HDL_V1.0.1";
+//        String time = String.valueOf(System.currentTimeMillis());
+//
+//        //1.璁剧疆璁よ瘉淇℃伅
+//        AuthenticateRequest.RequestBean requestBean = new AuthenticateRequest.RequestBean();
+//        requestBean.setMAC(macStr);
+//        requestBean.setSupplier("HDL");
+//        requestBean.setFirmwareVersion(versionString);
+//        requestBean.setHardwareModel("1956F");
+//        AuthenticateRequest.AuthBean authbean = new AuthenticateRequest.AuthBean();
+//        authbean.setSpk("ir.module");
+//        authbean.setMACKey(mac_key);
+//        authbean.setRequest(requestBean);
+//
+//
+//        //2.璁剧疆璁惧淇℃伅
+//        AuthenticateDeviceInfoBean infoBean = new AuthenticateDeviceInfoBean();
+//        infoBean.setDeviceMAC(macStr);
+//        infoBean.setIPMAC(macStr);
+//        infoBean.setDeviceName("HDL闈㈡澘");
+//        infoBean.setAccessMode("HDL");
+//        infoBean.setOID(getOid());
+//        infoBean.setSid(getSid());
+////        infoBean.set
+//        AuthenticateRequest.VersionBean[] versionBeans = new AuthenticateRequest.VersionBean[]{new AuthenticateRequest.VersionBean("FW", versionString), new AuthenticateRequest.VersionBean("HW", "1956F")};
+//        infoBean.setVersions(versionBeans);
+//        AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, infoBean, authbean);
+//
+//        String ip = IpUtils.getBroadcastAddress();
+//        ip = "192.168.10.102";
+//        sendAuthenticateRequest(ip, request, callBack);
+//    }
+
+    public interface SearchGatewayCallBack extends BaseCallBack {
+        /**
+         * 鎼滅储缃戝叧鎴愬姛
+         *
+         * @param gatewaySearchBean
+         */
+        void onSuccess(GatewaySearchBean gatewaySearchBean);
+    }
+
+
+    /**
+     * 鏆傚仠鎼滅储缃戝叧
+     */
+    public void endSearchAllGateway() {
+
+    }
+
+    /**
+     * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void searchGatewayMulticast(SearchGatewayCallBack callBack) {
+        searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, UDP_PORT, callBack);
+    }
+
+    /**
+     * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void searchGatewayBroadcast(SearchGatewayCallBack callBack) {
+        if (!HDLLinkConfig.getInstance().checkIfCertified()) {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+            return;
+        }
+        String ip = IpUtils.getBroadcastAddress();
+        searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip, UDP_PORT, callBack);
+    }
+
+    /**
+     * 閫氱敤鍙戦�佹寚浠�
+     * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
+     *
+     * @param topic     鍙戦�佹暟鎹�
+     * @param bodyStr   鍥炲鐨勪富棰�
+     * @param broadcast 鏄惁瑕佸箍鎾�
+     * @param 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));
+            }
+            return;
+        }
+
+        if (!HDLLinkConfig.getInstance().checkIfCertified()) {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+            return;
+        }
+
+        LinkRequest message = new LinkRequest(topic, bodyStr, false);
+        String ip = HDLLinkConfig.getInstance().getIpAddress();
+        if (broadcast) {
+            ip = IpUtils.getBroadcastAddress();
+        }
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess((LinkResponse) msg);
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }
+                , false).send();
+    }
+
+    /**
+     * 閫氱敤鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
+     *
+     * @param topic     鍙戦�佹暟鎹�
+     * @param bodyStr   鍥炲鐨勪富棰�
+     * @param broadcast 鏄惁骞挎挱
+     */
+    public void udpSendMsg(String topic, String bodyStr, boolean broadcast) {
+        if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
+            LogUtils.e("udpSendMsg", "鍙傛暟涓嶈兘涓虹┖");
+            return;
+        }
+        if (!HDLLinkConfig.getInstance().checkIfCertified()) {
+            LogUtils.e("udpSendMsg", "鏈璇侊紝璇峰厛璁よ瘉");
+            return;
+        }
+        LinkRequest message = new LinkRequest(topic, bodyStr, HDLLinkConfig.getInstance().isLocalEncrypt());
+        String ip = HDLLinkConfig.getInstance().getIpAddress();
+        if (broadcast) {
+            ip = IpUtils.getBroadcastAddress();
+        }
+        new HDLConnectHelper(ip, message, false).send();
+    }
+
+    private GatewaySearchBean getGatewaySearchBean(Object msg) {
+        GatewaySearchBean searchBean = null;
+        if (msg instanceof LinkResponse) {
+            LinkResponse linkResponse = (LinkResponse) msg;
+            String data = linkResponse.getData();
+            if (!TextUtils.isEmpty(data)) {
+                final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
+                }.getType());
+                searchBean = response.getObjects();
+            }
+        }
+        return searchBean;
+    }
+
+    private AuthenticateResponse getAuthenticateResponseBean(Object msg) {
+        AuthenticateResponse mBean = null;
+        if (msg instanceof LinkResponse) {
+            LinkResponse linkResponse = (LinkResponse) msg;
+            String data = linkResponse.getData();
+            if (!TextUtils.isEmpty(data)) {
+                AuthenticateResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<AuthenticateResponse>() {
+                }.getType());
+                mBean = response;
+            }
+
+        }
+        return mBean;
+    }
+
+    private NetworkAccessBroadcastResponse getNetworkAccessBroadcastResponse(Object msg) {
+        NetworkAccessBroadcastResponse mBean = null;
+        if (msg instanceof LinkResponse) {
+            LinkResponse linkResponse = (LinkResponse) msg;
+            String data = linkResponse.getData();
+            if (!TextUtils.isEmpty(data)) {
+                NetworkAccessBroadcastResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<NetworkAccessBroadcastResponse>() {
+                }.getType());
+                mBean = response;
+            }
+
+        }
+        return mBean;
+    }
+
+    /**
+     * 缃戝叧鎼滅储鐩稿叧
+     */
+    private static final int MAX_SEARCH_COUNT = 10;//鎬诲叡鎼滅储娴嬭瘯
+    private final AtomicInteger searchGatewayCount = new AtomicInteger(0);
+    ;
+    private final AtomicBoolean isSearchGatewaySuccess = new AtomicBoolean(true);
+    private String searchGatewayId = "";
+    private SearchGatewayCallBack mSearchGatewayCallBack;
+
+    private void initSearchGatewayEvent() {
+        LogUtils.i("鎼滅储缃戝叧", "initSearchGatewayEvent");
+        searchGatewayEvent = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                try {
+                    if (msg instanceof LinkResponse) {
+                        LinkResponse linkResponse = (LinkResponse) msg;
+                        String data = linkResponse.getData();
+                        if (!TextUtils.isEmpty(data)) {
+                            final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
+                            }.getType());
+                            GatewaySearchBean searchBean = response.getObjects();
+                            if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) {
+                                if (searchBean.getGatewayId().contains(searchGatewayId)) {
+                                    removeSearchGatewayEvent();//绉婚櫎鎼滅储缃戝叧鐩戝惉
+                                    isSearchGatewaySuccess.set(true);//鎼滅储鎴愬姛鏍囪
+                                    searchGatewayCount.set(11);//娆℃暟鏍囪
+                                    HDLLinkConfig.getInstance().setLocalEncrypt(searchBean.isLocalEncrypt());//璁剧疆鏄惁鍔犲瘑
+                                    if (mSearchGatewayCallBack != null) {
+                                        mSearchGatewayCallBack.onSuccess(searchBean);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+
+                }
+            }
+        };
+    }
+
+    private void initListenerGatewayEvent() {
+        LogUtils.i("鍒濆鍖栨案涔呯洃鍚綉鍏冲箍鎾簨浠讹紝涓嶇敤绉婚櫎姝や簨浠�");
+        EventListener gatewayEvent = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                try {
+                    if (msg instanceof LinkResponse) {
+                        LinkResponse linkResponse = (LinkResponse) msg;
+                        String data = linkResponse.getData();
+//                        LogUtils.i("鎺ユ敹鍒扮綉鍏充俊鎭細" + data);
+                        if (!TextUtils.isEmpty(data)) {
+                            final BaseLocalResponse<GatewayBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewayBean>>() {
+                            }.getType());
+                            GatewayBean gateway = response.getObjects();
+                            if (gateway != null) {
+                                if (!TextUtils.isEmpty(HDLLinkConfig.getInstance().getGatewayId())
+                                        && !TextUtils.isEmpty(HDLLinkConfig.getInstance().getHomeId())) {
+                                    //涓荤綉鍏冲苟涓旀槸褰撳墠缁戝畾鐨勭綉鍏�
+                                    if ("true".equals(gateway.getMaster().toLowerCase())) {
+                                        if (gateway.getGatewayId().equals(HDLLinkConfig.getInstance().getGatewayId())
+                                                || gateway.getDevice_mac().equals(HDLLinkConfig.getInstance().getGatewayId())
+                                                || gateway.getOid().equals(HDLLinkConfig.getInstance().getGatewayId())
+                                                || gateway.getHomeId().equals(HDLLinkConfig.getInstance().getHomeId())) {
+                                            HDLLinkConfig.getInstance().setLocalEncrypt(gateway.getIsLocalEncrypt());//璁剧疆鏄惁鍔犲瘑
+                                            HDLLinkConfig.getInstance().setIpAddress(gateway.getIp_address());
+                                            //鏇存柊褰撳墠缃戝叧鐨勪俊鎭�
+                                            HDLLinkConfig.getInstance().reSaveConfig();
+                                        }
+                                    }
+                                }
+
+                                if(TextUtils.isEmpty(gateway.getHomeId())||gateway.getHomeId().equals(HDLLinkConfig.getInstance().getHomeId())) {
+                                    HDLTcpConnect.initTcp(gateway.getIp_address());//鍒濆鍖朤CP杩炴帴
+                                }
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+
+                }
+            }
+        };
+        EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, gatewayEvent);
+    }
+
+    /**
+     * 鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
+     *
+     * @param gatewayId 缃戝叧id
+     * @param ipAddress 鐩爣鐨処P鍦板潃
+     * @param port      鐩爣鐨勭鍙�
+     * @param callBack  鍥炶皟
+     */
+    public void searchGateway(String gatewayId, String ipAddress, int port, SearchGatewayCallBack callBack) {
+        this.searchGatewayId = gatewayId;
+        this.mSearchGatewayCallBack = callBack;
+        //閲嶇疆鍙傛暟
+        searchGatewayCount.set(0);
+        isSearchGatewaySuccess.set(false);
+        String time = String.valueOf(System.currentTimeMillis());
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("id", IdUtils.getUUId());
+        jsonObject.addProperty("time_stamp", time);
+        LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH,
+                jsonObject.toString(), false);
+        //娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+        registerSearchGatewayEvent();
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                while (searchGatewayCount.get() < 10 && (!isSearchGatewaySuccess.get())) {
+                    try {
+                        //鎼滅储缃戝叧
+                        searchGatewayCount.set(searchGatewayCount.get() + 1);
+                        LogUtils.i("鎼滅储缃戝叧绗�" + searchGatewayCount.get() + "娆�");
+                        new HDLConnectHelper(ipAddress, message, false).send();
+                        Thread.sleep(1000L);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                if (!isSearchGatewaySuccess.get()) {
+                    //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�
+                    callBackSearchGatewayTimeout();
+                    LogUtils.e("鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�");
+                }
+            }
+        }).start();
+    }
+
+
+    /**
+     * 娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+     */
+    private void registerSearchGatewayEvent() {
+        LogUtils.i("娉ㄥ唽鎼滅储缃戝叧鐩戝惉");
+        EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent);
+    }
+
+    /**
+     * 绉婚櫎鎼滅储缃戝叧鐩戝惉
+     */
+    private void removeSearchGatewayEvent() {
+        LogUtils.i("鎼滅储缃戝叧", "绉婚櫎鎼滅储缃戝叧鐩戝惉");
+        EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent);
+    }
+
+    /**
+     * 鍥炶皟鎼滅储缃戝叧瓒呮椂
+     */
+    private void callBackSearchGatewayTimeout() {
+        removeSearchGatewayEvent();
+        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                if (mSearchGatewayCallBack != null) {
+                    mSearchGatewayCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEARCH_GATEWAY_TIMEOUT_ERROR));
+                }
+            }
+        });
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLZigbeeConnect.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLZigbeeConnect.java
new file mode 100644
index 0000000..cf10133
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLZigbeeConnect.java
@@ -0,0 +1,358 @@
+package com.hdl.sdk.link.core.connect;
+
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.ZigbeeResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.callback.ZigbeeCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Created by hxb on 2021/12/8.
+ * 鍘熺敓閫氳鐩稿叧鎺ュ彛
+ */
+public class HDLZigbeeConnect {
+
+    private static final String TAG="HDLZigbeeConnect";
+    private static HDLZigbeeConnect instance;
+    /**
+     * 鍐呴儴鐢紝涓昏鏄鐞嗗鐞嗘帀閫忎紶涓婚鍙妉ink涓婚鍚庯紝杩樺師Zigbee鍘熺敓鏁版嵁鍙婁富棰樼敤
+     */
+    private final String zigbeeAllTopic = "/Zigbee";
+
+    /**
+     * 杩斿洖褰撳墠瀹炰緥锛屼笉瀛樺湪灏卞垱寤哄苟鍚屾椂娉ㄥ唽鐩戝惉浜嬩欢
+     *
+     * @return
+     */
+    public static HDLZigbeeConnect getInstance() {
+        if (null == instance) {
+            instance = new HDLZigbeeConnect();
+            instance.initEventListener();
+        }
+        return instance;
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉Zigbee鎵�鏈夊師鐢熶富棰樺強鏁版嵁
+     *
+     * @param eventListener
+     */
+    public void registerListener(EventListener eventListener) {
+        if(null==eventListener){
+            return;
+        }
+        EventDispatcher.getInstance().register(zigbeeAllTopic, eventListener);
+    }
+
+    /**
+     * 绉婚櫎鐩戝惉Zigbee鍘熺敓涓婚鍙婃暟鎹�
+     *
+     * @param eventListener
+     */
+    public void removeListener(EventListener eventListener) {
+        if(null==eventListener){
+            return;
+        }
+        EventDispatcher.getInstance().remove(zigbeeAllTopic, eventListener);
+    }
+
+    /**
+     * 鍒濆鍖栫洃鍚簨浠�
+     */
+    private void initEventListener() {
+        final EventListener eventListener = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                try {
+                    if (msg instanceof LinkResponse) {
+                        LinkResponse linkResponse = (LinkResponse) msg;
+                        String body = linkResponse.getData();
+                        int index = body.indexOf("{");
+                        //zigbee鍥炲鐨勬暟鎹墠鏈変富棰橈紝鍚庨潰鎵嶆槸鏁版嵁
+                        if (index <= 0)
+                            return;
+
+                        String zigbeeTopic = body.substring(0, index).trim();
+                        //zigbee鐨勮礋杞芥暟鎹�
+                        String bodyData = body.substring(index);
+
+                        ZigbeeResponse zigbeeResponse = new ZigbeeResponse();
+                        zigbeeResponse.setTopic(zigbeeTopic);
+                        zigbeeResponse.setData(bodyData);
+                        String oid = null;
+                        //鏄惁鏄�氳繃涓荤綉鍏抽�忎紶涓婚
+                        if (linkResponse.getTopic().contains("/slaveoid/")) {
+                            oid = linkResponse.getTopic().split("/")[8];
+                        } else {
+                            oid = linkResponse.getTopic().split("/")[2];
+                        }
+                        zigbeeResponse.setOid(oid);
+                        for (GatewayBean gatewayBean : HDLLinkLocalGateway.getInstance().getGatewayList()) {
+                            if (oid.equals(gatewayBean.getGatewayId()) || oid.equals(gatewayBean.getDevice_mac()) || oid.equals(gatewayBean.getOid())) {
+                                //涓婇潰鐨刼id鍙兘鏄綉鍏砳d鎴栬�卪ac鎴栬�呮槸oid锛屼笉绠℃槸鍝釜缁熶竴浣跨敤oid琛ㄧず鏂瑰紡
+                                zigbeeResponse.setOid(gatewayBean.getOid());
+                                break;
+                            }
+                        }
+                        EventDispatcher.getInstance().post(zigbeeTopic, zigbeeResponse);
+                        //鍙戝竷Zigbee鍘熺敓涓婚鍙婃暟鎹�
+                        EventDispatcher.getInstance().post(zigbeeAllTopic, zigbeeResponse);
+                    }
+                } catch (Exception e) {
+                    LogUtils.e(TAG,"LinkResponse杞琙igbeeResponse寮傚父:"+ e.getMessage());
+                }
+            }
+        };
+        //
+        //娉ㄥ唽鐩存帴閫氳鐨勪富棰橈紝鍖呮嫭鐩存帴鍜屼富缃戝叧閫氳鎴栬�呯洿鎺ュ拰浠庣綉鍏抽�氳
+//        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_DOWN_REPLY, "+"), eventListener);
+
+        //娉ㄥ唽鐩存帴閫氳鐨勪富棰橈紝鍖呮嫭鐩存帴鍜屼富缃戝叧閫氳鎴栬�呯洿鎺ュ拰浠庣綉鍏抽�氳
+        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_UP, "+"), eventListener);
+
+        //娉ㄥ唽閫氳繃涓荤綉鍏抽�忎紶浠庣綉鍏崇殑涓婚
+//        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_DOWN_SLAVE_REPLY, "+", "+"), eventListener);
+
+        registerListener(String.format(TopicConstant.NATIVE_ZIGBEE_UP_SLAVE, "+", "+"), eventListener);
+    }
+
+    /**
+     * 鍙戦�佸師鐢熸暟鎹�
+     *
+     * @param gatewayOidOrGatewayId 鐩爣缃戝叧鐨刼id鎴栬�呯綉鍏矷d
+     * @param responeTopic          鍥炲涓婚
+     * @param payload               鍙戦�佹暟鎹�
+     * @param zigbeeCallBack        缁撴灉鍥炶皟
+     */
+    public void Send(String gatewayOidOrGatewayId,String responeTopic, String payload, final ZigbeeCallBack zigbeeCallBack) {
+        //濡傛灉鏈湴鏈夐摼鎺ヨ繖涓綉鍏�,鍒欑敤鏈湴杩炴帴
+        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
+        if (null == gatewayBean) {
+            LogUtils.i("鎵句笉鍒扮綉鍏筹紝Oid鏄�" + gatewayOidOrGatewayId);
+            if (null != zigbeeCallBack) {
+                zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+            return;
+        }
+
+        String tempTopic = String.format(TopicConstant.NATIVE_ZIGBEE_DOWN, gatewayOidOrGatewayId);
+        LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
+
+        if ("true".equals(gatewayBean.getMaster())) {
+            request.setCloudTopic(String.format(TopicConstant.NATIVE_ZIGBEE_DOWN, HDLLinkConfig.getInstance().getGatewayId()));
+        } else {
+            request.setCloudTopic(String.format(TopicConstant.NATIVE_ZIGBEE_DOWN_SLAVE, HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId));
+        }
+        request.setReplyTopic(responeTopic);
+//        final boolean[] isCallBack = {false};
+//        //閫忎紶鍛戒护涓婚澶勭悊
+//        final EventListener eventListener = new EventListener() {
+//            @Override
+//            public void onMessage(Object msg) {
+//                if (msg instanceof ZigbeeResponse) {
+//                    ZigbeeResponse linkResponse = (ZigbeeResponse) msg;
+//                    //TODO 濡傛灉閰嶇疆浠庣綉鍏崇殑淇℃伅锛岄�氳繃涓荤綉鍏宠浆杈撅紝杩欓噷oid瑕佸垽鏂笅
+//                    if (responeTopic.equals(linkResponse.getTopic())) {
+//                        isCallBack[0] = true;
+//                        removeListener(zigbeeAllTopic, this);
+//                        if (null != zigbeeCallBack) {
+//                            zigbeeCallBack.onSuccess(linkResponse.getData());
+//                        }
+//                    }
+//                }
+//            }
+//        };
+//        //娉ㄥ唽鐩戝惉
+//        registerListener(zigbeeAllTopic, eventListener);
+
+        long timeout = 8 * 1000;
+        /**
+         * 闇�瑕佺壒娈婂鐞嗕竴浜涗富棰�  闇�瑕佸欢闀胯秴鏃舵椂闂�
+         */
+        if (responeTopic.equals("Bind/SetBind_Respon") || responeTopic.equals("Bind/ClearBindInfo_Respon")) {
+            timeout = 20 * 1000;
+        }
+//        //涓�瀹氭椂闂村悗杩樻病鏈夋帴鏀跺埌鏁版嵁锛屽氨鍥炶皟澶辫触
+//        ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+//        scheduledExecutorService.schedule(new Runnable() {
+//            @Override
+//            public void run() {
+//                removeListener(zigbeeAllTopic, eventListener);
+//                scheduledExecutorService.shutdownNow();
+//                if (!isCallBack[0]) {
+//                    if (null != zigbeeCallBack) {
+//                        zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_FAILURE_ERROR));
+//                    }
+//                }
+//            }
+//        }, timeout, TimeUnit.SECONDS);
+        new HDLConnectHelper(timeout, 1, gatewayBean.getIp_address(), 8586, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof String) {
+                    if (null != zigbeeCallBack) {
+                        zigbeeCallBack.onSuccess(msg+"");
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (null != zigbeeCallBack) {
+                    zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
+    }
+
+
+
+    /**
+     * 鍙戦�佸師鐢熼�忎紶鍛戒护鏁版嵁
+     *
+     * @param gatewayOidOrGatewayId 鐩爣缃戝叧鐨刼id鎴栬�呯綉鍏矷d
+     * @param responeTopic          鍥炲涓婚
+     * @param payload               鍙戦�佹暟鎹�
+     * @param zigbeeCallBack        缁撴灉鍥炶皟
+     */
+    public void SendThrough(String gatewayOidOrGatewayId, String responeTopic, String payload, final ZigbeeCallBack zigbeeCallBack) {
+//        //濡傛灉鏈湴鏈夐摼鎺ヨ繖涓綉鍏�,鍒欑敤鏈湴杩炴帴
+//        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(gatewayOidOrGatewayId);
+//        if (null == gatewayBean) {
+//            LogUtils.i("鎵句笉鍒扮綉鍏筹紝Oid鏄�" + gatewayOidOrGatewayId);
+//            if (null != zigbeeCallBack) {
+//                zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+//            }
+//            return;
+//        }
+//        boolean isLocal = gatewayBean.getIsLocalGateway();
+//        //濡傛灉鏄湰鍦伴�氳
+//        if (isLocal == true) {
+//
+//            String tempTopic = String.format("/user/%s/custom/native/zigbee/down", gatewayOidOrGatewayId);
+//            String tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", gatewayOidOrGatewayId);
+//
+//            final boolean[] isCallBack = {false};
+//            //閫忎紶鍛戒护涓婚澶勭悊
+//            final EventListener eventListener = new EventListener() {
+//                @Override
+//                public void onMessage(Object msg) {
+//                    if (msg instanceof LinkResponse) {
+//                        LinkResponse linkResponse = (LinkResponse) msg;
+//                        //TODO 濡傛灉閰嶇疆浠庣綉鍏崇殑淇℃伅锛岄�氳繃涓荤綉鍏宠浆杈撅紝杩欓噷oid瑕佸垽鏂笅
+//                        String body = getZigbeeData(responeTopic, linkResponse);
+//                        if (null != body) {
+//                            isCallBack[0] = true;
+//                            removeListener(tempTopicReply, this);
+//                            if (null != zigbeeCallBack) {
+//                                zigbeeCallBack.onSuccess(body);
+//                            }
+//                        }
+//                    }
+//                }
+//            };
+//            //娉ㄥ唽鐩戝惉
+//            registerListener(tempTopicReply, eventListener);
+//
+//            //涓�瀹氭椂闂村悗杩樻病鏈夋帴鏀跺埌鏁版嵁锛屽氨鍥炶皟澶辫触
+//            ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+//            scheduledExecutorService.schedule(new Runnable() {
+//                @Override
+//                public void run() {
+//                    removeListener(tempTopicReply, eventListener);
+//                    scheduledExecutorService.shutdownNow();
+//                    if (!isCallBack[0]) {
+//                        if (null != zigbeeCallBack) {
+//                            zigbeeCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_FAILURE_ERROR));
+//                        }
+//                    }
+//                }
+//            }, 5, TimeUnit.SECONDS);
+//
+//            //鏈湴鍙戦��
+//            LinkRequest request = new LinkRequest(tempTopic, payload, gatewayBean.getIsLocalEncrypt());
+//            new HDLConnectHelper(gatewayBean.getIp_address(), request,true).send();
+//        } else {
+//            //璇锋眰涓婚
+//            String tempTopic = null;
+//            //鍥炲涓婚
+//            String tempTopicReply = null;
+//
+//            //杩滅▼鍙戦��
+//            if ("true".equals(gatewayBean.getMaster())) {
+//                tempTopic = String.format("/user/%s/custom/native/zigbee/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
+//                tempTopicReply = String.format("/user/%s/custom/native/zigbee/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId());
+//            } else {
+//                tempTopic = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/down", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), gatewayOidOrGatewayId);
+//                tempTopicReply = String.format("/user/%s/custom/native/zigbee/slaveoid/%s/up", com.hdl.sdk.link.core.config.HDLLinkConfig.getInstance().getGatewayId(), "+");
+//            }
+//            //TODO 鍚庣画瀹屽杽浜戠鐨勫彂閫佹帴鏀舵柟娉�
+//        }
+    }
+
+
+    /**
+     * 澶勭悊zigbee鍥炲鐨勬暟鎹�
+     *
+     * @param responeTopic   鍥炲涓婚
+     * @param linkResponse   鍥炲鐨勯�忎紶鏁版嵁
+     */
+    private static String getZigbeeData(String responeTopic, LinkResponse linkResponse) {
+        //涓婚涓虹┖涓嶅鐞�
+        if(TextUtils.isEmpty(responeTopic)){
+            return null;
+        }
+
+        String body = linkResponse.getData();
+        int index = body.indexOf("{");
+        //zigbee鍥炲鐨勬暟鎹墠鏈変富棰橈紝鍚庨潰鎵嶆槸鏁版嵁
+        if (index <= 0)
+            return null;
+
+        String zigbeeTopic = body.substring(0, index).trim();
+        //zigbee鐨勮礋杞芥暟鎹�
+        String bodyData = body.substring(index);
+
+        //涓嶆槸褰撳墠璇锋眰鐨勬暟鎹紝涓嶅鐞�
+        if (!zigbeeTopic.startsWith(responeTopic)) {
+            return null;
+        }
+
+        return bodyData;
+        //Zigbee浠ュ墠鐨勬帴鏀堕�昏緫
+//        HdlZbGatewayReceiveLogic.Current.ZigbeeOldReceiveLogic(reportTopic, bodyData, gatewayMac);
+    }
+
+    /**
+     * 娉ㄥ唽鐩戝惉
+     */
+    static void registerListener(String responseTopic, EventListener eventListener) {
+        if (!TextUtils.isEmpty(responseTopic)) {
+            EventDispatcher.getInstance().register(responseTopic, eventListener);
+        }
+    }
+
+    /**
+     * 绉婚櫎鐩戝惉
+     */
+    static void removeListener(String responseTopic, EventListener eventListener) {
+        if (!TextUtils.isEmpty(responseTopic)) {
+            EventDispatcher.getInstance().remove(responseTopic, eventListener);
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageDecoder.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageDecoder.java
new file mode 100644
index 0000000..aa07c9d
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageDecoder.java
@@ -0,0 +1,323 @@
+package com.hdl.sdk.link.core.protocol;
+
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.utils.ByteUtils;
+import com.hdl.sdk.link.core.bean.LinkPacket;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.utils.ByteBufferUtils;
+import com.hdl.sdk.link.core.utils.QueueUtils;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+import com.hdl.sdk.link.socket.bean.Packet;
+import com.hdl.sdk.link.socket.codec.ByteToMessageDecoder;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * link鍗忚绮樺寘鎷嗗寘
+ */
+public class LinkMessageDecoder extends ByteToMessageDecoder<LinkResponse> {
+
+    private static final String TAG=LinkMessageDecoder.class.getName();
+    //instance
+    private volatile static LinkMessageDecoder instance;
+
+    //getInstance
+    public static synchronized LinkMessageDecoder getInstance() {
+        if (instance == null) {
+            synchronized (LinkMessageDecoder.class) {
+                if (instance == null) {
+                    instance = new LinkMessageDecoder();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 鎺ユ敹鏁版嵁缂撳啿鍖�
+     */
+    private final ByteBuffer byteBuffer;
+
+    private final byte[] head = "Topic:".getBytes();
+
+    public LinkMessageDecoder() {
+        byteBuffer = ByteBuffer.allocate(1024 * 200);//100K
+    }
+
+    /// <summary>
+    /// 鑾峰彇鍐呭闀垮害
+    /// </summary>
+    /// <param name="topMsgs"></param>
+    /// <returns></returns>
+    int getLenght(String[] topMsgs) {
+        try {
+            for (int i = 0; i < topMsgs.length; i++) {
+                String topMsg = topMsgs[i].trim();
+                if (topMsg.startsWith("Length:")) {
+                    return Integer.parseInt(topMsg.replace("Length:", "").trim());
+                }
+            }
+        } catch (Exception e) {
+            LogUtils.e("寮傚父鏁版嵁锛�" + topMsgs[0] + "\r\n" + topMsgs[1]);
+            return -1;
+        }
+        //鎵句笉鍒伴暱搴�
+        return -1;
+    }
+
+    /// <summary>
+    /// 鑾峰彇涓婚
+    /// </summary>
+    /// <param name="topMsgs"></param>
+    /// <returns></returns>
+    private String getTopic(String[] topMsgs) {
+        for (int i = 0; i < topMsgs.length; i++) {
+            String topMsg = topMsgs[i].trim();
+            if (topMsg.startsWith("Topic:")) {
+                return topMsg.replace("Topic:", "");
+            }
+        }
+        //鎵句笉鍒颁富棰�
+        return null;
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁鐨勫紑濮嬩綅缃�
+     *
+     * @return 鏁版嵁浣嶇殑寮�濮嬬储寮�
+     */
+    int getBodyIndex() {
+        byte r = (byte) '\r';
+        byte n = (byte) '\n';
+        for (int i = 0; i < byteBuffer.position(); i++) {
+            //鎵惧嚭鏁版嵁鍐呭鍓嶉潰鐨勪袱涓崲琛�
+            if (3 <= i && byteBuffer.get(i - 3) == r && byteBuffer.get(i - 2) == n && byteBuffer.get(i - 1) == r && byteBuffer.get(i) == n) {
+                //鍓╀綑鐨勬暟鎹�
+                return i + 1;
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 鑾峰彇澶撮儴鏁版嵁
+     *
+     * @return
+     */
+    String getHeader() {
+        int bodyIndex = getBodyIndex();
+        if (bodyIndex < 0) {
+            //娌℃湁鎵惧埌澶撮儴鏁版嵁
+            return null;
+        } else {
+            byte bodyBytes[] = ByteBufferUtils.copyBytes(byteBuffer, bodyIndex);
+            return new String(bodyBytes);
+        }
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁鍐呭
+     *
+     * @param lenght
+     * @return
+     */
+    byte[] getBody(int index, int lenght) {
+        //鏄惁宸茬粡鑾峰彇瀹屾暣鎵�鏈夌殑鏁版嵁
+        byte[] bodyBytes = new byte[lenght];
+        if (index < 0 || byteBuffer.position() < index + lenght) {
+            //褰撳墠鏁版嵁杩樻病鏈夋帴鏀跺畬鎴�
+            return null;
+        }
+
+        for (int i = 0; i < bodyBytes.length; i++) {
+            bodyBytes[i] = byteBuffer.get(index + i);
+        }
+        return bodyBytes;
+    }
+
+
+    /**
+     * 杩欒竟澶勭悊浜嗙紦瀛樻暟鎹矘鍖呯殑鎯呭喌锛屾瘡娆¤姹傞兘闇�瑕佸惂褰撳墠瀹屾暣鐨勬枃浠堕櫎鍘�   浠ヤ究浜庝笅娆$殑杩斿洖
+     * tempList鐢ㄤ簬瀛樺偍澶氫綑鐨勬暟鎹�
+     * contentList鐢ㄤ簬鏈鏁版嵁鐨勫瓨鍌紙鍙戦�佺粰璁㈤槄鐨勬暟鎹級
+     */
+    byte[] geBody() {
+        int len = 3 + 4 + 4 + ((byteBuffer.get(7) & 0xFF) * 256 * 256 * 256) + ((byteBuffer.get(8) & 0xFF) * 256 * 256) + ((byteBuffer.get(9) * 256) & 0xFF) + (byteBuffer.get(10) & 0xFf);
+        byte[] bodyBytes = new byte[len];
+        for (int i = 0; i < len; i++) {
+            bodyBytes[i] = byteBuffer.get(i);
+        }
+
+        int endIndex = byteBuffer.position();
+        byteBuffer.clear();
+        for (int i = len; i < endIndex; i++) {
+            byteBuffer.put(byteBuffer.get(i));
+        }
+        return bodyBytes;
+    }
+
+    /**
+     * 绉婚櫎鍙兘瀛樺湪鐨勬棤鏁堟暟鎹�
+     */
+    void removeInVoidBytes() {
+        int index = 0;
+        boolean isMatch = false;
+        for (; index < byteBuffer.position() - head.length; index++) {
+            isMatch = true;
+            for (int j = 0, k = 0; j < head.length; j++, k++) {
+                if (head[j] != byteBuffer.get(index + k)) {
+                    isMatch = false;
+                    break;
+                }
+            }
+            if (isMatch) {
+                break;
+            }
+        }
+
+        if (0 < index && isMatch) {
+            int endIndex = byteBuffer.position();
+            byteBuffer.clear();
+            for (int i = index; i < endIndex; i++) {
+                byteBuffer.put(byteBuffer.get(i));
+            }
+        }
+    }
+
+    /**
+     * 绉婚櫎鍒版寚瀹氫綅缃墠闈㈢殑鏁版嵁
+     *
+     * @param position 鎸囧畾浣嶇疆
+     */
+    void remove(int position) {
+        int endIndex = byteBuffer.position();
+        byteBuffer.clear();
+        for (int i = position; i < endIndex; i++) {
+            byteBuffer.put(byteBuffer.get(i));
+        }
+    }
+
+    void fileManger(int commandAck, byte[] recevieBytes) {
+        String topic = "65531_" + commandAck;
+        LinkResponse response = new LinkResponse();
+        response.setTopic(topic);
+        response.setByteData(recevieBytes);
+        EventDispatcher.getInstance().post(response.getTopic(), response);
+    }
+
+    int bytes2int(byte[] bytes) {
+        int result = 0;
+        if (bytes.length == 2) {
+            int c = (bytes[0] & 0xff) << 8;
+            int d = (bytes[1] & 0xff);
+            result = c | d;
+        } else if (bytes.length == 4) {
+            return bytes[3] & 0xFF | //
+                    (bytes[2] & 0xFF) << 8 | //
+                    (bytes[1] & 0xFF) << 16 | //
+                    (bytes[0] & 0xFF) << 24; //
+        }
+        return result;
+    }
+
+    public String byte2hex(byte[] bytes) {
+        StringBuilder sb = new StringBuilder();
+        String tmp = null;
+        for (byte b : bytes) {
+            //灏嗘瘡涓瓧鑺備笌0xFF杩涜涓庤繍绠楋紝鐒跺悗杞寲涓�10杩涘埗锛岀劧鍚庡�熷姪浜嶪nteger鍐嶈浆鍖栦负16杩涘埗
+            tmp = Integer.toHexString(0xFF & b);
+            if (tmp.length() == 1) {
+                tmp = "0" + tmp;
+            }
+            sb.append(tmp + " ");
+        }
+        return sb.toString();
+    }
+
+    @Override
+    protected synchronized LinkResponse decoder(Packet packet) {
+        try {
+            if (null == packet) {
+                return null;
+            }
+            byteBuffer.put(packet.getBytes());
+        } catch (Exception e) {
+            LogUtils.e("鎺ユ敹鍒版暟鎹紓甯�:\r\n" + e.getMessage());
+            byteBuffer.flip();
+            byteBuffer.clear();
+        }
+        try {
+            //濡傛灉澶氭潯鍛戒护鎵撳寘鍦ㄤ竴鏉℃暟鎹腑锛岄兘闇�瑕佸鐞嗗畬
+            while (true) {
+                if (byteBuffer.position() > 2) {//鍒ゆ柇鏄惁鏄枃浠跺鐞嗛�氱煡 wxr
+                    byte[] topBytes = new byte[3];
+                    topBytes[0] = byteBuffer.get(0);
+                    topBytes[1] = byteBuffer.get(1);
+                    topBytes[2] = byteBuffer.get(2);
+                    if (new String(topBytes).equals("hex")) {
+                        //TODO 杩欏潡浠g爜缁熶竴绉诲嚭鍏跺畠鍦版柟澶勭悊
+                        byte[] commandBytes = ByteBufferUtils.copyBytes(byteBuffer, 5, 2);
+                        int command = bytes2int(commandBytes);
+                        byte[] submitBytes = geBody();
+                        if (command == 258 || command == 260 || command == 261) {
+                            //璇诲彇椹卞姩鍒楄〃鍝嶅簲 ||椹卞姩瀹夎鐢宠鍝嶅簲
+                            if (submitBytes.length > 11) {
+                                byte[] rangeBytes = ByteUtils.copyBytes(submitBytes, 11, submitBytes.length - 11);
+                                fileManger(command, rangeBytes);
+                            } else {
+                                //鏂逛究闂鎺掓煡
+                                fileManger(command, submitBytes);
+                            }
+                        } else {
+                            //缁欑妗′娇鐢�  鍚庨潰鐨勪笟鍔℃渶濂介兘鍦ㄨ繖杈瑰鐞� 涓嶇劧浼氶�犳垚涓氬姟鍒嗘暎
+                            fileManger(command, submitBytes);
+                        }
+                        continue;
+                    }
+                }
+                removeInVoidBytes();//绉婚櫎鍙兘瀛樺湪鐨勬棤鏁堟暟鎹�
+
+                //澶撮儴鏁版嵁
+                String header = getHeader();
+
+                if (header == null) {
+                    break;
+                }
+                String[] topMsgs = header.split("\r\n");
+
+                String topic = getTopic(topMsgs);
+                int lenght = getLenght(topMsgs);
+                if (topic == null || lenght <= 0) {
+                    //鑾峰彇涓嶅埌涓婚鎴栬�呭ご閮ㄦ暟鎹繕娌℃湁鎺ユ敹瀹屾垚
+                    break;
+                }
+
+                int bodyIndex = getBodyIndex();
+                //鏄惁宸茬粡鑾峰彇瀹屾暣鎵�鏈夌殑鏁版嵁
+                byte[] body = getBody(bodyIndex, lenght);
+
+                if (body == null) {
+                    //褰撳墠鏁版嵁杩樻病鏈夋帴鏀跺畬鎴�
+                    break;
+                }
+
+                remove(bodyIndex + lenght);
+
+                if (topic.contains("heartbeat_reply")) {
+                    if (packet.getSocket() != null) {
+                        packet.getSocket().setSoTimeout(10 * 1000);
+                    }
+                    continue;
+                }
+
+                QueueUtils.getInstance().add(new LinkPacket(topic, body));
+            }
+        } catch (Exception ee) {
+            LogUtils.e("澶勭悊鎺ユ敹鐨勬暟鎹紓甯�:\r\n" + ee.getMessage());
+        }
+        return null;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageEncoder.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageEncoder.java
new file mode 100644
index 0000000..d09e37a
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/protocol/LinkMessageEncoder.java
@@ -0,0 +1,18 @@
+package com.hdl.sdk.link.core.protocol;
+
+
+import com.hdl.sdk.link.socket.bean.Packet;
+import com.hdl.sdk.link.socket.codec.MessageToByteEncoder;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * link鍗忚鍚堝寘
+ */
+public class LinkMessageEncoder extends MessageToByteEncoder {
+
+    @Override
+    protected Packet encode(Packet packet) throws Exception {
+        return packet;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/AesUtil.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/AesUtil.java
new file mode 100644
index 0000000..942e76e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/AesUtil.java
@@ -0,0 +1,150 @@
+package com.hdl.sdk.link.core.utils;
+
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Aes 鍔犺В瀵嗗伐鍏风被
+ *
+ * @author yangtao
+ * 2020骞�10鏈�29鏃�
+ */
+public class AesUtil {
+
+    private static final String CIPHER_INSTANCE = "AES/CBC/PKCS7Padding";
+    private static final String AES_ALGORITHM = "AES";
+
+//    static {
+//        //AES/CBC/PKCS7Padding 渚濊禆
+//        Security.addProvider(new BouncyCastleProvider());
+//    }
+
+    /**
+     * AES鍔犲瘑
+     *
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] aesEncrypt(byte[] content, String key) {
+        return encrypt(content, key.getBytes(), CIPHER_INSTANCE, true, null);
+    }
+
+    /**
+     * AES瑙e瘑
+     *
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] aesDecrypt(byte[] content, String key) {
+        if (content == null || TextUtils.isEmpty(key)) {
+            LogUtils.i("鏁版嵁瑙e瘑锛�","content锛�"+content+" key:"+key);
+            return null;
+        }
+        return decrypt(content, key.getBytes(), CIPHER_INSTANCE, true, null);
+    }
+
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content        寰呭姞瀵嗗瓧绗︿覆
+     * @param keyByte        aesKye鐨刪exStr
+     * @param cipherInstance AES绠楁硶濉厖鏂瑰紡
+     * @param isIv           鏄惁浣跨敤鍋忕Щ閲� ECB妯″紡涓嶅彲鐢�
+     * @param iv             鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+     * @return
+     */
+    public static byte[] encrypt(byte[] content, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
+            //鍔犲瘑
+            Cipher cipher = Cipher.getInstance(cipherInstance);
+            if (isIv != null && isIv) {
+                //鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+                if (iv == null) {
+                    iv = keyByte;
+                }
+                IvParameterSpec ivps = new IvParameterSpec(iv);
+                cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
+            } else {
+                cipher.init(Cipher.ENCRYPT_MODE, key);
+            }
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param contentByte    寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param contentByte    瀵嗛挜
+     * @param cipherInstance AES绠楁硶濉厖鏂瑰紡
+     * @param isIv           鏄惁浣跨敤鍋忕Щ閲� ECB妯″紡涓嶅彲鐢�
+     * @param iv             鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+     * @return
+     */
+    public static byte[] decrypt(byte[] contentByte, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
+            //瑙e瘑
+            Cipher cipher = Cipher.getInstance(cipherInstance);
+            if (isIv != null && isIv) {
+                //鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+                if (iv == null) {
+                    iv = keyByte;
+                }
+                IvParameterSpec ivps = new IvParameterSpec(iv);
+                cipher.init(Cipher.DECRYPT_MODE, key, ivps);
+            } else {
+                cipher.init(Cipher.DECRYPT_MODE, key);
+            }
+            byte[] result = cipher.doFinal(contentByte);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteBufferUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteBufferUtils.java
new file mode 100644
index 0000000..99e1e5d
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteBufferUtils.java
@@ -0,0 +1,37 @@
+package com.hdl.sdk.link.core.utils;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Created by hxb on 2022/8/3.
+ *
+ */
+public class ByteBufferUtils {
+
+    /**
+     * 鑾峰彇ByteBuffer鎸囧畾浣嶇疆鏁版嵁
+     *
+     * @param byteBuffer 婧愬璞�
+     * @param length 鎸囧畾闀垮害
+     * @return 鏍规嵁闀垮害鐢熸垚鐨勬暟缁�
+     */
+    public static byte[] copyBytes(ByteBuffer byteBuffer, int length) {
+        return copyBytes(byteBuffer,0,length);
+    }
+
+    /**
+     * 澶嶅埗鎸囧畾浣嶇疆鐨勬暟鎹�
+     * @param byteBuffer
+     * @param index
+     * @param length
+     * @return
+     */
+    public static byte[] copyBytes(ByteBuffer byteBuffer, int index,int length) {
+        byte[] bytes = new byte[length];
+        for (int i = 0; i < bytes.length; i++) {
+            bytes[i] = byteBuffer.get(index + i);
+        }
+        return bytes;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteUtils.java
new file mode 100644
index 0000000..a2e095e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ByteUtils.java
@@ -0,0 +1,20 @@
+package com.hdl.sdk.link.core.utils;
+
+/**
+ * Created by hxb on 2022/8/5.
+ */
+public class ByteUtils {
+
+    public static String encodeHexString(byte[] data) {
+
+        StringBuilder sb = new StringBuilder();
+
+        for (byte b : data) {
+
+            sb.append(String.format("%02x ", b));
+
+        }
+        return sb.toString();
+
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/EncryptUtil.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/EncryptUtil.java
new file mode 100644
index 0000000..b12a06e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/EncryptUtil.java
@@ -0,0 +1,69 @@
+package com.hdl.sdk.link.core.utils;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.utils.ByteUtils;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Created by hxb on 2021/12/23.
+ */
+public class EncryptUtil {
+    /**
+     * 鑾峰彇鍔犲瘑鏁版嵁
+     *
+     * @param linkRequest 璇锋眰鏁版嵁
+     * @return
+     */
+    public static byte[] getEncryBytes(LinkRequest linkRequest) throws UnsupportedEncodingException {
+        //鍒ゆ柇鏄惁闇�瑕佸姞瀵�
+        if (ifNeedEncrypt(linkRequest.getTopic(), linkRequest.isEncrypt())) {
+            //闇�瑕佸姞瀵�
+            byte[] dataBytes = AesUtil.aesEncrypt(linkRequest.getData(), HDLLinkConfig.getInstance().getLocalSecret());
+            String headString = "Topic:" + linkRequest.getTopic() + "\r\n" + "Length:" + dataBytes.length + "\r\n" + "\r\n";
+            byte[] headBytes = headString.getBytes("utf-8");
+            byte[] sendBytes = ByteUtils.concatBytes(headBytes, dataBytes);
+            return sendBytes;
+        } else {
+            return linkRequest.getSendBytes();
+        }
+    }
+
+    /**
+     * 鍔犲瘑鏁版嵁
+     *
+     * param bytes 闇�瑕佸姞瀵嗘暟鎹�
+     * @param secret 鍔犲瘑瀵嗛挜
+     * @return
+     */
+    public static byte[] encryBytes(byte []bytes,String secret) {
+        if(bytes==null|| TextUtils.isEmpty(secret)){
+            LogUtils.i("浼犲叆鏁版嵁鍐呭涓虹┖鎴栬�呭瘑閽ヤ负绌�");
+            return null;
+        }
+        return AesUtil.aesEncrypt(bytes, secret);
+    }
+
+    /**
+     * 鍒ゆ柇褰撳墠涓婚鏁版嵁鏄惁闇�瑕佸姞瀵�
+     *
+     * @param topicStr 褰撳墠涓婚
+     * @return
+     */
+    public static boolean ifNeedEncrypt(String topicStr, boolean isLocalEncrypt) {
+        //杩囨护鐩稿叧闇�瑕佸姞瀵嗙殑涓婚
+        return (!topicStr.contains(TopicConstant.GATEWAY_AUTH_BROADCAST) //缃戝叧骞挎挱鍏ョ綉鎸囦护
+                && !topicStr.contains(TopicConstant.DEIVCE_AUTH_REQUEST) //鍏ョ綉璁よ瘉
+                && !topicStr.contains(TopicConstant.GATEWAY_SEARCH) //鎼滅储缃戝叧涓婚
+                && !topicStr.contains(TopicConstant.GATEWAY_SEARCH_REPLY) //鎼滅储缃戝叧涓婚鍥炲
+                && !topicStr.equals(TopicConstant.BROADCAST)
+                && isLocalEncrypt//鍚敤鍔犲瘑鏍囧織
+        );
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/HexUtil.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/HexUtil.java
new file mode 100644
index 0000000..41373e0
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/HexUtil.java
@@ -0,0 +1,449 @@
+package com.hdl.sdk.link.core.utils;
+
+import android.util.Log;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * Created by Zoro
+ * Created on 2021/9/17
+ * description:
+ */
+public class HexUtil {
+    private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5',
+            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+    private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5',
+            '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+
+    public static char[] encodeHex(byte[] data) {
+        return encodeHex(data, true);
+    }
+
+    public static char[] encodeHex(byte[] data, boolean toLowerCase) {
+        return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+    }
+
+    protected static char[] encodeHex(byte[] data, char[] toDigits) {
+        if (data == null)
+            return null;
+        int l = data.length;
+        char[] out = new char[l << 1];
+        for (int i = 0, j = 0; i < l; i++) {
+            out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
+            out[j++] = toDigits[0x0F & data[i]];
+        }
+        return out;
+    }
+
+
+    public static String encodeHexStr(byte[] data) {
+        return encodeHexStr(data, true);
+    }
+
+    public static String encodeHexStr(byte[] data, boolean toLowerCase) {
+        return encodeHexStr(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER);
+    }
+
+
+    protected static String encodeHexStr(byte[] data, char[] toDigits) {
+        return new String(encodeHex(data, toDigits));
+    }
+
+    public static String formatHexString(byte[] data) {
+        return formatHexString(data, false);
+    }
+
+    public static String formatHexString(byte[] data, boolean addSpace) {
+        if (data == null || data.length < 1)
+            return null;
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < data.length; i++) {
+            String hex = Integer.toHexString(data[i] & 0xFF);
+            if (hex.length() == 1) {
+                hex = '0' + hex;
+            }
+            sb.append(hex);
+            if (addSpace)
+                sb.append(" ");
+        }
+        return sb.toString().trim();
+    }
+
+    public static byte[] decodeHex(char[] data) {
+
+        int len = data.length;
+
+        if ((len & 0x01) != 0) {
+            throw new RuntimeException("Odd number of characters.");
+        }
+
+        byte[] out = new byte[len >> 1];
+
+        // two characters form the hex value.
+        for (int i = 0, j = 0; j < len; i++) {
+            int f = toDigit(data[j], j) << 4;
+            j++;
+            f = f | toDigit(data[j], j);
+            j++;
+            out[i] = (byte) (f & 0xFF);
+        }
+
+        return out;
+    }
+
+    /**
+     * 灏嗗崄鍏繘鍒跺瓧绗︿覆瑙g爜涓篵yte[]
+     *
+     * @param hexStr 鍗佸叚杩涘埗String
+     * @return byte[]
+     */
+    public static byte[] decodeHex(String hexStr) {
+        if ("".equals(hexStr)) {
+            return null;
+        }
+        hexStr = hexStr.replace(" ","");
+        return decodeHex(hexStr.toCharArray());
+    }
+
+    public static byte[] addAll(byte[]... arrays) {
+        if (arrays.length == 1) {
+            return arrays[0];
+        }
+
+        // 璁$畻鎬婚暱搴�
+        int length = 0;
+        for (byte[] array : arrays) {
+            if (null != array) {
+                length += array.length;
+            }
+        }
+
+        final byte[] result = new byte[length];
+        length = 0;
+        for (byte[] array : arrays) {
+            if (null != array) {
+                System.arraycopy(array, 0, result, length, array.length);
+                length += array.length;
+            }
+        }
+        return result;
+    }
+
+
+
+    protected static int toDigit(char ch, int index) {
+        int digit = Character.digit(ch, 16);
+        if (digit == -1) {
+            throw new RuntimeException("Illegal hexadecimal character " + ch
+                    + " at index " + index);
+        }
+        return digit;
+    }
+
+
+    public static byte[] hexStringToBytes(String hexString) {
+        if (hexString == null || hexString.equals("")) {
+            return null;
+        }
+        hexString = hexString.toUpperCase();
+        int length = hexString.length() / 2;
+        char[] hexChars = hexString.toCharArray();
+        byte[] d = new byte[length];
+        for (int i = 0; i < length; i++) {
+            int pos = i * 2;
+            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
+        }
+        return d;
+    }
+
+    public static byte charToByte(char c) {
+        return (byte) "0123456789ABCDEF".indexOf(c);
+    }
+
+    public static String extractData(byte[] data, int position) {
+        return HexUtil.formatHexString(new byte[]{data[position]});
+    }
+
+    public static String bytesToHexString(byte[] data) {
+        String result = "";
+        for (int i = 0; i < data.length; i++) {
+            String hexString = Integer.toHexString(data[i] & 0xFF);
+            if (hexString.length() == 1) {
+                hexString = '0' + hexString;
+            }
+            result += hexString.toUpperCase();
+        }
+        return result;
+    }
+
+    /**
+     * byte杞�16杩涘埗
+     *
+     * @param b
+     * @return
+     */
+    public static String binaryToHex(byte b) {
+        String str = byteToBit(b);
+        String hexStr = Integer.toHexString(Integer.parseInt(str, 2));
+        StringBuffer stringBuffer = new StringBuffer();
+        if (hexStr.length() == 1) {
+            stringBuffer.append("0");
+        }
+        stringBuffer.append(hexStr);
+        return stringBuffer.toString().toUpperCase();
+    }
+
+    /**
+     * byte杞崄杩涘埗
+     *
+     * @param b
+     * @return
+     */
+    public static int binaryToDecimal(byte b) {
+        String str = byteToBit(b);
+        return Integer.parseInt(str, 2);
+    }
+
+    /**
+     * Byte杞珺it
+     */
+    public static String byteToBit(byte b) {
+        return "" + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)
+                + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)
+                + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)
+                + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1);
+    }
+
+    /**
+     * int杞琤yte
+     *
+     * @param res
+     * @return
+     */
+    public static byte[] int2byte(int res) {
+        byte[] targets = new byte[2];
+
+        targets[1] = (byte) (res & 0xff);// 鏈�浣庝綅
+        targets[0] = (byte) ((res >> 8) & 0xff);// 娆′綆浣�
+        /*targets[2] = (byte) ((res >> 16) & 0xff);// 娆¢珮浣�
+        targets[3] = (byte) (res >>> 24);// 鏈�楂樹綅,鏃犵鍙峰彸绉�*/
+        return targets;
+    }
+
+    /**
+     * Bit杞珺yte
+     */
+    public static byte bitToByte(String byteStr) {
+        int re, len;
+        if (null == byteStr) {
+            return 0;
+        }
+        len = byteStr.length();
+        if (len != 4 && len != 8) {
+            return 0;
+        }
+        if (len == 8) {// 8 bit澶勭悊
+            if (byteStr.charAt(0) == '0') {// 姝f暟
+                re = Integer.parseInt(byteStr, 2);
+            } else {// 璐熸暟
+                re = Integer.parseInt(byteStr, 2) - 256;
+            }
+        } else {// 4 bit澶勭悊
+            re = Integer.parseInt(byteStr, 2);
+        }
+        return (byte) re;
+    }
+
+    /**
+     * 瑙f瀽浣撹剛鏁版嵁
+     *
+     * @param first
+     * @param second
+     * @param b
+     * @return
+     */
+    public static double getData(int first, int second, byte[] b) {
+        double data = ((b[first] & 0xFF) << 8) + (b[second] & 0xFF);
+        Log.e("", "data = " + data);
+        return data / 10;
+    }
+
+    /**
+     * 瑙f瀽浣撹剛鏁版嵁
+     *
+     * @param first
+     * @param second
+     * @param b
+     * @return
+     */
+    public static int getDataInt(int first, int second, byte[] b) {
+        int data = ((b[first] & 0xFF) << 8) + (b[second] & 0xFF);
+        Log.e("", "getDataInt = " + data);
+        return data;
+    }
+
+
+    // 鑾峰彇绯荤粺鏃堕棿
+    public static String getTime() {
+        SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
+        Date curDate = new Date(System.currentTimeMillis());
+        String str = formatter.format(curDate);
+        return str;
+    }
+
+    // 鑾峰彇绯荤粺鏃ユ湡
+    public static String getDate() {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyMMdd");
+        Date curDate = new Date(System.currentTimeMillis());
+        String str = formatter.format(curDate);
+        return str;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠绯荤粺鏃堕棿
+     *
+     * @return
+     */
+    public static String getCurrentTime() {
+        SimpleDateFormat formatter = new SimpleDateFormat("yy-MM-dd HH:mm:ss");
+        Date curDate = new Date(System.currentTimeMillis());
+        String str = formatter.format(curDate);
+        return str;
+    }
+
+    /**
+     * 鍚堝苟鏁扮粍
+     *
+     * @return
+     */
+    public static byte[] concat(byte[] b, byte[] mByte) {
+        byte[] result = Arrays.copyOf(b, b.length + mByte.length);
+        System.arraycopy(mByte, 0, result, b.length, mByte.length);
+        return result;
+    }
+
+    /**
+     * 瀛楃涓查暱搴︾瓑浜�1鐨勮瘽锛岃ˉ0
+     *
+     * @param str
+     * @return
+     */
+    public static String addZero(String str) {
+        //L.i(ParseData.class, "addZero");
+        StringBuffer sBuffer = new StringBuffer();
+        if (str.length() == 1) {
+            sBuffer.append("0");
+            sBuffer.append(str);
+            return sBuffer.toString();
+        } else {
+            return str;
+        }
+    }
+
+    public static double getPercent(double d) {
+        if (d > 100) {
+            return 0.0;
+        }
+        return d;
+    }
+
+    /**
+     * byte鏁扮粍杞瑂tr
+     *
+     * @param b
+     * @return
+     */
+    public static String byteArr2Str(byte[] b) {
+        if (b.length != 0) {
+            StringBuffer stringBuffer = new StringBuffer();
+            stringBuffer.append("[");
+            for (int i = 0; i < b.length; i++) {
+                stringBuffer.append(addZero(binaryToHex(b[i])));
+                if (i < b.length - 1) {
+                    stringBuffer.append(",");
+                }
+            }
+            stringBuffer.append("]");
+            return stringBuffer.toString();
+        }
+        return null;
+    }
+
+    /**
+     * 淇濈暀灏忔暟鐐瑰悗count浣�
+     *
+     * @param d
+     * @param count
+     * @return
+     */
+    public static double keepDecimal(double d, int count) {
+        BigDecimal decimal = new BigDecimal(d);
+        return decimal.setScale(count, BigDecimal.ROUND_HALF_UP).doubleValue();
+    }
+
+    /**
+     * kg杞琹b
+     *
+     * @param weight
+     * @return
+     */
+    public static double kg2lb(double weight) {
+        return keepDecimal(weight * 2.2046226, 1);
+    }
+
+    /**
+     * kg杞琷in
+     *
+     * @param weight
+     * @return
+     */
+    public static double kg2jin(double weight) {
+        return keepDecimal(weight * 2, 1);
+    }
+
+    /**
+     * kg杞瑂t
+     *
+     * @param weight
+     * @return
+     */
+    public static String kg2st(double weight) {
+        double lbData = kg2lb(weight);
+        StringBuffer stringBuffer = new StringBuffer();
+        int lb = (int) (lbData / 14);
+        int st = (int) lbData % 14;
+        stringBuffer.append(lb);
+        stringBuffer.append(":");
+        stringBuffer.append(addZero(String.valueOf(st)));
+        return stringBuffer.toString();
+    }
+
+    public static String int2HexStr(int i) {
+        return binaryToHex(Integer.valueOf(i).byteValue());
+    }
+
+    public static byte[] hexStringToByte(String hex) {
+        int len = (hex.length() / 2);
+        byte[] result = new byte[len];
+        char[] chars = hex.toCharArray();
+        for (int i = 0; i < len; i++) {
+            int pos = i * 2;
+            result[i] = (byte) (toByte(chars[pos]) << 4 | toByte(chars[pos + 1]));
+        }
+        return result;
+    }
+
+    private static byte toByte(char c) {
+        byte b = (byte) "0123456789ABCDEF".indexOf(c);
+        return b;
+    }
+
+    public static String formatTo1(double f) {
+        BigDecimal bg = new BigDecimal(f);
+        return bg.setScale(1, BigDecimal.ROUND_HALF_UP).toString();
+    }
+} 
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LanguageUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LanguageUtils.java
new file mode 100644
index 0000000..70ba132
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LanguageUtils.java
@@ -0,0 +1,8 @@
+package com.hdl.sdk.link.core.utils;
+
+/**
+ * Created by hxb on 2023/2/9.
+ */
+public class LanguageUtils {
+//    public static String
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LinkResponseUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LinkResponseUtils.java
new file mode 100644
index 0000000..57ca709
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/LinkResponseUtils.java
@@ -0,0 +1,73 @@
+package com.hdl.sdk.link.core.utils;
+
+import android.text.TextUtils;
+
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
+import com.hdl.sdk.link.core.bean.response.BaseLocalWithCodeResponse;
+
+import java.lang.reflect.Type;
+
+/**
+ * Created by jlchen on 1/6/22.
+ */
+public class LinkResponseUtils<T> {
+
+    public Type getType(){
+       return new TypeToken<BaseLocalResponse<T>>() {}.getType();
+    }
+
+    /**
+     * 杞崲鎻愬彇LinkResponse閲岄潰鐨刼bjects
+     *
+     * @param msg
+     * @return
+     */
+    public static <T> T convertLinkResponse(Object msg, Type type) {
+        T bean = null;
+        if (msg != null && msg instanceof LinkResponse) {
+            LinkResponse linkResponse = (LinkResponse) msg;
+            String data = linkResponse.getData();
+            if (!TextUtils.isEmpty(data)) {
+                try {
+                    final BaseLocalResponse<T> response = GsonConvert.getGson().fromJson(data, type);
+                    if (response != null) {
+                        bean = response.getObjects();
+                    }
+                } catch (Exception e) {
+                    LogUtils.e("convertLinkResponse catch:" + e.getMessage());
+                }
+            }
+        }
+        return bean;
+    }
+
+    /**
+     * 杞崲鎻愬彇LinkResponse閲岄潰鐨刼bjects  鍙湁杩斿洖code   鍒ゆ柇200鏄垚鍔�
+     *
+     * @param msg
+     * @return
+     */
+    public static <T> T convertLinkWithCodeResponse(Object msg, Type type) {
+        T bean = null;
+        if (msg != null && msg instanceof LinkResponse) {
+            LinkResponse linkResponse = (LinkResponse) msg;
+            String data = linkResponse.getData();
+            if (!TextUtils.isEmpty(data)) {
+                try {
+                    final BaseLocalWithCodeResponse<T> response = GsonConvert.getGson().fromJson(data, type);
+                    if (response != null) {
+                        bean = response.getCode();
+                    }
+                } catch (Exception e) {
+                    LogUtils.e("convertLinkResponse catch:" + e.getMessage());
+                }
+            }
+        }
+        return bean;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ProtocolParse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ProtocolParse.java
new file mode 100644
index 0000000..92a611b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/ProtocolParse.java
@@ -0,0 +1,74 @@
+package com.hdl.sdk.link.core.utils;
+
+import android.text.TextUtils;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 瑙f瀽Link鍗忚
+ */
+public class ProtocolParse {
+
+    private String topic;
+    private int length;
+    private int dataIndex;
+
+    public ProtocolParse(byte[] bytes) {
+        parse(bytes);
+    }
+
+    private void parse(byte[] bytes) {
+        try {
+            String[] split = new String(bytes, "utf-8").split("\r\n");
+            setTopic(parseTopic(split));
+            setLength(parseLength(split));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private static String parseTopic(String[] bytes) {
+        try {
+            for (String s : bytes) {
+                if (s.startsWith("Topic:")) {
+                    return s.replace("Topic:", "");
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private static int parseLength(String[] bytes) {
+        try {
+            for (String s : bytes) {
+                if (!TextUtils.isEmpty(s) && s.startsWith("Length:")) {
+                    return Integer.parseInt(s.replace("Length:", ""));
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return -1;
+    }
+
+
+
+    public String getTopic() {
+        return topic;
+    }
+
+    public void setTopic(String topic) {
+        this.topic = topic;
+    }
+
+    public int getLength() {
+        return length;
+    }
+
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java
new file mode 100644
index 0000000..2dda1ee
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java
@@ -0,0 +1,134 @@
+package com.hdl.sdk.link.core.utils;
+
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.core.bean.LinkPacket;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.connect.HDLConnectHelper;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.concurrent.ExecutorService;
+
+/**
+ * Created by hxb on 2022/8/4.
+ */
+public class QueueUtils {
+
+    //杩樻病瑙e瘑鐨勬暟鎹寘
+    private final Queue<LinkPacket> linkPackets;
+    private final ExecutorService executorService;
+    //鏄惁宸茬粡鍚姩
+    private boolean started;
+    /**
+     * instance
+     */
+    private volatile static QueueUtils instance;
+
+    private QueueUtils() {
+        linkPackets = new LinkedList<>();
+        executorService = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+    }
+
+    /**
+     * getInstance
+     *
+     * @return AuthenticateConfig
+     */
+    public static synchronized QueueUtils getInstance() {
+        if (instance == null) {
+            synchronized (QueueUtils.class) {
+                if (instance == null) {
+                    instance = new QueueUtils();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 澧炲姞鎺ユ敹鍒扮殑姣忔潯鏁版嵁
+     *
+     * @param linkPacket
+     */
+    public void add(LinkPacket linkPacket) {
+        synchronized (linkPackets) {
+            linkPackets.add(linkPacket);
+        }
+    }
+
+    public LinkPacket poll() {
+        synchronized (linkPackets) {
+            return linkPackets.poll();
+        }
+    }
+
+    /**
+     * 鍚姩澶勭悊鎺ユ敹鍒扮殑鏁版嵁
+     */
+    public synchronized void start() {
+        if (started) {
+            return;
+        }
+        started = true;
+        executorService.execute(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        LinkPacket linkPacket = poll();
+                        if (linkPacket == null) {
+                            Thread.sleep(10);
+                            continue;
+                        }
+                        manager(linkPacket);
+                    } catch (Exception e) {
+                        LogUtils.e("澶勭悊鎺ユ敹鍒扮殑鏁版嵁寮傚父:\r\n" + e.getMessage());
+                    }
+                }
+            }
+        });
+    }
+
+    private void manager(LinkPacket linkPacket) throws UnsupportedEncodingException {
+
+        LinkResponse response = new LinkResponse();
+        response.setTopic(linkPacket.getTopic());
+//        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByIpAddress(linkPacket.isIpAddress());
+//        boolean isEncrypt = false;
+//        if (gatewayBean != null) {
+//            isEncrypt = gatewayBean.getIsLocalEncrypt();
+//        }
+//        if (EncryptUtil.ifNeedEncrypt(response.getTopic(), isEncrypt)) {
+//        if (gatewayBean != null && gatewayBean.getIsLocalEncrypt() && encrypt(linkPacket.getBody())) {
+        if (!linkPacket.isCloudPacket() && encrypt(linkPacket.getBody())) {
+            //闇�瑕佽В瀵�
+            byte[] bodyBytes = AesUtil.aesDecrypt(linkPacket.getBody(), HDLLinkConfig.getInstance().getLocalSecret());
+            if (bodyBytes != null) {
+                response.setData(new String(bodyBytes, StandardCharsets.UTF_8));
+            } else {
+                LogUtils.e("瑙e瘑澶辫触\r\n" + linkPacket.getTopic() + "\r\n" + ByteUtils.encodeHexString(linkPacket.getBody()));
+                response.setData(new String(linkPacket.getBody(), "utf-8"));
+            }
+        } else {
+            response.setData(new String(linkPacket.getBody(), "utf-8"));
+        }
+        if (HDLConnectHelper.isLocal()) {
+            LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData());
+        }
+        //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆�
+        EventDispatcher.getInstance().post(response.getTopic(), response);
+    }
+
+    //鏄惁鍔犲瘑
+    private boolean encrypt(byte[] bytes) {
+        if (bytes[0] == '{' && bytes[bytes.length - 1] == '}' || (bytes[0] == '[' && bytes[bytes.length - 1] == ']')) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/AesUtil.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/AesUtil.java
new file mode 100644
index 0000000..01fbe3f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/AesUtil.java
@@ -0,0 +1,286 @@
+package com.hdl.sdk.link.core.utils.mqtt;
+
+
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.core.utils.HexUtil;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+
+/**
+ * Aes 鍔犺В瀵嗗伐鍏风被
+ *
+ * @author yangtao
+ * 2020骞�10鏈�29鏃�
+ */
+public class AesUtil {
+
+    private static final String CIPHER_INSTANCE = "AES/ECB/PKCS5Padding";
+    private static final String AES_ALGORITHM = "AES";
+
+    static {
+        //AES/CBC/PKCS7Padding 渚濊禆
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    /**
+     * AES鍔犲瘑
+     *
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] aesEncrypt(byte[] content, String key) {
+        return encrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
+    }
+
+    /**
+     * AES瑙e瘑
+     *
+     * @param key
+     * @return
+     * @throws Exception
+     */
+    public static byte[] aesDecrypt(byte[] content, String key) {
+        return decrypt(content, key.getBytes(), "AES/CBC/PKCS7Padding", true, null);
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content 寰呭姞瀵嗗瓧绗︿覆
+     * @param keyHex  aesKye鐨刪exStr
+     * @return
+     */
+    public static String encrypt(String content, String keyHex) {
+        return HexUtil.encodeHexStr(encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content 寰呭姞瀵嗗瓧绗︿覆
+     * @param key     瀵嗛挜
+     * @return
+     */
+    public static String encrypt(String content, byte[] key) {
+        return HexUtil.encodeHexStr(encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null));
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content 寰呭姞瀵嗗瓧绗︿覆
+     * @param keyHex  aesKye鐨刪exStr
+     * @return
+     */
+    public static byte[] encryptReturnByte(String content, String keyHex) {
+        return encrypt(content.getBytes(), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null);
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content 寰呭姞瀵嗗瓧绗︿覆
+     * @param key     瀵嗛挜
+     * @return
+     */
+    public static byte[] encryptReturnByte(String content, byte[] key) {
+        return encrypt(content.getBytes(), key, CIPHER_INSTANCE, false, null);
+    }
+
+    /**
+     * 鍔犲瘑
+     *
+     * @param content        寰呭姞瀵嗗瓧绗︿覆
+     * @param keyByte        aesKye鐨刪exStr
+     * @param cipherInstance AES绠楁硶濉厖鏂瑰紡
+     * @param isIv           鏄惁浣跨敤鍋忕Щ閲� ECB妯″紡涓嶅彲鐢�
+     * @param iv             鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+     * @return
+     */
+    public static byte[] encrypt(byte[] content, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
+            //鍔犲瘑
+            Cipher cipher = Cipher.getInstance(cipherInstance);
+            if (isIv != null && isIv) {
+                //鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+                if (iv == null) {
+                    iv = keyByte;
+                }
+                IvParameterSpec ivps = new IvParameterSpec(iv);
+                cipher.init(Cipher.ENCRYPT_MODE, key, ivps);
+            } else {
+                cipher.init(Cipher.ENCRYPT_MODE, key);
+            }
+            byte[] result = cipher.doFinal(content);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param contentHex 寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param keyHex     desKye鐨刪exStr
+     * @return
+     */
+    public static String decrypt(String contentHex, String keyHex) {
+        return new String(decrypt(HexUtil.decodeHex(contentHex), HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param contentHex 寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param key        瀵嗛挜
+     * @return
+     */
+    public static String decrypt(String contentHex, byte[] key) {
+        return new String(decrypt(HexUtil.decodeHex(contentHex), key, CIPHER_INSTANCE, false, null));
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param content 寰呰В瀵嗗緟鍐呭
+     * @param keyHex  瀵嗛挜
+     * @return
+     */
+    public static String decrypt(byte[] content, String keyHex) {
+        return new String(decrypt(content, HexUtil.decodeHex(keyHex), CIPHER_INSTANCE, false, null));
+    }
+
+    /**
+     * 瑙e瘑
+     *
+     * @param content 寰呰В瀵嗗緟鍐呭
+     * @param key     瀵嗛挜
+     * @return
+     */
+    public static String decrypt(byte[] content, byte[] key) {
+        return new String(decrypt(content, key, CIPHER_INSTANCE, false, null));
+    }
+
+
+    /**
+     * 瑙e瘑
+     *
+     * @param contentByte    寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param contentByte    瀵嗛挜
+     * @param cipherInstance AES绠楁硶濉厖鏂瑰紡
+     * @param isIv           鏄惁浣跨敤鍋忕Щ閲� ECB妯″紡涓嶅彲鐢�
+     * @param iv             鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+     * @return
+     */
+    public static byte[] decrypt(byte[] contentByte, byte[] keyByte, String cipherInstance, Boolean isIv, byte[] iv) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec(keyByte, AES_ALGORITHM);
+            //瑙e瘑
+            Cipher cipher = Cipher.getInstance(cipherInstance);
+            if (isIv != null && isIv) {
+                //鍋忕Щ閲� 涓嶄紶榛樿瀵嗛挜
+                if (iv == null) {
+                    iv = keyByte;
+                }
+                IvParameterSpec ivps = new IvParameterSpec(iv);
+                cipher.init(Cipher.DECRYPT_MODE, key, ivps);
+            } else {
+                cipher.init(Cipher.DECRYPT_MODE, key);
+            }
+            byte[] result = cipher.doFinal(contentByte);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
+
+
+    public static void main(String[] args) {
+//        jiemi();
+        //jiami();
+    }
+
+    public static void jiami() {
+        String key = "1f6714fc-fb9b-4a";
+        String content = "{\"id\":\"123\",\"objects\":[{\"sid\":\"0001011565879801020200010101\",\"type\":\"PWD\",\"local_id\":\"2\"}],\"time_stamp\":\"1603281282000\"}";
+        byte[] res = aesEncrypt(content.getBytes(), key);
+        System.out.println(HexUtil.encodeHexStr(res));
+    }
+
+    /**
+     *
+     * @param str
+     * @param houseId
+     * @return
+     */
+    public static String jiemi(byte[] str, String houseId) {
+        byte[] rs = aesDecrypt(str, HouseIdSecretUtil.getSecret(houseId));
+        String content = new String(rs);
+        return content;
+    }
+
+//    public static void main(String[] args) {
+//        try {
+//            //绗竴姝ワ細 鐢熸垚KEY
+//            //KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);
+//            //keyGenerator.init(256);
+//            //绗簩姝ワ細 浜х敓瀵嗛挜
+//            //SecretKey secretKey = keyGenerator.generateKey();
+//            //绗笁姝ワ細 鑾峰彇瀵嗛挜
+//            //byte[] keyBytes = secretKey.getEncoded();
+//            //System.out.println(byteArrayToHexStr(keyBytes));
+//            String src = "aaaaaaaaaVVVVaaaAAAA鏃�";
+//            String pwd = "41151AF257BFDB7859EEC62FB341EE95EE42E648FE24E1F8CE8DADE287CC1E5C";
+//            String mw = encrypt(src,pwd);
+//            System.out.println("mw:"+mw);
+//            String jm = decrypt(mw,pwd);
+//            System.out.println("jm:"+jm);
+//
+//        }catch (Exception e){
+//
+//        }
+//
+//    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/HouseIdSecretUtil.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/HouseIdSecretUtil.java
new file mode 100644
index 0000000..bc2a93b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/HouseIdSecretUtil.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.link.core.utils.mqtt;
+
+/**
+ * 浣忓畢瀵嗛挜鑾峰彇宸ュ叿绫�
+ *
+ * @author yangtao
+ * @date 2021.2.26
+ */
+public class HouseIdSecretUtil {
+
+    public static String getSecret(String homeId) {
+        String temp = new StringBuffer().append(homeId).reverse().toString();
+        if (temp.length() > 16) {
+            return temp.substring(0, 16);
+        }
+        //闀垮害涓嶅16浣嶇敤0琛ラ綈
+        for (int i = temp.length(); i < 16; i++) {
+            temp += "0";
+        }
+        return temp;
+    }
+
+    public static String getSecret(Long homeId) {
+       return getSecret(homeId.toString());
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getSecret("1363358800782790658"));
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java
new file mode 100644
index 0000000..6e8ef74
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java
@@ -0,0 +1,412 @@
+package com.hdl.sdk.link.core.utils.mqtt;
+
+import android.content.Context;
+import android.text.TextUtils;
+
+import com.alibaba.fastjson.JSON;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.core.bean.LinkPacket;
+import com.hdl.sdk.link.core.bean.eventbus.EventBindMiniRemoteSuccessInfo;
+import com.hdl.sdk.link.core.bean.eventbus.EventNotifyRefreshGatewayAesKeyInfo;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.connect.HDLConnectHelper;
+import com.hdl.sdk.link.core.protocol.LinkMessageDecoder;
+import com.hdl.sdk.link.core.utils.AesUtil;
+import com.hdl.sdk.link.core.utils.QueueUtils;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
+import com.hdl.sdk.link.socket.bean.Packet;
+
+import org.eclipse.paho.client.mqttv3.IMqttActionListener;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.IMqttToken;
+import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.greenrobot.eventbus.EventBus;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Zoro on 2018/8/1.
+ * desc:2019/7/24  杩炴帴鎴愬姛浠ュ悗鍐嶈闃�   涓嶉渶瑕佸彂閫佸績璺�  涓嶉渶瑕佽嚜宸卞鐞嗛噸杩�
+ */
+
+public class MqttRecvClient {
+    private static String mBroker;
+    private MemoryPersistence persistence = new MemoryPersistence();
+    private MqttAsyncClient sampleClient;
+    private MqttConnectOptions connOpts = new MqttConnectOptions();
+    private MqttThread mqttThread;
+    private static volatile MqttRecvClient mqttRecvClient;
+    private final String TAG = "MqttRecvClient";
+    private static final String[] ignoreTopics = new String[]{"/thing/topo/found", "/ota/device/progress/up"};
+    /**
+     * 涓婃鐨勪富棰橀渶瑕佽褰�  鏇存敼涓婚鐨勬椂鍊欓渶瑕佸彇娑堣闃�
+     */
+    private static List<String> lastTopicFilters = new ArrayList<>();
+    private static String mClientId;
+    private static String mUserName;
+    private static String mPassWord;
+    private final int[] qos = {0};
+
+    private MqttRecvClient() {
+        if (mqttThread == null) {
+            mqttThread = new MqttThread();
+        }
+        if (TextUtils.isEmpty(mUserName) || TextUtils.isEmpty(mPassWord)) {
+            return;
+        }
+        mqttThread.start();
+    }
+
+    public static void init(Context context, String broker1, String deviceId, String userName, String pwd) {
+        mClientId = deviceId;
+        mBroker = broker1;
+        mUserName = userName;
+        mPassWord = pwd;
+        MqttRecvClient.create();
+    }
+
+    public void send(String topic, byte[] bytes) {
+        try {
+            if (TextUtils.isEmpty(topic)) {
+                LogUtils.e("璇锋眰涓婚涓簄ull");
+                return;
+            }
+            checkAndsubscribeAllTopics(topic);
+            publish(topic, bytes);
+        } catch (MqttException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鍙戝竷
+     *
+     * @param topic 涓婚
+     * @param bytes 鍐呭
+     * @throws MqttException
+     */
+    public void publish(String topic, byte[] bytes) throws MqttException {
+        //鍥炲鏃讹紝mqtt涓婚涓殑鏂瑰悜瑕佸彉鍖栵紝瑕佸仛鏂瑰悜鏇挎崲
+        mqttRecvClient.sampleClient.publish(topic, bytes, 1, false, null, new IMqttActionListener() {
+            @Override
+            public void onSuccess(IMqttToken asyncActionToken) {
+                LogUtils.d(TAG, topic);
+            }
+
+            @Override
+            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
+            }
+        });
+    }
+
+    public static void create() {
+        if (mqttRecvClient == null) {
+            mqttRecvClient = new MqttRecvClient();
+        }
+    }
+
+    /**
+     * 浣跨敤鐨勬椂鍊欓渶瑕佸垽鏂潪绌�
+     */
+    public static MqttRecvClient getInstance() {
+        if (null == mqttRecvClient) {
+            synchronized (MqttRecvClient.class) {
+                if (null == mqttRecvClient) {
+                    mqttRecvClient = new MqttRecvClient();
+                }
+                return mqttRecvClient;
+            }
+        }
+        return mqttRecvClient;
+    }
+
+    class MqttThread extends Thread {
+        @Override
+        public void run() {
+            super.run();
+            connect();
+        }
+    }
+
+    private void connect() {
+        try {
+            if (sampleClient != null) {
+                sampleClient.close();
+            }
+            sampleClient = new MqttAsyncClient(mBroker, mClientId, persistence);
+            connOpts.setUserName(mUserName);
+//            connOpts.setServerURIs(new String[]{mBroker});
+            connOpts.setPassword(mPassWord.toCharArray());
+            connOpts.setCleanSession(true);
+            connOpts.setKeepAliveInterval(10);
+            connOpts.setAutomaticReconnect(true);
+            connOpts.setConnectionTimeout(10);
+            connOpts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
+            sampleClient.setCallback(new MqttCallbackExtended() {
+                public void connectComplete(boolean reconnect, String serverURI) {
+                    LogUtils.d(TAG, "connect success");
+                    checkAndsubscribeAllTopics("");
+                }
+
+                public void connectionLost(Throwable throwable) {
+                    LogUtils.d(TAG, "杩炴帴鏂紑");
+                    lastTopicFilters.clear();
+                }
+
+                public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
+                    managerMqttMsg(topic, mqttMessage);
+                }
+
+                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
+                }
+            });
+            sampleClient.connect(connOpts);
+
+        } catch (Exception me) {
+            me.printStackTrace();
+        }
+    }
+
+    /**
+     * 澶勭悊鎺ユ敹鐨刴qtt鏁版嵁
+     *
+     * @param topic       鎺ユ敹涓婚
+     * @param mqttMessage 鎺ユ敹鏁版嵁
+     * @throws Exception
+     */
+    public void managerMqttMsg(String topic, MqttMessage mqttMessage) throws Exception {
+        LogUtils.d(TAG, "\r\n" + "mqtt->杩滅▼鍥炲涓婚" + topic);
+        if (HDLConnectHelper.isLocal()) {
+            boolean needReturn = true;
+            //濡傛灉鏄湰鍦版ā寮忥紝浜戠涓嬫潵鐨勭綉鍏虫暟鎹儴鍒嗘暟鎹笉鎺ユ敹(濡傦細ota鍗囩骇鍙嶉杩涘害)
+            for (String ignoreTopic : ignoreTopics) {
+                if (topic.endsWith(ignoreTopic)) {
+                    needReturn = false;
+                    break;
+                }
+            }
+            if (needReturn) {
+                return;
+            }
+        }
+        if (topic.contains("/custom/mqtt/secret/change")) {
+            /**
+             * 缃戝叧閲嶈繛mqtt 闇�瑕佹洿鎹esKey 涓嶇劧缃戝叧鏃犳硶瑙e瘑 閫氱煡鍒锋柊缃戝叧鍒楄〃骞朵笖鏇存柊涓荤綉鍏崇殑aesKey
+             */
+            String[] topics = topic.split("/");
+            //闈炲綋鍓嶄綇瀹呯綉鍏崇殑鏁版嵁杩斿洖
+            if (topics.length < 3) {
+                return;
+            }
+            LogUtils.d(TAG, "缃戝叧閲嶈繛mqtt绉橀挜鏇存柊閫氱煡->" + topic);
+            EventNotifyRefreshGatewayAesKeyInfo eventNotifyRefreshGatewayAesKeyInfo = new EventNotifyRefreshGatewayAesKeyInfo();
+            eventNotifyRefreshGatewayAesKeyInfo.setGatewayId(topics[2]);
+            EventBus.getDefault().post(eventNotifyRefreshGatewayAesKeyInfo);
+            return;
+        }
+
+        String[] topics = topic.split("/");
+        //闈炲綋鍓嶄綇瀹呯綉鍏崇殑鏁版嵁杩斿洖
+        if (topics.length < 3) {
+            return;
+        }
+        String aes = null;
+        String cloudsGatewayId = topics[2];//浜戠涓奊atewayId
+        GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(cloudsGatewayId);
+        if (cloudsGatewayId.equals(HDLLinkConfig.getInstance().getHomeId())) {
+            aes = getHomeAES();
+        } else if (gatewayBean != null && HDLConnectHelper.getGatewayTypeList().contains(gatewayBean.getGatewayType())) {
+            //姣背娉qtt涓撶敤绉橀挜
+            aes = gatewayBean.getAesKey();
+        } else {
+            aes = HDLLinkConfig.getInstance().getAesKey();
+        }
+        if (TextUtils.isEmpty(aes)) {
+            return;
+        }
+
+        byte[] bytes = AesUtil.aesDecrypt(mqttMessage.getPayload(), aes);
+        if (null == bytes) {
+            LogUtils.d(TAG, "\r\n" + "mqtt->杩滅▼鍥炲鏁版嵁 瀵嗛挜瑙e瘑澶辫触");
+            return;
+        }
+        String bodyStr = new String(bytes);
+        LogUtils.d(TAG, "\r\n" + "mqtt->杩滅▼鍥炲鏁版嵁" + bodyStr);
+        /**
+         * 绾㈠瀹濊澶囬�氳繃/thing/topo/found涓婚  涓婃姤绾㈠瀹濊澶囧凡缁忓叆缃戜簡  鐒跺悗鐩存帴return  涓嶉渶瑕佸啀涓嬭浜�
+         */
+        if (topic.endsWith("/thing/topo/found")) {
+            /**
+             * {"id":"0000016E","time_stamp":"366574","objects":[{"sid":"010105D370451908110100000000",
+             * "name":"Mini鏅鸿兘閬ユ帶鍣�","spk":"ir.module","oid":"010105D370451908","omodel":"MIR01R-LK.10",
+             * "online":"true","attributes":[],"status":[],"from":"010105D370451908","src":"010105D370451908"}]}
+             */
+            if (bodyStr.contains("ir.module")) {
+                EventBus.getDefault().post(new EventBindMiniRemoteSuccessInfo());
+                return;
+            }
+        }
+        //Link浠庣綉鍏抽�忎紶鐗规畩澶勭悊
+        if (topic.contains("/native/a/") && topic.contains("/slaveoid/")) {
+            LinkMessageDecoder.getInstance().read(new Packet(bytes));
+        } else {
+            byte[] topBytes = new byte[3];
+            if (bytes.length > 2) {
+                topBytes[0] = bytes[0];
+                topBytes[1] = bytes[1];
+                topBytes[2] = bytes[2];
+            }
+            if (new String(topBytes).equals("hex")) {//link鍘熺敓鏁版嵁锛屽垽鏂槸鍚︽槸鏂囦欢澶勭悊閫氱煡
+                LinkMessageDecoder.getInstance().read(new Packet(bytes));
+            } else {
+                QueueUtils.getInstance().add(new LinkPacket(topic, bytes, true));
+            }
+        }
+    }
+
+    /**
+     * 妫�鏌ヤ富棰樻槸鍚﹀凡璁㈤槄锛屾病鏈夎闃呭氨璁㈤槄
+     *
+     * @param sendTopic 璇锋眰涓婚
+     */
+    public synchronized void checkAndsubscribeAllTopics(String sendTopic) {
+        if (null != sampleClient && sampleClient.isConnected() == false) {
+            return;
+        }
+        try {
+            for (String topic : nativeAndLinkTopic(sendTopic)) {
+                if (lastTopicFilters.contains(topic)) {
+                    continue;
+                }
+                LogUtils.d(TAG, "璁㈤槄涓婚" + topic);
+
+                sampleClient.subscribe(topic, 0, null, new IMqttActionListener() {
+                    @Override
+                    public void onSuccess(IMqttToken asyncActionToken) {
+                        if (!lastTopicFilters.contains(topic)) {
+                            lastTopicFilters.add(topic);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
+
+                    }
+                });
+            }
+
+        } catch (MqttException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 璁㈤槄骞冲彴涓嬫潵鐨勪富棰�
+     *
+     * @return string鏁扮粍
+     */
+    private String[] nativeAndLinkTopic(String sendTopic) {
+        String[] topicArray = sendTopic.split("/");
+        //闈炲綋鍓嶄綇瀹呯綉鍏崇殑鏁版嵁杩斿洖
+        if (topicArray.length < 3) {
+            return new String[]{
+                    String.format("/user/%s/#", HDLLinkConfig.getInstance().getGatewayId()),
+                    String.format("/base/%s/#", HDLLinkConfig.getInstance().getGatewayId())};
+        }
+
+        String gatewayId = topicArray[2];//浜戠涓奊atewayId
+        String[] topics = {
+                String.format("/user/%s/#", HDLLinkConfig.getInstance().getGatewayId()),
+                String.format("/base/%s/#", HDLLinkConfig.getInstance().getGatewayId()),
+                String.format("/user/%s/#", gatewayId),
+                String.format("/base/%s/#", gatewayId),
+        };
+        return topics;
+    }
+
+
+    /**
+     * APP璁㈤槄浜戠涓婚瑙e瘑瀵嗘枃鐨勭閽�(杩欎釜瀵嗛挜鍙兘鐢ㄤ簬璁㈤槄浜戠涓婚锛岃闃呯綉鍏充富棰樺彟澶栦竴涓瘑閽�)
+     *
+     * @return -杩斿洖瑙e瘑瀵嗘枃鐨勭閽�
+     */
+    private String getHomeAES() {
+        String homeId = HDLLinkConfig.getInstance().getHomeId();
+        if (TextUtils.isEmpty(homeId)) {
+            return null;
+        }
+        //瑙e瘑瀵嗛挜瑙勫垯锛氬凡鐜版湁鐨勪綇瀹匢D涓哄熀鍑�,浠庡彸杈逛竴涓�鑾峰彇鍊�,鏈�鍚庡鏋滀笉澶�16浣�,鍒欏線鍙宠ˉ闆�
+        StringBuilder aesKey = new StringBuilder();
+        for (int i = homeId.length() - 1; i >= 0; i--) {
+            aesKey.append(homeId.charAt(i));
+            if (aesKey.length() == 16) {
+                break;
+            }
+        }
+        return this.PadRight(aesKey.toString(), 16, "0");
+    }
+
+    /**
+     * 浠庡彸杈规坊鍔犵┖鏍兼垨鍏跺畠瀛楃
+     *
+     * @param currentValueStr 褰撳墠鍊�
+     * @param count           鎬婚暱鏁�
+     * @param others          鍏跺畠瀛楃(鑷畾涔�)
+     * @return 鎬婚暱搴�
+     */
+    private String PadRight(String currentValueStr, int count, String others) {
+        if (count > currentValueStr.length()) {
+            StringBuilder stringBuilder = new StringBuilder();
+            int subLen = count - currentValueStr.length();
+            for (int i = 0; i < subLen; i++) {
+                stringBuilder.append(others);
+            }
+            currentValueStr = currentValueStr + stringBuilder;
+        }
+        return currentValueStr;
+
+    }
+
+    /**
+     * 鍒囨崲浣忓畢鐨勬椂鍊欒闃呰鍏ㄩ儴鍙栨秷
+     */
+    public void removeAllTopic() {
+        if (null != sampleClient && sampleClient.isConnected() == false) {
+            return;
+        }
+        try {
+            if (lastTopicFilters.size() == 0) {
+                return;
+            }
+            LogUtils.d(TAG, "绉婚櫎涓婚:\r\n" + JSON.toJSONString(lastTopicFilters));
+            sampleClient.unsubscribe(lastTopicFilters.toArray(new String[lastTopicFilters.size()]));
+            lastTopicFilters.clear();
+        } catch (MqttException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void stop() {
+        if (mqttRecvClient != null) {
+            try {
+                if (mqttRecvClient.sampleClient != null) {
+                    mqttRecvClient.sampleClient.disconnect();
+                    mqttRecvClient.sampleClient.close();
+                    mqttRecvClient = null;
+                }
+            } catch (MqttException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java
new file mode 100644
index 0000000..d7b6668
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java
@@ -0,0 +1,799 @@
+package com.hdl.sdk.link.gateway;
+
+import android.text.TextUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+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.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.R;
+import com.hdl.sdk.link.common.config.TopicConstant;
+import com.hdl.sdk.link.common.event.EventDispatcher;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.IdUtils;
+import com.hdl.sdk.link.common.utils.IpUtils;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.SPUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+
+import com.hdl.sdk.link.core.bean.LinkRequest;
+import com.hdl.sdk.link.core.bean.LinkResponse;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.bean.response.BaseLocalResponse;
+import com.hdl.sdk.link.core.callback.GatewayCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkTCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.core.connect.HDLConnectHelper;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/23.
+ */
+public class HDLLinkLocalGateway {
+    //instance
+    private volatile static HDLLinkLocalGateway instance;
+
+    //getInstance
+    public static synchronized HDLLinkLocalGateway getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkLocalGateway.class) {
+                if (instance == null) {
+                    instance = new HDLLinkLocalGateway();
+                }
+            }
+        }
+        return instance;
+    }
+
+    /**
+     * 缃戝叧鍒楄〃锛岃褰曟墍鏈夋悳绱㈠埌鐨勭綉鍏筹紝鍙兘鍖呭惈鏂嚎鐨勭綉鍏�
+     */
+    private final List<GatewayBean> gatewayBeanList = new ArrayList();
+
+    /**
+     * 鑾峰彇缂撳瓨鐨勭綉鍏冲垪琛紝鍙兘鍖呭惈鏂嚎鐨勭綉鍏�
+     *
+     * @return 缃戝叧鍒楄〃
+     */
+    public List<GatewayBean> getGatewayList() {
+        return gatewayBeanList;
+    }
+
+    /**
+     * 閫氳繃oid鎴栬�呯綉鍏矷D鎴栬�匒MC鑾峰彇鍐呭瓨涓殑缃戝叧锛屾敞鎰忥紝濡傛灉鏄繙绋嬮�氳锛実atewayBeanList瑕佸钩鍙颁笂缁戝畾鐨勪富缃戝叧鍙婁粠缃戝叧杩涘幓锛岃涓嶈幏鍙栦笉鍒扮綉鍏充俊鎭�
+     *
+     * @param oidOrGatewayId
+     * @return
+     */
+    public GatewayBean getGatewayByOidOrGatewayId(String oidOrGatewayId) {
+        if (TextUtils.isEmpty(oidOrGatewayId)) {
+            return null;
+        }
+        for (GatewayBean gatewayBean : gatewayBeanList) {
+            if (oidOrGatewayId.equals(gatewayBean.getOid())
+                    || oidOrGatewayId.equals(gatewayBean.getGatewayId())
+                    || oidOrGatewayId.equals(gatewayBean.getDevice_mac())
+                    || oidOrGatewayId.equals(gatewayBean.getIp_address())
+            )
+                return gatewayBean;
+        }
+        return null;
+    }
+
+    /**
+     * 閫氳繃IP鑾峰彇缃戝叧淇℃伅
+     *
+     * @param ipAddress
+     * @return
+     */
+    public GatewayBean getGatewayByIpAddress(String ipAddress) {
+        if (TextUtils.isEmpty(ipAddress)) {
+            return null;
+        }
+        for (GatewayBean gatewayBean : gatewayBeanList) {
+            if (ipAddress.equals(gatewayBean.getIp_address()))
+                return gatewayBean;
+        }
+        return null;
+    }
+
+    /**
+     * 閫氳繃spk鑾峰彇缃戝叧锛岃繖涓篃鏀寔鑾峰彇姣背娉�
+     *
+     * @param spkList 闆嗗悎
+     * @return 杩斿洖缃戝叧鍒楄〃
+     */
+    public List<GatewayBean> getGatewayBySpk(List<String> spkList) {
+        if (spkList.size() == 0) {
+            return this.getGatewayList();
+        }
+        List<GatewayBean> gatewayBeanList = new ArrayList<>();
+        for (GatewayBean gatewayBean : this.getGatewayList()) {
+            if (spkList.contains(gatewayBean.getGatewayType()))
+                gatewayBeanList.add(gatewayBean);
+        }
+        return gatewayBeanList;
+    }
+
+    /**
+     * 鑾峰彇缃戝叧鍒楄〃  鍘绘帀绾㈠瀹濊繖绉嶈澶�
+     *
+     * @param spkList 闆嗗悎
+     * @return 杩斿洖缃戝叧鍒楄〃
+     */
+    public List<GatewayBean> getGatewayByGatewayType(List<String> spkList) {
+        if (spkList.size() == 0) {
+            return this.getGatewayList();
+        }
+        List<GatewayBean> gatewayBeanList = new ArrayList<>();
+        for (GatewayBean gatewayBean : this.getGatewayList()) {
+            if (spkList.contains(gatewayBean.getGatewayType()) && !"MIR01R-LK.10".equals(gatewayBean.getDevice_model()))
+                gatewayBeanList.add(gatewayBean);
+        }
+        return gatewayBeanList;
+    }
+
+    /**
+     * 鑾峰彇鏈湴缃戝叧瀵硅薄(鍖呮嫭姣背娉�)
+     *
+     * @param macAndSid 璁惧mac
+     * @return 鎵惧埌杩斿洖GatewayBean, 鏈壘鍒拌繑鍥瀗ull.
+     */
+    public GatewayBean getLocalGateway(String macAndSid) {
+        if (TextUtils.isEmpty(macAndSid)) {
+            return null;
+        }
+        for (GatewayBean gatewayBean : this.getGatewayList()) {
+            if (macAndSid.equals(gatewayBean.getDevice_mac())
+                    || macAndSid.equals(gatewayBean.getSid())) {
+                return gatewayBean;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠浣忓畢鐨勪富缃戝叧;
+     *
+     * @param homeId 浣忓畢id
+     * @return 鎵惧埌杩斿洖GatewayBean, 鏈壘鍒拌繑鍥瀗ull.
+     */
+    public GatewayBean findMainGateway(String homeId) {
+        for (GatewayBean gatewayBean : this.getGatewayList()) {
+            if (gatewayBean.getMaster().equals("true")
+                    && gatewayBean.getHomeId().equals(homeId)
+                    && gatewayBean.getGatewayType().equals("AGATEWAY")) {
+                return gatewayBean;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鎼滅储缃戝叧锛屽彧鍙戜竴娆★紝娌℃湁鍥炶皟
+     */
+    public void serchGatewayOneTime() {
+        String time = String.valueOf(System.currentTimeMillis());
+        JsonObject jsonObject = new JsonObject();
+        jsonObject.addProperty("id", IdUtils.getUUId());
+        jsonObject.addProperty("time_stamp", time);
+        LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH,
+                jsonObject.toString(), false);
+
+        String ipAddress = IpUtils.getBroadcastAddress();
+        new HDLConnectHelper(1, ipAddress, message, false).send();
+    }
+
+
+    /**
+     * 鍒涙柊鎵�鏈夊湪绾跨殑缃戝叧锛屽寘鎷綋鍓嶄綇瀹呯殑鍙婃病鏈夌粦瀹氳繃鐨勭綉鍏�
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void refreshGatewayByHome(String homeId, GatewayCallBack callBack) {
+        refreshGatewayByHome(homeId, true, callBack);
+    }
+
+    /**
+     * 鏍规嵁浣忓畢id鑾峰彇缃戝叧
+     *
+     * @param homeId                 杩囨护鐨勪綇瀹卛d
+     * @param needEmptyHomeIdGateway 缃戝叧鐨勪綇瀹卛d涓虹┖鏃讹紝鏄惁鍙互鍔犲叆缃戝叧鍒楄〃
+     * @param callBack               鍥炶皟鏂规硶
+     */
+    public void refreshGatewayByHome(String homeId, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
+        refreshGatewayByHomeIdAndSpk(homeId, this.getGatewayTypeList(), needEmptyHomeIdGateway, callBack);
+    }
+
+    /**
+     * 鑾峰彇缃戠粶璁惧锛屽寘鎷綉鍏冲強姣背娉㈢瓑缃戠粶璁惧
+     *
+     * @param homeId                 浣忓畢Id
+     * @param spk                    缃戠粶璁惧spk
+     * @param needEmptyHomeIdGateway 鏄惁闇�瑕佺┖浣忓畢Id璁惧
+     * @param callBack               鍥炶皟
+     */
+    public void refreshGatewayByHomeIdAndSpk(String homeId, List<String> spk, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
+        String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
+        final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
+        EventListener eventListener = getSearchGatewayEvent(homeId, spk, needEmptyHomeIdGateway, tempGatewayBeanList);
+        EventDispatcher.getInstance().register(topicReply, eventListener);
+
+        ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
+            @Override
+            public void run() {
+                int count = 5;
+                while (0 < count--) {
+                    try {
+                        //鎼滅储缃戝叧
+                        serchGatewayOneTime();
+                        Thread.sleep(300L);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                //瓒呭嚭娆℃暟鍚庣Щ闄ょ洃鍚簨浠�
+                EventDispatcher.getInstance().remove(topicReply, eventListener);
+                if (callBack != null) {
+                    if (tempGatewayBeanList.size() == 0) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
+                    } else {
+                        callBack.onSuccess(tempGatewayBeanList);
+                    }
+                }
+            }
+        });
+    }
+
+    /**
+     * 鍒涙柊鎵�鏈夊湪绾跨殑缃戝叧锛屽寘鎷綋鍓嶄綇瀹呯殑鍙婃病鏈夌粦瀹氳繃鐨勭綉鍏�
+     *
+     * @param callBack 鍥炶皟
+     */
+    public void refreshGateway(GatewayCallBack callBack) {
+        String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
+        final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
+        EventListener eventListener = getSearchGatewayEvent(this.getGatewayTypeList(), tempGatewayBeanList);
+        EventDispatcher.getInstance().register(topicReply, eventListener);
+        ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
+            @Override
+            public void run() {
+                int count = 5;
+                while (0 < count--) {
+                    try {
+                        //鎼滅储缃戝叧
+                        serchGatewayOneTime();
+                        Thread.sleep(300L);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+
+                //瓒呭嚭娆℃暟鍚庣Щ闄ょ洃鍚簨浠�
+                EventDispatcher.getInstance().remove(topicReply, eventListener);
+                if (callBack != null) {
+                    if (tempGatewayBeanList.size() == 0) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
+                    } else {
+
+                        callBack.onSuccess(tempGatewayBeanList);
+                    }
+                }
+            }
+        });
+    }
+
+//    /**
+//     * 鑾峰彇鎼滅储缃戝叧浜嬩欢
+//     *
+//     * @param homeId
+//     * @return
+//     */
+//    private EventListener getSearchGatewayEvent(String homeId, final List<GatewayBean> tempGatewayBeanList) {
+//       return getSearchGatewayEvent(homeId,true,tempGatewayBeanList);
+//    }
+
+
+//    /**
+//     * 鑾峰彇鎼滅储缃戝叧浜嬩欢
+//     *
+//     * @param homeId
+//     * @return
+//     */
+//    private EventListener getSearchGatewayEvent(String homeId, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
+//        //娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+//        return new EventListener() {
+//            @Override
+//            public void onMessage(Object msg) {
+//                if (!(msg instanceof LinkResponse)) {
+//                    return;
+//                }
+//                GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
+//                if (gateway == null) {
+//                    return;
+//                }
+//                gateway.setOnline(true);
+//                gateway.setIsLocalGateWay(true);//鏈湴鎼滅储鍒扮殑缃戝叧鏍囪瘑涓烘湰鍦扮綉鍏�
+//
+//                //鍙姞杞戒綇瀹呬竴鏍风殑鎴栬�呯綉鍏宠繕娌℃湁閰嶇疆杩囩殑锛屾垨鑰呬笉闇�瑕佷綇瀹卛d涓虹┖鐨勭綉鍏�
+//                if (homeId.equals(gateway.getHomeId()) || (needEmptyHomeIdGateway == true && TextUtils.isEmpty(gateway.getHomeId()))) {
+//                    //鏇存柊缂撳瓨缃戝叧锛屼細璁板綍鎵�鏈夋敹鍒扮殑缃戝叧锛屼互涓轰簡淇濆瓨缃戝叧鐨処P淇℃伅
+//                    updateGatewayList(gatewayBeanList, gateway);
+//                    //鏇存柊褰撳墠璇诲彇缃戝叧鐨勫垪琛紝杩欎釜鍒楄〃姣忔閮芥槸娓呯┖鍐嶈鍙�
+//                    updateGatewayList(tempGatewayBeanList, gateway);
+//                }
+//            }
+//        };
+//    }
+
+    /**
+     * 鑾峰彇鎼滅储缃戝叧浜嬩欢
+     *
+     * @param homeId
+     * @return
+     */
+    private EventListener getSearchGatewayEvent(String homeId, List<String> spk, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
+        //娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+        return new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                if (!(msg instanceof LinkResponse)) {
+                    return;
+                }
+                GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
+                if (gateway == null) {
+                    return;
+                }
+                gateway.setOnline(true);
+                gateway.setIsLocalGateWay(true);//鏈湴鎼滅储鍒扮殑缃戝叧鏍囪瘑涓烘湰鍦扮綉鍏�
+                //鍙姞杞戒綇瀹呬竴鏍风殑鎴栬�呯綉鍏宠繕娌℃湁閰嶇疆杩囩殑锛屾垨鑰呬笉闇�瑕佷綇瀹卛d涓虹┖鐨勭綉鍏�
+                if (homeId.equals(gateway.getHomeId()) || (needEmptyHomeIdGateway == true && TextUtils.isEmpty(gateway.getHomeId()))) {
+                    //鏇存柊缂撳瓨缃戝叧锛屼細璁板綍鎵�鏈夋敹鍒扮殑缃戝叧锛屼互涓轰簡淇濆瓨缃戝叧鐨処P淇℃伅
+                    updateGatewayList(gatewayBeanList, gateway);
+                    //闈炴悳绱㈢殑缃戝叧绫讳技杩斿洖
+                    if (spk.contains(gateway.getGatewayType())) {
+                        //鏇存柊褰撳墠璇诲彇缃戝叧鐨勫垪琛紝杩欎釜鍒楄〃姣忔閮芥槸娓呯┖鍐嶈鍙�
+                        updateGatewayList(tempGatewayBeanList, gateway);
+                    }
+                }
+            }
+        };
+    }
+
+    /**
+     * 鑾峰彇鎼滅储缃戝叧浜嬩欢 杩欒竟涓嶈繃婊omeId
+     *
+     * @return
+     */
+    private EventListener getSearchGatewayEvent(List<String> spk, final List<GatewayBean> tempGatewayBeanList) {
+        //娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+        return new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                if (!(msg instanceof LinkResponse)) {
+                    return;
+                }
+                GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
+                if (gateway == null) {
+                    return;
+                }
+                gateway.setIsLocalGateWay(true);//鏈湴鎼滅储鍒扮殑缃戝叧鏍囪瘑涓烘湰鍦扮綉鍏�
+                //鍗囩骇缃戝叧椹卞姩  闇�瑕佹樉绀烘墍鏈夌綉鍏�
+                //鈿狅笍杩欒竟涓嶉渶瑕佹坊鍔犲埌gatewayBeanList   鍥犱负杩欎釜鏄綉鍏崇绾垮崌绾х殑鏃跺�欑殑鍔熻兘
+//                updateGatewayList(gatewayBeanList, gateway);
+                //鏇存柊褰撳墠璇诲彇缃戝叧鐨勫垪琛紝杩欎釜鍒楄〃姣忔閮芥槸娓呯┖鍐嶈鍙�
+                if (spk.contains(gateway.getGatewayType())) {
+                    //鏇存柊褰撳墠璇诲彇缃戝叧鐨勫垪琛紝杩欎釜鍒楄〃姣忔閮芥槸娓呯┖鍐嶈鍙�
+                    updateGatewayList(tempGatewayBeanList, gateway);
+                }
+            }
+        };
+    }
+
+    /**
+     * 鏇存柊鏀跺埌鐨勭綉鍏冲埌鍒楄〃
+     *
+     * @param gatewayBeanList
+     * @param gateway         褰撳墠鏀跺埌鐨勭綉鍏�
+     */
+    void updateGatewayList(final List<GatewayBean> gatewayBeanList, GatewayBean gateway) {
+
+        if (TextUtils.isEmpty(gateway.getOid()) || TextUtils.isEmpty(gateway.getDevice_mac())) {
+            LogUtils.e("缃戝叧Mac鎴栬�匫id涓虹┖锛屾棤鏁堢綉鍏�");
+            return;
+        }
+
+        boolean isFound = false;//鏄惁鍦ㄥ唴瀛樹腑鎵惧埌缃戝叧瀵硅薄
+        //鎵惧嚭mac涓�鏍风殑缃戝叧鏇存柊鏈�鏂版暟鎹�
+        for (int i = 0; i < gatewayBeanList.size(); i++) {
+            if (gatewayBeanList.get(i).getDevice_mac().equals(gateway.getDevice_mac())) {
+                isFound = true;
+                gatewayBeanList.set(i, gateway);
+//                break;
+            }
+        }
+
+        //娓呴櫎oid涓�鏍凤紝mac涓嶄竴鏍风殑缃戝叧缂撳瓨銆備竴鑸槸鍦ㄧ綉鍏虫浛鎹㈢殑鎯呭喌绌洪棿鍑虹幇
+        for (int i = 0; i < gatewayBeanList.size(); i++) {
+            if (gatewayBeanList.get(i).getDevice_mac().equals(gateway.getDevice_mac()) && !gatewayBeanList.get(i).getOid().equals(gateway.getOid())) {
+                gatewayBeanList.remove(i--);
+            }
+        }
+
+        //娌℃湁鎵惧埌灏辨坊鍔�
+        if (!isFound) {
+            gatewayBeanList.add(gateway);
+        }
+    }
+
+    /**
+     * 鑾峰彇缃戝叧瀵硅薄
+     *
+     * @param linkResponse
+     * @return
+     */
+    private GatewayBean getGatewayBeanByResponse(LinkResponse linkResponse) {
+        String data = linkResponse.getData();
+        if (!TextUtils.isEmpty(data)) {
+            final BaseLocalResponse<GatewayBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewayBean>>() {
+            }.getType());
+            return response.getObjects();
+        }
+        return null;
+    }
+
+
+    /*
+     * 缁戝畾缃戝叧
+     * */
+    public void SetGatewayRemoteInfo(String master, String mac, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
+
+        JsonObject jObject = new JsonObject();
+        if (master.equals("true")) {
+            jObject.addProperty("server_addr", regionUrl);
+            jObject.addProperty("remote", "true");
+        } else {
+            jObject.addProperty("server_addr", "");
+            jObject.addProperty("remote", "false");
+        }
+
+        JsonObject sendJsonObj = new JsonObject();
+        sendJsonObj.add("objects", jObject);
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /*
+     * 缁戝畾缃戝叧
+     * 缂栬緫homeId缁欑綉鍏�
+     * */
+    public void bindGateway(String master, String mac, String homeId, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
+
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("homeId", homeId);
+//        if(master.equals("true")) {
+//            jObject.addProperty("server_addr", regionUrl);
+//            jObject.addProperty("remote", "true");
+//        }else {
+//            jObject.addProperty("server_addr", "");
+//            jObject.addProperty("remote", "false");
+//        }
+
+        JsonObject sendJsonObj = new JsonObject();
+        sendJsonObj.add("objects", jObject);
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /*
+     * 鍒濆鍖栫綉鍏�
+     * */
+    public void initializeGateway(String mac, String oid, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_INITIALIZE_REMOTE, oid);
+
+        JsonObject sendJsonObj = new JsonObject();
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("device_mac", mac);
+        sendJsonObj.add("objects", jObject);
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /*
+     * 璁剧疆涓讳粠缃戝叧鏍囪
+     * */
+    public void setMasterGateway(String regionUrl, String ip, String mac, String master, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
+
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("master", master);
+
+        JsonObject sendJsonObj = new JsonObject();
+        sendJsonObj.add("objects", jObject);
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if ("true".equals(master)) {
+                    String longStr1 = SPUtils.getString("longitude");
+                    String latStr1 = SPUtils.getString("latitude");
+                    if (!TextUtils.isEmpty(longStr1) && !TextUtils.isEmpty(latStr1)) {
+                        HDLLinkLocalSdk.getInstance().gatewayLocation(mac, longStr1, latStr1, isEncrypt, new HDLLinkTCallBack<String>() {
+                            @Override
+                            public void onSuccess(String data) {
+                            }
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                            }
+                        });
+                    }
+                }
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+                SetGatewayRemoteInfo(master, mac, regionUrl, ip, isEncrypt, new HDLLinkCallBack() {
+                    @Override
+                    public void onSuccess(String msg) {
+
+                    }
+
+                    @Override
+                    public void onError(HDLLinkException e) {
+
+                    }
+                });
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /**
+     * 璁剧疆缃戝叧鍏ョ綉浠庢満妯″紡
+     */
+    public void AuthGateway(String ip, String mac, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
+
+        JsonObject sendJsonObj = new JsonObject();
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("spk", "LINKDEVICE");
+        jObject.addProperty("time", "120");
+        sendJsonObj.add("objects", jObject);
+
+
+        String sendStr = sendJsonObj.toString();
+        LinkRequest message = new LinkRequest(topic, sendStr, false);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                callBack.onSuccess("");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /**
+     * 璁剧疆缃戝叧鍏ョ綉浠庢満妯″紡
+     */
+    public void AuthGateway(String ip, String mac) {
+        String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
+
+        JsonObject sendJsonObj = new JsonObject();
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("spk", "LINKDEVICE");
+        jObject.addProperty("time", "120");
+        sendJsonObj.add("objects", jObject);
+
+
+        String sendStr = sendJsonObj.toString();
+        LinkRequest message = new LinkRequest(topic, sendStr, false);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+            }
+        }, true).send();
+    }
+
+    /*
+     * 鑾峰彇缃戝叧淇℃伅
+     * */
+    public void getGatewayInfo(String ip, String mac, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_GET, mac);
+
+        JsonObject sendJsonObj = new JsonObject();
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+
+    /**
+     * 鍙戦�佹暟鎹埌Link缃戝叧
+     *
+     * @param ip        缃戝叧IP
+     * @param mac       缃戝叧mac
+     * @param isEncrypt 鏄惁鍔犲瘑
+     * @param topic     璇锋眰涓婚
+     * @param jObject   璐熻浇鏁版嵁<娌℃湁濉玭ull></>
+     * @param sendPath  鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
+     */
+    public void sendDataToLinkGateway(String ip, String mac, boolean isEncrypt,
+                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+        String topicSend = topic.replace("%s", mac);
+        //缁勮闇�瑕佸彂閫佺殑鏁版嵁
+        String sendStr = createSendData(jObject);
+//        LogUtils.i("sendDataToLinkGateway->" + sendPath + "->鏈湴鍙戦�乗r\n" + topicSend + "\r\n" + sendStr);
+        LinkRequest message = new LinkRequest(topicSend, sendStr, isEncrypt);
+        GatewayBean gatewayBean = this.getLocalGateway(mac);
+        if (gatewayBean != null) {
+            message.setCloudTopic(topic.replace("%s", gatewayBean.getGatewayId()));
+        }
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                try {
+                    JSONObject jsonObject = new JSONObject(new Gson().toJson(msg));
+                    if (jsonObject.has("data")) {
+                        callBack.onSuccess(jsonObject.getString("data"));
+                    }
+                } catch (Exception e) {
+                    callBack.onSuccess(e.getMessage());
+                }
+//                LogUtils.i("sendDataToLinkGateway->"+sendPath+"->鏈湴鎺ユ敹鏁版嵁\r\n"+msg.toString());
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+//                LogUtils.i("sendDataToLinkGateway->" + sendPath + "->鏈湴鎺ユ敹鏁版嵁->澶辫触(-200)");
+            }
+        }, true, mac).send();
+    }
+
+    /**
+     * 缁勮闇�瑕佸彂閫佺殑鏁版嵁
+     *
+     * @param jObject 璐熻浇鏁版嵁<娌℃湁濉玭ull>
+     * @return 杩斿洖json瀛楃涓�
+     */
+    private String createSendData(Object jObject) {
+        //topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
+        JsonObject sendJsonObj = new JsonObject();
+        if (jObject != null) {
+            if (jObject instanceof JsonObject) {
+                sendJsonObj.add("objects", (JsonObject) jObject);
+            } else if (jObject instanceof JsonArray) {
+                sendJsonObj.add("objects", (JsonArray) jObject);
+            } else if (jObject instanceof JSONArray) {
+                JsonArray array = GsonConvert.getGson().fromJson(jObject.toString(), new TypeToken<JsonArray>() {
+                }.getType());
+                sendJsonObj.add("objects", array);
+            }
+        }
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        return sendJsonObj.toString();
+    }
+
+    /**
+     * 鏀寔缃戝叧绫诲瀷
+     *
+     * @return 绫诲瀷鍒楄〃
+     */
+    private List<String> getGatewayTypeList() {
+        List<String> typeList = new ArrayList<>();
+        typeList.add("AGATEWAY");//缃戝叧
+        typeList.add("sensor.mmv_sleep");//姣背娉pk
+        typeList.add("sensor.mmv_pose");//姣背娉pk
+        return typeList;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/bean/GatewaySearchBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/bean/GatewaySearchBean.java
new file mode 100644
index 0000000..f0a02e3
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/bean/GatewaySearchBean.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.link.gateway.bean;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 12/16/21.
+ */
+public class GatewaySearchBean implements Serializable {
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/type/GatewayMasterType.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/type/GatewayMasterType.java
new file mode 100644
index 0000000..1ad5fa2
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/type/GatewayMasterType.java
@@ -0,0 +1,21 @@
+package com.hdl.sdk.link.gateway.type;
+
+import androidx.annotation.StringDef;
+
+import java.lang.annotation.Retention;
+
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Created by jlchen on 12/30/21.
+ */
+@Retention(SOURCE)
+@StringDef({GatewayMasterType.MasterTrue,GatewayMasterType.MasterFalse,GatewayMasterType.NO_CONFIG})
+public @interface GatewayMasterType {
+    //涓荤綉鍏�
+    String MasterTrue = "true";
+    //浠庣綉鍏�
+    String MasterFalse = "false";
+    //鏈厤缃�
+    String NO_CONFIG = "no_config";
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketOptions.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketOptions.java
new file mode 100644
index 0000000..d92529a
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketOptions.java
@@ -0,0 +1,74 @@
+package com.hdl.sdk.link.socket;
+
+
+import com.hdl.sdk.link.socket.codec.IHandleMessage;
+import com.hdl.sdk.link.socket.listener.ConnectStatusListener;
+
+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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketPool.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketPool.java
new file mode 100644
index 0000000..79e11f6
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketPool.java
@@ -0,0 +1,54 @@
+package com.hdl.sdk.link.socket;
+
+import com.hdl.sdk.link.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 class SingletonInstance {
+        private static final SocketPool INSTANCE = new SocketPool();
+    }
+
+    public static SocketPool getInstance() {
+        return SingletonInstance.INSTANCE;
+    }
+
+    public void clear() {
+        mPool.clear();
+        mUdpClientPool.clear();
+    }
+
+    public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
+        DatagramSocket socket = null;
+        final String key = address.getPort() + "";
+        if (mUdpClientPool.containsKey(key)) {
+            socket = mUdpClientPool.get(key);
+            if (socket != null && socket.isClosed()) {
+                mUdpClientPool.remove(key);
+                socket = null;
+            }
+        }
+        if (socket == null) {
+            socket = new DatagramSocket(address);
+            mUdpClientPool.put(key, socket);
+        }
+        return socket;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketRequest.java
new file mode 100644
index 0000000..d710ad6
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/SocketRequest.java
@@ -0,0 +1,34 @@
+package com.hdl.sdk.link.socket;
+
+import java.util.UUID;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class SocketRequest {
+
+    private String action;
+
+    private byte[] data;
+
+    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;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java
new file mode 100644
index 0000000..5a098d9
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java
@@ -0,0 +1,281 @@
+package com.hdl.sdk.link.socket;
+
+import android.text.TextUtils;
+
+import androidx.collection.ArrayMap;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.socket.client.IClient;
+import com.hdl.sdk.link.socket.client.IHeartbeat;
+import com.hdl.sdk.link.socket.listener.SendListener;
+import com.hdl.sdk.link.socket.annotation.ConnectStatus;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+
+/**
+ * Created by Tong on 2021/9/26.
+ * Tcp/Udp 鍚姩鍣�
+ */
+public class TcpSocketBoot {
+
+    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  long time=System.currentTimeMillis();
+    /**
+     * tcp鏄惁宸茬粡杩炴帴
+     */
+    private boolean connected=false;
+
+    public IClient getClient() {
+        return client;
+    }
+
+    public boolean isConnected() {
+        return connected;
+    }
+
+    private final BlockingQueue<SocketRequest> mMessageQueue = new LinkedBlockingDeque<>();
+
+    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
+
+    public  TcpSocketBoot(IClient client) {
+        TCP_SOCKET_BOOT_LIST.add(this);
+        this.client = client;
+        initConnectThread();
+        initReceiveThread();
+        initSendThread();
+        initHeartbeat();
+    }
+
+    /**
+     * 璁板綍鎵�鏈塖ocketBoot
+     */
+    final static List<TcpSocketBoot> TCP_SOCKET_BOOT_LIST = new ArrayList();
+
+    /**
+     * 鏍规嵁IP鍦板潃鍙婄鍙h幏鍙栧綋鍓峴ocketBoot
+     * @param ipAddress
+     * @param port
+     * @return
+     */
+    public static TcpSocketBoot getByEndPoint(String ipAddress, int port){
+        if(ipAddress==null){
+            return  null;
+        }
+        for(TcpSocketBoot tcpSocketBoot : TCP_SOCKET_BOOT_LIST){
+            if(ipAddress.equals(tcpSocketBoot.getClient().getOptions().getIp())&& tcpSocketBoot.getClient().getOptions().getPort()==port)
+            {
+                return tcpSocketBoot;
+            }
+        }
+        return  null;
+    }
+
+    /**
+     * 杩炴帴tcp锛屽唴閮ㄧ淮鎶ゆ帀锛屽彲浠ヤ笉鐢ㄥ紑鏀惧閮紝鏍规嵁杩欎釜涓氬姟鎴戠壒鎬у鐞嗗ソ
+     */
+    private synchronized void connect() {
+        try {
+            LogUtils.i("TCP杩炴帴锛�"+this.getClient().getOptions().getIp());
+            client.onConnectStatus(ConnectStatus.CONNECTING);
+//            Thread.sleep(700);
+            client.connect();
+            LogUtils.i("TCP杩炴帴鎴愬姛锛�"+this.getClient().getOptions().getIp());
+            connected=true;
+            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==false){
+                                Thread.sleep(100);
+                                continue;
+                            }
+                            SocketRequest socketRequest = mMessageQueue.take();
+                            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) {
+                                connected = false;
+                                LogUtils.e("鍙戦�佸け璐�:" + e.getMessage());
+                                if (!TextUtils.isEmpty(action)) {
+                                    SendListener sendListener = sendMap.get(action);
+                                    if (sendListener != null) {
+                                        sendListener.onError();
+                                    }
+                                }
+                            }
+                        } catch (Exception e) {
+                            LogUtils.e("鍙戦�佸け璐�1:" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    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) {
+                            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 {
+                            if (!connected) {
+                                reconect();
+                            }
+                            Thread.sleep(5*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 {
+                            //5绉�
+                            if (connected && 5 * 1000 < (System.currentTimeMillis() - time)) {
+                                time = System.currentTimeMillis();
+                                //蹇冭烦妫�娴�
+                                if (iHeartbeat != null)
+                                    iHeartbeat.heartbeat();
+                            }
+                            Thread.sleep(10);
+                        } 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) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    private synchronized void disconnect() {
+        try {
+            client.disconnect();
+            //鏂紑杩炴帴
+            client.onConnectStatus(ConnectStatus.DISCONNECT);
+        } catch (Exception e) {
+
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/annotation/ConnectStatus.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/annotation/ConnectStatus.java
new file mode 100644
index 0000000..9ecb29c
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/annotation/ConnectStatus.java
@@ -0,0 +1,31 @@
+package com.hdl.sdk.link.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 {
+
+    /**
+     * 杩炴帴涓�
+     */
+    int CONNECTING = 0;
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    int CONNECTED = 1;
+
+    /**
+     * 杩炴帴鍏抽棴
+     */
+    int DISCONNECT = 2;
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/bean/Packet.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/bean/Packet.java
new file mode 100644
index 0000000..e2558a8
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/bean/Packet.java
@@ -0,0 +1,45 @@
+package com.hdl.sdk.link.socket.bean;
+
+import java.net.Socket;
+import java.net.SocketOption;
+
+/**
+ * Created by hxb on 2021/12/23.
+ */
+public class Packet {
+    private byte []bytes;
+    private Socket socket;
+
+    public  Packet( byte []bytes, Socket socket){
+        this.bytes=bytes;
+        this.socket=socket;
+    }
+    public Packet(byte []bytes){
+       this(bytes,null);
+    }
+
+
+    /**
+     * 鎺ユ敹鎴栬�呭彂閫佺殑鏁版嵁
+     * @return
+     */
+    public byte[] getBytes() {
+        return bytes;
+    }
+
+    /**
+     * 鎺ユ敹鎴栬�呭彂閫佺殑鏁版嵁
+     * @param bytes
+     */
+    public void setBytes(byte[] bytes) {
+        this.bytes = bytes;
+    }
+
+    public Socket getSocket() {
+        return socket;
+    }
+
+    public void setSocket(Socket socket) {
+        this.socket = socket;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IClient.java
new file mode 100644
index 0000000..71293d7
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IClient.java
@@ -0,0 +1,32 @@
+package com.hdl.sdk.link.socket.client;
+
+
+import com.hdl.sdk.link.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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IHeartbeat.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IHeartbeat.java
new file mode 100644
index 0000000..9a4e7a4
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IHeartbeat.java
@@ -0,0 +1,8 @@
+package com.hdl.sdk.link.socket.client;
+
+/**
+ * Created by hxb on 2022/2/16.
+ */
+public interface IHeartbeat {
+    void heartbeat();
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IUdpClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IUdpClient.java
new file mode 100644
index 0000000..7db851e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/IUdpClient.java
@@ -0,0 +1,38 @@
+package com.hdl.sdk.link.socket.client;
+
+import com.hdl.sdk.link.socket.udp.UdpSocketOptions;
+
+/**
+ * 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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/TcpClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/TcpClient.java
new file mode 100644
index 0000000..d5e6f38
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/TcpClient.java
@@ -0,0 +1,176 @@
+package com.hdl.sdk.link.socket.client;
+
+
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.core.protocol.LinkMessageDecoder;
+import com.hdl.sdk.link.socket.TcpSocketBoot;
+import com.hdl.sdk.link.socket.SocketOptions;
+import com.hdl.sdk.link.socket.annotation.ConnectStatus;
+import com.hdl.sdk.link.socket.bean.Packet;
+import com.hdl.sdk.link.socket.codec.IHandleMessage;
+import com.hdl.sdk.link.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.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 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 TcpSocketBoot init(String ip, int port, SocketOptions options) {
+         return new TcpSocketBoot(new TcpClient(ip, port, options));
+    }
+
+
+
+
+    @Override
+    public void connect() throws Exception {
+        mSocket = getSocket();
+        mSocket.connect(new InetSocketAddress(ip, port), 3 * 1000);
+        mSocket.setTcpNoDelay(true);
+        mSocket.setReuseAddress(true);
+//        mSocket.setKeepAlive(true);
+//        mSocket.setSoTimeout(12 * 1000);
+    }
+
+
+
+
+    @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) {
+            int len = 0;
+
+            if ((len = stream.read(readBuffer)) == -1) {
+                throw new Exception("缃戝叧鏂紑");
+            }
+
+            byte[] bytes = new byte[len];
+            System.arraycopy(readBuffer, 0, bytes, 0, len);
+            socketOptions.getHandleMessage().read(new Packet(bytes, mSocket));
+        }
+    }
+
+    @Override
+    public synchronized void  sendMsg(byte[] msg) throws Exception {
+        final OutputStream outputStream = getOutStream();
+        if (outputStream != null && getOptions() != null) {
+            try {
+//                IHandleMessage handleMessage = getOptions().getHandleMessage();
+//                handleMessage.write(handleMessage.write(msg));
+                getOutStream().write(msg);
+
+            }finally {
+                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/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/UdpClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/UdpClient.java
new file mode 100644
index 0000000..2e94009
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/UdpClient.java
@@ -0,0 +1,191 @@
+package com.hdl.sdk.link.socket.client;
+
+
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.core.protocol.LinkMessageDecoder;
+import com.hdl.sdk.link.socket.SocketPool;
+import com.hdl.sdk.link.socket.bean.Packet;
+import com.hdl.sdk.link.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.link.socket.udp.UdpSocketOptions;
+import com.hdl.sdk.link.socket.codec.IHandleMessage;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+
+
+/**
+ * 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;
+
+    WifiManager.MulticastLock lock;
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉绔彛
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param socketOptions
+     */
+    public 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);
+        this.lock= socketOptions.getWifiManager().createMulticastLock("UDPwifi");
+    }
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @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 synchronized void bind() throws Exception {
+        try {
+            //宸茬粡缁戝畾杩囧氨涓嶇敤鍐嶇粦瀹�
+            if (null != mSocket) {
+                return;
+            }
+
+            lock.acquire();
+            if (TextUtils.isEmpty(ipAddress)) {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port));
+            }
+            else{
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(Inet4Address.getByName(ipAddress), port));
+            }
+            mSocket.setBroadcast(true);
+//            mSocket.setReuseAddress(true);
+
+        } catch (Exception e) {
+            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 (Exception e) {
+            LogUtils.e("鎺ユ敹鍒癠dp鏁版嵁鍖呭紓甯革紝寮傚父淇℃伅锛�" + e.getMessage());
+            return;
+        }
+        if (receivePacket.getLength() == 0) {
+            LogUtils.i("鎺ユ敹鍒癠dp鏁版嵁鍖咃紝鏁版嵁鍖呴暱搴︿负0锛�" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
+            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(new Packet(receivePacket.getAddress().getHostAddress(), data,null));
+//            }
+
+            byte[] data = new byte[receivePacket.getLength()];
+            System.arraycopy(receivePacket.getData(), 0, data, 0, data.length);
+            socketOptions.getHandleMessage().read(new Packet(data));
+
+        } catch (Exception e) {
+            LogUtils.i("鎺ユ敹鍒癠dp鏁版嵁鍖咃紝澶勭悊寮傚父锛�" + e.getMessage());
+        }
+    }
+
+
+    @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);
+        if (mSocket != null) {
+            mSocket.send(sendPacket);
+        } else {
+            DatagramSocket datagramSocket = new DatagramSocket();
+            datagramSocket.send(sendPacket);
+            datagramSocket.close();
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/ByteToMessageDecoder.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/ByteToMessageDecoder.java
new file mode 100644
index 0000000..7f4bbab
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/ByteToMessageDecoder.java
@@ -0,0 +1,22 @@
+package com.hdl.sdk.link.socket.codec;
+
+import com.hdl.sdk.link.socket.bean.Packet;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class ByteToMessageDecoder<T> implements IHandleFlow<T> {
+
+    protected abstract T decoder(Packet packet)
+            throws Exception;
+
+    @Override
+    public final T read(Packet packet) throws Exception {
+        return decoder(packet);
+    }
+//
+//    @Override
+//    public final byte[] write(Packet data) {
+//        return data;
+//    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleFlow.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleFlow.java
new file mode 100644
index 0000000..3ce442f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleFlow.java
@@ -0,0 +1,14 @@
+package com.hdl.sdk.link.socket.codec;
+
+import com.hdl.sdk.link.socket.bean.Packet;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IHandleFlow<T> {
+
+    T read(Packet packet) throws Exception;
+
+//    byte[] write(Packet packet) throws Exception;
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleMessage.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleMessage.java
new file mode 100644
index 0000000..1c7a223
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IHandleMessage.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.socket.codec;
+
+import com.hdl.sdk.link.socket.bean.Packet;
+
+/**
+ * Created by Tong on 2021/9/27.
+ */
+public interface IHandleMessage {
+    void read(Packet packet) throws Exception;
+
+//    byte[] write(Packet packet) throws Exception;
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IMessagePipeLine.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IMessagePipeLine.java
new file mode 100644
index 0000000..41128df
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/IMessagePipeLine.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.link.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IMessagePipeLine {
+
+    void add(IHandleFlow flow);
+
+    void clear();
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessagePipeLine.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessagePipeLine.java
new file mode 100644
index 0000000..3e09cc2
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessagePipeLine.java
@@ -0,0 +1,45 @@
+package com.hdl.sdk.link.socket.codec;
+
+import com.hdl.sdk.link.socket.bean.Packet;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 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(Packet packet) throws Exception {
+        for (int i = 0; i < queue.size(); i++) {
+            IHandleFlow flow = queue.get(i);
+            Object read = flow.read(packet);
+//            try {
+//                out = Objects.requireNonNull(read);
+//            } catch (Exception ignored) {
+//            }
+        }
+    }
+
+//    @Override
+//    public byte[] write(Packet packet) throws Exception {
+//        for (int i = 0; i < queue.size(); i++) {
+//            IHandleFlow flow = queue.get(i);
+//            byte[] write = flow.write(packet);
+//        }
+//        return new byte[0];
+//    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessageToByteEncoder.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessageToByteEncoder.java
new file mode 100644
index 0000000..e093590
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/codec/MessageToByteEncoder.java
@@ -0,0 +1,26 @@
+package com.hdl.sdk.link.socket.codec;
+
+
+import com.hdl.sdk.link.socket.bean.Packet;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class MessageToByteEncoder implements IHandleFlow {
+
+
+    protected abstract Packet encode(Packet packet)
+            throws Exception;
+
+    @Override
+    public final Object read(Packet packet) {
+        return packet;
+    }
+
+//    @Override
+//    public byte[] write(Packet packet) throws Exception {
+//        return encode(packet);
+//    }
+
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/ConnectStatusListener.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/ConnectStatusListener.java
new file mode 100644
index 0000000..9efb726
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/ConnectStatusListener.java
@@ -0,0 +1,27 @@
+package com.hdl.sdk.link.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 杩炴帴鐘舵��
+ */
+public interface ConnectStatusListener {
+
+    /**
+     * 杩炴帴涓�
+     */
+    default void onConnecting() {
+    }
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    default void onConnected() {
+    }
+
+    /**
+     * 杩炴帴澶辫触
+     */
+    default void onConnectFailed() {
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/SendListener.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/SendListener.java
new file mode 100644
index 0000000..e9a84f1
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/listener/SendListener.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.link.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface SendListener {
+
+    void onSucceed();
+
+    void onError();
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketBoot.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketBoot.java
new file mode 100644
index 0000000..4e039f7
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketBoot.java
@@ -0,0 +1,128 @@
+package com.hdl.sdk.link.socket.udp;
+
+import android.text.TextUtils;
+
+import androidx.collection.ArrayMap;
+
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.socket.listener.SendListener;
+import com.hdl.sdk.link.socket.SocketRequest;
+import com.hdl.sdk.link.socket.client.IUdpClient;
+
+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 ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
+
+
+    public IUdpClient getClient() {
+        return client;
+    }
+
+    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);
+            }
+            client.sendMsg(ipAddress,port, msg);
+        } catch (Exception e) {
+            LogUtils.e("鍙戦�佸け璐�:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴褰撳墠socket
+     */
+    public synchronized void close() {
+        isOpenRetry.set(false);
+        sendMap.clear();
+        receiveThread.shutdown();
+        receiveThread=null;
+        client.close();
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketOptions.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketOptions.java
new file mode 100644
index 0000000..38ad296
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/udp/UdpSocketOptions.java
@@ -0,0 +1,32 @@
+package com.hdl.sdk.link.socket.udp;
+
+
+import android.net.wifi.WifiManager;
+
+import com.hdl.sdk.link.socket.codec.IHandleMessage;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketOptions {
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+    private WifiManager wifiManager;
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+
+    public WifiManager getWifiManager() {
+        return wifiManager;
+    }
+
+    public void setWifiManager(WifiManager wifiManager) {
+        this.wifiManager = wifiManager;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java
new file mode 100644
index 0000000..957bac3
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java
@@ -0,0 +1,392 @@
+package com.hdl.sdk.link.zigbee;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+import com.hdl.sdk.link.core.bean.ZigbeeResponse;
+import com.hdl.sdk.link.core.callback.ZigbeeCallBack;
+import com.hdl.sdk.link.core.connect.HDLZigbeeConnect;
+import com.hdl.sdk.link.zigbee.bean.PanelVibrationBean;
+import com.hdl.sdk.link.zigbee.bean.TimeDataBean;
+import com.hdl.sdk.link.zigbee.bean.ZBBaseSendBean;
+import com.hdl.sdk.link.zigbee.bean.ZBDeviceBean;
+import com.hdl.sdk.link.zigbee.callback.ZBDeviceListCallBack;
+import com.hdl.sdk.link.zigbee.config.ZigBee;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by jlchen on 12/16/21.
+ * ZigBee鍘熺敓鍗忚鐩稿叧
+ */
+public class HDLLinkLocalZigBee {
+    private static final String TAG = "HDLLinkLocalZigBee";
+    private static final String Cluster_ID = "Cluster_ID";
+    private static final String Command = "Command";
+    //instance
+    private volatile static HDLLinkLocalZigBee instance;
+
+    //getInstance
+    public static synchronized HDLLinkLocalZigBee getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkLocalZigBee.class) {
+                if (instance == null) {
+                    instance = new HDLLinkLocalZigBee();
+                }
+            }
+        }
+        return instance;
+    }
+
+
+    /**
+     * 鍙戦�佹秷鎭粰缃戝叧
+     *
+     * @param gatewayOid
+     * @param replyTopic 鍥炲涓婚
+     * @param payload
+     * @param callback
+     */
+    public void sendData(String gatewayOid, String replyTopic, String payload, ZigbeeCallBack callback) {
+        //娉ㄦ剰 gatewayId鏄~瑕佽繛鎺ョ殑缃戝叧锛屽彲浠ユ槸涓荤綉鍏崇殑Id锛屼篃鍙互鏄粠缃戝叧鐨処d
+        HDLZigbeeConnect.getInstance().Send(gatewayOid, replyTopic, payload, callback);
+    }
+
+    /********************************缃戝叧鐩稿叧********************************/
+    /**
+     * 鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+     *
+     * @param gatewayOid 缃戝叧id
+     * @param callback
+     */
+    public void locationGateway(String gatewayOid, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.GwLinuxLocate);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.GwLinuxLocate, jObject.toString(), callback);
+    }
+
+    /********************************璁惧鐩稿叧********************************/
+    /**
+     * 璁剧疆璁惧鍏ョ綉鏂瑰紡
+     * 璁剧疆1娆′箣鍚庝繚鎸佽缃殑鏂瑰紡
+     * 閲嶅惎鎭㈠榛樿鏂瑰紡
+     *
+     * @param gatewayOid        缃戝叧oid
+     * @param deviceJoiningMode 0锛氶粯璁わ紱1锛氭柊鏂瑰紡锛堝揩閫熷叆缃戯級
+     */
+    public void setDeviceJoiningMode(String gatewayOid, int deviceJoiningMode, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("Cluster_ID", 0);
+        jObject.addProperty("Command", 180);
+        JsonObject data = new JsonObject();
+        data.addProperty("mode", deviceJoiningMode);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SetJoiningModeRespon, jObject.toString(), callback);
+    }
+
+    /**
+     * 璁剧疆鎼滅储鏂拌澶囧紑鍚垨鑰呭叧闂�
+     *
+     * @param gatewayOid 缃戝叧oid
+     * @param time       寮�鍚悳绱㈣澶囩殑鏃堕棿(鍗曚綅锛氱) 0:鍏抽棴鎼滅储 255锛氫竴鐩村紑鍚�
+     * @param callback
+     */
+    public void sendSearchDevice(String gatewayOid, int time, ZigbeeCallBack callback) {
+        ZBBaseSendBean<TimeDataBean> baseSendBean = new ZBBaseSendBean(0, ZigBee.CommandType.SearchNewDevice, new TimeDataBean(time));
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SearchNewDevice, GsonConvert.getGson().toJson(baseSendBean), callback);
+    }
+
+    /**
+     * 鎼滅储璁惧
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void startSearchDevice(String gatewayOid, ZigbeeCallBack callback) {
+        sendSearchDevice(gatewayOid, 255, callback);
+    }
+
+    /**
+     * 鏆傚仠鎼滅储璁惧
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void stopSearchDevice(String gatewayOid, ZigbeeCallBack callback) {
+        sendSearchDevice(gatewayOid, 0, callback);
+    }
+
+    /**
+     * 瀹氫綅璁惧 闂儊5绉�
+     * 璇ユ潯鎸囦护璁惧涓嶅洖澶嶏紝鎵�鏈夋病callBack
+     * 鍙戦�佽鍛戒护锛岃澶囨寚绀虹伅灏嗛棯鐑併�俢luster 鍒楄〃涓敮鎸� Identify 鍔熻兘锛屽嵆鍖呭惈 cluster=3 鐨勮 澶囧彲浠ヤ娇鐢ㄨ鎺ュ彛銆�
+     *
+     * @param gatewayOid
+     * @param deviceAddr 鍗曟挱鏃朵负璁惧鑺傜偣鐨� mac 鍦� 鍧� 绫诲瀷鏄瓧绗︼紙16 涓瓧绗︼級 缁勬挱鏃朵负缁� id 绫诲瀷鏄暟鍊� 骞挎挱鏃朵负 null
+     * @param epoint     璁惧绔彛鍙� 鍜� mac 鍦板潃鍏卞悓鏍囪瘑鍞竴鐨� zigbee 璁惧 鏁板�艰寖鍥� 0-255
+     */
+    public void locationDevice(String gatewayOid, String deviceAddr, int epoint) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 3);
+        jObject.addProperty(Command, 0);
+        jObject.addProperty("SendMode", 2);//鍙戦�佹ā寮� 缁勬挱: 1 鍗曟挱: 2 骞挎挱: 15
+        JsonObject data = new JsonObject();
+        data.addProperty("Time", 5);//闂儊鏃堕棿锛堢锛�
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.Identify, jObject.toString(), null);
+    }
+
+
+    /**
+     * 璁惧鍒楄〃-璁惧鍒犻櫎锛堜娇璁惧绂荤綉锛�
+     * 閫氳繃璇ユ寚浠ゅ彲浠ヤ娇璁惧鑴辩褰撳墠 zigbee 缃戠粶锛岃璁惧淇℃伅涔熷皢浼氬湪缃戝叧涓婂垹闄ゃ��
+     * 娉ㄦ剰锛氬皢浼氬垹闄ゅ悓涓� MAC 鍦板潃涓嬫墍鏈変笉鍚岀鍙g殑璁惧锛屽涓�涓� 2 璺寜閿澶囷紝瀹冨叿鏈変袱涓� 鎸夐敭锛屽湪璁惧鍒楄〃涓婅繖涓や釜鎸夐敭鍏锋湁鐩稿悓鐨� mac锛屼絾绔彛鍙锋槸涓嶅悓鐨勩�備娇鐢ㄨ鎸囦护璁╀换鎰� 涓�涓寜閿缃戯紝鍙︿竴涓篃浼氱缃戙��
+     *
+     * @param gatewayOid
+     * @param compelClear 0锛氫笉寮哄埗娓呴櫎銆傞渶瑕佽妭鐐硅澶� 鍙嶉绂荤綉纭淇℃伅鍚庢墠鑳藉垹闄よ 澶囦俊鎭��
+     *                    1锛氬己鍒舵竻闄ゃ�備笉闇�瑕佽妭鐐硅澶� 鍙嶉绂荤綉纭淇℃伅锛岀洿鎺ュ垹闄よ 澶囦俊鎭��
+     */
+    public void removeDevice(String gatewayOid, int compelClear, List<String> deviceAddrList, ZigbeeCallBack callback) {
+        if (deviceAddrList == null || deviceAddrList.size() == 0) {
+            LogUtils.e("娌℃湁瑕佸垹闄ゅ埌鏁版嵁");
+            return;
+        }
+        JsonArray addrList = new JsonArray();
+        for (String addr : deviceAddrList) {
+            JsonObject aObject = new JsonObject();
+            aObject.addProperty("DeviceAddr", addr);
+            addrList.add(aObject);
+        }
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.RemoveDevice);
+        JsonObject data = new JsonObject();
+        data.addProperty("CompelClear", compelClear);
+        data.add("DeviceAddrList", addrList);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.RemoveDevice, jObject.toString(), callback);
+    }
+
+    /**
+     * 璁惧鍒楄〃-鑾峰彇鏈湴缃戝叧璁惧 EPDeviceId 鍒楄〃
+     * 锛堢綉鍏充竴涓竴涓繑鍥炵鐐硅澶囪缁嗕俊鎭級
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void getZigBeeDeviceList(String gatewayOid, ZBDeviceListCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.GetDeviceInfo);
+        //鏄惁鑾峰彇鍒楄〃鎴愬姛鏍囪
+        AtomicBoolean isSuccess = new AtomicBoolean(false);
+        //鎼滅储5s绛夊緟鏍囪
+        AtomicInteger timeOut = new AtomicInteger(0);
+        //璁惧鍒楄〃
+        List<ZBDeviceBean> list = new ArrayList<>();
+        //娉ㄥ唽鐩戝惉浜嬩欢
+        EventListener zigBeeEventListener = new EventListener() {
+            @Override
+            public synchronized void onMessage(Object msg) {
+                if (msg instanceof ZigbeeResponse) {
+                    ZigbeeResponse zigbeeResponse = (ZigbeeResponse) msg;
+                    try {
+                        if (zigbeeResponse.getTopic().equals(ZigBee.ReplyTopicType.GetDeviceInfo)) {
+                            final ZBDeviceBean bean = GsonConvert.getGson().fromJson(zigbeeResponse.getData(), new TypeToken<ZBDeviceBean>() {
+                            }.getType());
+
+
+                            if (bean == null) {
+                                LogUtils.i("鑾峰彇鍒扮殑Zigbee璁惧鍒楄〃鍙嶇郴鍒楀寲澶辫触:\r\n" + zigbeeResponse.getData());
+                            } else {
+                                bean.setGatewayMac(zigbeeResponse.getOid());
+                                LogUtils.i("zigbeeResponse ZBDeviceBean:" + bean.getDeviceAddr() + "锛�" + bean.getEpoint());
+                                if (bean.getData().getTotalNum() == 0) {
+                                    //鍥炲绌虹殑璁惧鍒楄〃
+                                    list.clear();
+                                    if (callback != null) {
+                                        callback.onSuccess(list);
+                                    }
+                                    HDLZigbeeConnect.getInstance().removeListener(this);
+                                    isSuccess.set(true);
+                                } else {
+                                    list.add(bean);
+//                                LogUtils.i("getZigBeeDeviceList 閲嶇疆鏃堕棿涓�0");
+                                    timeOut.set(0);//鏀跺埌涓�涓澶囧垯閲嶇疆鏃堕棿
+                                    //濡傛灉褰撳墠搴忓彿绛変簬鎬绘暟锛屼唬琛ㄦ槸鏈�鍚庝竴涓澶囦簡锛屽洖璋冩垚鍔�
+                                    if (bean.getData().getDeviceNum() == bean.getData().getTotalNum()) {
+                                        if (callback != null) {
+                                            callback.onSuccess(list);
+                                        }
+                                        HDLZigbeeConnect.getInstance().removeListener(this);
+                                        isSuccess.set(true);
+                                        LogUtils.i("getZigBeeDeviceList璇诲彇瀹屾垚");
+                                        timeOut.set(6);//璁℃椂缁撴潫鏍囪
+                                    }
+
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        LogUtils.e(TAG, "鎺ユ敹鐨勬暟鎹唴瀹�:" + zigbeeResponse.getData() + "  寮傚父淇℃伅:" + e.getMessage());
+                    }
+                }
+            }
+        };
+        HDLZigbeeConnect.getInstance().registerListener(zigBeeEventListener);
+        //鍙戦�佹暟鎹�
+        sendData(gatewayOid, "", jObject.toString(), null);
+        //5绉掑悗杩樻病鏈夋帴鏀跺埌鏁版嵁锛屽氨鍥炶皟澶辫触
+        ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+        scheduledExecutorService.schedule(new Runnable() {
+            @Override
+            public void run() {
+                while (timeOut.get() < 5) {
+                    try {
+                        timeOut.set(timeOut.get() + 1);
+                        LogUtils.i("getZigBeeDeviceList 璁℃椂锛�" + timeOut.get() + "s");
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                //绉婚櫎鐩戝惉浜嬩欢
+                HDLZigbeeConnect.getInstance().removeListener(zigBeeEventListener);
+                if (!isSuccess.get()) {
+                    if (null != callback) {
+                        callback.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR));
+                    }
+                }
+                LogUtils.i("getZigBeeDeviceList 5s鍊掕鏃剁粨鏉�");
+                scheduledExecutorService.shutdownNow();
+            }
+        }, 1, TimeUnit.SECONDS);
+
+    }
+
+    /**
+     * 淇敼璁惧绔彛锛堟寜閿級鍚嶇О
+     *
+     * @param gatewayOid
+     * @param deviceAddr
+     * @param epoint
+     * @param deviceName
+     * @param callback
+     */
+    public void renameDeviceName(String gatewayOid, String deviceAddr, int epoint, String deviceName, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.DeviceRename);
+        JsonObject data = new JsonObject();
+        data.addProperty("DeviceName", deviceName);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.DeviceRename, jObject.toString(), callback);
+    }
+
+    /**
+     * 瀵圭鐐瑰洖璺澶囧姛鑳界被鍨嬭繘琛岃缃 onoffoutput 鍥炶矾,杩涜璁剧疆涓烘櫘閫氬紑鍏虫垨鎻掑骇鎴栫伅鍏�
+     *
+     * @param gatewayOid
+     * @param deviceAddr   璁惧鑺傜偣鐨� mac 鍦板潃 锛堟渶澶� 16 涓瓧绗︼級
+     * @param epoint       璁惧绔彛鍙� 鍜� mac 鍦板潃鍏卞悓鏍囪瘑鍞竴鐨� zigbee 璁惧 鏁板�艰寖鍥� 0-255
+     * @param functionType 鐢ㄦ潵琛ㄧず瀹為檯鍥炶矾鐢ㄤ簬浠�涔� 鍔熻兘锛屽彲鎵╁睍 0-缁х數鍣ㄦ帴鏅�氬紑鍏� 1-缁х數鍣ㄦ帴鐏厜 2-鎻掑骇
+     * @param callback
+     */
+    public void setEPDeviceFunctionType(String gatewayOid, String deviceAddr, int epoint, int functionType, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.SetEPDeviceFunctionType);
+        JsonObject data = new JsonObject();
+        data.addProperty("FunctionType", functionType);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SetEPDeviceFunctionType, jObject.toString(), callback);
+    }
+
+
+    /********闈㈡澘闇囧姩鍔熻兘********/
+    /**
+     * 鑾峰彇绠�绾﹂潰鏉块渿鍔ㄥ姛鑳界殑淇℃伅
+     */
+    public void getPanelVibrationInfo(String gatewayOid, String deviceAddr, int epoint, String passData, ZigbeeCallBack callback) {
+//        //缁勮鍙戦�佹暟鎹�
+//        JsonObject jObject = new JsonObject();
+//        jObject.addProperty("DeviceAddr", deviceAddr);
+//        jObject.addProperty("Epoint", 200);
+//        jObject.addProperty(Cluster_ID, 64513);
+//        jObject.addProperty(Command, 0);
+//        JsonObject data = new JsonObject();
+//        data.addProperty("PassData", "050108110101");
+//        jObject.add("Data", data);
+//        sendClientDataPassthrough(device, jObject.toString(), "0802", 18, 6, null, callback);
+//        sendClientDataPassthrough(gatewayOid,deviceAddr,epoint,passData,callback);
+
+    }
+
+    /**
+     * 璁剧疆绠�绾﹂潰鏉块渿鍔ㄥ姛鑳界殑淇℃伅
+     *
+     * @param device
+     * @param deviceAddr
+     * @param panelVibrationBean
+     * @param callback
+     */
+    public void setPanelVibrationInfo(String device, String deviceAddr, PanelVibrationBean panelVibrationBean, ZigbeeCallBack callback) {
+//        String passData = "0800081104";
+//        passData += panelVibrationBean.getIsEnable() ? "01" : "00";
+////        passData += Convert.ToString(panelVibrationBean.getStrength(), 16).PadLeft(2, '0');
+////        String time = Convert.ToString(panelVibrationBean.getTime(), 16).PadLeft(4, '0');
+////        //浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�
+////        passData += time.Substring(2, 2);
+////        passData += time.Substring(0, 2);
+//
+////        var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
+////        var data = new Newtonsoft.Json.Linq.JObject { { "PassData", passData } };
+////        jObject.Add("Data", data);
+//
+//        JsonObject jObject = new JsonObject();
+//        jObject.addProperty("DeviceAddr", deviceAddr);
+//        jObject.addProperty("Epoint", 200);
+//        jObject.addProperty(Cluster_ID, 64513);
+//        jObject.addProperty(Command, 0);
+//        JsonObject data = new JsonObject();
+//        data.addProperty("PassData", passData);
+//        jObject.add("Data", data);
+//
+//        sendClientDataPassthrough(device, jObject.toString(), "0002", 16, 6, null, callback);
+    }
+
+
+    /**
+     * 寮�鍏虫帶鍒�(浠呯敤浜巆luster=6鐨勮澶囷級 璁惧鏀寔cluster=6鐨勮澶囨墠鑳借皟鐢ㄨ鎺ュ彛
+     *
+     * @param command 0:鍏抽棴 1:鎵撳紑 2:鍙栧弽
+     */
+    public void switchControl(String gatewayOid, int command, ZBDeviceBean deviceBean) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceBean.getDeviceAddr());
+        jObject.addProperty("Epoint", deviceBean.getEpoint());
+        jObject.addProperty(Cluster_ID, 6);
+        jObject.addProperty(Command, command);
+        jObject.addProperty("SendMode", 2);
+        sendData(gatewayOid, "", jObject.toString(), null);
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/PanelVibrationBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/PanelVibrationBean.java
new file mode 100644
index 0000000..11b6f86
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/PanelVibrationBean.java
@@ -0,0 +1,37 @@
+package com.hdl.sdk.link.zigbee.bean;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 12/17/21.
+ */
+public class PanelVibrationBean implements Serializable {
+
+    private Boolean isEnable;//闇囧姩浣胯兘
+    private int strength;//闇囧姩寮哄害(鍗佽繘鍒�)
+    private int time;//闇囧姩鏃堕棿(鍗佽繘鍒�)
+
+    public Boolean getIsEnable() {
+        return isEnable;
+    }
+
+    public void setIsEnable(Boolean enable) {
+        isEnable = enable;
+    }
+
+    public int getStrength() {
+        return strength;
+    }
+
+    public void setStrength(int strength) {
+        this.strength = strength;
+    }
+
+    public int getTime() {
+        return time;
+    }
+
+    public void setTime(int time) {
+        this.time = time;
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/TimeDataBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/TimeDataBean.java
new file mode 100644
index 0000000..634c3ab
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/TimeDataBean.java
@@ -0,0 +1,21 @@
+package com.hdl.sdk.link.zigbee.bean;
+
+/**
+ * Created by jlchen on 12/16/21.
+ */
+public class TimeDataBean {
+
+    private int time;//0-255
+
+    public TimeDataBean(int time) {
+        this.time = time;
+    }
+
+    public int getTime() {
+        return time;
+    }
+
+    public void setTime(int time) {
+        this.time = time;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBBaseSendBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBBaseSendBean.java
new file mode 100644
index 0000000..814b610
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBBaseSendBean.java
@@ -0,0 +1,42 @@
+package com.hdl.sdk.link.zigbee.bean;
+
+
+/**
+ * Created by jlchen on 12/16/21.
+ */
+public class ZBBaseSendBean<T> {
+    private int Cluster_ID;//绨� id
+    private int Command;//鎿嶄綔鐮�
+    private T data;//鏁版嵁
+
+    public ZBBaseSendBean(int cluster_ID, int command, T data) {
+        Cluster_ID = cluster_ID;
+        Command = command;
+        this.data = data;
+    }
+
+    public int getCluster_ID() {
+        return Cluster_ID;
+    }
+
+    public void setCluster_ID(int cluster_ID) {
+        Cluster_ID = cluster_ID;
+    }
+
+    public int getCommand() {
+        return Command;
+    }
+
+    public void setCommand(int command) {
+        Command = command;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceBean.java
new file mode 100644
index 0000000..1536506
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceBean.java
@@ -0,0 +1,565 @@
+package com.hdl.sdk.link.zigbee.bean;
+
+import androidx.annotation.NonNull;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by jlchen on 12/29/21.
+ * 鎼滅储ZigBee璁惧鍥炶矾鍥炲
+ */
+public class ZBDeviceBean implements Serializable {
+    /// <summary>
+    /// 瀹為檯鐨勮澶噄d
+    /// <para>258:color dimmable light,璋冨叧鐏� </para>
+    /// <para>10:Door lock,闂ㄩ攣</para>
+    /// <para>514:Window covering device,绐楀笜</para>
+    /// <para>515:Window covering controller锛岀獥甯樻帶鍒跺櫒</para>
+    /// <para>769:Thermostat,鎭掓俯闈㈡澘/绌鸿皟</para>
+    /// <para>770:Temperature Sensor,娓╁害浼犳劅鍣�</para>
+    /// <para>775:Temperature Sensor,婀垮害浼犳劅鍣�</para>
+    /// <para>262:Light sensor,鍏夌収浼犳劅鍣�</para>
+    /// <para>1026:sensor,浼犳劅鍣紝鍏蜂綋绫诲瀷鐨勪紶鎰熷櫒DeviceType鏉ュ尯鍒�</para>
+    /// </summary>
+    private int Device_ID;
+    /// MAC鍦板潃
+    private String DeviceAddr;
+    //璁惧绔彛鍙�
+    //鍜宮ac鍦板潃鍏卞悓鏍囪瘑鍞竴鐨剒igbee璁惧
+    //鏁板�艰寖鍥�0-255
+    //濡傛灉鏃犺澶囪瀛楁涓嶅瓨鍦�
+    private int Epoint;
+    //杩斿洖鍏ョ綉璁惧淇℃伅
+    private int Data_ID;
+    //璁惧璇︾粏淇℃伅
+    private ZBDataBean Data;
+    //鑷畾涔夋坊鍔犲瓧娈� 鍙兘鏄痮id锛屽彲鑳芥槸缃戝叧Id锛屽彲鑳芥槸mac
+    private String gatewayMac;
+
+    /**
+     * 妯℃澘鍖归厤鏍囪 wxr 鑷畾涔� 2022-02-23 16:09:44
+     */
+    private boolean templateSettingFlag = false;
+    public boolean isTemplateSettingFlag() {
+        return templateSettingFlag;
+    }
+
+    public void setTemplateSettingFlag(boolean templateSettingFlag) {
+        this.templateSettingFlag = templateSettingFlag;
+    }
+    private String templateAddr ;
+
+    private String linkSid;
+    private String linkSpk;
+    private String linkOid;
+    private String linkName;
+
+    public ZBDeviceBean() {
+    }
+
+    public ZBDeviceBean(String linkSid, String linkSpk, String linkOid, String linkName) {
+        this.linkSid = linkSid;
+        this.linkSpk = linkSpk;
+        this.linkOid = linkOid;
+        this.linkName = linkName;
+    }
+
+    public String getLinkSid() {
+        return linkSid == null ? "" : linkSid;
+    }
+
+    public void setLinkSid(@NonNull String linkSid) {
+        this.linkSid = linkSid;
+    }
+
+    public String getLinkSpk() {
+        return linkSpk == null ? "" : linkSpk;
+    }
+
+    public void setLinkSpk(@NonNull String linkSpk) {
+        this.linkSpk = linkSpk;
+    }
+
+    public String getLinkOid() {
+        return linkOid == null ? "" : linkOid;
+    }
+
+    public void setLinkOid(@NonNull String linkOid) {
+        this.linkOid = linkOid;
+    }
+
+    public String getLinkName() {
+        return linkName == null ? "" : linkName;
+    }
+
+    public void setLinkName(@NonNull String linkName) {
+        this.linkName = linkName;
+    }
+
+    public String getTemplateAddr() {
+        return templateAddr == null ? "" : templateAddr;
+    }
+
+    public void setTemplateAddr(String templateAddr) {
+        this.templateAddr = templateAddr;
+    }
+
+    @NonNull
+    public String getGatewayMac() {
+        return gatewayMac == null ? "" : gatewayMac;
+    }
+
+    public void setGatewayMac(@NonNull String gatewayMac) {
+        this.gatewayMac = gatewayMac;
+    }
+
+    public int getDevice_ID() {
+        return Device_ID;
+    }
+
+    public void setDevice_ID(int Device_ID) {
+        this.Device_ID = Device_ID;
+    }
+
+    @NonNull
+    public String getDeviceAddr() {
+        return DeviceAddr == null ? "" : DeviceAddr;
+    }
+
+    public void setDeviceAddr(@NonNull String DeviceAddr) {
+        this.DeviceAddr = DeviceAddr;
+    }
+
+    public int getEpoint() {
+        return Epoint;
+    }
+
+    public void setEpoint(int Epoint) {
+        this.Epoint = Epoint;
+    }
+
+    public int getData_ID() {
+        return Data_ID;
+    }
+
+    public void setData_ID(int Data_ID) {
+        this.Data_ID = Data_ID;
+    }
+
+
+
+    public ZBDataBean getData() {
+        if(Data == null){
+            Data = new ZBDataBean();
+        }
+        return Data;
+    }
+
+    public void setData(ZBDataBean Data) {
+        this.Data = Data;
+    }
+
+    /**
+     * 璁惧璇︾粏淇℃伅
+     */
+    public static class ZBDataBean implements Serializable{
+        private int TotalNum;//鍏ョ綉璁惧鎬绘暟銆傜瓑浜�0鏃讹紝琛ㄧず娌℃湁璁惧淇℃伅锛屼笅闈㈠瓧娈靛皢涓嶅瓨鍦ㄣ��
+        private int DeviceNum;//鏍囪瘑褰撳墠璁惧鏄彂閫佺殑鏄鍑犱釜璁惧銆侱eviceNum浠�1寮�濮嬫瘡鍙戦�佷竴涓澶囦俊鎭紝涓嬩竴涓澶囦俊鎭殑DeviceNum灏嗗姞1銆傜洿鍒癉eviceNum绛変簬TotalNum璇存槑鎵�鏈夎澶囦俊鎭彂閫佸畬姣�
+        private int JoinTime;//鍏ョ綉鐨剈tc鏃堕棿鎴�
+        private int ZigbeeType;//1:璺敱鍣ㄨ澶� 2锛氱粓绔澶囷紝鐢垫睜璁惧
+        private int NwkAddr;//璁惧缃戠粶鍦板潃
+        private int DeviceType;//璇ュ瓧娈典富瑕侀拡瀵笽AS瀹夐槻璁惧璁剧珛銆傛墍鏈塈AS瀹夐槻璁惧鍏辩敤涓�涓狣eviceID涓�1026銆傛墍浠ヨ鍖哄垎瀛愯澶囩被鍨嬶紝闇�瑕佽瀛楁銆�
+        //鐢ㄤ簬鍒ゆ柇璁惧鐨剒igbee鍗忚鐗堟湰銆�49246锛歓LL1.0鏍囧噯璁惧銆�260锛� ZHA1.2鏍囧噯璁惧銆� Z3.0鏍囧噯璁惧銆�
+        // 41440锛歓GP3.0鏍囧噯璁惧銆�265锛歓SE1.4鏍囧噯璁惧銆�
+        private int Profile;
+        //璁惧mac鍚嶇О
+        private String MacName;
+        //璁惧鍚�
+        private String DeviceName;
+        //0锛氳澶囦笉鍦ㄧ嚎 1锛氳澶囧湪绾�
+        private int IsOnline;
+        //杈撳叆绨囧垪琛�
+        //绔偣鍥炶矾鑷韩鎷ユ湁澶氬皯鍔熻兘锛屽彲浠ヨ鎺у埗锛涜鎺у姛鑳�
+        //鍙傝�儂igbee鑱旂洘鏂囨。
+        private List<InClusterListBean> InClusterList;
+        //杈撳嚭绨囧垪琛�
+        //绔偣鍥炶矾鍙互鎺у埗鍏朵粬璁惧澶氬皯鍔熻兘锛涙帶鍒跺姛鑳�
+        //鍙傝�儂igbee鑱旂洘鏂囨。
+        private List<OutClusterListBean> OutClusterList;
+        //鐢ㄤ簬璁板綍璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�傛渶澶ф敮鎸佽褰�16涓睘鎬х姸鎬侊紝涓斿彧璁板綍灞炴�у�奸暱搴︿笉澶т簬4瀛楄妭鐨勬暟鎹��
+        private List<AttributeStatusBean> AttributeStatus;
+        //褰撳墠杩愯绋嬪簭鐗堟湰淇℃伅
+        private int ImgVersion;
+        //褰撳墠闀滃儚绫诲瀷id
+        private int ImgTypeId;
+        //纭欢鐗堟湰
+        private int HwVersion;
+        //椹卞姩浠g爜銆備负0鏃讹紝琛ㄧずzigbee鍗忚皟鍣ㄨ澶囥�傚叾浠栧�艰〃绀轰负铏氭嫙椹卞姩璁惧
+        private int DriveCode;
+        //璁惧鎵�鍦ㄧ綉鍏崇殑缃戝叧id
+        private String GwId;
+        //鎵�鏈夋寚瀹歝luster鏄惁閮藉凡缁忔垚鍔熺粦瀹氬崗璋冨櫒
+        //0锛氭湭瀹屽叏缁戝畾
+        //1锛氬凡缁忕粦瀹�
+        private int ClusterBindZbSuccess;
+        //鏄惁鑾峰彇鎵�鏈夐粯璁ょ粦瀹氫俊鎭�
+        //0锛氬惁
+        //1锛氭槸
+        private int IsGetAllDefaultBind;
+        //鍒堕�犲晢鍚嶅瓧
+        private String ManufacturerName;
+        //璁惧鍨嬪彿
+        private String ModelIdentifier;
+        //浜у搧鐮� 搴忓垪鍙�
+        private String ProductCode;
+        //鐢ㄦ潵琛ㄧず瀹為檯鍥炶矾鐢ㄤ簬浠�涔堝姛鑳斤紝鍙墿灞�
+        //0-缁х數鍣ㄦ帴鏅�氬紑鍏�
+        //1-缁х數鍣ㄦ帴鐏厜
+        //鎻掑骇
+        private String FunctionType;
+
+        public int getTotalNum() {
+            return TotalNum;
+        }
+
+        public void setTotalNum(int TotalNum) {
+            this.TotalNum = TotalNum;
+        }
+
+        public int getDeviceNum() {
+            return DeviceNum;
+        }
+
+        public void setDeviceNum(int DeviceNum) {
+            this.DeviceNum = DeviceNum;
+        }
+
+        public int getJoinTime() {
+            return JoinTime;
+        }
+
+        public void setJoinTime(int JoinTime) {
+            this.JoinTime = JoinTime;
+        }
+
+        public int getZigbeeType() {
+            return ZigbeeType;
+        }
+
+        public void setZigbeeType(int ZigbeeType) {
+            this.ZigbeeType = ZigbeeType;
+        }
+
+        public int getNwkAddr() {
+            return NwkAddr;
+        }
+
+        public void setNwkAddr(int NwkAddr) {
+            this.NwkAddr = NwkAddr;
+        }
+
+        public int getDeviceType() {
+            return DeviceType;
+        }
+
+        public void setDeviceType(int DeviceType) {
+            this.DeviceType = DeviceType;
+        }
+
+        public int getProfile() {
+            return Profile;
+        }
+
+        public void setProfile(int Profile) {
+            this.Profile = Profile;
+        }
+
+        @NonNull
+        public String getMacName() {
+            return MacName == null ? "" : MacName;
+        }
+
+        public void setMacName(@NonNull String MacName) {
+            this.MacName = MacName;
+        }
+
+        @NonNull
+        public String getDeviceName() {
+            return DeviceName == null ? "" : DeviceName;
+        }
+
+        public void setDeviceName(@NonNull String DeviceName) {
+            this.DeviceName = DeviceName;
+        }
+
+        public int getIsOnline() {
+            return IsOnline;
+        }
+
+        public void setIsOnline(int IsOnline) {
+            this.IsOnline = IsOnline;
+        }
+
+        @NonNull
+        public List<InClusterListBean> getInClusterList() {
+            if (InClusterList == null) {
+                return new ArrayList<>();
+            }
+            return InClusterList;
+        }
+
+        public void setInClusterList(@NonNull List<InClusterListBean> InClusterList) {
+            this.InClusterList = InClusterList;
+        }
+
+        @NonNull
+        public List<OutClusterListBean> getOutClusterList() {
+            if (OutClusterList == null) {
+                return new ArrayList<>();
+            }
+            return OutClusterList;
+        }
+
+        public void setOutClusterList(@NonNull List<OutClusterListBean> OutClusterList) {
+            this.OutClusterList = OutClusterList;
+        }
+
+        @NonNull
+        public List<AttributeStatusBean> getAttributeStatus() {
+            if (AttributeStatus == null) {
+                return new ArrayList<>();
+            }
+            return AttributeStatus;
+        }
+
+        public void setAttributeStatus(@NonNull List<AttributeStatusBean> AttributeStatus) {
+            this.AttributeStatus = AttributeStatus;
+        }
+
+        public int getImgVersion() {
+            return ImgVersion;
+        }
+
+        public void setImgVersion(int ImgVersion) {
+            this.ImgVersion = ImgVersion;
+        }
+
+        public int getImgTypeId() {
+            return ImgTypeId;
+        }
+
+        public void setImgTypeId(int ImgTypeId) {
+            this.ImgTypeId = ImgTypeId;
+        }
+
+        public int getHwVersion() {
+            return HwVersion;
+        }
+
+        public void setHwVersion(int HwVersion) {
+            this.HwVersion = HwVersion;
+        }
+
+        public int getDriveCode() {
+            return DriveCode;
+        }
+
+        public void setDriveCode(int DriveCode) {
+            this.DriveCode = DriveCode;
+        }
+
+        @NonNull
+        public String getGwId() {
+            return GwId == null ? "" : GwId;
+        }
+
+        public void setGwId(@NonNull String GwId) {
+            this.GwId = GwId;
+        }
+
+        public int getClusterBindZbSuccess() {
+            return ClusterBindZbSuccess;
+        }
+
+        public void setClusterBindZbSuccess(int ClusterBindZbSuccess) {
+            this.ClusterBindZbSuccess = ClusterBindZbSuccess;
+        }
+
+        public int getIsGetAllDefaultBind() {
+            return IsGetAllDefaultBind;
+        }
+
+        public void setIsGetAllDefaultBind(int IsGetAllDefaultBind) {
+            this.IsGetAllDefaultBind = IsGetAllDefaultBind;
+        }
+
+        @NonNull
+        public String getManufacturerName() {
+            return ManufacturerName == null ? "" : ManufacturerName;
+        }
+
+        public void setManufacturerName(@NonNull String ManufacturerName) {
+            this.ManufacturerName = ManufacturerName;
+        }
+
+        @NonNull
+        public String getModelIdentifier() {
+            return ModelIdentifier == null ? "" : ModelIdentifier;
+        }
+
+        public void setModelIdentifier(@NonNull String ModelIdentifier) {
+            this.ModelIdentifier = ModelIdentifier;
+        }
+
+        @NonNull
+        public String getProductCode() {
+            return ProductCode == null ? "" : ProductCode;
+        }
+
+        public void setProductCode(@NonNull String ProductCode) {
+            this.ProductCode = ProductCode;
+        }
+
+        public String getFunctionType() {
+            return FunctionType;
+        }
+
+        public void setFunctionType(String FunctionType) {
+            this.FunctionType = FunctionType;
+        }
+
+        /**
+         * 杈撳叆绨�
+         */
+        public static class InClusterListBean implements Serializable{
+            /// <summary>
+            /// 璁惧鏀寔鐨勮緭鍏ュ姛鑳�
+            /// <para>0:Basic,璁惧鏀寔鈥滃熀纭�灞炴�р�� </para>
+            /// <para>3:Identify,璁惧鏀寔鈥滆瘑鍒姛鑳解��</para>
+            /// <para>4:Groups,璁惧鏀寔鈥滅粍鍔熻兘鈥�</para>
+            /// <para>5:Scenes,璁惧鏀寔鈥滃満鏅姛鑳解��</para>
+            /// <para>6:on/off,璁惧鏀寔鈥滃紑鍏冲姛鑳解��</para>
+            /// 寮�鍏冲姛鑳界殑璁惧濡傦細璋冨叧鐏�/缁х數鍣�/绐楀笜绛夈�傘�傘��
+            /// <para>8:Level Control,璁惧鏀寔鈥滀寒搴﹁皟鑺傚姛鑳解��</para>
+            /// 浜害璋冭妭鍔熻兘鐨勮澶囧锛氳皟鍏崇伅銆傘�傘��
+            /// <para>257:Door Lock,璁惧鏀寔鈥滈棬閿佸姛鑳解��</para>
+            /// 闂ㄩ攣鍔熻兘鐨勮澶囧锛氶棬閿併�傘�傘��
+            ///  <para>258:Window Covering,璁惧鏀寔鈥滅獥甯樻帶鍒跺姛鑳解��</para>
+            /// 绐楀笜鎺у埗鍔熻兘鐨勮澶囧锛氱獥甯�/寮�鍚堝笜/鍗峰笜銆傘�傘��
+            /// <para>513:Thermostat,璁惧鏀寔鈥滄亽娓╁櫒鍔熻兘鈥�</para>
+            /// 鎭掓俯鍣ㄥ姛鑳界殑璁惧濡傦細绌鸿皟銆傘�傘��
+            /// <para>768:Color Control,璁惧鏀寔鈥滈鑹茶皟鑺傚姛鑳解��</para>
+            /// 棰滆壊璋冭妭鍔熻兘鐨勮澶囧锛氳皟鍏夌伅銆傘�傘��
+            /// <para>1026:Temperature Measurement,璁惧鏀寔鈥滄俯搴︽祴閲忓姛鑳解��</para>
+            /// 娓╁害娴嬮噺鍔熻兘鐨勮澶囧锛氭俯搴︿紶鎰熷櫒銆傘�傘��
+            /// <para>1029:Relative Humidity Measurement,璁惧鏀寔鈥滄箍搴︽祴閲忓姛鑳解��</para>
+            /// 婀垮害娴嬮噺鍔熻兘鐨勮澶囧锛氭箍搴︿紶鎰熷櫒銆傘�傘��
+            /// <para>1066:Pm2.5  Measurement,璁惧鏀寔鈥減m2.5娴嬮噺鍔熻兘鈥�</para>
+            /// Pm2.5娴嬮噺鍔熻兘鐨勮澶囧锛歅m2.5浼犳劅鍣ㄣ�傘�傘��
+            /// </summary>
+            private int InCluster;
+
+            public int getInCluster() {
+                return InCluster;
+            }
+
+            public void setInCluster(int inCluster) {
+                this.InCluster = inCluster;
+            }
+        }
+
+        /**
+         * 杈撳嚭绨�
+         */
+        public static class OutClusterListBean implements Serializable{
+            /// <summary>
+            /// 璁惧鏀寔鐨勮緭鍑哄姛鑳�
+            /// <para>0:Basic,璁惧鏀寔鈥滃熀纭�灞炴�р�� </para>
+            /// <para>3:Identify,璁惧鏀寔鈥滆瘑鍒姛鑳解��</para>
+            /// <para>4:Groups,璁惧鏀寔鈥滅粍鍔熻兘鈥�</para>
+            /// <para>5:Scenes,璁惧鏀寔鈥滃満鏅姛鑳解��</para>
+            /// <para>6:on/off,璁惧鏀寔鈥滃紑鍏冲姛鑳解��</para>
+            /// 寮�鍏冲姛鑳界殑璁惧濡傦細璋冨叧鐏�/缁х數鍣�/绐楀笜绛夈�傘�傘��
+            /// <para>8:Level Control,璁惧鏀寔鈥滀寒搴﹁皟鑺傚姛鑳解��</para>
+            /// 浜害璋冭妭鍔熻兘鐨勮澶囧锛氳皟鍏崇伅銆傘�傘��
+            /// <para>257:Door Lock,璁惧鏀寔鈥滈棬閿佸姛鑳解��</para>
+            /// 闂ㄩ攣鍔熻兘鐨勮澶囧锛氶棬閿併�傘�傘��
+            ///  <para>258:Window Covering,璁惧鏀寔鈥滅獥甯樻帶鍒跺姛鑳解��</para>
+            /// 绐楀笜鎺у埗鍔熻兘鐨勮澶囧锛氱獥甯�/寮�鍚堝笜/鍗峰笜銆傘�傘��
+            /// <para>513:Thermostat,璁惧鏀寔鈥滄亽娓╁櫒鍔熻兘鈥�</para>
+            /// 鎭掓俯鍣ㄥ姛鑳界殑璁惧濡傦細绌鸿皟銆傘�傘��
+            /// <para>768:Color Control,璁惧鏀寔鈥滈鑹茶皟鑺傚姛鑳解��</para>
+            /// 棰滆壊璋冭妭鍔熻兘鐨勮澶囧锛氳皟鍏夌伅銆傘�傘��
+            /// <para>1026:Temperature Measurement,璁惧鏀寔鈥滄俯搴︽祴閲忓姛鑳解��</para>
+            /// 娓╁害娴嬮噺鍔熻兘鐨勮澶囧锛氭俯搴︿紶鎰熷櫒銆傘�傘��
+            /// <para>1029:Relative Humidity Measurement,璁惧鏀寔鈥滄箍搴︽祴閲忓姛鑳解��</para>
+            /// 婀垮害娴嬮噺鍔熻兘鐨勮澶囧锛氭箍搴︿紶鎰熷櫒銆傘�傘��
+            /// </summary>
+            private int OutCluster;
+
+            public int getOutCluster() {
+                return OutCluster;
+            }
+
+            public void setOutCluster(int outCluster) {
+                this.OutCluster = outCluster;
+            }
+        }
+
+        /**
+         * 璁惧鏈�鏂颁笂鎶ョ殑灞炴�х姸鎬佷俊鎭�
+         */
+        public static class AttributeStatusBean implements Serializable{
+
+            /// <summary>
+            /// 灞炴�х皣id
+            /// </summary>
+            private int ClusterId;
+            /// <summary>
+            /// 灞炴�d
+            /// </summary>
+            private int AttributeId;
+            /// <summary>
+            /// 灞炴�у�硷紝杩欎釜涓滆タ涓嶉渶瑕佷粈涔堥珮浣嶅湪鍚庝綆浣嶅湪鍓�,瀹冨凡缁忔槸杞负浜�10杩涘埗
+            /// </summary>
+            private int AttributeData;
+            /// <summary>
+            /// 灞炴�х姸鎬佹渶鍚庢洿鏂扮殑utc鏃堕棿鎴�
+            /// </summary>
+            private int ReportTime;
+
+            public int getClusterId() {
+                return ClusterId;
+            }
+
+            public void setClusterId(int clusterId) {
+                this.ClusterId = ClusterId;
+            }
+
+            public int getAttributeId() {
+                return AttributeId;
+            }
+
+            public void setAttributeId(int AttributeId) {
+                this.AttributeId = AttributeId;
+            }
+
+            public int getAttributeData() {
+                return AttributeData;
+            }
+
+            public void setAttributeData(int attributeData) {
+                this.AttributeData = AttributeData;
+            }
+
+            public int getReportTime() {
+                return ReportTime;
+            }
+
+            public void setReportTime(int ReportTime) {
+                this.ReportTime = ReportTime;
+            }
+        }
+    }
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceModuleBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceModuleBean.java
new file mode 100644
index 0000000..ea4af5e
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/bean/ZBDeviceModuleBean.java
@@ -0,0 +1,32 @@
+//package com.hdl.sdk.link.zigbee.bean;
+//
+//import androidx.annotation.NonNull;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * Created by jlchen on 12/29/21.
+// * 鍘熺敓ZigBee璁炬ā鍧�
+// */
+//public class ZBDeviceModuleBean {
+//
+//    //鍘熺敓ZigBee璁惧鍥炶矾鍒楄〃
+//    private List<ZBDeviceBean> deviceLoopList = new ArrayList<>();
+//
+//    public ZBDeviceModuleBean(List<ZBDeviceBean> deviceLoopList) {
+//        this.deviceLoopList = deviceLoopList;
+//    }
+//
+//    @NonNull
+//    public List<ZBDeviceBean> getDeviceLoopList() {
+//        if (deviceLoopList == null) {
+//            return new ArrayList<>();
+//        }
+//        return deviceLoopList;
+//    }
+//
+//    public void setDeviceLoopList(@NonNull List<ZBDeviceBean> deviceLoopList) {
+//        this.deviceLoopList = deviceLoopList;
+//    }
+//}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/HDLZBCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/HDLZBCallBack.java
new file mode 100644
index 0000000..7c21660
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/HDLZBCallBack.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.link.zigbee.callback;
+
+/**
+ * Created by jlchen on 12/16/21.
+ */
+public interface HDLZBCallBack {
+
+    void onSuccess(String msg);
+
+    void onError(String error);
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/ZBDeviceListCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/ZBDeviceListCallBack.java
new file mode 100644
index 0000000..2bdec6b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/callback/ZBDeviceListCallBack.java
@@ -0,0 +1,13 @@
+package com.hdl.sdk.link.zigbee.callback;
+
+import com.hdl.sdk.link.core.callback.BaseCallBack;
+import com.hdl.sdk.link.zigbee.bean.ZBDeviceBean;
+
+import java.util.List;
+
+/**
+ * Created by jlchen on 12/29/21.
+ */
+public interface ZBDeviceListCallBack extends BaseCallBack {
+    void onSuccess(List<ZBDeviceBean> list);
+}
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZBDeviceType.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZBDeviceType.java
new file mode 100644
index 0000000..2be9bda
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZBDeviceType.java
@@ -0,0 +1,161 @@
+package com.hdl.sdk.link.zigbee.config;
+
+/**
+ * Created by jlchen on 12/29/21.
+ */
+
+import androidx.annotation.IntDef;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * ZigBee璁惧绫诲瀷
+ * device_ID 瀵瑰簲鐨勮澶囨灇涓�
+ */
+@IntDef({ZBDeviceType.UnKown})
+@Retention(RetentionPolicy.SOURCE)
+public @interface ZBDeviceType{
+    int UnKown = 0x9999;
+    int ZbGateway = 0x9998;
+    /// <summary>
+    /// 骞茬粨鐐�
+    /// <para>璁惧ID涓�0</para>
+    /// <para>瀹氫箟瀵硅薄锛歅anel</para>
+    /// </summary>
+    int OnOffSwitch = 0;
+    /// <summary>
+    /// 浜害鎺у埗寮�鍏�
+    /// <para>璁惧ID涓�2</para>
+    /// <para>瀹氫箟瀵硅薄 LevelControlSwitch</para>
+    /// </summary>
+    int LevelControlSwitch = 1;
+    /// <summary>
+    /// 缁х數鍣�
+    /// <para>璁惧ID涓�2</para>
+    /// <para>瀹氫箟瀵硅薄锛歍oggleLight</para>
+    /// </summary>
+    int OnOffOutput = 2;
+    /// <summary>
+    /// 闂ㄩ攣
+    /// <para>璁惧ID涓�10</para>
+    /// <para>瀹氫箟瀵硅薄锛欴oorLock</para>
+    /// </summary>
+    int DoorLock = 10;
+    /// <summary>
+    /// 璁惧ID涓�257鐨勮澶�
+    /// <para>璋冨厜鐏細鏀寔浜害</para>
+    /// <para>璋冨厜璁惧</para>
+    /// </summary>
+    int DimmableLight = 257;
+    /// <summary>
+    /// 璁惧ID涓�258鐨勮澶�
+    /// <para>鑹叉俯鐏�</para>
+    /// <para>瀹氫箟瀵硅薄锛欳olorTemperatureLight</para>
+    /// </summary>
+    int ColorTemperatureLight = 258;
+    /// <summary>
+    /// 璋冨厜鍣ㄦ帶鍒跺櫒
+    /// <para>璁惧ID涓�260</para>
+    /// <para>瀹氫箟瀵硅薄 DimmerSwitch</para>
+    /// </summary>
+    int DimmerSwitch = 260;
+    /// <summary>
+    /// 棰滆壊璋冨厜鐏紑鍏�
+    /// <para>璁惧ID涓�261</para>
+    /// <para>瀹氫箟瀵硅薄 LevelControlSwitch</para>
+    /// </summary>
+    int ColorDimmerSwitch = 261;
+    /// <summary>
+    /// 绐楀笜璁惧ID
+    /// <para>Rollershade:鍗峰笜</para>
+    /// </summary>
+    int WindowCoveringDevice = 514;
+    /// <summary>
+    /// 绐楀笜鎺у埗鍣ㄨ澶嘔D
+    /// <para>CurtainController:绐楀笜鎺у埗鍣�</para>
+    /// </summary>
+    int WindowCoveringController = 515;
+    /// <summary>
+    /// 璁惧ID涓�528鐨勮澶�
+    /// <para>棰滆壊璋冨厜鐏細鏀寔浜害/鑹插害/楗卞拰搴�</para>
+    /// <para>璋冨厜璁惧</para>
+    /// <para>瀹氫箟瀵硅薄锛欳olorDimmableLight</para>
+    /// </summary>
+    int ColorDimmableLight = 528;
+    /// <summary>
+    /// 鎭掓俯鍣�
+    /// <para>璁惧ID涓�769</para>
+    /// <para>瀹氫箟瀵硅薄锛欰C</para>
+    /// </summary>
+    int Thermostat = 769;
+    /// <summary>
+    /// <para>娓╂箍搴︿紶鎰熷櫒</para>
+    /// <para>璁惧ID涓�770</para>
+    /// <para>瀹氫箟瀵硅薄锛歍emperatureSensor</para>
+    /// <para>娉ㄦ剰瀹冧笌HumiditySensor涓嶄竴鏍�;瀹冨叿浣撴槸娓╁害杩樻槸婀垮害;闇�瑕佸彂鍛戒护鍘昏鍙�</para>
+    /// </summary>
+    int TemperatureSensor = 770;
+    /// <summary>
+    /// <para>PM2.5浼犳劅鍣�</para>
+    /// <para>璁惧ID涓�777</para>
+    /// <para>瀹氫箟瀵硅薄锛歅MSensor</para>
+    /// </summary>
+    int PMSensor = 777;
+    /// <summary>
+    /// 瀹夐槻璁惧
+    /// <para>璁惧ID涓�1026鐨勮澶�</para>
+    /// <para>瀹氫箟瀵硅薄锛欼ASZone</para>
+    /// </summary>
+    int IASZone = 1026;
+    /// <summary>
+    /// 铚傞福鍣�
+    /// <para>璁惧ID涓�1027鐨勮澶�</para>
+    /// <para>瀹氫箟瀵硅薄锛欱uzzer</para>
+    /// </summary>
+    int Buzzer = 1027;
+    /// <summary>
+    /// 鎺у埗婧愯澶�
+    /// <para>璁惧ID涓�0</para>
+    /// <para>瀹氫箟瀵硅薄锛歅anel</para>
+    /// </summary>
+    int OtaPanelDevice = 49152;
+    /// <summary>
+    /// 鎺у埗婧愯澶�
+    /// <para>璁惧ID涓�0</para>
+    /// <para>瀹氫箟瀵硅薄锛歅anel</para>
+    /// </summary>
+    int OtaDevice = 49153;
+    /// <summary>
+    /// 绌烘皵寮�鍏�
+    /// </summary>
+    int AirSwitch = 53249;
+    /// <summary>
+    /// 涓户鍣�
+    /// </summary>
+    int Repeater = 53250;
+    /// 杞崲鍣�
+    /// <para>璁惧ID涓�53251</para>
+    /// <para>瀹氫箟瀵硅薄锛歍ransverter</para>
+    /// </summary>
+    int Transverter = 0xD003;
+    /// <summary>
+    /// <para>鏅捐。鏋�</para>
+    /// <para>璁惧ID涓�0xD004 </para>
+    /// <para>瀹氫箟瀵硅薄锛欰irer</para>
+    /// </summary>
+    int Airer = 0xD004;
+
+    /// 鏂伴
+    /// <para>璁惧ID涓�53504</para>
+    /// <para>瀹氫箟瀵硅薄锛欶reshAirAC</para>
+    /// </summary>
+    int FreshAir = 0xD100;
+
+    /// <summary>
+    /// <para>婀垮害浼犳劅鍣�</para>
+    /// <para>璁惧ID涓�53760</para>
+    /// <para>瀹氫箟瀵硅薄锛欻umiditySensor</para>
+    /// <para>娉ㄦ剰瀹冧笌TemperatureSensor涓嶄竴鏍�;杩欎釜id瀹氭浜嗗氨鏄箍搴︿紶鎰熷櫒</para>
+    /// </summary>
+    int HumiditySensor = 0xD200;
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZigBee.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZigBee.java
new file mode 100644
index 0000000..b4426de
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/config/ZigBee.java
@@ -0,0 +1,88 @@
+package com.hdl.sdk.link.zigbee.config;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.StringDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Created by jlchen on 12/16/21.
+ * ZigBee鍘熺敓鍗忚鎺у埗鐮佺浉鍏�
+ */
+public class ZigBee {
+
+
+
+//    /**
+//     * 涓婚
+//     */
+//    @StringDef({})
+//    @Retention(RetentionPolicy.SOURCE)
+//    public @interface TopicType {
+//        //鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+//        String GwLinuxLocate = "GwLinuxLocate";
+//        //璁惧鍒楄〃-鑾峰彇鏈湴缃戝叧璁惧 EPDeviceId 鍒楄〃
+//        String GetDeviceInfo = "GetDeviceInfo";
+//        //鑾峰彇鍏ョ綉璁惧
+//        String SearchNewDevice = "SearchNewDevice";
+//        //淇敼璁惧绔彛锛堟寜閿級鍚嶇О
+//        String DeviceRename = "DeviceRename";
+//        //璁惧鍒楄〃-璁惧鍒犻櫎锛堜娇璁惧绂荤綉锛�
+//        String RemoveDevice = "RemoveDevice";
+//        //璁惧鎺у埗-鏃� Id-3-identify 瀹氫綅鍔熻兘
+//        String Identify = "Identify";
+//        //瀵圭鐐瑰洖璺澶囧姛鑳界被鍨嬭繘琛岃缃�
+//        String SetEPDeviceFunctionType = "Device/SetEPDeviceFunctionType";
+//
+//    }
+
+    /**
+     * 鍥炲涓婚
+     */
+    @StringDef({})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ReplyTopicType {
+        //鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+        String GwLinuxLocate = "GwLinuxLocate_Respon";
+        //璁惧鍒楄〃-鑾峰彇鏈湴缃戝叧璁惧 EPDeviceId 鍒楄〃
+        String GetDeviceInfo = "DeviceInfoRespon";
+        //鑾峰彇鍏ョ綉璁惧
+        String SearchNewDevice = "Device/SearchNewDevice";
+        //淇敼璁惧绔彛锛堟寜閿級鍚嶇О
+        String DeviceRename = "DeviceRenameRespon";
+        //璁惧鍒楄〃-璁惧鍒犻櫎锛堜娇璁惧绂荤綉锛�
+        String RemoveDevice = "RemoveDeviceRespon";
+        //璁惧鎺у埗-鏃� Id-3-identify 瀹氫綅鍔熻兘
+        String Identify = "Identify";
+        //瀵圭鐐瑰洖璺澶囧姛鑳界被鍨嬭繘琛岃缃�
+        String SetEPDeviceFunctionType = "Device/SetEPDeviceFunctionType";
+        //鏂拌澶囧叆缃�
+        String DeviceInComingRespon = "DeviceInComingRespon";
+        //璁剧疆鍏ョ綉娴佺▼鏂瑰紡
+        String SetJoiningModeRespon = "SetJoiningMode_Respon";
+
+    }
+
+    /**
+     * 鎺у埗鐮�
+     */
+    @IntDef({CommandType.SearchNewDevice})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface CommandType {
+        //鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+        int GwLinuxLocate = 85;
+        //璁惧鍒楄〃-鑾峰彇鏈湴缃戝叧璁惧 EPDeviceId 鍒楄〃
+        int GetDeviceInfo = 93;
+        //鑾峰彇鍏ョ綉璁惧
+        int SearchNewDevice = 94;
+        //淇敼璁惧绔彛锛堟寜閿級鍚嶇О
+        int DeviceRename = 96;
+        //璁惧鍒楄〃-璁惧鍒犻櫎锛堜娇璁惧绂荤綉锛�
+        int RemoveDevice =  99;
+        //瀵圭鐐瑰洖璺澶囧姛鑳界被鍨嬭繘琛岃缃�
+        int SetEPDeviceFunctionType = 110;
+
+    }
+
+}
diff --git a/HDLLinkLocalSdk/src/main/res/values-zh/strings_code.xml b/HDLLinkLocalSdk/src/main/res/values-zh/strings_code.xml
new file mode 100644
index 0000000..25f17da
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/res/values-zh/strings_code.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="HDL_DATA_ERROR">鍙傛暟寮傚父</string>
+    <string name="HDL_DATA_NULL_ERROR">鍙傛暟涓嶈兘涓虹┖</string>
+    <string name="HDL_AUTH_ERROR">璁よ瘉澶辫触</string>
+    <string name="HDL_SEND_ERROR">鍙戦�佸け璐�</string>
+    <string name="HDL_TIMEOUT_ERROR">瓒呮椂锛岀綉鍏虫棤鍥炲</string>
+    <string name="HDL_UNAUTHORIZED_ERROR">鏈璇侊紝璇峰厛璁よ瘉</string>
+    <string name="HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED">璁よ瘉澶辫触锛岀綉鍏虫湭娉ㄥ唽鍒颁簯绔�</string>
+    <string name="HDL_SEARCH_GATEWAY_TIMEOUT_ERROR">鎼滅储缃戝叧澶辫触锛岃秴鏃�</string>
+    <string name="HDL_AUTH_MAC_KEY_ERROR">璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪</string>
+    <string name="HDL_DATA_PARSING_ERROR">鏁版嵁瑙f瀽寮傚父</string>
+    <string name="HDL_GET_DEVICE_LIST_ERROR">鑾峰彇璁惧鍒楄〃澶辫触</string>
+    <string name="HDL_GET_FUNCTION_LIST_ERROR">鑾峰彇鍔熻兘鍒楄〃澶辫触</string>
+    <string name="HDL_GET_FUNCTION_PROPERTIES_ERROR">鑾峰彇鍔熻兘灞炴�уけ璐�</string>
+    <string name="HDL_CONTROL_FAILURE_ERROR">鎺у埗澶辫触</string>
+    <string name="HDL_GET_GATEWAY_FAILURE_ERROR">鑾峰彇缃戝叧鍒楄〃澶辫触</string>
+    <string name="HDL_GET_Zigbee_FAILURE_ERROR">鍙戦�佽秴鏃讹紝缃戝叧鏃犲搷搴�</string>
+    <string name="HDL_GATEWAY_NOT_EXIST">缃戝叧涓嶅瓨鍦�</string>
+    <string name="HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR">鑾峰彇鍘熺敓璁惧鍒楄〃澶辫触</string>
+    <string name="HDL_MILLIMETER_NOT_EXIST">姣背娉笉瀛樺湪</string>
+    <string name="HDL_UNKOWN_CODE">鏈煡閿欒</string>
+    <string name="HDL_APPLICATION_EXCEPTION">绯荤粺寮傚父</string>
+    <string name="HDL_TOPIC_NOT_RIGHT">涓婚娌℃湁鍖归厤</string>
+    <string name="HDL_OBJECT_NOT_SUPPORT">瀵硅薄涓嶆敮鎸�</string>
+    <string name="HDL_GATEWAY_REMOTE_NOT_RESPONSE">缃戝叧鏈湴杩炴帴澶辫触锛岄�氳繃杩滅▼閫氳涓嶅洖澶�</string>
+</resources>
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/res/values/arrays-error.xml b/HDLLinkLocalSdk/src/main/res/values/arrays-error.xml
new file mode 100644
index 0000000..0260f1f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/res/values/arrays-error.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string-array name="gateway"></string-array>
+    <string-array name="cloud"></string-array>
+    <string-array name="app"></string-array>
+</resources>
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/res/values/strings_code.xml b/HDLLinkLocalSdk/src/main/res/values/strings_code.xml
new file mode 100644
index 0000000..ca99860
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/res/values/strings_code.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+<string name="HDL_DATA_ERROR">Parameter exception</string>
+<string name="HDL_DATA_NULL_ERROR">Parameter cannot be empty</string>
+<string name="HDL_AUTH_ERROR">Authentication failed</string>
+<string name="HDL_SEND_ERROR">fail in send</string>
+<string name="HDL_TIMEOUT_ERROR">timeout,gateway no response</string>
+<string name="HDL_UNAUTHORIZED_ERROR">Not certified, please authenticate first</string>
+<string name="HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED">Authentication failed. The gateway is not registered to the cloud</string>
+<string name="HDL_SEARCH_GATEWAY_TIMEOUT_ERROR">Failed to search gateway, timeout</string>
+<string name="HDL_AUTH_MAC_KEY_ERROR">Authentication failed. The device key corresponding to the MAC does not exist</string>
+<string name="HDL_DATA_PARSING_ERROR">Data parsing error</string>
+<string name="HDL_GET_DEVICE_LIST_ERROR">Failed to get device list</string>
+<string name="HDL_GET_FUNCTION_LIST_ERROR">Failed to get function list</string>
+<string name="HDL_GET_FUNCTION_PROPERTIES_ERROR">Failed to get function attribute</string>
+<string name="HDL_CONTROL_FAILURE_ERROR">Control failure</string>
+<string name="HDL_GET_GATEWAY_FAILURE_ERROR">Failed to get gateway list</string>
+<string name="HDL_GET_Zigbee_FAILURE_ERROR">Sending timeout, no response from gateway</string>
+<string name="HDL_GATEWAY_NOT_EXIST">Gateway does not exist</string>
+<string name="HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR">Failed to get the device list</string>
+<string name="HDL_MILLIMETER_NOT_EXIST">Millimeter does not exist</string>
+<string name="HDL_UNKOWN_CODE">Unkown Error</string>
+<string name="HDL_APPLICATION_EXCEPTION">System Exception</string>
+<string name="HDL_TOPIC_NOT_RIGHT">Theme does not match</string>
+<string name="HDL_OBJECT_NOT_SUPPORT">Object not supported</string>
+<string name="HDL_GATEWAY_REMOTE_NOT_RESPONSE">Gateway local connection failed, unable to reply through remote communication</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
index fb3a685..693ae32 100644
--- a/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
+++ b/app/src/main/java/com/hdl/photovoltaic/HDLApp.java
@@ -13,6 +13,8 @@
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.PermissionUtils;
 import com.hdl.photovoltaic.utils.SharedPreUtils;
+import com.hdl.sdk.link.core.connect.HDLUdpConnect;
+import com.hdl.sdk.link.core.utils.QueueUtils;
 
 import java.util.HashMap;
 import java.util.Objects;
@@ -90,6 +92,7 @@
 //        NetWorkUtil.init(this);
 //        //10.鍒濆鍖栨瀬鍏夋帹閫�
 //        initJPush();
+         initSocket();
     }
 
     /**
@@ -99,6 +102,10 @@
         HDLUniMPSDKManager.getInstance().initDCUniMPSDK(this);
     }
 
-
+    //鍒濆鍖杝ocket鍙婂惎鍔ㄥ鐞嗘帴鏀跺埌鏁版嵁鐨勫鐞嗘柟娉�
+    private void initSocket() {
+        QueueUtils.getInstance().start();
+        HDLUdpConnect.getInstance().initUdp();
+    }
 
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
index c16a5ad..da64b67 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlDeviceLogic.java
@@ -14,8 +14,15 @@
 import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean;
 import com.hdl.photovoltaic.ui.bean.InverterDeviceBean;
 import com.hdl.photovoltaic.ui.bean.OidBean;
+import com.hdl.photovoltaic.uni.HDLUniMP;
+import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.callback.GatewayCallBack;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
 
 import java.lang.reflect.Type;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -222,6 +229,15 @@
                 }
             }
         });
+
     }
 
+
+    public void searchGateway(GatewayCallBack gatewayCallBack)
+    {
+        List<String> spks = new ArrayList<>();
+        spks.add("energy.hdl_inverter");
+        //缃戝叧鎼滅储
+        HDLLinkLocalGateway.getInstance().refreshGatewayByHomeIdAndSpk(UserConfigManage.getInstance().getHomeId(), spks, true, gatewayCallBack);
+    }
 }
diff --git a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
index 367cfb5..f362488 100644
--- a/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
+++ b/app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -11,6 +11,13 @@
 import com.hdl.photovoltaic.uni.HDLUniMP;
 import com.hdl.photovoltaic.uni.HDLUniMPSDKManager;
 import com.hdl.photovoltaic.utils.WifiUtils;
+import com.hdl.sdk.link.HDLLinkLocalSdk;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.core.bean.gateway.GatewayBean;
+import com.hdl.sdk.link.core.callback.GatewayCallBack;
+import com.hdl.sdk.link.core.callback.HDLLinkCallBack;
+import com.hdl.sdk.link.core.config.HDLLinkConfig;
+import com.hdl.sdk.link.gateway.HDLLinkLocalGateway;
 
 import org.greenrobot.eventbus.EventBus;
 import org.json.JSONObject;
@@ -57,8 +64,12 @@
             }
             org.json.JSONObject jsonObject = getJSONObject(data);
             String type_value = "";
+            String oid="";
             if (jsonObject.has("type")) {
                 type_value = jsonObject.getString("type");
+            }
+            if (jsonObject.has("oid")) {
+                oid = jsonObject.getString("oid");
             }
 
             if (HDLUniMP.UNI_EVENT_REPLY_HOME_MODEL.equals(event)) {
@@ -90,10 +101,29 @@
                     }
                     break;
                     case HDLUniMP.UNI_EVENT_REPLY_DEVICE_LIST: {
-                        //鑾峰彇璁惧鍒楄〃
+                        //缃戝叧鎼滅储
+                        HdlDeviceLogic.getInstance().searchGateway(new GatewayCallBack() {
+                            @Override
+                            public void onSuccess(List<GatewayBean> gatewayBeanList) {
+                                HDLUniMP.UniCallBackBaseBean callBackBaseBean = new HDLUniMP.UniCallBackBaseBean();
+                                callBackBaseBean.setTopic(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL);
+                                callBackBaseBean.setType(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_LIST);
+                                callBackBaseBean.setData(gatewayBeanList);
+                                sendUni(callBackBaseBean);
+                            }
+
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                                //鍙戦�佸け璐�
+                            }
+                        });
                     }
                     break;
+                    case HDLUniMP.UNI_EVENT_REPLY_DEVICE_MODBUS_SEND:{
+                        //鍙戦�乵odbus鍗忚
 
+                    }
                 }
 
             } else if (HDLUniMP.UNI_EVENT_REPLY_WIFI_MODEL.equals(event)) {
@@ -232,6 +262,7 @@
                 return new JSONObject();
             }
             String json = new Gson().toJson(obj);
+
             return new JSONObject(json);
         } catch (Exception e) {
             return new JSONObject();
diff --git a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
index ed79307..1bc3474 100644
--- a/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
+++ b/app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
@@ -33,6 +33,7 @@
     public final static String UNI_EVENT_REPLY_DEVICE_ADD = "add";//璁惧娣诲姞
     public final static String UNI_EVENT_REPLY_DEVICE_DEL = "del";//璁惧鍒犻櫎
     public final static String UNI_EVENT_REPLY_DEVICE_OID = "oid";//璁惧銆愬寘鎷笅鎸傝澶囥�憃id鍒楄〃
+    public final static String UNI_EVENT_REPLY_DEVICE_MODBUS_SEND="modbus_send";//modbus鍗忚
 
     /*********Wifi妯″潡*********/ //鍗敠瀹氫箟
     public final static String UNI_EVENT_REPLY_WIFI_MODEL = "uni_wifi_model";//wifi妯″潡
diff --git a/local.properties b/local.properties
index 1a98706..72f7e7a 100644
--- a/local.properties
+++ b/local.properties
@@ -7,4 +7,4 @@
 # Location of the SDK. This is only used by Gradle.
 # For customization when using a Version Control System, please read the
 # header note.
-sdk.dir=/Users/wenjucheng/Library/Android/sdk
\ No newline at end of file
+sdk.dir=/Users/hdl/Library/Developer/Xamarin/android-sdk-macosx
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index c8e8029..ed709be 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,4 @@
 rootProject.name = "PhotovoltaicDebug"
 include ':app'
 include ':third-zxing'
+include ':HDLLinkLocalSdk'

--
Gitblit v1.8.0