From 11cea3249fd58d59d7c1d644b1cfff6a547921c2 Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期三, 16 二月 2022 13:07:10 +0800
Subject: [PATCH] Merge branch 'dev-hxb'

---
 HDLSDK/hdl-common/build.gradle                                                             |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/BroadcastRequest.java    |   54 +++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java             |   16 +
 HDLSDK/hdl-socket/build.gradle                                                             |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java      |   28 +
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java                         |  288 +++++------------
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java |  230 ++++++++++++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java                 |   55 ++-
 HDLSDK_DEMO/app/libs/hdl-common-V1.0.3.aar                                                 |    0 
 HDLSDK_DEMO/app/libs/hdl-connect-V1.0.3.aar                                                |    0 
 HDLSDK_DEMO.zip                                                                            |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java                          |   27 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java             |   14 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java                   |   61 ++-
 HDLSDK_DEMO/app/libs/hdl-socket-V1.0.3.aar                                                 |    0 
 HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/config/TopicConstant.java               |   10 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketOptions.java                      |   90 +----
 HDLSDK.zip                                                                                 |    0 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java                 |    2 
 /dev/null                                                                                  |    0 
 HDLSDK/hdl-connect/build.gradle                                                            |    6 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java           |    2 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/PropertyReadRequest.java |    5 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IClient.java                     |    5 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java                                  |   37 +
 25 files changed, 584 insertions(+), 350 deletions(-)

diff --git a/HDLSDK.zip b/HDLSDK.zip
new file mode 100644
index 0000000..945fe33
--- /dev/null
+++ b/HDLSDK.zip
Binary files differ
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 2033551..aed7414 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -71,7 +71,10 @@
         super.onDestroy();
         removeAllTopicsListener();
     }
-
+void init(){
+    HDLLinkConfig.getInstance().setLocalSecret("7d04c4e3c2b7d600");
+    HDLLinkConfig.getInstance().setGatewayId("1473119283609321473");
+}
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -80,9 +83,9 @@
         tv = findViewById(R.id.state_tv);
         rv = findViewById(R.id.rv);
         rv.setLayoutManager(new LinearLayoutManager(this));
-
+         init();
         checkIfCertified();
-
+        initDeviceInfo();
         registerAllTopicsListener();
 
         ActivityResultLauncher<String[]> launcher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
@@ -202,6 +205,7 @@
             @Override
             public void onMessage(Object msg) {
                 LinkResponse response = (LinkResponse) msg;
+                handleLinkResponse(response);
             }
         };
         HDLLink.getInstance().registerAllTopicsListener(allTopicsListener);
@@ -250,6 +254,24 @@
         HDLLink.getInstance().removeAllTopicsListener(allTopicsListener);
     }
 
+    void initDeviceInfo()
+    {
+        AuthenticateRequest.AuthenticateDeviceInfoBean infoBean = new AuthenticateRequest.AuthenticateDeviceInfoBean();
+        infoBean.setDeviceMAC("123456789");
+        infoBean.setIPMAC("12345678900");
+        infoBean.setDeviceName("闊充箰鎾斁鍣�");//璁惧鍚嶅瓧
+        infoBean.setDeviceModel("MCLog.431");//璁惧鍨嬪彿
+        infoBean.setAccessMode("WIFI");
+        infoBean.setIPGateway("192.168.88.1");
+        infoBean.setIPAddress("192.168.88.100");
+        infoBean.setGateway_type("music.standard");
+        infoBean.setHw_version("HW2.0");
+        infoBean.setFw_version("Fw1.0");
+        infoBean.setOID("010105000000FE08");
+        infoBean.setSid("010105000000FE08110100000000");
+        HDLLinkConfig.getInstance().setDeviceInfoBean(infoBean);
+    }
+
     /**
      * 鍏ョ綉璁よ瘉
      */
@@ -262,7 +284,7 @@
         String macStr = "AA000000000000BB";//璁惧鍞竴MAC鍦板潃
         String secret = "87ae414b7a853f65";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret
 
-        //姝e紡鏈嶅姟鍣�
+//        //姝e紡鏈嶅姟鍣�
 //        String spkStr = "screen.mirror";//浜у搧spk
 //        String macStr = "AA000000000000AC";//璁惧鍞竴MAC鍦板潃
 //        String secret = "ee62124c151b737c";//閫氳繃spk鍜宮ac鎻愪氦浜戠璁よ瘉鍚庡垎閰嶇殑secret
@@ -290,13 +312,14 @@
         infoBean.setDeviceModel("HDL");//
         infoBean.setAccessMode("WIFI");
         infoBean.setIPGateway("192.168.88.1");
-        infoBean.setIPAddress(IpUtils.getIP(this));
+        infoBean.setIPAddress(IpUtils.getIP(this));//鏍规嵁鐪熷疄鐨処P鍦板潃濉啓
 
         infoBean.setOID("010105000000FE08");
         infoBean.setSid("010105000000FE08110100000000");
+        infoBean.setHw_version("1.0");
+        infoBean.setFw_version("1.0");
 //        infoBean.set
