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