From 30e96788f05f5ce28b58d991051c79e9c952c824 Mon Sep 17 00:00:00 2001
From: 562935844@qq.com
Date: 星期三, 28 十二月 2022 14:51:34 +0800
Subject: [PATCH] 修改入网认证流程

---
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java    |   27 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java                    |   32 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java            |   55 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java                 |    8 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java             |  239 +++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java                 |  150 ++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java              |   26 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store                              |    0 
 HDLSDK_DEMO.rar                                                                            |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java                     |   41 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java                            |   67 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java                 |   12 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java                        |  270 +++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java                     |   89 +
 HDLSDK/.idea/gradle.xml                                                                    |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java                   |  151 +++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java          |   24 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java                 |  124 ++
 HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.20.aar                                               |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java              |   10 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java              |  101 ++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java                     |  150 +++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java            |   11 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java                    |   63 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java             |   11 
 HDLSDK/settings.gradle                                                                     |    4 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java                     |   75 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java                        |   52 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java             |   47 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java        |   24 
 HDLSDK_DEMO/app/build.gradle                                                               |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java                |   30 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java               |   10 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java  |   43 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java                  |  176 +++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java                  |  199 ++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java             |   51 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java                        |   51 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java        |   64 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java                 |   42 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java                     |   12 
 /dev/null                                                                                  |    0 
 HDLSDK/hdl-connect/build.gradle                                                            |    5 
 HDLSDK/com.hdl.sdk/build.gradle                                                            |    4 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java |   70 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java        |   20 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java             |   73 +
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java                                  |    1 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store                              |    0 
 49 files changed, 2,675 insertions(+), 43 deletions(-)

diff --git a/HDLSDK/.idea/gradle.xml b/HDLSDK/.idea/gradle.xml
index ab2103b..e6ea393 100644
--- a/HDLSDK/.idea/gradle.xml
+++ b/HDLSDK/.idea/gradle.xml
@@ -11,9 +11,7 @@
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/com.hdl.sdk" />
-            <option value="$PROJECT_DIR$/hdl-common" />
             <option value="$PROJECT_DIR$/hdl-connect" />
-            <option value="$PROJECT_DIR$/hdl-socket" />
           </set>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
index 678a722..002f8dd 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -329,6 +329,7 @@
             public void onSuccess(String msg) {
                 tv.setText("璁よ瘉鎴愬姛");
                 responseTv.setText(msg.toString());
+                Log.i("TAG", "onSuccess: 璁よ瘉鎴愬姛");
             }
         });
     }
diff --git a/HDLSDK/com.hdl.sdk/build.gradle b/HDLSDK/com.hdl.sdk/build.gradle
index 795f57b..c7ec494 100644
--- a/HDLSDK/com.hdl.sdk/build.gradle
+++ b/HDLSDK/com.hdl.sdk/build.gradle
@@ -32,9 +32,9 @@
 //    embed(name: 'hdl-connect-release',ext: 'aar')
 //    embed(name: 'hdl-socket-release',ext: 'aar')
 
-    embed project(path: ':hdl-common', configuration:'default')
+//    embed project(path: ':hdl-common', configuration:'default')
     embed project(path: ':hdl-connect', configuration:'default')
-    embed project(path: ':hdl-socket', configuration:'default')
+//    embed project(path: ':hdl-socket', configuration:'default')
 }
 
 //鎵撳寘鐨�
diff --git a/HDLSDK/hdl-connect/build.gradle b/HDLSDK/hdl-connect/build.gradle
index 9b7328f..09f41a1 100644
--- a/HDLSDK/hdl-connect/build.gradle
+++ b/HDLSDK/hdl-connect/build.gradle
@@ -9,7 +9,7 @@
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
         versionCode 2
-        versionName "1.0.15"
+        versionName "1.0.21"
 
         consumerProguardFiles "consumer-rules.pro"
     }