-        AuthenticateRequest.VersionBean[] versionBeans = new AuthenticateRequest.VersionBean[]{new AuthenticateRequest.VersionBean("FW", versionString), new AuthenticateRequest.VersionBean("HW", "1956F")};
-        infoBean.setVersions(versionBeans);
+
         AuthenticateRequest request = new AuthenticateRequest(IdUtils.getUUId(), time, infoBean, authbean);
         HDLLink.getInstance().startAuthenticateRequest(request, new HDLLinkCallBack() {
             @Override
diff --git a/HDLSDK/hdl-common/build.gradle b/HDLSDK/hdl-common/build.gradle
index c3c6ca8..3a82524 100644
--- a/HDLSDK/hdl-common/build.gradle
+++ b/HDLSDK/hdl-common/build.gradle
@@ -9,7 +9,7 @@
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
         versionCode 2
-        versionName "1.0.2"
+        versionName "1.0.5"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
diff --git a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/config/TopicConstant.java b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
index 0ed30c0..9f4a148 100644
--- a/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
+++ b/HDLSDK/hdl-common/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
@@ -77,4 +77,14 @@
     //8.6鍦烘櫙鍒犻櫎
     public static final String SCENE_DELETE = "/user/%s/custom/scene/delete";
 
+    /**
+     * 璁惧杩炴帴TCP涔嬪墠骞挎挱
+     */
+    public static final String BROADCAST="/user/all/custom/gateway/broadcast";
+
+    /**
+     * 涓荤綉鍏冲洖澶�
+     */
+    public static final String BROADCAST_REPLY="/user/all/custom/gateway/broadcast_reply";
+
 }
diff --git a/HDLSDK/hdl-connect/build.gradle b/HDLSDK/hdl-connect/build.gradle
index 6664bb5..ce517bb 100644
--- a/HDLSDK/hdl-connect/build.gradle
+++ b/HDLSDK/hdl-connect/build.gradle
@@ -8,8 +8,8 @@
     defaultConfig {
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
-        versionCode 3
-        versionName "1.0.2"
+        versionCode 2
+        versionName "1.0.5"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
@@ -44,4 +44,4 @@
 //    //鍔犲瘑
 //    implementation 'cn.hutool:hutool-all:5.6.5'
 //    implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
-}
\ No newline at end of file
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
index fc815f4..debe128 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -177,14 +177,25 @@
     }
 
     /**
-     * 閫氱敤UDP骞挎挱鍙戦�佹寚浠�
+     * 閫氱敤UDP鍙戦�佹寚浠�
      * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
      * @param topic 鍙戦�佹暟鎹�
      * @param bodyStr body鍐呭
      * @param callBack 鍥炶皟
      */
     public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr, callBack);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false, callBack);
+    }
+
+    /**
+     * 閫氱敤骞挎挱UDP鍙戦�佹寚浠�
+     * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
+     * @param topic 鍙戦�佹暟鎹�
+     * @param bodyStr body鍐呭
+     * @param callBack 鍥炶皟
+     */
+    public void udpBroadcastSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true, callBack);
     }
 
     /**
@@ -206,7 +217,17 @@
      * @param bodyStr  鍥炲鐨勪富棰�
      */
     public void udpSendMsg(String topic, String bodyStr) {
-        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr);
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,false);
+    }
+
+    /**
+     * 閫氱敤骞挎挱鍙戦�佹寚浠� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
+     *
+     * @param topic    鍙戦�佹暟鎹�
+     * @param bodyStr  鍥炲鐨勪富棰�
+     */
+    public void udpBroadcastSendMsg(String topic, String bodyStr) {
+        HDLAuthSocket.getInstance().udpSendMsg(topic, bodyStr,true);
     }
 
     /**
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
index 7b9b253..f3b663b 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/LinkRequest.java
@@ -4,6 +4,7 @@
 
 import androidx.annotation.NonNull;
 
+import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.common.utils.ByteUtils;
 import com.hdl.sdk.connect.utils.AesUtil;
@@ -87,6 +88,7 @@
                 String headString = "Topic:" + getTopic() + "\r\n" + "Length:" + dataBytes.length + "\r\n" + "\r\n";
                 byte[] headBytes = headString.getBytes("utf-8");
                 byte[] sendBytes = ByteUtils.concatBytes(headBytes, dataBytes);
+                LogUtils.i(headString + "\r\n" + data);
                 return sendBytes;
 
             } else {
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
index 1314671..e7ba0f3 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/AuthenticateRequest.java
@@ -34,15 +34,45 @@
         this.auth = auth;
     }
 
+    /**
+     * 璁よ瘉淇℃伅
+     */
     public static class AuthBean implements Serializable {
+        /**
+         * 璁惧MACKey
+         */
         private String mac_key;//(mac+secret)鐨勪袱娆d5鍊�
+        /**
+         * 璁惧spk
+         */
         private String spk;
+        /**
+         * 璇锋眰淇℃伅
+         */
         private RequestBean request;//璁惧鐩稿叧淇℃伅
 
+        /**
+         * MAC key
+         * @return
+         */
         public String getMACKey() { return mac_key; }
+
+        /**
+         * MACkey
+         * @param value
+         */
         public void setMACKey(String value) { this.mac_key = value; }
 
+        /**
+         * SPK
+         * @return
+         */
         public String getSpk() { return spk; }
+
+        /**
+         * SPK
+         * @param value
+         */
         public void setSpk(String value) { this.spk = value; }
 
         public RequestBean getRequest() { return request; }
@@ -51,6 +81,13 @@
         public AuthBean() {
 
         }
+
+        /**
+         *  璁よ瘉淇℃伅
+         * @param mac_key mac key
+         * @param spk 浜у搧spk
+         * @param request 璇锋眰瀵硅薄
+         */
         public AuthBean(String mac_key, String spk, RequestBean request) {
             this.mac_key = mac_key;
             this.spk = spk;
@@ -71,16 +108,52 @@
             this.firmware_version = firmware_version;
         }
 
+        /**
+         * 璁惧MAC
+         * @return
+         */
         public String getMAC() { return mac; }
+
+        /**
+         * 璁惧MAC
+         * @param value
+         */
         public void setMAC(String value) { this.mac = value; }
 
+        /**
+         * 鍘傚
+         * @return
+         */
         public String getSupplier() { return supplier; }
+
+        /**
+         * 鍘傚
+         * @param value
+         */
         public void setSupplier(String value) { this.supplier = value; }
 
+        /**
+         * 纭欢鐗堟湰
+         * @return
+         */
         public String getHardwareModel() { return hardware_model; }
+
+        /**
+         * 纭欢鐗堟湰
+         * @param value
+         */
         public void setHardwareModel(String value) { this.hardware_model = value; }
 
+        /**
+         * 杞欢鐗堟湰
+         * @return
+         */
         public String getFirmwareVersion() { return firmware_version; }
+
+        /**
+         * 杞欢鐗堟湰
+         * @param value
+         */
         public void setFirmwareVersion(String value) { this.firmware_version = value; }
     }
 
@@ -97,46 +170,197 @@
         private String ip_gateway;
         private String dns1 = "114.114.114.114";
         private String dns2 = "8.8.8.8";
