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