@@ -27,5 +27,6 @@
 }
 
 dependencies {
-    api project(path: ':hdl-socket')
+//    api project(path: ':hdl-socket')
+    api 'com.google.code.gson:gson:2.8.8'
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store
new file mode 100644
index 0000000..e90f688
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/.DS_Store
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
new file mode 100644
index 0000000..08db433
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
@@ -0,0 +1,67 @@
+package com.hdl.sdk.common;
+
+import android.content.Context;
+import android.util.Log;
+
+import com.hdl.sdk.common.config.TopicConstant;
+import com.hdl.sdk.common.exception.HDLLinkException;
+import com.hdl.sdk.common.utils.IdUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.LinkResponse;
+import com.hdl.sdk.connect.bean.request.BroadcastRequest;
+import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
+import com.hdl.sdk.connect.config.HDLLinkConfig;
+import com.hdl.sdk.connect.socket.HDLAuthSocket;
+import com.hdl.sdk.connect.socket.HDLSocket;
+
+/**
+ * Created by Tong on 2021/9/28.
+ */
+public class HDLSdk {
+
+    private Context context;
+
+    /**
+     * 鑾峰彇褰撳墠鐗堟湰
+     *
+     * @return
+     */
+    public String getVersion() {
+        return version;
+    }
+
+    private String version = "1.0.22";
+
+    private HDLSdk() {
+    }
+
+    private static class SingletonInstance {
+        private static final HDLSdk INSTANCE = new HDLSdk();
+    }
+
+    public static HDLSdk getInstance() {
+        return SingletonInstance.INSTANCE;
+    }
+
+    public void init(Context context) {
+        this.context = context.getApplicationContext();
+        HDLSocket.getInstance().broadcastRequest();
+        LogUtils.i("HDLSdk Version:" + version);
+    }
+
+
+    public Context getContext() {
+        return context;
+    }
+
+    /**
+     * 璁剧疆鎵撳嵃鏄惁寮�鍚�
+     *
+     * @param enable
+     */
+    public void setLogEnabled(boolean enable) {
+        LogUtils.setEnabled(enable);
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java
new file mode 100644
index 0000000..b27f2ab
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/IHDLClient.java
@@ -0,0 +1,52 @@
+package com.hdl.sdk.common;
+
+/**
+ * Created by Tong on 2021/9/28.
+ * 鍖呭惈鎵�鏈夋搷浣�
+ */
+public interface IHDLClient {
+
+
+    /**
+     * 鎼滅储缃戝叧
+     */
+    void searchGateway();
+
+
+    /**
+     * 鑾峰彇缃戝叧璇︾粏淇℃伅
+     */
+    void getGatewayInfo();
+
+    /**
+     * 鑾峰彇璁惧鍒楄〃
+     */
+    void getDeviceList();
+
+    /**
+     * 鑾峰彇鍔熻兘鍒楄〃
+     */
+    void getFunctionList();
+
+    /**
+     * 鑾峰彇鍔熻兘灞炴��
+     */
+    void getFunctionAttribute();
+
+    /**
+     * 璁惧鎺у埗
+     */
+    void deviceControl();
+
+    /**
+     * 鑾峰彇璁惧鐘舵��
+     */
+    void getDeviceStatus();
+
+    /**
+     * 鏀瑰彉璁惧鐘舵��
+     */
+    void changeDeviceStatus();
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
new file mode 100644
index 0000000..07dc798
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
@@ -0,0 +1,101 @@
+package com.hdl.sdk.common.config;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class TopicConstant {
+
+    //缃戝叧骞挎挱鍏ョ綉鎸囦护
+    public static final String GATEWAY_AUTH_BROADCAST = "/user/all/custom/device/network_access/broadcast";
+
+    //璁惧鍏ョ綉鍜岃璇�
+    public static final String DEIVCE_AUTH_REQUEST = "/user/all/custom/device/network_access/request";
+
+    //璁惧鍏ョ綉鍜岃璇佸搷搴�
+    public static final String DEIVCE_AUTH_REQUEST_REPLY = "/user/all/custom/device/network_access/request_reply";
+
+    //鎼滅储缃戝叧
+    public static final String GATEWAY_SEARCH = "/user/all/custom/gateway/search";
+
+    //鎼滅储缃戝叧鍝嶅簲
+    public static final String GATEWAY_SEARCH_REPLY = "/user/all/custom/gateway/search_reply";
+
+    //缃戝叧璇︾粏淇℃伅鑾峰彇s=gw_id
+    public static final String GATEWAY_INFO = "/user/%s/custom/gateway/get";
+
+    //鑾峰彇鐗╃悊璁惧鍒楄〃
+    public static final String GET_DEVICE_LIST = " /user/%s/custom/device/list/get";
+
+    //鑾峰彇鐗╃悊璁惧鍒楄〃鍝嶅簲
+    public static final String GET_DEVICE_LIST_REPLY = " /user/%s/custom/device/list/get_reply";
+
+    //鑾峰彇鍔熻兘鍒楄〃
+    public static final String GET_FUNCTION_LIST = "/user/%s/custom/function/list/get";
+
+    //鑾峰彇鍔熻兘鍝嶅簲
+    public static final String GET_FUNCTION_LIST_REPLY = "/user/%s/custom/function/list/get_reply";
+
+    //鍔熻兘灞炴�ц鍙�
+    public static final String GET_FUNCTION_ATTRIBUTE = "/user/%s/custom/function/attribute/get";
+
+    //鍔熻兘灞炴�у搷搴�
+    public static final String GET_FUNCTION_ATTRIBUTE_REPLY = "/user/%s/custom/function/attribute/get_reply";
+
+    //鎺у埗
+    public static final String PROPERTY_DOWN = "/base/%s/thing/property/down";
+
+    //鎺у埗鍝嶅簲
+    public static final String PROPERTY_DOWN_REPLY = "/base/%s/thing/property/down_reply";
+
+    //鐘舵�佷笂鎶�
+    public static final String PROPERTY_UP = "/base/%s/thing/property/up";
+
+    //鐘舵�佷笂鎶ュ搷搴�
+    public static final String PROPERTY_UP_REPLY = "/base/%s/thing/property/up_reply";
+
+    //璇诲彇鐘舵��
+    public static final String PROPERTY_READ = "/base/%s/thing/property/read";
+
+    //璇诲彇鐘舵�佸搷搴�
+    public static final String PROPERTY_READ_REPLY = "/base/%s/thing/property/read_reply";
+
+    //8.1鑾峰彇鍦烘櫙鍒楄〃
+    public static final String SCENE_LIST_GET = "/user/%s/custom/scene/list/get";
+
+    //8.2鑾峰彇鍦烘櫙
+    public static final String SCENE_GET = "/user/%s/custom/scene/get";
+
+    //8.3鎵ц鍦烘櫙
+    public static final String SCENE_CONTROL = "/user/%s/custom/scene/execute";
+
+    //8.4鍦烘櫙澧炲姞
+    public static final String SCENE_ADD = "/user/%s/custom/scene/add";
+
+    //8.5鍦烘櫙缂栬緫
+    public static final String SCENE_EDIT = "/user/%s/custom/scene/edit";
+
+    //8.6鍦烘櫙鍒犻櫎
+    public static final String SCENE_DELETE = "/user/%s/custom/scene/delete";
+
+    //link tcp 鐧诲綍
+    public static final String GATEWAY_LOGIN = "/user/%s/custom/gateway/login";
+
+    /**
+     * 璁惧杩炴帴TCP涔嬪墠骞挎挱
+     */
+    public static final String BROADCAST="/user/all/custom/gateway/broadcast";
+
+    /**
+     * 涓荤綉鍏冲洖澶�
+     */
+    public static final String BROADCAST_REPLY="/user/all/custom/gateway/broadcast_reply";
+
+    /**
+     * 蹇冭烦妫�娴�
+     */
+    public static final String HEARTBEAT="/user/%s/custom/gateway/heartbeat";
+    /**
+     * 蹇冭烦妫�娴嬪洖澶�
+     */
+    public static final String HEARTBEAT_REPLY="/user/%s/custom/gateway/heartbeat_reply";
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
new file mode 100644
index 0000000..2f59e1d
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventDispatcher.java
@@ -0,0 +1,239 @@
+package com.hdl.sdk.common.event;
+
+
+import android.util.ArrayMap;
+
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 浜嬩欢鍒嗗彂
+ */
+public class EventDispatcher {
+
+    private static final List<EventListener> ALL_TOPICS_EVENT = new ArrayList<>();//鎵�鏈変富棰樻秷鎭�
+
+    private static final ConcurrentHashMap<Object, List<EventListener>> EVENT = new ConcurrentHashMap<>();
+
+    private static final ConcurrentHashMap<EventListener, Integer> TYPE = new ConcurrentHashMap<>();
+
+    private static final int MAIN_TYPE = 0;
+    private static final int IO_TYPE = 1;
+
+    private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(3);
+
+
+    private EventDispatcher() {
+    }
+
+    //    private static class SingletonInstance {
+    private static final EventDispatcher instance = new EventDispatcher();
+//    }
+
+    public static EventDispatcher getInstance() {
+        return instance;
+    }
+
+    public void register(Object tag, EventListener listener) {
+        synchronized (this) {
+            try {
+                LogUtils.i("娉ㄥ唽涓婚锛�" + tag);
+                if (tag == null) return;
+                if (!EVENT.containsKey(tag)) {
+                    EVENT.put(tag, new ArrayList<>());
+                }
+                if (listener == null) {
+                    LogUtils.i("鐩戝惉浜嬩欢涓虹┖");
+                    return;
+                }
+                Objects.requireNonNull(EVENT.get(tag)).add(listener);
+                TYPE.put(listener, MAIN_TYPE);
+            } catch (Exception e) {
+                LogUtils.e("register锛�" + e.getMessage());
+            }
+        }
+    }
+
+    public void registerIo(Object tag, EventListener listener) {
+        synchronized (this) {
+            LogUtils.i("娉ㄥ唽涓婚锛�" + tag);
+            if (tag == null) return;
+            if (!EVENT.containsKey(tag)) {
+                EVENT.put(tag, new ArrayList<>());
+            }
+            try {
+                if (listener == null) {
+                    LogUtils.i("鐩戝惉浜嬩欢涓虹┖");
+                    return;
+                }
+                Objects.requireNonNull(EVENT.get(tag)).add(listener);
+                TYPE.put(listener, IO_TYPE);
+            } catch (Exception e) {
+                LogUtils.e("registerIo锛�" + e.getMessage());
+            }
+        }
+    }
+
+    public void remove(Object tag) {
+        synchronized (this) {
+            if (tag == null) {
+                return;
+            }
+            try {
+                if (EVENT.containsKey(tag)) {
+                    LogUtils.i("绉婚櫎key锛�" + tag);
+                    List<EventListener> list = EVENT.get(tag);
+                    for (EventListener eventListener : list) {
+                        if (eventListener == null) {
+                            continue;
+                        }
+                        TYPE.remove(eventListener);
+                    }
+                    EVENT.remove(tag);
+                }
+            } catch (Exception ignored) {
+                LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+            }
+        }
+    }
+
+    public void remove(Object tag, EventListener listener) {
+        synchronized (this) {
+            try {
+                if (tag == null || listener == null) {
+                    return;
+                }
+                if (EVENT.containsKey(tag)) {
+                    LogUtils.i("绉婚櫎key锛�" + tag);
+                    List<EventListener> ev = EVENT.get(tag);
+                    if (ev != null && !ev.isEmpty()) {
+                        TYPE.remove(listener);
+                        ev.remove(listener);
+                    }
+                }
+            } catch (Exception ignored) {
+                LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+            }
+        }
+    }
+
+    public synchronized void post(Object tag, Object o) {
+        if (tag == null) {
+            LogUtils.i("post tag涓虹┖");
+            return;
+        }
+        try {
+            if (EVENT.containsKey(tag)) {
+                LogUtils.i("post锛�" + tag);
+                List<EventListener> list = EVENT.get(tag);
+                if (list != null && !list.isEmpty()) {
+                    for (EventListener listener : list) {
+                        if (listener == null) {
+                            continue;
+                        }
+                        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                try {
+                                    if (listener != null) {
+                                        listener.onMessage(o);
+                                    }
+                                } catch (Exception e) {
+                                    LogUtils.e("post寮傚父1锛�" + e.getMessage());
+                                }
+                            }
+                        });
+                    }
+                }
+            }
+            //鎵�鏈変富棰樼殑Listener閫氱煡
+            if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
+                for (EventListener listener : ALL_TOPICS_EVENT) {
+                    if (listener == null) {
+                        continue;
+                    }
+                    ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                        @Override
+                        public void run() {
+                            try {
+                                if (listener != null) {
+                                    listener.onMessage(o);
+                                }
+                            } catch (Exception e) {
+                            }
+                        }
+                    });
+                }
+            }
+        } catch (Exception e) {
+            LogUtils.e("post寮傚父2锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void registerAllTopicsListener(EventListener listener) {
+        if (listener == null) {
+            return;
+        }
+        try {
+            if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.contains(listener)) {
+                ALL_TOPICS_EVENT.add(listener);
+            }
+            TYPE.put(listener, MAIN_TYPE);
+        } catch (Exception e) {
+            LogUtils.e("registerAllTopicsListener锛�" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
+     *
+     * @param listener
+     */
+    public synchronized void removeAllTopicsListener(EventListener listener) {
+        try {
+            ioThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        if (listener == null) {
+                            return;
+                        }
+                        if (ALL_TOPICS_EVENT != null && !ALL_TOPICS_EVENT.isEmpty()) {
+                            TYPE.remove(listener);
+                            ALL_TOPICS_EVENT.remove(listener);
+                        }
+                    } catch (Exception ignored) {
+                        LogUtils.e("绉婚櫎event寮傚父1锛�" + ignored.getMessage());
+                    }
+
+                }
+            });
+        } catch (Exception e) {
+            LogUtils.e("绉婚櫎event寮傚父2锛�" + e.getMessage());
+        }
+    }
+
+    public synchronized void clear() {
+        ALL_TOPICS_EVENT.clear();
+        EVENT.clear();
+        TYPE.clear();
+    }
+
+    public synchronized void release() {
+        clear();
+        ioThread.shutdownNow();
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java
new file mode 100644
index 0000000..b2f9c38
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/event/EventListener.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.common.event;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface EventListener {
+
+    void onMessage(Object msg);
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java
new file mode 100644
index 0000000..a5c9a5f
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkCode.java
@@ -0,0 +1,47 @@
+package com.hdl.sdk.common.exception;
+
+/**
+ * Created by jlchen on 11/15/21.
+ *
+ * @Description : HDLError
+ */
+public enum HDLLinkCode {
+
+    HDL_DATA_ERROR(-2000,"鍙傛暟寮傚父"),
+    HDL_DATA_NULL_ERROR(-2001,"鍙傛暟涓嶈兘涓虹┖"),
+    HDL_AUTH_ERROR(-2002,"璁よ瘉澶辫触"),
+    HDL_SEND_ERROR(-2003,"鍙戦�佸け璐�"),
+    HDL_TIMEOUT_ERROR(-2004,"瓒呮椂"),
+    HDL_UNAUTHORIZED_ERROR(-2005,"鏈璇侊紝璇峰厛璁よ瘉"),
+    HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED(-2006,"璁よ瘉澶辫触锛岀綉鍏虫湭娉ㄥ唽鍒颁簯绔�"),
+    HDL_SEARCH_GATEWAY_TIMEOUT_ERROR(-2007,"鎼滅储缃戝叧澶辫触锛岃秴鏃�"),
+    HDL_AUTH_MAC_KEY_ERROR_(-2008,"璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪"),
+    HDL_GET_DEVICE_LIST_ERROR(-2100,"鑾峰彇璁惧鍒楄〃澶辫触"),
+    HDL_GET_FUNCTION_LIST_ERROR(-2101,"鑾峰彇鍔熻兘鍒楄〃澶辫触"),
+    HDL_GET_FUNCTION_PROPERTIES_ERROR(-2102,"鑾峰彇鍔熻兘灞炴�уけ璐�"),
+    HDL_CONTROL_FAILURE_ERROR(-2103,"鎺у埗澶辫触");
+
+    private String msg;
+    private int code;
+
+    private HDLLinkCode(int code, String msg) {
+        this.msg = msg;
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
new file mode 100644
index 0000000..b580aae
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/exception/HDLLinkException.java
@@ -0,0 +1,64 @@
+package com.hdl.sdk.common.exception;
+
+
+
+
+/**
+ * Created by Tong on 2021/11/11.
+ */
+public class HDLLinkException extends RuntimeException {
+
+    private int code = 0;
+    private String msg = "";
+    private Throwable rawThrowable;
+
+    public HDLLinkException() {
+    }
+
+    public HDLLinkException(String msg) {
+        this.msg = msg;
+    }
+
+    public HDLLinkException(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public HDLLinkException(int code) {
+        this.code = code;
+    }
+
+    public HDLLinkException(Throwable rawThrowable) {
+        this.rawThrowable = rawThrowable;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public
+    String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Throwable getRawThrowable() {
+        return rawThrowable;
+    }
+
+    public void setRawThrowable(Throwable rawThrowable) {
+        this.rawThrowable = rawThrowable;
+    }
+
+    public static HDLLinkException getErrorWithCode(HDLLinkCode code){
+        return new HDLLinkException(code.getCode(), code.getMsg());
+    }
+}
+
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java
new file mode 100644
index 0000000..6122daa
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ByteUtils.java
@@ -0,0 +1,151 @@
+package com.hdl.sdk.common.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class ByteUtils {
+
+    public static byte[] toByteArray(List<Byte> list) {
+        Byte[] temps = list.toArray(new Byte[0]);
+        byte[] result = new byte[temps.length];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = temps[i];
+        }
+        return result;
+
+    }
+
+    public static List<Byte> toByteList(byte[] bytes) {
+        final List<Byte> list = new ArrayList<>();
+        for (byte aByte : bytes) {
+            list.add(aByte);
+        }
+        return list;
+
+    }
+
+    public static byte[] getRangeBytes(List<Byte> list, int start, int end) {
+        Byte[] temps = Arrays.copyOfRange(list.toArray(new Byte[0]), start, end);
+        byte[] result = new byte[temps.length];
+        for (int i = 0; i < temps.length; i++) {
+            result[i] = temps[i];
+        }
+        return result;
+
+    }
+
+    /**
+     * 鎷兼帴byte
+     */
+    public static byte[] concatBytes(byte[] bt1, byte[] bt2) {
+        if (bt1 == null) {
+            return bt2;
+        }
+        if (bt2 == null) {
+            return bt1;
+        }
+        byte[] bt3 = new byte[bt1.length + bt2.length];
+        System.arraycopy(bt1, 0, bt3, 0, bt1.length);
+        System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
+        return bt3;
+    }
+
+
+    public boolean endWith(Byte[] src, byte[] target) {
+        if (src.length < target.length) {
+            return false;
+        }
+        for (int i = 0; i < target.length; i++) {
+            if (target[target.length - i - 1] != src[src.length - i - 1]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+
+    public static int byteIndexOf(byte[] searched, byte[] find, int start) {
+        boolean matched;
+        int end = find.length - 1;
+        int skip = 0;
+        for (int index = start; index <= searched.length - find.length; ++index) {
+            matched = true;
+            if (find[0] != searched[index] || find[end] != searched[index + end]) continue;
+            else skip++;
+            if (end > 10)
+                if (find[skip] != searched[index + skip] || find[end - skip] != searched[index + end - skip])
+                    continue;
+                else skip++;
+            for (int subIndex = skip; subIndex < find.length - skip; ++subIndex) {
+                if (find[subIndex] != searched[index + subIndex]) {
+                    matched = false;
+                    break;
+                }
+            }
+            if (matched) {
+                return index;
+            }
+        }
+        return -1;
+
+    }
+
+    public static int getByteIndexOf(byte[] sources, byte[] src) {
+        return getByteIndexOf(sources, src, 0, sources.length);
+    }
+
+    //鍒ゆ柇涓�涓猙yte鏁板�煎湪鍙﹀涓�涓猙yte鏁扮粍涓搴旂殑娓告爣鍊�
+    public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex) {
+        return getByteIndexOf(sources, src, startIndex, sources.length);
+    }
+
+
+    //鍒ゆ柇涓�涓猙yte鏁板�煎湪鍙﹀涓�涓猙yte鏁扮粍涓搴旂殑娓告爣鍊硷紝鎸囧畾寮�濮嬬殑娓告爣鍜岀粨鏉熺殑娓告爣浣嶇疆
+    public static int getByteIndexOf(byte[] sources, byte[] src, int startIndex, int endIndex) {
+
+        if (sources == null || src == null || sources.length == 0 || src.length == 0) {
+            return -1;
+        }
+
+        if (endIndex > sources.length) {
+            endIndex = sources.length;
+        }
+
+        int i, j;
+        for (i = startIndex; i < endIndex; i++) {
+            if (sources[i] == src[0] && i + src.length < endIndex) {
+                for (j = 1; j < src.length; j++) {
+                    if (sources[i + j] != src[j]) {
+                        break;
+                    }
+                }
+
+                if (j == src.length) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 瀛楃涓瞭o Bytes
+     * @param str 瀛楃涓�
+     * @return
+     */
+    public static byte[] stringToBytes(String str) {
+        try {
+            // 浣跨敤鎸囧畾鐨勫瓧绗﹂泦灏嗘瀛楃涓茬紪鐮佷负byte搴忓垪骞跺瓨鍒颁竴涓猙yte鏁扮粍涓�
+            return str.getBytes("utf-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return new byte[]{};
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java
new file mode 100644
index 0000000..c053953
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IdUtils.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.common.utils;
+
+import java.util.UUID;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class IdUtils {
+    public static String getUUId() {
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java
new file mode 100644
index 0000000..832cf2f
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/IpUtils.java
@@ -0,0 +1,89 @@
+package com.hdl.sdk.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/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
new file mode 100644
index 0000000..40ea989
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/LogUtils.java
@@ -0,0 +1,63 @@
+package com.hdl.sdk.common.utils;
+
+import android.util.Log;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class LogUtils {
+
+    private static final String TAG = "HDLSDK";
+
+    private static boolean isEnabled = true;
+
+    public static boolean isEnabled() {
+        return isEnabled;
+    }
+
+    public static void setEnabled(boolean enabled) {
+        isEnabled = enabled;
+    }
+
+    public static void d(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.d(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void e(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.e(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void w(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.w(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void v(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.v(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void i(String tag, String msg) {
+        if (tag != null && msg != null && isEnabled) {
+            Log.i(TAG, tag + "-- " + msg);
+        }
+    }
+
+    public static void i(String msg) {
+        if (msg != null && isEnabled) {
+            Log.i(TAG, msg);
+        }
+    }
+
+    public static void e(String msg) {
+        if (msg != null && isEnabled) {
+            Log.e(TAG, msg);
+        }
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
new file mode 100644
index 0000000..17ceeab
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/SPUtils.java
@@ -0,0 +1,150 @@
+package com.hdl.sdk.common.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+
+import com.hdl.sdk.common.HDLSdk;
+
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by Tong on 2021/9/28.
+ */
+public class SPUtils {
+    private static final String APP_PREFERENCES_KEY = "profile";
+    private static final SharedPreferences PREFERENCES =
+            HDLSdk.getInstance().getContext().getApplicationContext().getSharedPreferences(APP_PREFERENCES_KEY, Context.MODE_PRIVATE);
+
+    private static SharedPreferences getAppPreference() {
+        return PREFERENCES;
+    }
+
+
+    //======閫氱敤瀛樺偍========
+    public static void put(final String key, final String value) {
+        getAppPreference().edit().putString(key, value).apply();
+    }
+
+
+    public static String getString(final String key) {
+        return getString(key, "");
+    }
+
+
+    public static String getString(final String key, final String defaultValue) {
+        return getAppPreference().getString(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final int value) {
+        put(key, value, false);
+    }
+
+
+    public static void put(final String key, final int value, final boolean isCommit) {
+        getAppPreference().edit().putInt(key, value).apply();
+    }
+
+
+    public static int getInt(final String key) {
+        return getInt(key, -1);
+    }
+
+
+    public static int getInt(final String key, final int defaultValue) {
+        return getAppPreference().getInt(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final long value) {
+        getAppPreference().edit().putLong(key, value).apply();
+    }
+
+
+    public static long getLong(final String key) {
+        return getLong(key, -1L);
+    }
+
+
+    public static long getLong(final String key, final long defaultValue) {
+        return getAppPreference().getLong(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final float value) {
+        getAppPreference().edit().putFloat(key, value).apply();
+    }
+
+
+    public static float getFloat(final String key) {
+        return getFloat(key, -1f);
+    }
+
+
+    public static float getFloat(final String key, final float defaultValue) {
+        return getAppPreference().getFloat(key, defaultValue);
+    }
+
+
+    public static void put(final String key, final boolean value) {
+        getAppPreference().edit().putBoolean(key, value).apply();
+    }
+
+
+    public static boolean getBoolean(final String key) {
+        return getBoolean(key, false);
+    }
+
+
+    public static boolean getBoolean(final String key, final boolean defaultValue) {
+        return getAppPreference().getBoolean(key, defaultValue);
+    }
+
+
+    public static void put(final String key,
+                           final Set<String> value
+    ) {
+
+        getAppPreference().edit().putStringSet(key, value).apply();
+
+    }
+
+
+    public static Set<String> getStringSet(final String key) {
+        return getStringSet(key, Collections.<String>emptySet());
+    }
+
+
+    public static Set<String> getStringSet(final String key,
+                                           final Set<String> defaultValue) {
+        return getAppPreference().getStringSet(key, defaultValue);
+    }
+
+
+    public static Map<String, ?> getAll() {
+        return getAppPreference().getAll();
+    }
+
+
+    public static boolean contains(final String key) {
+        return getAppPreference().contains(key);
+    }
+
+
+    public static void remove(final String key) {
+        getAppPreference().edit().remove(key).apply();
+    }
+
+    public static void clear() {
+        getAppPreference()
+                .edit()
+                .clear()
+                .apply();
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java
new file mode 100644
index 0000000..b7192b0
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/ThreadToolUtils.java
@@ -0,0 +1,73 @@
+package com.hdl.sdk.common.utils;
+
+import android.os.Handler;
+import android.os.Looper;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+/**
+ * Created by Tong on 2021/9/15.
+ */
+public class ThreadToolUtils {
+
+    private final Handler uiHandler = new Handler(Looper.getMainLooper());
+
+    //cpu 鏈�澶х嚎绋嬪绾抽噺
+    private final int coreSize = Runtime.getRuntime().availableProcessors() + 1;
+
+    private ThreadToolUtils() {
+    }
+
+//    private static class SingletonInstance {
+//    }
+
+    private static final ThreadToolUtils instance = new ThreadToolUtils();
+
+    public static ThreadToolUtils getInstance() {
+        return instance;
+    }
+
+
+    /**
+     * 绾跨▼鏁伴噺鍥哄畾鐨勭嚎绋嬫睜
+     */
+    public ExecutorService newFixedThreadPool(int size) {
+        if (size == 0 || coreSize < size) {
+            return Executors.newFixedThreadPool(coreSize);
+        }
+        return Executors.newFixedThreadPool(size);
+    }
+
+    /**
+     * 瀹氭椂浠诲姟绾跨▼姹�
+     */
+    public ScheduledExecutorService newScheduledThreadPool(int size) {
+        if (size == 0 || coreSize < size) {
+            return Executors.newScheduledThreadPool(coreSize);
+        }
+        return Executors.newScheduledThreadPool(size);
+    }
+
+    /**
+     * 鍗曚竴绾跨▼
+     */
+    public ExecutorService newSingleThreadPool() {
+        return Executors.newSingleThreadExecutor();
+    }
+
+
+    public ExecutorService newCachedThreadPool() {
+        return Executors.newCachedThreadPool();
+    }
+
+    /**
+     * 鍒囨崲鍥炰富绾跨▼
+     */
+    public void runOnUiThread(Runnable run) {
+        uiHandler.post(run);
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java
new file mode 100644
index 0000000..41115ed
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/GsonConvert.java
@@ -0,0 +1,55 @@
+package com.hdl.sdk.common.utils.gson;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/9/8.
+ */
+public class GsonConvert {
+
+    private static Gson gson = null;
+
+    public static Gson getGson() {
+        if (gson == null) {
+            synchronized (GsonConvert.class) {
+                if (gson == null) {
+                    gson = new GsonBuilder()
+                            .setPrettyPrinting()
+                            .disableHtmlEscaping()
+                            .registerTypeAdapter(String.class, new StringTypeAdapter())
+                            .create();
+                }
+            }
+        }
+        return gson;
+    }
+
+    private static class StringTypeAdapter implements JsonSerializer<String>, JsonDeserializer<String> {
+        @Override
+        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+                throws JsonParseException {
+            if (json instanceof JsonPrimitive) {
+                return json.getAsString();
+            } else {
+                return json.toString();
+            }
+        }
+
+        @Override
+        public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
+            return new JsonPrimitive(src);
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
new file mode 100644
index 0000000..ebdac92
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/utils/gson/ParameterizedTypeImpl.java
@@ -0,0 +1,43 @@
+package com.hdl.sdk.common.utils.gson;
+
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+/**
+ * Created by Tong on 2021/9/17.
+ */
+public class ParameterizedTypeImpl implements ParameterizedType {
+
+    private final Type[] actualTypeArguments;
+    private final Type rawType;
+    private final Type ownerType;
+
+    public ParameterizedTypeImpl(Type rawType, Type[] actualTypeArguments, Type ownerType) {
+        this.ownerType = ownerType;
+        this.rawType = rawType;
+        this.actualTypeArguments = actualTypeArguments;
+    }
+
+    public static Type getType(Type rawType, Type[] actualTypeArguments) {
+        return new ParameterizedTypeImpl(rawType, actualTypeArguments, null);
+    }
+
+
+    @Override
+    public Type[] getActualTypeArguments() {
+        return actualTypeArguments;
+    }
+
+
+    @Override
+    public Type getRawType() {
+        return rawType;
+    }
+
+
+    @Override
+    public Type getOwnerType() {
+        return ownerType;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java
new file mode 100644
index 0000000..394ad89
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LoginRequest.java
@@ -0,0 +1,30 @@
+package com.hdl.sdk.connect.bean;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2022/09/23.
+ */
+
+public class LoginRequest implements Serializable {
+
+
+    private String clientType;
+    private String version;
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java
new file mode 100644
index 0000000..7c7ed2c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/response/DeviceInfoResponse.java
@@ -0,0 +1,70 @@
+package com.hdl.sdk.connect.bean.response;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/12/21.
+ *
+ * @Description : DeviceInfoResponse
+ */
+public class DeviceInfoResponse extends BaseResponse {
+    private GatewayObjects objects;
+
+    public GatewayObjects getObjects() {
+        return objects;
+    }
+
+    public void setObjects(GatewayObjects value) {
+        this.objects = value;
+    }
+
+    public class GatewayObjects implements Serializable {
+        private String ip_address;
+        private String gatewayId;
+        private String oid;
+        private String homeId;
+        private String mac;
+
+        public String getIPAddress() {
+            return ip_address;
+        }
+
+        public void setIPAddress(String value) {
+            this.ip_address = value;
+        }
+
+        public String getGatewayID() {
+            return gatewayId;
+        }
+
+        public void setGatewayID(String value) {
+            this.gatewayId = value;
+        }
+
+        public String getOID() {
+            return oid;
+        }
+
+        public void setOID(String value) {
+            this.oid = value;
+        }
+
+        public String getHomeId() {
+            return homeId;
+        }
+
+        public void setHomeId(String homeId) {
+            this.homeId = homeId;
+        }
+
+        public String getMac() {
+            return mac;
+        }
+
+        public void setMac(String mac) {
+            this.mac = mac;
+        }
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
index 23f1583..de555ec 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -4,6 +4,7 @@
 import android.util.Log;
 
 import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
 import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.EventDispatcher;
 import com.hdl.sdk.common.event.EventListener;
@@ -11,15 +12,20 @@
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.IdUtils;
 import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.SPUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.HDLLink;
+import com.hdl.sdk.connect.bean.LoginRequest;
 import com.hdl.sdk.connect.bean.request.BroadcastRequest;
+import com.hdl.sdk.connect.bean.response.AuthenticateResponse;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
 import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
 import com.hdl.sdk.connect.bean.request.FunctionAttributeRequest;
 import com.hdl.sdk.connect.bean.LinkRequest;
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.bean.request.PropertyReadRequest;
+import com.hdl.sdk.connect.bean.response.DeviceInfoResponse;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
@@ -59,7 +65,7 @@
         statusListener = new ConnectStatusListener() {
             @Override
             public void onConnecting() {
-                broadcastRequest();
+                //broadcastRequest();
             }
 
             @Override
@@ -74,43 +80,67 @@
         };
     }
 
+    public boolean isBroadcast = false;
+
     /**
      * 骞挎挱鑷韩淇℃伅缁欎富缃戝叧
      */
-    private void broadcastRequest() {
+    public void broadcastRequest() {
+
         new Thread(new Runnable() {
             @Override
             public void run() {
-                try {
-                    LogUtils.i("骞挎挱璁惧鏈韩淇℃伅");
+                while (true) {
+                    try {
+                        Thread.sleep(1000);
+//                        LogUtils.i("checkIfCertified=" + HDLLink.getInstance().checkIfCertified() + " getTcp().connected=" + getTcp().connected);
+                        try {
+                            if (!HDLLink.getInstance().checkIfCertified() || getTcp().connected) {
+                                continue;
+                            }
+                        } catch (Exception e) {
 
-                    String time = String.valueOf(System.currentTimeMillis());
-                    if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
-                        LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
-                        return;
+                        }
+                        LogUtils.i("骞挎挱璁惧鏈韩淇℃伅");
+                        String time = String.valueOf(System.currentTimeMillis());
+                        if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
+                            LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
+                            continue;
+                        }
+                        BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
+                        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
+                            @Override
+                            public void onSuccess(LinkResponse msg) {
+                                getTcp();
+                                String data = msg.getData();
+                                if (!TextUtils.isEmpty(data)) {
+                                    DeviceInfoResponse response = GsonConvert.getGson().fromJson(data, new TypeToken<DeviceInfoResponse>() {
+                                    }.getType());
+                                    HDLLinkConfig.getInstance().setIpAddress(response.getObjects().getIPAddress());
+                                    HDLLinkConfig.getInstance().reSaveConfig();
+                                }
+                                isBroadcast = true;
+                                LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧鎴愬姛锛�");
+                            }
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                                isBroadcast = false;
+                                LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧澶辫触锛�");
+                            }
+                        });
+//                        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+                        //HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
+                    } catch (Exception e) {
+                        LogUtils.e("骞挎挱璁惧鏈韩淇℃伅澶辫触锛屽け璐ヤ俊鎭細" + e.getMessage());
                     }
-                    BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true, new HDLLinkResponseCallBack() {
-                        @Override
-                        public void onSuccess(LinkResponse msg) {
-                            LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧鎴愬姛锛�");
-                        }
-
-                        @Override
-                        public void onError(HDLLinkException e) {
-                            LogUtils.i("骞挎挱淇℃伅缁欎富缃戝叧澶辫触锛�");
-                        }
-                    });
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
-                    HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request), true);
-                } catch (Exception e) {
-                    LogUtils.e("骞挎挱璁惧鏈韩淇℃伅澶辫触锛屽け璐ヤ俊鎭細" + e.getMessage());
                 }
+
             }
         }).start();
     }
 
-//    private static class SingletonInstance {
+    //    private static class SingletonInstance {
 //    }
     private static final HDLSocket instance = new HDLSocket();
 
@@ -119,8 +149,9 @@
     }
 
     SocketOptions options;
+
     private SocketOptions getTcpOptions() {
-        if(null!=options){
+        if (null != options) {
             return options;
         }
         options = new SocketOptions();
@@ -423,13 +454,13 @@
             throw new RuntimeException("璇锋悳绱㈢綉鍏�");
         }
         //濡傛灉娌℃湁鍒濆鍖栵紝鎴栬�呯綉鍏矷P鏇存敼浜嗭紝灏遍噸鏂板垵濮嬪寲
-        if (tcpBoot == null||!getTcpOptions().getIp().equals(getTcpIp())) {
+        if (tcpBoot == null || !getTcpOptions().getIp().equals(getTcpIp())) {
             tcpBoot = TcpClient.init(getTcpIp(), getTcpPort(), getTcpOptions());
             tcpBoot.SetHeartbeat(new IHeartbeat() {
                 @Override
                 public void heartbeat() {
 
-                    if(HDLLinkConfig.getInstance().getDeviceInfoBean()==null||HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()==null) {
+                    if (HDLLinkConfig.getInstance().getDeviceInfoBean() == null || HDLLinkConfig.getInstance().getDeviceInfoBean().getOID() == null) {
                         LogUtils.i("DeviceInfoBean涓虹┖锛岄渶瑕佽缃墠鑳芥甯稿績璺�");
                         return;
                     }
@@ -493,8 +524,9 @@
     }
 
     /**
-     *  鍦烘櫙鎺у埗
-     * @param sids 鍦烘櫙sid鍒楄〃
+     * 鍦烘櫙鎺у埗
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
      * @param callBack 鍥炶皟
      */
     public void controlScene(List<String> sids, HDLLinkCallBack callBack) {
@@ -535,6 +567,56 @@
                 }
             }
         } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
+    /**
+     * tcp鐧诲綍鏂逛究鑾峰彇鐘舵��
+     *
+     * @param clientType 瀹㈡埛绔被鍨�
+     *                   搴旂敤锛歛pp锛�
+     *                   璋冭瘯杞欢锛歱rogram锛�
+     *                   绗笁鏂癸細third_party锛�
+     *                   缃戝叧锛歡ateway锛�
+     *                   鍏跺畠锛歰ther
+     * @param version    鍗忚鐗堟湰
+     */
+    public void tcpLogin(String clientType, String version, HDLLinkCallBack callBack) {
+        final String msgId = IdUtils.getUUId();
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<LoginRequest> data = new BaseLocalResponse<>();
+        data.setId(msgId);
+        data.setTime_stamp(time);
+
+        final LoginRequest request = new LoginRequest();
+        request.setVersion(version);
+        request.setClientType(clientType);
+
+        data.setObjects(request);
+
+        String topic = String.format(TopicConstant.GATEWAY_LOGIN, HDLLinkConfig.getInstance().getGatewayId());
+        LinkRequest message = new LinkRequest(topic,
+                GsonConvert.getGson().toJson(data));
+
+        String replyTopic = topic + "_reply";
+        try {
+            sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                @Override
+                public void onSucceed() {
+                    LogUtils.i("tcpLogin onSucceed");
+                }
+
+                @Override
+                public void onError() {
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                    }
+                }
+            });
+        } catch (Exception e) {
             if (callBack != null) {
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
             }
@@ -584,8 +666,8 @@
     /**
      * 閫氱敤TCP鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      *
-     * @param topic    鍙戦�佹暟鎹�
-     * @param bodyStr  鍥炲鐨勪富棰�
+     * @param topic   鍙戦�佹暟鎹�
+     * @param bodyStr 鍥炲鐨勪富棰�
      */
     public void tcpSendMsg(String topic, String bodyStr) {
         try {
@@ -596,7 +678,7 @@
             LinkRequest message = new LinkRequest(topic, bodyStr);
             getTcp().sendMsg(message.getSendBytes());
         } catch (Exception e) {
-            LogUtils.e("tcpSendMsg", "鍙戦�佸け璐� :"+e.getMessage());
+            LogUtils.e("tcpSendMsg", "鍙戦�佸け璐� :" + e.getMessage());
         }
     }
 
@@ -607,7 +689,7 @@
     public void sendMsg(byte[] data, String eventTag, HDLLinkCallBack callBack, SendListener sendListener) {
 
         try {
-            if(eventTag!=null) {
+            if (eventTag != null) {
                 final AtomicInteger sendCount = new AtomicInteger(0);
 
                 final ScheduledExecutorService threadPool = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store
new file mode 100644
index 0000000..7062e40
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/.DS_Store
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java
new file mode 100644
index 0000000..3a1647c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -0,0 +1,270 @@
+package com.hdl.sdk.socket;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.HDLSdk;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.connect.socket.HDLSocket;
+import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.client.IClient;
+import com.hdl.sdk.socket.client.IHeartbeat;
+import com.hdl.sdk.socket.client.TcpClient;
+import com.hdl.sdk.socket.listener.SendListener;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+
+/**
+ * Created by Tong on 2021/9/26.
+ * Tcp/Udp 鍚姩鍣�
+ */
+public class SocketBoot {
+
+    private ExecutorService connectThread;
+    private ExecutorService sendThread;
+    private ExecutorService receiveThread;
+    private ExecutorService heartbeatThread;
+
+    private final IClient client;
+    private IHeartbeat iHeartbeat;
+
+    public void SetHeartbeat(IHeartbeat iHeartbeat) {
+        this.iHeartbeat = iHeartbeat;
+    }
+
+    /**
+     * 褰撳墠鎺ユ敹鍒版暟鎹殑鏃堕棿
+     */
+    private static long time = System.currentTimeMillis();
+
+    /**
+     * tcp鏄惁宸茬粡杩炴帴
+     */
+    public boolean connected = false;
+
+    public IClient getClient() {
+        return client;
+    }
+
+    private final BlockingQueue<SocketRequest> mMessageQueue = new LinkedBlockingDeque<>();
+
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
+
+    public SocketBoot(IClient client) {
+        this.client = client;
+        initConnectThread();
+        initReceiveThread();
+        initSendThread();
+        initHeartbeat();
+    }
+
+    /**
+     * 杩炴帴tcp锛屽唴閮ㄧ淮鎶ゆ帀锛屽彲浠ヤ笉鐢ㄥ紑鏀惧閮紝鏍规嵁杩欎釜涓氬姟鎴戠壒鎬у鐞嗗ソ
+     */
+    private synchronized void connect() {
+        try {
+            LogUtils.i("TCP杩炴帴");
+            client.onConnectStatus(ConnectStatus.CONNECTING);
+            Thread.sleep(1000);
+            client.connect();
+            connected = true;
+            HDLSocket.getInstance().tcpLogin("third_party", HDLSdk.getInstance().getVersion(),null);
+            LogUtils.i("TCP杩炴帴鎴愬姛");
+            client.onConnectStatus(ConnectStatus.CONNECTED);
+        } catch (Exception e) {
+            LogUtils.e("杩炴帴寮傚父" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 鍒濆鍖栧彂閫佺嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    private void initSendThread() {
+        if (sendThread == null) {
+            sendThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            sendThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            if (!connected) {
+                                Thread.sleep(200);
+                                continue;
+                            }
+                            SocketRequest socketRequest = mMessageQueue.take();
+//                            final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
+//                            LogUtils.i("鍙戦�佹暟鎹細" + sendStr);
+                            if (System.currentTimeMillis() - socketRequest.getTime() > 10000) {
+                                continue;
+                            }
+                            final String action = socketRequest.getAction();
+                            try {
+
+                                client.sendMsg(socketRequest.getData());
+                                if (!TextUtils.isEmpty(action)) {
+                                    SendListener sendListener = sendMap.get(action);
+                                    if (sendListener != null) {
+                                        sendListener.onSucceed();
+                                    }
+                                }
+                            } catch (Exception e) {
+                                HDLSocket.getInstance().isBroadcast=false;
+                                connected = false;
+
+                                LogUtils.e("鍙戦�佸け璐�:" + e.getMessage());
+                                if (!TextUtils.isEmpty(action)) {
+                                    SendListener sendListener = sendMap.get(action);
+                                    if (sendListener != null) {
+                                        sendListener.onError();
+                                    }
+                                }
+                            }
+                        } catch (Exception e) {
+
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    public void initReceiveThread() {
+        if (receiveThread == null) {
+            receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            receiveThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            if (connected) {
+                                //璇诲彇鏁版嵁
+                                client.onHandleResponse();
+                                time = System.currentTimeMillis();
+                            } else {
+                                try {
+                                    Thread.sleep(1000);
+                                } catch (Exception ee) {
+
+                                }
+                            }
+                        } catch (Exception e) {
+                            HDLSocket.getInstance().isBroadcast= false;
+                            connected = false;
+
+                            LogUtils.e("鎺ユ敹鏁版嵁绾跨▼寮傚父" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栭噸鏂拌繛鎺ョ嚎绋�
+     */
+    private void initConnectThread() {
+        if (connectThread == null) {
+            connectThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            //涓�瀹氭椂闂存娴嬩竴娆¤繛鎺ユ儏鍐碉紝娌℃湁杩炴帴灏辨墽琛岃繛鎺ワ紝杩炴帴缁熶竴鐢辫繖閲岀淮鎶�
+            connectThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+//                            LogUtils.i("initConnectThread: connected=" + connected + " isBroadcast=" + HDLSocket.getInstance().isBroadcast);
+                            if (!connected && HDLSocket.getInstance().isBroadcast) {
+                                reconect();
+                            }
+                            Thread.sleep(3 * 1000);
+                        } catch (Exception e) {
+                            LogUtils.e("瀹氭椂杩炴帴澶辫触:" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+    /**
+     * 鍒濆鍖栭噸鏂板績璺崇嚎绋�
+     */
+    private void initHeartbeat() {
+        if (heartbeatThread == null) {
+            heartbeatThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            heartbeatThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            //10绉�
+                            if (connected && 10 * 1000 < (System.currentTimeMillis() - time)) {
+                                time = System.currentTimeMillis();
+                                //蹇冭烦妫�娴�
+                                if (iHeartbeat != null)
+                                    iHeartbeat.heartbeat();
+                            }
+                            Thread.sleep(1000);
+                        } catch (Exception e) {
+                            LogUtils.e("瀹氭椂蹇冭烦妫�娴嬬綉鍏冲紓甯革細" + e.getMessage());
+                        }
+                    }
+                }
+            });
+        }
+    }
+
+
+    /**
+     * 閲嶆柊杩炴帴
+     */
+    private void reconect() {
+        disconnect();
+        connect();
+    }
+
+    /**
+     * 鍙戦�佹棤闇�鍥炶皟
+     *
+     * @param msg 鍙戦�佺殑鏁版嵁
+     */
+    public void sendMsg(byte[] msg) {
+        sendMsg(msg, null);
+    }
+
+
+    /**
+     * @param listener 涓�鑸儏鍐垫棤闇�鐩戝惉
+     */
+    public void sendMsg(byte[] msg, SendListener listener) {
+        try {
+            SocketRequest request = new SocketRequest(msg);
+            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
+                sendMap.put(request.getAction(), listener);
+            }
+            mMessageQueue.put(request);
+        } catch (Exception e) {
+            LogUtils.e("鍙戦�佹暟鎹け璐ワ細" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    private synchronized void disconnect() {
+        try {
+            client.disconnect();
+            //鏂紑杩炴帴
+            client.onConnectStatus(ConnectStatus.DISCONNECT);
+        } catch (Exception e) {
+
+        }
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java
new file mode 100644
index 0000000..1e300d5
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketOptions.java
@@ -0,0 +1,75 @@
+package com.hdl.sdk.socket;
+
+
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * socket閰嶇疆
+ */
+public class SocketOptions {
+
+    //鍙戦�佺洰鏍囧湴鍧�IP
+    private String ip="";
+    private int port;
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+
+    //鐩戝惉鐘舵��
+    private List<ConnectStatusListener> mConnectStatusListener;
+
+
+    public String getIp() {
+        return ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+
+    public void clearConnectStatusListener() {
+        if (mConnectStatusListener != null && !mConnectStatusListener.isEmpty()) {
+            mConnectStatusListener.clear();
+        }
+    }
+
+    public void addConnectStatusListener(ConnectStatusListener connectStatusListener) {
+        if (mConnectStatusListener == null) {
+            mConnectStatusListener = new ArrayList<>();
+        }
+        mConnectStatusListener.add(connectStatusListener);
+    }
+
+    public void removeConnectStatusListener(ConnectStatusListener connectStatusListener) {
+        if (mConnectStatusListener != null) {
+            mConnectStatusListener.remove(connectStatusListener);
+        }
+    }
+
+    public List<ConnectStatusListener> getConnectStatusListener() {
+        return mConnectStatusListener;
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java
new file mode 100644
index 0000000..cf07185
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketPool.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.socket;
+
+import com.hdl.sdk.socket.client.IClient;
+
+import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
+import java.net.SocketException;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Created by Tong on 2021/10/19.
+ * 璁″垝鍙傝�僩eneric-pool銆丆ommons Pool杩涜瀹屽杽
+ */
+public class SocketPool {
+
+    private final ConcurrentHashMap<String, IClient> mPool;
+    private final ConcurrentHashMap<String, DatagramSocket> mUdpClientPool;
+
+    private SocketPool() {
+        mPool = new ConcurrentHashMap<>();
+        mUdpClientPool = new ConcurrentHashMap<>();
+    }
+
+    private static final SocketPool instance = new SocketPool();
+
+    public static SocketPool getInstance() {
+        return instance;
+    }
+
+    public void clear() {
+        mPool.clear();
+        mUdpClientPool.clear();
+    }
+
+    public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
+        DatagramSocket socket;
+        final String key = address.toString();
+        if (mUdpClientPool.containsKey(key)) {
+            socket = mUdpClientPool.get(key);
+            if (socket != null && !socket.isClosed()) {
+                return socket;
+            } else {
+                socket = new DatagramSocket(address);
+            }
+        } else {
+            socket = new DatagramSocket(address);
+        }
+        mUdpClientPool.put(address.toString(), socket);
+        return socket;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java
new file mode 100644
index 0000000..eaa81fc
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/SocketRequest.java
@@ -0,0 +1,41 @@
+package com.hdl.sdk.socket;
+
+import java.util.UUID;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public class SocketRequest {
+
+    private String action;
+
+    private byte[] data;
+
+    private long time = System.currentTimeMillis();
+
+    public SocketRequest(byte[] data) {
+        this.data = data;
+
+        action = UUID.randomUUID().toString();
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    public void setData(byte[] data) {
+        this.data = data;
+    }
+
+    public long getTime() {
+        return time;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
new file mode 100644
index 0000000..24f6c5c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/annotation/ConnectStatus.java
@@ -0,0 +1,24 @@
+package com.hdl.sdk.socket.annotation;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+
+public class ConnectStatus {
+
+    /**
+     * 杩炴帴涓�
+     */
+    public static final int CONNECTING = 0;
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    public static final int CONNECTED = 1;
+
+    /**
+     * 杩炴帴鍏抽棴
+     */
+    public static final int DISCONNECT = 2;
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java
new file mode 100644
index 0000000..8fa126e
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IClient.java
@@ -0,0 +1,32 @@
+package com.hdl.sdk.socket.client;
+
+
+import com.hdl.sdk.socket.SocketOptions;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface IClient {
+
+    void connect() throws Exception;
+
+    void disconnect();
+
+
+    SocketOptions getOptions();
+
+    /**
+     * 鐩戝惉鏁版嵁
+     */
+    void onHandleResponse() throws Exception;
+
+    /**
+     * 鍙戦�佹秷鎭�
+     */
+    void sendMsg(byte[] msg) throws Exception;
+
+    /**
+     * 杩炴帴鐘舵��
+     */
+    void onConnectStatus(int status);
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java
new file mode 100644
index 0000000..a86a092
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IHeartbeat.java
@@ -0,0 +1,8 @@
+package com.hdl.sdk.socket.client;
+
+/**
+ * Created by hxb on 2022/2/16.
+ */
+public interface IHeartbeat {
+    void heartbeat();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
new file mode 100644
index 0000000..0e6e5d6
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
@@ -0,0 +1,42 @@
+package com.hdl.sdk.socket.client;
+
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
+
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public interface IUdpClient {
+
+    /**
+     * 缁戝畾绔彛
+     */
+    void bind() throws Exception;
+
+    /**
+     * 鍏抽棴褰撳墠杩炴帴
+     * @return
+     */
+    boolean close();
+
+
+    UdpSocketOptions getOptions();
+
+    /**
+     * 鐩戝惉鏁版嵁
+     */
+    void onHandleResponse() throws Exception;
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩爣IP
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     * @throws Exception
+     */
+    void sendMsg(String ipAddress,int port, byte[] msg) throws Exception;
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
new file mode 100644
index 0000000..7469cc3
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
@@ -0,0 +1,199 @@
+package com.hdl.sdk.socket.client;
+
+
+
+import com.hdl.sdk.common.utils.ByteUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.socket.SocketBoot;
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.net.SocketAddress;
+import java.net.StandardSocketOptions;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Created by Tong on 2021/9/15.
+ */
+public final class TcpClient implements IClient {
+
+
+    private SocketOptions socketOptions;
+
+    private final String ip;
+    private final int port;
+
+    private Socket mSocket;
+
+    private final static List<TcpClient> tcpClientList = new ArrayList();
+
+    /**
+     * 浠庤繛鎺ユ睜涓壘鍑哄綋鍓岻P鍙婄鍙g殑杩炴帴瀹㈡埛绔�
+     * @param ipAdderss 杩炴帴IP鍦板潃
+     * @param port 杩炴帴绔彛
+     * @return
+     */
+    public static TcpClient getTcpClientByIP(String ipAdderss,int port) {
+        for(TcpClient tcpClient:tcpClientList){
+            if(tcpClient.ip.equals(ipAdderss)&&tcpClient.port==port)
+            {
+                return tcpClient;
+            }
+        }
+        return  null;
+    }
+
+    private byte[] readBuffer = new byte[4*1024];
+
+    private TcpClient(String ip, int port, SocketOptions socketOptions) {
+        this.socketOptions = socketOptions;
+        this.ip = ip;
+        this.port = port;
+        socketOptions.setIp(ip);
+        socketOptions.setPort(port);
+    }
+
+    public static SocketBoot init(String ip, int port, SocketOptions options) {
+        return new SocketBoot(new TcpClient(ip, port, options));
+    }
+
+
+    @Override
+    public void connect() throws Exception {
+
+        mSocket = getSocket();
+//        SocketOptions options = getOptions();
+        mSocket.connect(new InetSocketAddress(ip, port), 3 * 1000);
+        mSocket.setTcpNoDelay(true);
+        mSocket.setReuseAddress(true);
+//        mSocket.setKeepAlive(true);
+        mSocket.setSoTimeout(25 * 1000);
+
+        tcpClientList.add(this);
+    }
+
+
+
+
+    @Override
+    public void disconnect() {
+        if (mSocket != null) {
+            try {
+                mSocket.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @Override
+    public synchronized SocketOptions getOptions() {
+        if (socketOptions == null) {
+            socketOptions = new SocketOptions();
+        }
+        return socketOptions;
+    }
+
+    @Override
+    public void onHandleResponse() throws Exception {
+        final InputStream stream = getInputStream();
+        if (stream != null && getOptions() != null) {
+            while ( true) {
+                int len=getInputStream().read(readBuffer);
+                if(len<=0){
+                    throw  new Exception("鎺ユ敹寮傚父锛屾帴鏀舵暟鎹暱搴en="+len);
+                }
+
+                IHandleMessage handleMessage = getOptions().getHandleMessage();
+                if (handleMessage != null) {
+                    byte []bytes = new byte[len];
+                    System.arraycopy(readBuffer,0,bytes,0,len);
+                    //瀹屾暣鐨勬暟鎹墠鍥炶皟
+                    handleMessage.read(bytes,ip);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void sendMsg(byte[] msg) throws Exception {
+        final OutputStream outputStream = getOutStream();
+        if (outputStream != null && getOptions() != null) {
+                IHandleMessage handleMessage = getOptions().getHandleMessage();
+                handleMessage.write(handleMessage.write(msg));
+                outputStream.write(msg);
+                outputStream.flush();
+        }
+    }
+
+
+    /**
+     * 澶勭悊杩炴帴鐘舵��
+     */
+    public void onConnectStatus(int status) {
+        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final List<ConnectStatusListener> list = getOptions().getConnectStatusListener();
+                if (list != null && !list.isEmpty()) {
+                    for (ConnectStatusListener listener : list) {
+                        switch (status) {
+                            case ConnectStatus
+                                    .CONNECTING:
+                                listener.onConnecting();
+                                break;
+                            case ConnectStatus
+                                    .CONNECTED:
+                                listener.onConnected();
+                                break;
+                            case ConnectStatus
+                                    .DISCONNECT:
+                                listener.onConnectFailed();
+                                break;
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+
+    private synchronized Socket getSocket() {
+        return new Socket();
+    }
+
+    private InputStream getInputStream() {
+        if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
+            try {
+                return mSocket.getInputStream();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+    private OutputStream getOutStream() {
+        if (mSocket != null && mSocket.isConnected() && !mSocket.isClosed()) {
+            try {
+                return mSocket.getOutputStream();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
new file mode 100644
index 0000000..f9b9670
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -0,0 +1,176 @@
+package com.hdl.sdk.socket.client;
+
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.utils.IpUtils;
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.socket.SocketBoot;
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.SocketPool;
+import com.hdl.sdk.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
+import com.hdl.sdk.socket.codec.IHandleMessage;
+
+import java.io.IOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpClient implements IUdpClient {
+
+    /**
+     * 褰撳墠socket
+     */
+    private  DatagramSocket mSocket;
+
+    /**
+     * 鎺ユ敹鏁版嵁鍖�
+     */
+    private DatagramPacket receivePacket;
+
+    /**
+     * 缂撳啿鍖哄ぇ灏�
+     */
+    private final int BUFFER = 2 * 1024;
+
+    /**
+     * 鏈湴鐩戝惉IP鍦板潃
+     */
+    private String ipAddress;
+    /**
+     * 鏈湴鐩戝惉绔彛
+     */
+    private int port;
+
+    /**
+     * socket閰嶇疆淇℃伅
+     */
+    private UdpSocketOptions socketOptions;
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉绔彛
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param socketOptions
+     */
+    private UdpClient(String ipAddress,int port, UdpSocketOptions socketOptions) {
+        this.ipAddress = ipAddress;
+        this.port = port;
+        this.socketOptions = socketOptions;
+        byte[] receiveByte = new byte[BUFFER];
+        receivePacket = new DatagramPacket(receiveByte, receiveByte.length);
+    }
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉IP鍦板潃
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(String ipAddress, int port, UdpSocketOptions options) {
+        return new UdpSocketBoot(new UdpClient(ipAddress, port, options));
+    }
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(int port, UdpSocketOptions options) {
+        return init("0.0.0.0", port, options);
+    }
+
+
+    @Override
+    public void bind() throws Exception {
+        try {
+            //宸茬粡缁戝畾杩囧氨涓嶇敤鍐嶇粦瀹�
+            if (null != mSocket) {
+                return;
+            }
+            if (TextUtils.isEmpty(ipAddress)) {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port));
+            }else {
+                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(ipAddress,port));
+            }
+            mSocket.setBroadcast(true);
+//            mSocket.setReuseAddress(true);
+
+        } catch (Exception e) {
+            LogUtils.e("鍒濆鍖朣ocket 澶辫触锛�" + e.getMessage());
+            throw e;
+        }
+    }
+
+    @Override
+    public boolean close() {
+        try {
+            mSocket.close();
+        } catch (Exception e) {
+
+        }
+        mSocket = null;
+        return true;
+    }
+
+    @Override
+    public UdpSocketOptions getOptions() {
+        return this.socketOptions;
+    }
+
+    @Override
+    public void onHandleResponse() throws Exception {
+        if (mSocket == null) {
+            return;
+        }
+        try {
+            mSocket.receive(receivePacket);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        if (receivePacket.getLength() == 0) {
+            return;
+        }
+        //鎺掗櫎鑷繁鍙戝嚭鍘荤殑
+        try {
+            if (IpUtils.isLocalIpAddress(receivePacket.getAddress().getHostAddress()))
+                return;
+        } catch (Exception ignored) {
+
+        }
+
+        try {
+            LogUtils.i("鎺ユ敹鍒癠dp鏁版嵁鍖咃紝缃戠粶鍦板潃锛�" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
+
+            IHandleMessage handleMessage = getOptions().getHandleMessage();
+            if (handleMessage != null) {
+                byte[] data = new byte[receivePacket.getLength()];
+                System.arraycopy(receivePacket.getData(), 0, data, 0, data.length);
+                handleMessage.read(data,receivePacket.getAddress().getHostAddress());
+            }
+
+        } catch (Exception e) {
+
+        }
+    }
+
+
+    @Override
+    public void sendMsg(String ipAddress,int port, byte[] msg) throws Exception {
+        if (msg == null) {
+            return;
+        }
+        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ipAddress), port);
+        mSocket.send(sendPacket);
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java
new file mode 100644
index 0000000..4bcbe40
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/ByteToMessageDecoder.java
@@ -0,0 +1,20 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class ByteToMessageDecoder<T> implements IHandleFlow<T> {
+
+    protected abstract T decoder(Object msg,String ipaddress)
+            throws Exception;
+
+    @Override
+    public final T read(Object data,String ipaddress) throws Exception {
+        return decoder(data,ipaddress);
+    }
+
+    @Override
+    public final byte[] write(byte[] data) {
+        return data;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java
new file mode 100644
index 0000000..39f1f6c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleFlow.java
@@ -0,0 +1,12 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IHandleFlow<T> {
+
+    T read(Object data,String ipaddress) throws Exception;
+
+    byte[] write(byte[] data) throws Exception;
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java
new file mode 100644
index 0000000..f86f0b1
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IHandleMessage.java
@@ -0,0 +1,10 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/27.
+ */
+public interface IHandleMessage {
+    void read(byte[] data,String ipaddress) throws Exception;
+
+    byte[] write(byte[] data) throws Exception;
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java
new file mode 100644
index 0000000..4fdc975
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/IMessagePipeLine.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.socket.codec;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public interface IMessagePipeLine {
+
+    void add(IHandleFlow flow);
+
+    void clear();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java
new file mode 100644
index 0000000..2f874e0
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessagePipeLine.java
@@ -0,0 +1,51 @@
+package com.hdl.sdk.socket.codec;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Created by Tong on 2021/9/23.
+ */
+public class MessagePipeLine implements IMessagePipeLine, IHandleMessage {
+
+    public final List<IHandleFlow> queue = new ArrayList<>();
+
+    @Override
+    public void add(IHandleFlow flow) {
+        queue.add(flow);
+    }
+
+    @Override
+    public synchronized void clear() {
+        queue.clear();
+    }
+
+    @Override
+    public void read(byte[] data,String ipaddress) throws Exception {
+        Object out = data;
+        for (int i = 0; i < queue.size(); i++) {
+            IHandleFlow flow = queue.get(i);
+            Object read = flow.read(out,ipaddress);
+            try {
+                out = Objects.requireNonNull(read);
+            } catch (Exception ignored) {
+            }
+        }
+    }
+
+    @Override
+    public byte[] write(byte[] data) throws Exception {
+        byte[] out = data;
+        for (int i = 0; i < queue.size(); i++) {
+            IHandleFlow flow = queue.get(i);
+            byte[] write = flow.write(out);
+            try {
+                out = Objects.requireNonNull(write);
+            } catch (Exception ignored) {
+
+            }
+        }
+        return new byte[0];
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java
new file mode 100644
index 0000000..515be13
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/codec/MessageToByteEncoder.java
@@ -0,0 +1,24 @@
+package com.hdl.sdk.socket.codec;
+
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public abstract class MessageToByteEncoder implements IHandleFlow {
+
+
+    protected abstract byte[] encode(byte[] data)
+            throws Exception;
+
+    @Override
+    public final Object read(Object data,String ipaddress) {
+        return data;
+    }
+
+    @Override
+    public byte[] write(byte[] data) throws Exception {
+        return encode(data);
+    }
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java
new file mode 100644
index 0000000..6bd77b1
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/ConnectStatusListener.java
@@ -0,0 +1,27 @@
+package com.hdl.sdk.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ * 杩炴帴鐘舵��
+ */
+public interface ConnectStatusListener {
+
+    /**
+     * 杩炴帴涓�
+     */
+    default void onConnecting() {
+    }
+
+    /**
+     * 杩炴帴鎴愬姛
+     */
+    default void onConnected() {
+    }
+
+    /**
+     * 杩炴帴澶辫触
+     */
+    default void onConnectFailed() {
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java
new file mode 100644
index 0000000..7f2a9ea
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/listener/SendListener.java
@@ -0,0 +1,11 @@
+package com.hdl.sdk.socket.listener;
+
+/**
+ * Created by Tong on 2021/9/22.
+ */
+public interface SendListener {
+
+    void onSucceed();
+
+    void onError();
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
new file mode 100644
index 0000000..be4e1a4
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
@@ -0,0 +1,124 @@
+package com.hdl.sdk.socket.udp;
+
+import android.text.TextUtils;
+
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.socket.SocketRequest;
+import com.hdl.sdk.socket.client.IUdpClient;
+import com.hdl.sdk.socket.listener.SendListener;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketBoot {
+
+    private final IUdpClient client;
+
+    private final AtomicBoolean isOpenRetry = new AtomicBoolean(false);
+
+    private final AtomicInteger resendCount = new AtomicInteger(0);
+
+    private ExecutorService receiveThread;
+
+    private final ConcurrentMap<String, SendListener> sendMap = new ConcurrentHashMap<>();
+
+    public UdpSocketBoot(IUdpClient client) {
+        this.client = client;
+    }
+
+    /**
+     * 缁戝畾 socket
+     * @throws Exception 鍙兘绔彛鍐茬獊
+     */
+    public void bind() throws Exception {
+        client.bind();
+        initReceiveThread();
+    }
+
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋�
+     */
+    private void initReceiveThread() {
+        if(null!=receiveThread){
+            return;
+        }
+        receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+        receiveThread.execute(new Runnable() {
+            @Override
+            public void run() {
+                while (true) {
+                    try {
+                        client.onHandleResponse();
+                    } catch (Exception e) {
+                       LogUtils.i("鎺ユ敹绾跨▼寮傚父锛�"+e.getMessage());
+                    }
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑鐨処P鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(String ipAddress,int port,byte[] msg, SendListener listener) {
+        sendMsg(ipAddress,port, msg, true, listener);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑鐨処P鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佹暟鎹�
+     */
+    public void sendMsg(String ipAddress,int port,byte[] msg) {
+        sendMsg(ipAddress,port, msg, true, null);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param ipAddress 鐩殑IP鍦板潃
+     * @param port 绔彛
+     * @param msg 鍙戦�佺殑鏁版嵁
+     * @param isRefreshRetry 鏄惁瑕侀噸鍙�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(String ipAddress,int port, byte[] msg, boolean isRefreshRetry, SendListener listener) {
+        if (isRefreshRetry) {
+            //閲嶇疆杩炴帴娆℃暟
+            resendCount.set(0);
+        }
+        try {
+            SocketRequest request = new SocketRequest(msg);
+            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
+                sendMap.put(request.getAction(), listener);
+            }
+            LogUtils.i("鍙戦�佺洰鏍嘔P鍜岀鍙�", ipAddress + ":" + port);
+            client.sendMsg(ipAddress, port, msg);
+        } catch (Exception e) {
+            LogUtils.i("鍙戦�佸け璐�:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴褰撳墠socket
+     */
+    public synchronized void close() {
+        isOpenRetry.set(false);
+        sendMap.clear();
+        receiveThread.shutdown();
+        receiveThread=null;
+        client.close();
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
new file mode 100644
index 0000000..e61818c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
@@ -0,0 +1,26 @@
+package com.hdl.sdk.socket.udp;
+
+
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketOptions {
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+}
diff --git a/HDLSDK/settings.gradle b/HDLSDK/settings.gradle
index ded4b2e..147d5db 100644
--- a/HDLSDK/settings.gradle
+++ b/HDLSDK/settings.gradle
@@ -1,6 +1,6 @@
 
 //include ':app'
-include ':hdl-socket'
+//include ':hdl-socket'
 include ':hdl-connect'
-include ':hdl-common'
+//include ':hdl-common'
 include ':com.hdl.sdk'
diff --git a/HDLSDK_DEMO.rar b/HDLSDK_DEMO.rar
new file mode 100644
index 0000000..ed20808
--- /dev/null
+++ b/HDLSDK_DEMO.rar
Binary files differ
diff --git a/HDLSDK_DEMO/app/build.gradle b/HDLSDK_DEMO/app/build.gradle
index 29c810f..211f3fb 100644
--- a/HDLSDK_DEMO/app/build.gradle
+++ b/HDLSDK_DEMO/app/build.gradle
@@ -40,5 +40,5 @@
     implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.6'
     implementation 'com.google.code.gson:gson:2.8.8'
 //    implementation project(path: ':hdl-connect')
-    implementation files('libs\\com.hdl.sdk-v1.0.17.aar')
+    implementation files('libs\\com.hdl.sdk-v1.0.20.aar')
 }
\ No newline at end of file
diff --git a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.17.aar b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.17.aar
deleted file mode 100644
index c6367f9..0000000
--- a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.17.aar
+++ /dev/null
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.20.aar b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.20.aar
new file mode 100644
index 0000000..efe61d1
--- /dev/null
+++ b/HDLSDK_DEMO/app/libs/com.hdl.sdk-v1.0.20.aar
Binary files differ

--
Gitblit v1.8.0