-        private VersionBean[] versions;
+        private String gateway_type;
+        private String hw_version;
+        private String fw_version;
 
         public String getOID() { return oid; }
+
+        /**
+         * 璁惧Oid
+         * @param value
+         */
         public void setOID(String value) { this.oid = value; }
 
         public String getDeviceMAC() { return device_mac; }
+
+        /**
+         * 璁惧Mac
+         * @param value
+         */
         public void setDeviceMAC(String value) { this.device_mac = value; }
 
+        /**
+         * 璁惧鍚�
+         * @return
+         */
         public String getDeviceName() { return device_name; }
+
+        /**
+         * 璁惧鍚�
+         * @param value
+         */
         public void setDeviceName(String value) { this.device_name = value; }
 
+        /**
+         * 璁惧鍨嬪彿
+         * @return
+         */
         public String getDeviceModel() { return device_model; }
+
+        /**
+         * 璁惧鍨嬪彿
+         * @param value
+         */
         public void setDeviceModel(String value) { this.device_model = value; }
 
+        /**
+         * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         * @return
+         */
         public String getAccessMode() { return access_mode; }
+
+        /**
+         * 杩炴帴绫诲瀷锛屾湁绾胯繕鏄棤绾�
+         * @param value
+         */
         public void setAccessMode(String value) { this.access_mode = value; }
 
+        /**
+         * 璁惧sid
+         * @return
+         */
         public String getSid() { return sid; }
+
+        /**
+         * 璁惧sid
+         * @param value
+         */
         public void setSid(String value) { this.sid = value; }
 
+        /**
+         * 璁惧IPMAC
+         * @return
+         */
         public String getIPMAC() { return ip_mac; }
+
+        /**
+         * 璁惧IPMAC
+         * @param value
+         */
         public void setIPMAC(String value) { this.ip_mac = value; }
 
+        /**
+         * 璁惧IP鍦板潃
+         * @return
+         */
         public String getIPAddress() { return ip_address; }
+
+        /**
+         * 璁惧IP鍦板潃
+         * @param value
+         */
         public void setIPAddress(String value) { this.ip_address = value; }
 
+        /**
+         * 瀛愮綉鎺╃爜
+         * @return
+         */
         public String getNetmask() { return netmask; }
+
+        /**
+         * 瀛愮綉鎺╃爜
+         * @param value
+         */
         public void setNetmask(String value) { this.netmask = value; }
 
+        /**
+         * 缃戝叧IP
+         * @return
+         */
         public String getIPGateway() { return ip_gateway; }
+
+        /**
+         * 缃戝叧IP
+         * @param value
+         */
         public void setIPGateway(String value) { this.ip_gateway = value; }
 
+        /**
+         * DNS1
+         * @return
+         */
         public String getDns1() { return dns1; }
+
+        /**
+         * DNS1
+         * @param value
+         */
         public void setDns1(String value) { this.dns1 = value; }
 
+        /**
+         * DNS2
+         * @return
+         */
         public String getDns2() { return dns2; }
+
+        /**
+         * DNS2
+         * @param value
+         */
         public void setDns2(String value) { this.dns2 = value; }
 
-        public VersionBean[] getVersions() { return versions; }
-        public void setVersions(VersionBean[] value) { this.versions = value; }
+        public VersionBean[] getVersions() {return null;  }
+        public void setVersions(VersionBean[] value) {  }
+
+        /**
+         * 缃戝叧绫诲瀷
+         * @return
+         */
+        public String getGateway_type() {
+            return gateway_type;
+        }
+
+        /**
+         * 缃戝叧绫诲瀷
+         * @param gateway_type
+         */
+        public void setGateway_type(String gateway_type) {
+            this.gateway_type = gateway_type;
+        }
+
+        /**
+         * 纭欢鐗堟湰
+         * @return
+         */
+        public String getHw_version() {
+            return hw_version;
+        }
+
+        /**
+         *纭欢鐗堟湰
+         * @param
+         */
+        public void setHw_version(String hw_version) {
+            this.hw_version = hw_version;
+        }
+
+
+        /**
+         * 鍥轰欢鐗堟湰
+         * @return
+         */
+        public String getFw_version() {
+            return fw_version;
+        }
+
+        /**
+         * 鍥轰欢鐗堟湰
+         * @param fw_version
+         */
+        public void setFw_version(String fw_version) {
+            this.fw_version = fw_version;
+        }
     }
 
     public static class VersionBean implements Serializable{
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/BroadcastRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/BroadcastRequest.java
new file mode 100644
index 0000000..3092fcd
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/BroadcastRequest.java
@@ -0,0 +1,54 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by jlchen on 11/11/21.
+ *
+ * /user/all/custom/gateway/broadcast
+ */
+public class BroadcastRequest implements Serializable {
+    private String id;
+    private String time_stamp;
+    private AuthenticateRequest.AuthenticateDeviceInfoBean objects;//褰撳墠璁惧鍩烘湰淇℃伅
+    private String code;//
+
+    public BroadcastRequest(String id, String time_stamp, AuthenticateRequest.AuthenticateDeviceInfoBean objects, String code) {
+        this.id = id;
+        this.time_stamp = time_stamp;
+        this.objects = objects;
+        this.code = code;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getTime_stamp() {
+        return time_stamp;
+    }
+
+    public void setTime_stamp(String time_stamp) {
+        this.time_stamp = time_stamp;
+    }
+
+    public AuthenticateRequest.AuthenticateDeviceInfoBean getObjects() {
+        return objects;
+    }
+
+    public void setObjects(AuthenticateRequest.AuthenticateDeviceInfoBean objects) {
+        this.objects = objects;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/PropertyReadRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/PropertyReadRequest.java
index e26ebf4..0486f16 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/PropertyReadRequest.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/PropertyReadRequest.java
@@ -1,9 +1,12 @@
 package com.hdl.sdk.connect.bean.request;
 
+import java.io.Serializable;
+
 /**
  * Created by Tong on 2021/10/8.
  */
-public class PropertyReadRequest {
+public class PropertyReadRequest implements Serializable
+{
 
     private String sid;
 
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
index dd5e830..949b7e9 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/config/HDLLinkConfig.java
@@ -3,7 +3,9 @@
 import android.text.TextUtils;
 
 import com.hdl.sdk.common.config.TopicConstant;
+import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.SPUtils;
+import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
 
 
@@ -23,6 +25,8 @@
     private String ipAddress;
     private boolean isLocalEncrypt;//缃戝叧鏄惁闇�瑕佸姞瀵嗛�氳
     private GatewaySearchBean currentGateway;//褰撳墠缃戝叧
+
+    private AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean;//褰撳墠璁惧鍩烘湰淇℃伅
 
     /**
      * instance
@@ -111,11 +115,15 @@
     }
 
     public String getLocalSecret() {
+        LogUtils.i("HDLLinkConfig","瀵嗛挜鏄�:"+localSecret);
         return localSecret;
     }
 
     public String getGatewayId() {
         return gatewayId;
+    }
+    public void setGatewayId(String gatewayId) {
+        this.gatewayId=gatewayId;
     }
 
     public String getIpAddress() {
@@ -160,6 +168,7 @@
         return (!topicStr.contains(TopicConstant.GATEWAY_AUTH_BROADCAST) //缃戝叧骞挎挱鍏ョ綉鎸囦护
                 && !topicStr.contains(TopicConstant.DEIVCE_AUTH_REQUEST) //鍏ョ綉璁よ瘉
                 && !topicStr.contains(TopicConstant.GATEWAY_SEARCH) //鎼滅储缃戝叧涓婚
+                && !topicStr.equals(TopicConstant.BROADCAST)
                 && isLocalEncrypt//鍚敤鍔犲瘑鏍囧織
         );
     }
@@ -174,4 +183,11 @@
         return String.format(topicStr, gatewayId);
     }
 
+    public AuthenticateRequest.AuthenticateDeviceInfoBean getDeviceInfoBean() {
+        return deviceInfoBean;
+    }
+
+    public void setDeviceInfoBean(AuthenticateRequest.AuthenticateDeviceInfoBean deviceInfoBean) {
+        this.deviceInfoBean = deviceInfoBean;
+    }
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
index 834c242..0d20188 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/protocol/LinkMessageDecoder.java
@@ -1,8 +1,12 @@
 package com.hdl.sdk.connect.protocol;
 
 
+import android.os.Build;
 import android.util.Log;
 
+import androidx.annotation.RequiresApi;
+
+import com.google.gson.internal.bind.DateTypeAdapter;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.common.event.EventDispatcher;
@@ -13,6 +17,7 @@
 import com.hdl.sdk.socket.codec.ByteToMessageDecoder;
 
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.List;
 
 /**
@@ -111,8 +116,9 @@
         }
     }
 
+    @RequiresApi(api = Build.VERSION_CODES.O)
     @Override
-    protected LinkResponse decoder(Object msg) throws Exception {
+    protected synchronized LinkResponse decoder(Object msg) throws Exception {
         if (msg instanceof byte[]) {
             bytes.addAll(ByteUtils.toByteList((byte[]) msg));
             //濡傛灉澶氭潯鍛戒护鎵撳寘鍦ㄤ竴鏉℃暟鎹腑锛岄兘闇�瑕佸鐞嗗畬
@@ -154,18 +160,22 @@
                 if (HDLLinkConfig.getInstance().ifNeedEncrypt(response.getTopic())) {
                     //闇�瑕佽В瀵�
                     byte[] bodyBytes = AesUtil.aesDecrypt(body, HDLLinkConfig.getInstance().getLocalSecret());
-//                        byte[] bodyBytes = AESUtils.decryptAES(body,AuthenticateConfig.getInstance().getLocalSecret());
                     if (bodyBytes != null) {
-                        response.setData(new String(bodyBytes, "utf-8"));
-//                            LogUtils.i("TAG", "瑙e瘑 涓婚锛�"+response.getTopic()+ " body: "+response.getData());
+                        body = bodyBytes;
                     } else {
-                        //瑙e瘑澶辫触锛岃繑鍥炲師鏁版嵁
-                        response.setData(new String(body, "utf-8"));
+                        try {
+                            LogUtils.e("瑙e瘑澶辫触锛屾暟鎹唴瀹规槸锛歕r\n" + Base64.getEncoder().encodeToString(body));
+                        } catch (Exception e) {
+                        }
                     }
-
-                } else {
-                    response.setData(new String(body, "utf-8"));
                 }
+
+                String bodyString = new String(body, "utf-8");
+                //闈炴甯告暟鎹紝杩斿洖
+                if (!(bodyString.startsWith("{") || bodyString.startsWith("["))) {
+                    continue;
+                }
+                response.setData(bodyString);
                 LogUtils.i( "LinkMessageDecoder->decoder:" + response.getTopic() + "\r\n" + response.getData());
                 //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆�
                 EventDispatcher.getInstance().post(response.getTopic(), response);
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
index 010263f..3c8363f 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -359,9 +359,10 @@
      *
      * @param topic    鍙戦�佹暟鎹�
      * @param bodyStr  鍥炲鐨勪富棰�
+     * @param broadcast 鏄惁瑕佸箍鎾�
      * @param callBack 鍥炶皟
      */
-    public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) {
+    public void udpSendMsg(String topic, String bodyStr,boolean broadcast,  HDLLinkResponseCallBack callBack) {
         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
             if (callBack != null) {
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR));
@@ -378,6 +379,9 @@
 
         LinkRequest message = new LinkRequest(topic, bodyStr);
         String ip = HDLLinkConfig.getInstance().getIpAddress();
+        if(broadcast) {
+            ip = IpUtils.getBroadcastAddress();
+        }
         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
                     @Override
                     public void onSucceed(Object msg) {
@@ -399,8 +403,9 @@
      *
      * @param topic   鍙戦�佹暟鎹�
      * @param bodyStr 鍥炲鐨勪富棰�
+     * @param broadcast 鏄惁骞挎挱
      */
-    public void udpSendMsg(String topic, String bodyStr) {
+    public void udpSendMsg(String topic, String bodyStr,boolean broadcast) {
         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) {
             LogUtils.e("udpSendMsg", "鍙傛暟涓嶈兘涓虹┖");
             return;
@@ -410,7 +415,10 @@
             return;
         }
         LinkRequest message = new LinkRequest(topic, bodyStr);
-        String ip = HDLLinkConfig.getInstance().getIpAddress();// IpUtils.getBroadcastAddress();
+        String ip = HDLLinkConfig.getInstance().getIpAddress();
+        if(broadcast) {
+            ip = IpUtils.getBroadcastAddress();
+        }
         HdlSocketHelper.sendUdpOne(getUdpBoot(), ip, UDP_PORT, message);
     }
 
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 b03d0fe..dedba8a 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -1,42 +1,37 @@
 package com.hdl.sdk.connect.socket;
 
 import android.text.TextUtils;
+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;
 import com.hdl.sdk.common.exception.HDLLinkCode;
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.IdUtils;
-import com.hdl.sdk.common.utils.IpUtils;
 import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.common.utils.SPUtils;
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
+import com.hdl.sdk.connect.bean.request.BroadcastRequest;
 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.response.GatewaySearchBean;
 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.request.PropertyUpRequest;
-import com.hdl.sdk.connect.callback.BaseCallBack;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
+import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
 import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
 import com.hdl.sdk.socket.SocketBoot;
 import com.hdl.sdk.socket.SocketOptions;
 import com.hdl.sdk.socket.client.TcpClient;
-import com.hdl.sdk.socket.client.UdpClient;
 import com.hdl.sdk.socket.codec.MessagePipeLine;
 import com.hdl.sdk.socket.listener.ConnectStatusListener;
 import com.hdl.sdk.socket.listener.SendListener;
 
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
@@ -63,7 +58,7 @@
         statusListener = new ConnectStatusListener() {
             @Override
             public void onConnecting() {
-
+                broadcastRequest();
             }
 
             @Override
@@ -78,6 +73,31 @@
         };
     }
 
+    /**
+     * 骞挎挱鑷韩淇℃伅缁欎富缃戝叧
+     */
+    private void broadcastRequest() {
+        String time = String.valueOf(System.currentTimeMillis());
+        if (null == HDLLinkConfig.getInstance().getDeviceInfoBean()) {
+            LogUtils.i("DeviceInfoBean涓虹┖锛岃璁剧疆褰撳墠瀵硅薄");
+            return;
+        }
+        BroadcastRequest request = new BroadcastRequest(IdUtils.getUUId(), time, HDLLinkConfig.getInstance().getDeviceInfoBean(), "200");
+        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request),true);
+        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) {
+
+            }
+        });
+        HDLAuthSocket.getInstance().udpSendMsg(TopicConstant.BROADCAST, GsonConvert.getGson().toJson(request),true);
+    }
+
     private static class SingletonInstance {
         private static final HDLSocket INSTANCE = new HDLSocket();
     }
@@ -86,17 +106,17 @@
         return SingletonInstance.INSTANCE;
     }
 
-
+    SocketOptions options;
     private SocketOptions getTcpOptions() {
-        final SocketOptions options = new SocketOptions();
+        if(null!=options){
+            return options;
+        }
+        options = new SocketOptions();
         final MessagePipeLine pipeLine = new MessagePipeLine();
         pipeLine.add(new LinkMessageDecoder());
         pipeLine.add(new LinkMessageEncoder());
         options.setHandleMessage(pipeLine);
-        options.setEnabledHeartbeat(false);//鏄惁寮�鍚績璺冲寘鍙戦�佹娴�
-//        options.setHeartbeatTimeInterval(10*1000L);
-//        options.setHeartbeatData("TCP");
-//        options.setEnabledHeartbeat(true);//鏄惁寮�鍚績璺冲寘鍙戦�佹娴�
+        options.addConnectStatusListener(statusListener);
         return options;
     }
 
@@ -387,11 +407,14 @@
 
     public SocketBoot getTcp() throws RuntimeException {
         if (TextUtils.isEmpty(getTcpIp())) {
+            LogUtils.e("璇锋悳绱㈢綉鍏�");
             throw new RuntimeException("璇锋悳绱㈢綉鍏�");
         }
-        if (tcpBoot == null) {
+        //濡傛灉娌℃湁鍒濆鍖栵紝鎴栬�呯綉鍏矷P鏇存敼浜嗭紝灏遍噸鏂板垵濮嬪寲
+        if (tcpBoot == null||!getTcpOptions().getIp().equals(getTcpIp())) {
             tcpBoot = TcpClient.init(getTcpIp(), getTcpPort(), getTcpOptions());
         }
+
         return tcpBoot;
     }
 
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
index 7776163..4bcc51e 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
@@ -21,7 +21,7 @@
  */
 public class HdlSocketHelper {
 
-    private static final Long DEF_SEND_TIMEOUT = 1000L;
+    private static final Long DEF_SEND_TIMEOUT = 500L;
     private static final int DEF_MAX_RETRY = 4;
     private static final int DEF_SEND_ONE = 1;
 
diff --git a/HDLSDK/hdl-socket/build.gradle b/HDLSDK/hdl-socket/build.gradle
index 21a9e32..e4bdbc4 100644
--- a/HDLSDK/hdl-socket/build.gradle
+++ b/HDLSDK/hdl-socket/build.gradle
@@ -9,7 +9,7 @@
         minSdkVersion rootProject.minSdkVersion
         targetSdkVersion rootProject.targetSdkVersion
         versionCode 2
-        versionName "1.0.2"
+        versionName "1.0.5"
 
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles "consumer-rules.pro"
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
index 5d20229..74e0940 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -27,25 +27,19 @@
 public class SocketBoot {
 
     private ExecutorService connectThread;
-    private ScheduledExecutorService heartbeatThread;
     private ExecutorService sendThread;
     private ExecutorService receiveThread;
-    private ScheduledExecutorService delayThread;
 
     private final IClient client;
 
-//    public IClient getClient() {
-//        return client;
-//    }
-
     /**
-     * socket鏄惁鍦ㄨ繍琛�
+     * tcp鏄惁宸茬粡杩炴帴
      */
-    private final AtomicBoolean isRun = new AtomicBoolean(false);
+    private boolean connected=false;
 
-    private final AtomicBoolean isOpenRetry = new AtomicBoolean(false);
-
-    private final AtomicInteger resendCount = new AtomicInteger(0);
+    public IClient getClient() {
+        return client;
+    }
 
     private final BlockingQueue<SocketRequest> mMessageQueue = new LinkedBlockingDeque<>();
 
@@ -53,88 +47,42 @@
 
     public SocketBoot(IClient client) {
         this.client = client;
+        initConnectThread();
+        initReceiveThread();
+        initSendThread();
     }
 
-    public ScheduledExecutorService getHeartBeat() {
-        if (heartbeatThread == null) {
-            heartbeatThread = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
-        }
-        return heartbeatThread;
-    }
-
-    public void connect() {
-        resendCount.set(0);
-        resetConnect(true);
-        isOpenRetry.set(true);
-    }
-
-    public synchronized void resetConnect(boolean isFirst) {
-        final int maxRetry = client.getOptions().getMaxRetry();
-        if (maxRetry == 0 && resendCount.get() > 0 ||
-                (maxRetry > 0 && maxRetry + 1 < resendCount.get())) {
-            LogUtils.d("====", "===閲嶈繛娆℃暟杈惧埌鏈�澶�==");
-            return;
-        }
-        if (!client.isConnect()) {
-            if (connectThread == null) {
-                connectThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
-            }
-            connectThread.execute(new Runnable() {
-                @Override
-                public void run() {
-                    client.onConnectStatus(ConnectStatus.CONNECTING);
-                    if (!isFirst) {
-                        try {
-                            resendCount.set(resendCount.get() + 1);
-                            Thread.sleep(300L);
-                            LogUtils.d("====", "==閲嶈繛绗�" + resendCount + "娆�==");
-                        } catch (Exception ignored) {
-                        }
-                    }
-                    try {
-                        client.connect();
-                        isRun.set(true);
-                        if (client.isConnect()) {
-                            LogUtils.d("====", "====杩炴帴鎴愬姛====");
-                            startHeartbeat();
-
-                            initSendThread();
-                            initReceiveThread();
-
-                            client.onConnectStatus(ConnectStatus.CONNECTED);
-                            resendCount.set(0);
-                        } else {
-                            throw new ConnectException();
-                        }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                        LogUtils.d("====", "===杩炴帴澶辫触===" + e);
-                        //鍐嶅垽鏂竴涓嬫湁娌℃湁杩炴帴
-                        if (!client.isConnect()) {
-                            isRun.set(false);
-                            client.onConnectStatus(ConnectStatus.DISCONNECT);
-                            stopHeartbeat();
-                            disconnectError();
-                        }
-                    }
-                }
-            });
+    /**
+     * 杩炴帴tcp锛屽唴閮ㄧ淮鎶ゆ帀锛屽彲浠ヤ笉鐢ㄥ紑鏀惧閮紝鏍规嵁杩欎釜涓氬姟鎴戠壒鎬у鐞嗗ソ
+     */
+    private synchronized void connect() {
+        try {
+            LogUtils.i("TCP杩炴帴");
+            client.onConnectStatus(ConnectStatus.CONNECTING);
+            Thread.sleep(700);
+            client.connect();
+            connected=true;
+            client.onConnectStatus(ConnectStatus.CONNECTED);
+        }catch(Exception e) {
+            LogUtils.e("杩炴帴寮傚父"+e.getMessage());
         }
     }
 
-    public void initSendThread() {
+
+    /**
+     * 鍒濆鍖栧彂閫佺嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
+    private void initSendThread() {
         if (sendThread == null) {
             sendThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
-        }
-        sendThread.execute(new Runnable() {
-            @Override
-            public void run() {
-                while (isRun.get()) {
-                    if (client.isConnect()) {
+            sendThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
                         try {
                             SocketRequest socketRequest = mMessageQueue.take();
-                            final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
-                            LogUtils.i("鍙戦�佹暟鎹細"+sendStr);
+//                            final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
+//                            LogUtils.i("鍙戦�佹暟鎹細" + sendStr);
                             final String action = socketRequest.getAction();
                             try {
                                 client.sendMsg(socketRequest.getData());
@@ -145,33 +93,22 @@
                                     }
                                 }
                             } catch (Exception e) {
+                                connected = false;
+                                LogUtils.e("鍙戦�佸け璐�:" + e.getMessage());
                                 if (!TextUtils.isEmpty(action)) {
                                     SendListener sendListener = sendMap.get(action);
                                     if (sendListener != null) {
                                         sendListener.onError();
                                     }
                                 }
-
-                                stopHeartbeat();
-                                if (sendThread != null) {
-                                    sendThread.shutdownNow();
-                                }
-                                if (isRun.get()) {
-                                    disconnectError();
-                                }
-
                             }
-                        } catch (InterruptedException ignored) {
+                        } catch (Exception e) {
 
                         }
-
                     }
-
                 }
-                LogUtils.d("=====", "==鍙戦�佺嚎绋嬪叧闂�==");
-            }
-        });
-
+            });
+        }
     }
 
     /**
@@ -183,151 +120,94 @@
             receiveThread.execute(new Runnable() {
                 @Override
                 public void run() {
-                    while (isRun.get()) {
-                        if (client.isConnect()) {
-                            try {
+                    while (true) {
+                        try {
+                            if (connected) {
                                 //璇诲彇鏁版嵁
                                 client.onHandleResponse();
-                            } catch (Exception e) {
-                                e.printStackTrace();
-                                disconnectError();
+                            } else {
+                                try {
+                                    Thread.sleep(1000);
+                                } catch (Exception ee) {
+
+                                }
                             }
+                        } catch (Exception e) {
+                            connected = false;
+                            LogUtils.e("鎺ユ敹鏁版嵁绾跨▼寮傚父" + e.getMessage());
                         }
                     }
-                    LogUtils.i("Socket 绾跨▼閫�鍑烘帴鏀舵暟鎹�");
                 }
             });
         }
     }
 
+    /**
+     * 鍒濆鍖栭噸鏂拌繛鎺ョ嚎绋�
+     */
+    private void initConnectThread() {
+        if (connectThread == null) {
+            connectThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
+            //涓�瀹氭椂闂存娴嬩竴娆¤繛鎺ユ儏鍐碉紝娌℃湁杩炴帴灏辨墽琛岃繛鎺ワ紝杩炴帴缁熶竴鐢辫繖閲岀淮鎶�
+            connectThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (true) {
+                        try {
+                            if (!connected) {
+                                reconect();
+                            }
+                            Thread.sleep(10*1000);
+                        } catch (Exception e) {
 
-    public void startHeartbeat() {
-        if (heartbeatThread != null) {
-            heartbeatThread.shutdownNow();
-            heartbeatThread = null;
-        }
-        if (client.getOptions() == null || client.getOptions().getHeartbeatTimeInterval() <= 0 || !client.getOptions().isEnabledHeartbeat()) {
-            return;
-        }
-        getHeartBeat().scheduleWithFixedDelay(new Runnable() {
-            @Override
-            public void run() {
-                if (isRun.get()) {
-//                    LogUtils.d("====", "===鍙戦�佸績璺冲寘===");
-                    if (client.getOptions() != null) {
-                        final byte[] heartBeat = client.getOptions().getHeartbeatData();
-                        if (heartBeat != null) {
-                            sendMsg(heartBeat, false, null);
-                        } else {
-                            sendMsg(new byte[0], false, null);
                         }
                     }
                 }
-            }
-        }, client.getOptions().getHeartbeatTimeInterval(), client.getOptions().getHeartbeatTimeInterval(), TimeUnit.MILLISECONDS);
-    }
-
-    public void stopHeartbeat() {
-        if (heartbeatThread != null) {
-            heartbeatThread.shutdownNow();
-            heartbeatThread = null;
+            });
         }
     }
+    /**
+     * 閲嶆柊杩炴帴
+     */
+    private void reconect() {
+        disconnect();
+        connect();
+    }
 
+    /**
+     * 鍙戦�佹棤闇�鍥炶皟
+     * @param msg 鍙戦�佺殑鏁版嵁
+     */
     public void sendMsg(byte[] msg) {
-        sendMsg(msg, true, null);
+        sendMsg(msg, null);
     }
 
-    public void sendMsg(byte[] msg, SendListener listener) {
-        sendMsg(msg, true, listener);
-    }
 
     /**
      * @param listener 涓�鑸儏鍐垫棤闇�鐩戝惉
      */
-    private void sendMsg(byte[] msg, boolean isRefreshRetry, SendListener listener) {
-        if (isRefreshRetry) {
-            //閲嶇疆杩炴帴娆℃暟
-            resendCount.set(0);
-        }
+    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 (InterruptedException ignored) {
+        } catch (Exception e) {
 
-        }
-        if (!client.isConnect()) {
-            resetConnect(false);
         }
     }
 
     /**
-     * 鍙戠敓閿欒锛岄噸杩�
+     * 鍏抽棴杩炴帴
      */
-    private void disconnectError() {
-        disconnect();
-        isRun.set(false);
-        if (isOpenRetry.get()) {
-            if (delayThread != null) {
-                delayThread.shutdownNow();
-            }
-            delayThread = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
-            delayThread.schedule(new Runnable() {
-                @Override
-                public void run() {
-                    if (!client.isConnect() && isOpenRetry.get()) {
-                        resetConnect(false);
-                    }
-                }
-            }, 3000, TimeUnit.MILLISECONDS);
-        }
-
-    }
-
     private synchronized void disconnect() {
-        if (client.isConnect()) {
+        try {
             client.disconnect();
             //鏂紑杩炴帴
             client.onConnectStatus(ConnectStatus.DISCONNECT);
-        }
-    }
+        } catch (Exception e) {
 
-    public synchronized void close() {
-        isOpenRetry.set(false);
-        isRun.set(false);
-        if (connectThread != null) {
-            connectThread.shutdownNow();
-            connectThread = null;
         }
-        if (heartbeatThread != null) {
-            heartbeatThread.shutdownNow();
-            heartbeatThread = null;
-        }
-        if (sendThread != null) {
-            sendThread.shutdownNow();
-            sendThread = null;
-        }
-        if (receiveThread != null) {
-            receiveThread.shutdownNow();
-            receiveThread = null;
-        }
-        sendMap.clear();
-        client.disconnect();
-        mMessageQueue.clear();
-
-    }
-
-    public synchronized void release() {
-        close();
-        if (client != null && client.getOptions() != null) {
-            client.getOptions().clearConnectStatusListener();
-        }
-    }
-
-    public boolean isConnect() {
-        return client.isConnect();
     }
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketOptions.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketOptions.java
index 1bbf2f9..429d646 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketOptions.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketOptions.java
@@ -14,17 +14,9 @@
  */
 public class SocketOptions {
 
-    //璁剧疆璇诲彇缂撳瓨
-    private int readMaxBufferSize = 512;
-
-    //鍙戦�佸績璺冲寘
-    private boolean isEnabledHeartbeat = true;
-
-    //蹇冭烦鍖�
-    private byte[] heartbeatData;
-
-    //蹇冭烦鍖呮椂闂撮棿闅�
-    private long heartbeatTimeInterval = 300L;
+    //鍙戦�佺洰鏍囧湴鍧�IP
+    private String ip="";
+    private int port;
 
     //澶勭悊鏁版嵁
     private IHandleMessage handleMessage;
@@ -32,18 +24,22 @@
     //鐩戝惉鐘舵��
     private List<ConnectStatusListener> mConnectStatusListener;
 
-    //鏈�澶ч噸杩炴鏁�,灏忎簬0鏃犻檺娆℃暟,绛変簬0涓嶉噸杩�
-    private int maxRetry = -1;
 
-    private boolean isTcpNoDelay;
-    private boolean isReuseAddress;
-    //淇濇寔娲诲姩鐘舵��
-    private boolean isKeepAlive;
-    private boolean isOOBInline;
-    private int sendBufferSize;
-    private int receiveBufferSize;
-    private int soTimeout;
-    private boolean soLinger;
+    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;
@@ -51,38 +47,6 @@
 
     public void setHandleMessage(IHandleMessage handleMessage) {
         this.handleMessage = handleMessage;
-    }
-
-    public boolean isEnabledHeartbeat() {
-        return isEnabledHeartbeat;
-    }
-
-    public void setEnabledHeartbeat(boolean enabledHeartbeat) {
-        isEnabledHeartbeat = enabledHeartbeat;
-    }
-
-    public byte[] getHeartbeatData() {
-        return heartbeatData;
-    }
-
-    public void setHeartbeatData(byte[] heartbeatData) {
-        this.heartbeatData = heartbeatData;
-    }
-
-    public void setHeartbeatData(String heartbeatData) {
-        try {
-            this.heartbeatData = heartbeatData.getBytes("utf-8");
-        } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public long getHeartbeatTimeInterval() {
-        return heartbeatTimeInterval;
-    }
-
-    public void setHeartbeatTimeInterval(long heartbeatTimeInterval) {
-        this.heartbeatTimeInterval = heartbeatTimeInterval;
     }
 
     public void clearConnectStatusListener() {
@@ -104,26 +68,8 @@
         }
     }
 
-
     public List<ConnectStatusListener> getConnectStatusListener() {
         return mConnectStatusListener;
-    }
-
-
-    public int getMaxRetry() {
-        return maxRetry;
-    }
-
-    public void setMaxRetry(int maxRetry) {
-        this.maxRetry = maxRetry;
-    }
-
-    public int getReadMaxBufferSize() {
-        return readMaxBufferSize;
-    }
-
-    public void setReadMaxBufferSize(int readMaxBufferSize) {
-        this.readMaxBufferSize = readMaxBufferSize;
     }
 
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IClient.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IClient.java
index e768514..3e6a6da 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IClient.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IClient.java
@@ -12,11 +12,6 @@
 
     void disconnect();
 
-    /**
-     * 鏄惁宸茬粡杩炴帴
-     */
-    boolean isConnect();
-
 
     SocketOptions getOptions();
 
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
index 4e9d13c..db3bbcc 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/TcpClient.java
@@ -3,6 +3,7 @@
 
 
 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;
@@ -15,6 +16,8 @@
 import java.io.OutputStream;
 import java.net.InetSocketAddress;
 import java.net.Socket;
+import java.net.SocketAddress;
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -31,12 +34,32 @@
 
     private Socket mSocket;
 
-    private byte[] readBuffer;
+    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) {
@@ -46,14 +69,19 @@
 
     @Override
     public void connect() throws Exception {
+
         mSocket = getSocket();
-        SocketOptions options = getOptions();
-        mSocket.connect(new InetSocketAddress(ip, port));
+//        SocketOptions options = getOptions();
+        mSocket.connect(new InetSocketAddress(ip, port), 3 * 1000);
         mSocket.setTcpNoDelay(true);
         mSocket.setReuseAddress(true);
         mSocket.setKeepAlive(true);
-        readBuffer = new byte[options.getReadMaxBufferSize()];
+        mSocket.setSoTimeout(20 * 1000);
+
+        tcpClientList.add(this);
     }
+
+
 
 
     @Override
@@ -68,16 +96,6 @@
     }
 
     @Override
-    public boolean isConnect() {
-        if (mSocket == null) {
-            return false;
-        }
-
-        return mSocket.isConnected() && !mSocket.isClosed();
-    }
-
-
-    @Override
     public synchronized SocketOptions getOptions() {
         if (socketOptions == null) {
             socketOptions = new SocketOptions();
@@ -89,12 +107,17 @@
     public void onHandleResponse() throws Exception {
         final InputStream stream = getInputStream();
         if (stream != null && getOptions() != null) {
-            int len=0;
-            while ( (len=getInputStream().read(readBuffer)) != -1) {
+            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);
+                    LogUtils.i("鏀跺埌TCP鏁版嵁",new String(bytes));
                     //瀹屾暣鐨勬暟鎹墠鍥炶皟
                     handleMessage.read(bytes);
                 }
@@ -106,14 +129,10 @@
     public void sendMsg(byte[] msg) throws Exception {
         final OutputStream outputStream = getOutStream();
         if (outputStream != null && getOptions() != null) {
-            try {
                 IHandleMessage handleMessage = getOptions().getHandleMessage();
                 handleMessage.write(handleMessage.write(msg));
-                getOutStream().write(msg);
-
-            } finally {
+                outputStream.write(msg);
                 outputStream.flush();
-            }
         }
     }
 
diff --git a/HDLSDK_DEMO.zip b/HDLSDK_DEMO.zip
new file mode 100644
index 0000000..34cbc9d
--- /dev/null
+++ b/HDLSDK_DEMO.zip
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-common-V1.0.2.aar b/HDLSDK_DEMO/app/libs/hdl-common-V1.0.2.aar
deleted file mode 100644
index fa3988c..0000000
--- a/HDLSDK_DEMO/app/libs/hdl-common-V1.0.2.aar
+++ /dev/null
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-common-V1.0.3.aar b/HDLSDK_DEMO/app/libs/hdl-common-V1.0.3.aar
new file mode 100644
index 0000000..395037a
--- /dev/null
+++ b/HDLSDK_DEMO/app/libs/hdl-common-V1.0.3.aar
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.2.aar b/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.2.aar
deleted file mode 100644
index a63952e..0000000
--- a/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.2.aar
+++ /dev/null
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.3.aar b/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.3.aar
new file mode 100644
index 0000000..53d16c9
--- /dev/null
+++ b/HDLSDK_DEMO/app/libs/hdl-connect-V1.0.3.aar
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.2.aar b/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.2.aar
deleted file mode 100644
index 59ea7bf..0000000
--- a/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.2.aar
+++ /dev/null
Binary files differ
diff --git a/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.3.aar b/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.3.aar
new file mode 100644
index 0000000..f541a33
--- /dev/null
+++ b/HDLSDK_DEMO/app/libs/hdl-socket-V1.0.3.aar
Binary files differ

--
Gitblit v1.8.0