From 3b47201d878ba8ff973b84baf15942475688e964 Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期五, 15 十二月 2023 16:04:28 +0800
Subject: [PATCH] 合并第一个版本

---
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java                             |   26 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java                                     |    4 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinAllBean.java                  |   45 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java                                |   20 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidSpkBean.java                                        |   61 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java                               |   41 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java                              |   22 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkGroupControlCreateBean.java                            |  114 +++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java                                     |   35 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java                                      |    4 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaBean.java                                           |   36 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java                              |   40 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaSpaceBean.java                                      |   85 ++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAiMillimeterZTMacInfo.java        |   26 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java                             |    9 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinBean.java                     |   49 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/DeviceRemoteInfo.java                         |   71 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java                              |   45 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java                              |    2 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddAIMillimeterZTSuccessInfo.java |   13 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java                                       |   45 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java                                   |   27 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddSlaveGatewaySuccessInfo.java   |   60 +
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java                                |  345 ++++++++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java                                            |  841 ++++++++++++++++++++++
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java                           |    9 
 local.properties                                                                                               |    5 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java                               |   53 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java                                      |   19 
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java                                         |   21 
 30 files changed, 2,040 insertions(+), 133 deletions(-)

diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
index b308e0b..db9a046 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/HDLLinkLocalSdk.java
@@ -2,6 +2,7 @@
 
 import android.content.Context;
 import android.text.TextUtils;
+import android.widget.Toast;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -9,10 +10,14 @@
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.reflect.TypeToken;
+import com.hdl.linkpm.sdk.core.exception.HDLLinkCopyException;
+import com.hdl.linkpm.sdk.utils.HDLExceptionSubmitUtils;
 import com.hdl.sdk.link.bean.GatewayLocationBean;
+import com.hdl.sdk.link.bean.LinkGroupControlCreateBean;
 import com.hdl.sdk.link.bean.LinkIrDeviceBean;
 import com.hdl.sdk.link.bean.LinkOtaBean;
 import com.hdl.sdk.link.bean.LinkSidNameBean;
+import com.hdl.sdk.link.bean.MMWAreaBean;
 import com.hdl.sdk.link.common.config.TopicConstant;
 import com.hdl.sdk.link.common.exception.HDLLinkCode;
 import com.hdl.sdk.link.common.exception.HDLLinkException;
@@ -91,7 +96,7 @@
         return instance;
     }
 
-    private Context context;
+    private static Context context;
 
 
     public void init(Context context) {
@@ -118,6 +123,26 @@
             return true;
         else
             return false;
+    }
+
+    public static void showToast(String msg){
+//        runOnUiThread(new Runnable() {
+//            @Override
+//            public void run() {
+//                try {
+//                    if (toast == null) {
+//                        toast = Toast.makeText(HDLGlobal.getInstance().getContext(), message, Toast.LENGTH_SHORT);
+//                    } else {
+//                        toast.setText(message);
+//                    }
+//                    toast.show();
+//                } catch (Exception ignored) {
+//
+//                }
+//            }
+//
+//        });
+        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
     }
 
     /**
@@ -233,6 +258,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -277,6 +303,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -321,6 +348,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -365,6 +393,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -407,6 +436,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -417,6 +447,39 @@
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             }
         }
+    }
+
+    public void controlDevice(Object object, String gatewayId, String ipAddress, String mac, boolean encrypt, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+
+        String time = String.valueOf(System.currentTimeMillis());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("id", IdUtils.getUUId());
+        jsonObject.put("time_stamp", time);
+        List<Object> stringList = new ArrayList<>();
+        stringList.add(object);
+        jsonObject.put("objects", stringList);
+        String topic = String.format(TopicConstant.PROPERTY_DOWN, gatewayId);
+        LinkRequest request = new LinkRequest(topic, jsonObject.toString(), encrypt);
+        new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("controlDevice onSuccess");
+                    callBack.onSuccess("");
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true, mac).send();
     }
 
     /**
@@ -448,6 +511,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -489,6 +553,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -528,6 +593,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -538,6 +604,36 @@
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             }
         }
+    }
+
+    public void sidNameChange(List<LinkSidNameBean> bean, String gatewayId, String ipaddress, boolean isLocalEncrypt, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<List<LinkSidNameBean>> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+        data.setObjects(bean);
+        String topic = String.format(TopicConstant.EDIT_FUNCTION, gatewayId);
+        LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), isLocalEncrypt);
+        new HDLConnectHelper(ipaddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("sidNameChange onSuccess");
+                    callBack.onSuccess("");
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
     }
 
     /**
@@ -567,6 +663,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -577,6 +674,39 @@
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             }
         }
+    }
+
+    /**
+     * sid缁戝畾鎴块棿
+     */
+    public void sidBindUid(List<LinkSidUidBean> bean, String gatewayId, String ipaddress, boolean isLocalEncrypt, HDLLinkTCallBack<String> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<List<LinkSidUidBean>> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+        data.setObjects(bean);
+        String topic = String.format(TopicConstant.SID_BIND_ROOM, gatewayId);
+        LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), isLocalEncrypt);
+        new HDLConnectHelper(ipaddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("sidBindUid onSuccess");
+                    callBack.onSuccess("Success");
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
     }
 
     /**
@@ -606,6 +736,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -645,6 +776,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -685,6 +817,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -725,6 +858,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -773,6 +907,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -813,6 +948,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -862,6 +998,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -913,6 +1050,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -953,6 +1091,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -993,6 +1132,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1033,6 +1173,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1076,6 +1217,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1120,6 +1262,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1164,6 +1307,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1208,6 +1352,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1262,6 +1407,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1315,6 +1461,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1368,6 +1515,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1409,6 +1557,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1450,6 +1599,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1491,6 +1641,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1543,6 +1694,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1595,6 +1747,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1636,6 +1789,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1697,6 +1851,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1741,6 +1896,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1754,6 +1910,230 @@
         }
 
     }
+
+    /**
+     * 鏈嶅姟璋冪敤
+     *
+     * @param topic    涓婚
+     * @param callBack 鍥炶皟
+     */
+    public void serviceDown(String topic, JSONArray jsonArray, String ipAddress, boolean encrypt, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<JSONArray> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+        data.setObjects(jsonArray);
+
+        LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), encrypt);
+        new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("propertyRead onSuccess");
+                    callBack.onSuccess(msg.toString());
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
+    }
+
+    /**
+     * 鏈嶅姟璋冪敤
+     *
+     * @param topic    涓婚
+     * @param callBack 鍥炶皟
+     */
+    public void serviceDown(String topic, JSONArray jsonArray, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<JSONArray> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(jsonArray);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("propertyRead onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+
+    /**
+     * 鏈嶅姟鐘舵�佽幏鍙�
+     *
+     * @param topic    涓婚
+     * @param callBack 鍥炶皟
+     */
+    public void serviceRead(String topic, JSONArray jsonArray, String ipAddress, boolean encrypt, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<JSONArray> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+        data.setObjects(jsonArray);
+
+        LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), encrypt);
+        new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("propertyRead onSuccess");
+                    callBack.onSuccess(msg.toString());
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true).send();
+    }
+
+    /**
+     * 鏈嶅姟鐘舵�佽幏鍙�
+     *
+     * @param topic    涓婚
+     * @param callBack 鍥炶皟
+     */
+    public void serviceRead(String topic, JSONArray jsonArray, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<JSONArray> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(jsonArray);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("propertyRead onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇姣背娉㈠尯鍩�
+     *
+     * @param sid      璇锋眰鍙傛暟 鎸囧畾璇诲彇鐨勮澶噑id
+     * @param callBack 鍥炶皟
+     */
+    public void getMillimeterArea(String sid, HDLLinkTCallBack<List<MMWAreaBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            List<PropertyReadRequest> list = new ArrayList<>();
+            list.add(new PropertyReadRequest(sid));
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.MMW_AREA_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("propertyRead onSuccess");
+                        Type type = new TypeToken<BaseLocalResponse<List<MMWAreaBean>>>() {
+                        }.getType();
+                        List<MMWAreaBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
 
     /**
      * 璇诲彇鐘舵��
@@ -1787,12 +2167,20 @@
                 public void onSucceed(Object msg) {
                     if (msg instanceof LinkResponse) {
                         LogUtils.i("propertyRead onSuccess");
-                        callBack.onSuccess(msg.toString());
+                        Type type = new TypeToken<BaseLocalResponse<String>>() {
+                        }.getType();
+                        String list = LinkResponseUtils.convertLinkResponse(msg, type);
+                        if (list == null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                        } else {
+                            callBack.onSuccess(list);
+                        }
                     }
                 }
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1804,6 +2192,58 @@
                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             }
         }
+    }
+
+    /**
+     * 璇诲彇鐘舵��
+     *
+     * @param sids     璇锋眰鍙傛暟 鎸囧畾璇诲彇鐨勮澶噑id鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void propertyRead(List<String> sids, String gatewayId, String ipAddress, String mac, boolean encrypt, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+
+        String time = String.valueOf(System.currentTimeMillis());
+        final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
+        data.setId(IdUtils.getUUId());
+        data.setTime_stamp(time);
+
+        List<PropertyReadRequest> list = new ArrayList<>();
+        for (String s : sids) {
+            list.add(new PropertyReadRequest(s));
+        }
+        data.setObjects(list);
+
+        String topic = String.format(TopicConstant.PROPERTY_READ, gatewayId);
+
+        LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), encrypt);
+        new HDLConnectHelper(ipAddress, request, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (msg instanceof LinkResponse) {
+                    LogUtils.i("propertyRead onSuccess");
+                    Type type = new TypeToken<BaseLocalResponse<String>>() {
+                    }.getType();
+                    String list = LinkResponseUtils.convertLinkResponse(msg, type);
+                    if (list == null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                    } else {
+                        callBack.onSuccess(list);
+                    }
+                }
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                }
+            }
+        }, true, mac).send();
     }
 
     /**
@@ -1845,6 +2285,105 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    public void getSceneListaa(HDLLinkTCallBack<List<LinkSceneBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+
+        if (!TextUtils.isEmpty("18FE8588AC73E526")) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.SCENE_LIST_GET, "18FE8588AC73E526");
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper("192.168.1.100", request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkSceneBean>>>() {
+                            }.getType();
+                            List<LinkSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    public void getSceneListAiks(GatewayBean bean, HDLLinkTCallBack<List<LinkSceneBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+
+        if (!TextUtils.isEmpty(bean.getDevice_mac())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            JsonObject jsonObject = new JsonObject();
+            jsonObject.addProperty("id", IdUtils.getUUId());
+            jsonObject.addProperty("time_stamp", time);
+
+            String topic = String.format(TopicConstant.SCENE_LIST_GET, bean.getDevice_mac());
+
+            LinkRequest request = new LinkRequest(topic, jsonObject.toString(), false);
+            new HDLConnectHelper(bean.getIp_address(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneList onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkSceneBean>>>() {
+                            }.getType();
+                            List<LinkSceneBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1896,6 +2435,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1944,6 +2484,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -1956,6 +2497,244 @@
             }
         }
     }
+
+    /**
+     * 鍦烘櫙鎺у埗
+     *
+     * @param sids     鍦烘櫙sid鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void controlAiksScene(GatewayBean bean, List<String> sids, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String device_mac = bean.getDevice_mac();
+        if (!TextUtils.isEmpty(device_mac)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<PropertyReadRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            List<PropertyReadRequest> list = new ArrayList<>();
+            for (String s : sids) {
+                list.add(new PropertyReadRequest(s));
+            }
+            data.setObjects(list);
+            String topic = String.format(TopicConstant.SCENE_CONTROL, device_mac);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), false);
+            new HDLConnectHelper(bean.getIp_address(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("controlScene onSuccess");
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缇ゆ帶澧炲垹
+     */
+    public void groupControlEdit(List<LinkGroupControlCreateBean> list, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LinkGroupControlCreateBean>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(list);
+            String topic = String.format(TopicConstant.GROUPCONTROL_EDIT, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneDetail onSuccess");
+                        if (callBack != null) {
+                            callBack.onSuccess(msg.toString());
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缇ゆ帶鎺у埗
+     */
+    public void groupControlControl(JSONObject object, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<JSONObject>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            List<JSONObject> objectList = new ArrayList<>();
+            objectList.add(object);
+            data.setObjects(objectList);
+            String topic = String.format(TopicConstant.GROUPCONTROL_CONTROL, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneDetail onSuccess");
+                        if (callBack != null) {
+                            callBack.onSuccess(msg.toString());
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缇ゆ帶鍒犻櫎
+     */
+    public void groupControlDelete(JSONObject object, HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<JSONObject>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            List<JSONObject> objectList = new ArrayList<>();
+            objectList.add(object);
+            data.setObjects(objectList);
+            String topic = String.format(TopicConstant.GROUPCONTROL_DELETE, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneDetail onSuccess");
+                        if (callBack != null) {
+                            callBack.onSuccess(msg.toString());
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                        HDLLinkLocalSdk.showToast(hdlLinkCode.getMsg());
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
+    /**
+     * 缇ゆ帶鍒楄〃鑾峰彇
+     */
+    public void getGroupControlList(List<JSONObject> list, HDLLinkTCallBack<List<LinkGroupControlCreateBean>> callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<JSONObject>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+            data.setObjects(list);
+            String topic = String.format(TopicConstant.GROUPCONTROL_LIST_GET, gatewayId);
+
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(data), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        LogUtils.i("getSceneDetail onSuccess");
+                        if (callBack != null) {
+                            Type type = new TypeToken<BaseLocalResponse<List<LinkGroupControlCreateBean>>>() {
+                            }.getType();
+                            List<LinkGroupControlCreateBean> list = LinkResponseUtils.convertLinkResponse(msg, type);
+                            if (list == null) {
+                                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_PARSING_ERROR));
+                            } else {
+                                callBack.onSuccess(list);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
 
     /**
      * 閫氱敤UDP鍙戦�佹寚浠�
@@ -2038,10 +2817,13 @@
      *
      * @param callBack 鍥炶皟鎵�鏈夎鍙栧埌鐨勭綉鍏冲垪琛�
      */
+    public void refreshGateway(GatewayCallBack callBack) {
+        HDLLinkLocalGateway.getInstance().refreshGateway(callBack);
+    }
+
     public void refreshGateway(GatewayCallBack callBack,List<String> spks) {
         HDLLinkLocalGateway.getInstance().refreshGateway(callBack,spks);
     }
-
     /**
      * 鑾峰彇褰撳墠浣忓畢缂撳瓨鐨勬墍鏈夌綉鍏筹紝涓�鑸槸璋冭瘯杞欢浣跨敤锛屼笁鏂逛笉鐢ㄨ皟璇曟鏂规硶
      * 濡傛灉涔嬪墠杩樻病鏈夎鍙栬繃缃戝叧锛屽厛璋冪敤鏂规硶refreshGatewayByHome璇诲彇涓�娆�
@@ -2090,6 +2872,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -2133,6 +2916,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -2145,6 +2929,51 @@
             }
         }
     }
+
+    /**
+     * 鍏ㄩ噺鏇存柊鎴块棿鍒楄〃
+     *
+     * @param callBack
+     */
+    public void getGatewaylist(HDLLinkCallBack callBack) {
+        if (null == callBack) {
+            return;
+        }
+        String gatewayId = HDLLinkConfig.getInstance().getGatewayId();
+        if (!TextUtils.isEmpty(gatewayId)) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<JSONObject> senData = new BaseLocalResponse<>();
+            senData.setId(IdUtils.getUUId());
+            senData.setTime_stamp(time);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("device_mac", "0C811A93EA13F1F5");
+            senData.setObjects(jsonObject);
+            String topic = String.format(TopicConstant.GATEWAY_INFO, gatewayId);
+            LinkRequest request = new LinkRequest(topic, GsonConvert.getGson().toJson(senData), HDLLinkConfig.getInstance().isLocalEncrypt());
+            new HDLConnectHelper(HDLLinkConfig.getInstance().getIpAddress(), request, new HDLConnectHelper.HdlSocketListener() {
+                @Override
+                public void onSucceed(Object msg) {
+                    if (msg instanceof LinkResponse) {
+                        callBack.onSuccess(msg.toString());
+                    }
+                }
+
+                @Override
+                public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
+
+                    if (callBack != null) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+                    }
+                }
+            }, true).send();
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
+            }
+        }
+    }
+
 
     /**
      * 鑾峰彇鎴块棿缁戝畾鍏崇郴
@@ -2185,6 +3014,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
 
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
@@ -2230,6 +3060,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -2272,6 +3103,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
@@ -2287,7 +3119,7 @@
     /**
      * 鍒氬垰缁戝畾缃戝叧鐨勬椂鍊欒缃綉鍏崇粡绾害  涓嶉渶瑕佸姞瀵�
      */
-    public void gatewayLocation(String mGatewayId, String longitude, String lat, boolean isEncrypt,HDLLinkTCallBack<String> callBack) {
+    public void gatewayLocation(String mGatewayId, String longitude, String lat, boolean isEncrypt, HDLLinkTCallBack<String> callBack) {
         if (null == callBack) {
             return;
         }
@@ -2314,6 +3146,7 @@
 
                 @Override
                 public void onFailure(HDLLinkCode hdlLinkCode) {
+                    HDLExceptionSubmitUtils.submit(topic, request, HDLLinkCopyException.getErrorWithCode(hdlLinkCode.getCode(), hdlLinkCode.getMsg()));
                     if (callBack != null) {
                         callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
                     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java
index 17b4870..2440999 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicInputBean.java
@@ -24,6 +24,12 @@
      * 鍦扮悊鍥存爮	8 涓嶅仛
      */
     private String condition_type;
+    /**
+     * 娌℃湁璇ュ瓧娈点�佽鍊兼垨0: 鐘舵�佹娴�(姣忔鏀跺埌鐘舵�佸氨鎴愮珛)
+     * 1:鍔ㄤ綔妫�娴�(闇�瑕佸垏鎹㈢姸鎬佹墠鎴愮珛)
+     */
+    private String detect_type;
+    private String identifier;
     //true:涓存椂bypass涓�乫alse:鍚敤涓�  鏄惁杩囨护
     private String bypass;
     private List<LinkCreateLogicInputConditionBean> condition = new ArrayList<>();
@@ -41,6 +47,22 @@
     private LinkCreateSceneFunctionControlAttrsBean controlAttrs;
     private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
 
+    public String getIdentifier() {
+        return identifier == null ? "" : identifier;
+    }
+
+    public void setIdentifier(@NonNull String identifier) {
+        this.identifier = identifier;
+    }
+
+    public String getDetect_type() {
+        return detect_type == null ? "" : detect_type;
+    }
+
+    public void setDetect_type(@NonNull String detect_type) {
+        this.detect_type = detect_type;
+    }
+
     public String getBypass() {
         return bypass == null ? "" : bypass;
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java
index 9b43655..e2010e6 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateLogicOutputBean.java
@@ -33,10 +33,19 @@
     private String oid;
     private String spk;
     private String online;
+    private String identifier;
     private LinkCreateSceneImageBean sceneImage;
     private LinkCreateSceneFunctionControlAttrsBean controlAttrs;
     private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
 
+    public String getIdentifier() {
+        return identifier == null ? "" : identifier;
+    }
+
+    public void setIdentifier(@NonNull String identifier) {
+        this.identifier = identifier;
+    }
+
     public String getStatusDesc() {
         return statusDesc == null ? "" : statusDesc;
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java
index 7b3bb69..91f4f18 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneBean.java
@@ -17,12 +17,39 @@
     private String sid;
     private String group;
     private String can_delete;
+    private String can_edit;
     private String gatewayId;
     private String image;
+    private String from; //鏉ユ簮锛屾柟渚跨綉鍏宠瘑鍒�
+    private String local;
     private List<LinkCreateSceneImageToCloudBean> imageBeans = new ArrayList<>();
     private List<String> uids = new ArrayList<>();
     private List<LinkCreateSceneFunctionBean> functions = new ArrayList<>();
 
+    public String getCan_edit() {
+        return can_edit == null ? "" : can_edit;
+    }
+
+    public void setCan_edit(@NonNull String can_edit) {
+        this.can_edit = can_edit;
+    }
+
+    public String getLocal() {
+        return local == null ? "" : local;
+    }
+
+    public void setLocal(@NonNull String local) {
+        this.local = local;
+    }
+
+    public String getFrom() {
+        return from == null ? "" : from;
+    }
+
+    public void setFrom(@NonNull String from) {
+        this.from = from;
+    }
+
     public String getGatewayId() {
         return gatewayId == null ? "" : gatewayId;
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java
index 1d588dc..a93a83c 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkCreateSceneFunctionBean.java
@@ -23,11 +23,20 @@
     private String name;
     private String online;
     private String type;
+    private String identifier;
     private LinkCreateSceneImageBean sceneImage = new LinkCreateSceneImageBean();
     private List<LinkCreateSceneFunctionStatusBean> status = new ArrayList<>();
     private LinkCreateSceneFunctionControlAttrsBean controlAttrs = new LinkCreateSceneFunctionControlAttrsBean();
     private List<LinkCreateSceneFunctionattributesBean> attributes = new ArrayList<>();
 
+    public String getIdentifier() {
+        return identifier == null ? "" : identifier;
+    }
+
+    public void setIdentifier(@NonNull String identifier) {
+        this.identifier = identifier;
+    }
+
     public LinkCreateSceneImageBean getSceneImage() {
         if (sceneImage == null) {
             sceneImage = new LinkCreateSceneImageBean("0", "https://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/material/appdebug/scene0.png", "/static/images/scene/scene0.png");
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkGroupControlCreateBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkGroupControlCreateBean.java
new file mode 100644
index 0000000..8f65835
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkGroupControlCreateBean.java
@@ -0,0 +1,114 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/6/30
+ * description:
+ */
+public class LinkGroupControlCreateBean implements Serializable {
+    private String sid;
+    private String name;
+    private String type;
+    private List<String> uids = new ArrayList<>();
+    private List<LinkSidSpkBean> sids = new ArrayList<>();
+    /**
+     * "${宸插畬鎴愭暟}/${鎬绘暟}"
+     */
+    private String progress;
+    /**
+     * 1:閰嶇疆涓�
+     * 2:閰嶇疆澶辫触
+     * 3:閰嶇疆鎴愬姛
+     * 4:閮ㄥ垎鎴愬姛
+     */
+    private int state;
+    /**
+     * 鐢ㄦ埛寮�鍏宠褰� 鍙互鎺у埗  榛樿off鏄叧  on鏄紑
+     */
+    private String onoff;
+
+    public LinkGroupControlCreateBean() {
+    }
+
+    public String getOnoff() {
+        return onoff == null ? "" : onoff;
+    }
+
+    public void setOnoff(@NonNull String onoff) {
+        this.onoff = onoff;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getName() {
+        return name == null ? "" : name;
+    }
+
+    public void setName(@NonNull String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type == null ? "" : type;
+    }
+
+    public void setType(@NonNull String type) {
+        this.type = type;
+    }
+
+    public List<String> getUids() {
+        if (uids == null) {
+            return uids = new ArrayList<>();
+        }
+        return uids;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(@NonNull int state) {
+        this.state = state;
+    }
+
+    public void setUids(@NonNull List<String> uids) {
+        this.uids = uids;
+    }
+
+    public List<LinkSidSpkBean> getSids() {
+        if (sids == null) {
+            return sids = new ArrayList<>();
+        }
+        return sids;
+    }
+
+    public String getProgress() {
+        return progress == null ? "" : progress;
+    }
+
+    public void setProgress(@NonNull String progress) {
+        this.progress = progress;
+    }
+
+    public void setSids(@NonNull List<LinkSidSpkBean> sids) {
+        this.sids = sids;
+    }
+
+    public LinkGroupControlCreateBean(String name, String type) {
+        this.name = name;
+        this.type = type;
+    }
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java
index 623f2f0..7cc6785 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSceneBean.java
@@ -16,11 +16,30 @@
     private String delay;//寤惰繜
     private String modify_time;//淇敼鏃堕棿
     private String gatewayId;
+    private String from; //鏉ユ簮锛屾柟渚跨綉鍏宠瘑鍒�
+
+    private String local;
     private LinkCreateSceneBean detailInfo = new LinkCreateSceneBean();//璇︽儏
     /**
      * 涓撻棬缁欏満鏅壒閲忔搷浣滃仛澶勭悊
      */
     private boolean isChoose = false;
+
+    public String getLocal() {
+        return local == null ? "" : local;
+    }
+
+    public void setLocal(@NonNull String local) {
+        this.local = local;
+    }
+
+    public String getFrom() {
+        return from == null ? "" : from;
+    }
+
+    public void setFrom(@NonNull String from) {
+        this.from = from;
+    }
 
     public boolean isChoose() {
         return isChoose;
@@ -40,7 +59,7 @@
 
     @NonNull
     public LinkCreateSceneBean getDetailInfo() {
-        return detailInfo== null ? new LinkCreateSceneBean() : detailInfo;
+        return detailInfo == null ? new LinkCreateSceneBean() : detailInfo;
     }
 
     public void setDetailInfo(@NonNull LinkCreateSceneBean detailInfo) {
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidSpkBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidSpkBean.java
new file mode 100644
index 0000000..06648a4
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/LinkSidSpkBean.java
@@ -0,0 +1,61 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/6/30
+ * description:
+ */
+public class LinkSidSpkBean implements Serializable {
+    private String sid;
+    private String spk;
+    /**
+     * 鍔熻兘sid閰嶇疆鐨勭姸鎬侊紝0琛ㄧず鎴愬姛锛屽叾浠栬〃绀哄け璐�
+     */
+    private int config_state;
+    private String msg;
+
+    public LinkSidSpkBean() {
+    }
+
+    public String getMsg() {
+        return msg == null ? "" : msg;
+    }
+
+    public void setMsg(@NonNull String msg) {
+        this.msg = msg;
+    }
+
+    public int getConfig_state() {
+        return config_state;
+    }
+
+    public void setConfig_state(@NonNull int config_state) {
+        this.config_state = config_state;
+    }
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public LinkSidSpkBean(String sid, String spk) {
+        this.sid = sid;
+        this.spk = spk;
+    }
+
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaBean.java
new file mode 100644
index 0000000..2f5c37f
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaBean.java
@@ -0,0 +1,36 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/11/20
+ * description:
+ */
+public class MMWAreaBean implements Serializable {
+    private String sid;
+    private List<MMWAreaSpaceBean> spaces = new ArrayList<>();
+
+    public String getSid() {
+        return sid == null ? "" : sid;
+    }
+
+    public void setSid(@NonNull String sid) {
+        this.sid = sid;
+    }
+
+    public List<MMWAreaSpaceBean> getSpaces() {
+        if (spaces == null) {
+            return spaces = new ArrayList<>();
+        }
+        return spaces;
+    }
+
+    public void setSpaces(@NonNull List<MMWAreaSpaceBean> spaces) {
+        this.spaces = spaces;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaSpaceBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaSpaceBean.java
new file mode 100644
index 0000000..3dd42e8
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/bean/MMWAreaSpaceBean.java
@@ -0,0 +1,85 @@
+package com.hdl.sdk.link.bean;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/11/20
+ * description:
+ */
+public class MMWAreaSpaceBean implements Serializable {
+    private String space_id;
+    private String space_type;
+    private String space_color;
+    private String space_name;
+    private String x_s;
+    private String x_e;
+    private String y_s;
+    private String y_e;
+
+    public String getSpace_id() {
+        return space_id == null ? "" : space_id;
+    }
+
+    public void setSpace_id(@NonNull String space_id) {
+        this.space_id = space_id;
+    }
+
+    public String getSpace_type() {
+        return space_type == null ? "" : space_type;
+    }
+
+    public void setSpace_type(@NonNull String space_type) {
+        this.space_type = space_type;
+    }
+
+    public String getSpace_color() {
+        return space_color == null ? "" : space_color;
+    }
+
+    public void setSpace_color(@NonNull String space_color) {
+        this.space_color = space_color;
+    }
+
+    public String getSpace_name() {
+        return space_name == null ? "" : space_name;
+    }
+
+    public void setSpace_name(@NonNull String space_name) {
+        this.space_name = space_name;
+    }
+
+    public String getX_s() {
+        return x_s == null ? "" : x_s;
+    }
+
+    public void setX_s(@NonNull String x_s) {
+        this.x_s = x_s;
+    }
+
+    public String getX_e() {
+        return x_e == null ? "" : x_e;
+    }
+
+    public void setX_e(@NonNull String x_e) {
+        this.x_e = x_e;
+    }
+
+    public String getY_s() {
+        return y_s == null ? "" : y_s;
+    }
+
+    public void setY_s(@NonNull String y_s) {
+        this.y_s = y_s;
+    }
+
+    public String getY_e() {
+        return y_e == null ? "" : y_e;
+    }
+
+    public void setY_e(@NonNull String y_e) {
+        this.y_e = y_e;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
index d66e47d..a480450 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/config/TopicConstant.java
@@ -152,6 +152,9 @@
     //璇诲彇鐘舵��
     public static final String PROPERTY_READ = "/base/%s/thing/property/read";
 
+    //鑾峰彇姣背娉㈠尯鍩�
+    public static final String MMW_AREA_GET = "/base/%s/thing/service/sub_space_config_get/down";
+
     //璇诲彇鐘舵�佸搷搴�
     public static final String PROPERTY_READ_REPLY = "/base/%s/thing/property/read_reply";
 
@@ -312,8 +315,25 @@
     public static final String NATIVE_MODBUS_DOWN ="/user/%s/custom/native/inverter/down";
     public static final String NATIVE_MODBUS_UP ="/user/%s/custom/native/inverter/up";
     public static final String NATIVE_MODBUS_DOWN_REPLY ="/user/%s/custom/native/inverter/down_reply";
+    /**
+     * 缇ゆ帶澧炴敼
+     */
+    public static final String GROUPCONTROL_EDIT ="/user/%s/custom/device/group/control/edit";
 
+    /**
+     * 缇ゆ帶鍒楄〃
+     */
+    public static final String GROUPCONTROL_LIST_GET ="/user/%s/custom/device/group/control/list";
     public static final String NATIVE_MODBUS_DOWN_SLAVE ="/user/%s/custom/native/inverter/down/slaveoid/%s";
     public static final String NATIVE_MODBUS_DOWN_SLAVE_REPLY ="/user/%s/custom/native/inverter/down_reply/slaveoid/%s";
+    /**
+     * 缇ゆ帶鍒犻櫎
+     */
+    public static final String GROUPCONTROL_DELETE ="/user/%s/custom/device/group/control/delete";
+
+    /**
+     * 缇ゆ帶鎺у埗
+     */
+    public static final String GROUPCONTROL_CONTROL ="/user/%s/custom/device/group/control/down";
 
 }
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java
index 256bcb7..37f8b50 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/event/EventDispatcher.java
@@ -24,7 +24,7 @@
 
     private static final LockList<EventListener> ALL_TOPICS_EVENT = new LockList<EventListener>();//鎵�鏈変富棰樻秷鎭�
 
-    //    private static final ArrayMap<String, List<EventListener>> EVENT = new ArrayMap<>();
+//    private static final ArrayMap<String, List<EventListener>> EVENT = new ArrayMap<>();
     private static final LockArrayMap<String, List<EventListener>> EVENT = new LockArrayMap<String, List<EventListener>>();
 
     private static final ExecutorService ioThread = ThreadToolUtils.getInstance().newFixedThreadPool(2);
@@ -99,7 +99,7 @@
                         if (ev != null && !ev.isEmpty()) {
 //                            TYPE.remove(listener);
                             ev.remove(listener);
-                            LogUtils.i(String.format("绉婚櫎璁㈤槄涓婚:%s,褰撳墠鍥炶皟鏁伴噺:%s", tag, ev.size()));
+                            LogUtils.i(String.format("绉婚櫎璁㈤槄涓婚:%s,褰撳墠鍥炶皟鏁伴噺:%s",tag,ev.size()));
                         }
                     }
                 } catch (Exception e) {
@@ -112,12 +112,11 @@
 
     /**
      * 涓や釜涓婚鏄惁鍖归厤
-     *
-     * @param desString    瀛楀吀涓殑涓婚
+     * @param desString 瀛楀吀涓殑涓婚
      * @param sourceString 鎺ユ敹鍒扮殑涓婚
      * @return
      */
-    boolean isMatch(String desString, String sourceString) {
+    boolean isMatch(String desString,String sourceString) {
         String[] des = desString.split("/");
         String[] source = sourceString.split("/");
         if (des.length != source.length) {
@@ -136,11 +135,10 @@
 
     /**
      * 浜嬩欢鍒嗗彂鍣紝鍒嗗彂鎵�鏈夊湪鎺ュ彛鍒楄〃涓殑浜嬩欢
-     *
-     * @param topicTag -
-     * @param o        -
+     * @param topicTag
+     * @param o
      */
-    public synchronized void post(String topicTag, final Object o) {
+    public synchronized void post(String topicTag, @NonNull Object o) {
         try {
             for (String key : EVENT.keySet()) {
                 if (!isMatch(key, topicTag)) {
@@ -170,16 +168,16 @@
             }
             //寮�鍙戝垎鍙戜簨浠�
             for (EventListener listener : ALL_TOPICS_EVENT) {
-//                ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
-//                    @Override
-//                    public void run() {
-                if (listener != null) {
-                    listener.onMessage(o);
-                }
-//                    }
-//                });
+                ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (listener != null) {
+                            listener.onMessage(o);
+                        }
+                    }
+                });
             }
-        } catch (Exception e) {
+        }catch (Exception e){
             LogUtils.e(e.getMessage());
         }
 
@@ -191,10 +189,8 @@
     public synchronized void filePost() {
         //TODO
     }
-
     /**
      * 娉ㄥ唽鎵�鏈変富棰樻秷鎭殑鐩戝惉
-     *
      * @param listener
      */
     public synchronized void registerAllTopicsListener(EventListener listener) {
@@ -210,7 +206,6 @@
 
     /**
      * 鍙栨秷鎵�鏈変富棰樻秷鎭殑鐩戝惉
-     *
      * @param listener
      */
     public synchronized void removeAllTopicsListener(EventListener listener) {
@@ -229,13 +224,13 @@
         });
     }
 
-    private synchronized void clear() {
+    public synchronized void clear() {
         ALL_TOPICS_EVENT.clear();
         EVENT.clear();
 //        TYPE.clear();
     }
 
-    private synchronized void release() {
+    public synchronized void release() {
         clear();
         ioThread.shutdownNow();
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java
index a2c6adf..2597fa7 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/exception/HDLLinkCode.java
@@ -14,33 +14,31 @@
  * @Description : HDLError
  */
 public class HDLLinkCode {
-    public static final HDLLinkCode HDL_UNKOWN_CODE = new HDLLinkCode(-1000, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNKOWN_CODE));
-    public static final HDLLinkCode HDL_DATA_ERROR = new HDLLinkCode(-2000, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_ERROR));
-    public static final HDLLinkCode HDL_DATA_NULL_ERROR = new HDLLinkCode(-2001, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_NULL_ERROR));
-    public static final HDLLinkCode HDL_AUTH_ERROR = new HDLLinkCode(2002, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR));
-    public static final HDLLinkCode HDL_SEND_ERROR = new HDLLinkCode(2003, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEND_ERROR));
-    public static final HDLLinkCode HDL_TIMEOUT_ERROR = new HDLLinkCode(2004, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TIMEOUT_ERROR));
-    public static final HDLLinkCode HDL_UNAUTHORIZED_ERROR = new HDLLinkCode(-2005, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNAUTHORIZED_ERROR));
-    public static final HDLLinkCode HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED = new HDLLinkCode(-2006, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED));
-    public static final HDLLinkCode HDL_SEARCH_GATEWAY_TIMEOUT_ERROR = new HDLLinkCode(-2007, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEARCH_GATEWAY_TIMEOUT_ERROR));
-    public static final HDLLinkCode HDL_AUTH_MAC_KEY_ERROR = new HDLLinkCode(-2008, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_MAC_KEY_ERROR));
-    public static final HDLLinkCode HDL_DATA_PARSING_ERROR = new HDLLinkCode(-2009, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_PARSING_ERROR));
-    public static final HDLLinkCode HDL_GET_DEVICE_LIST_ERROR = new HDLLinkCode(-2100, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_DEVICE_LIST_ERROR));
-    public static final HDLLinkCode HDL_GET_FUNCTION_LIST_ERROR = new HDLLinkCode(-2101, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_LIST_ERROR));
-    public static final HDLLinkCode HDL_GET_FUNCTION_PROPERTIES_ERROR = new HDLLinkCode(-2102, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_PROPERTIES_ERROR));
-    public static final HDLLinkCode HDL_CONTROL_FAILURE_ERROR = new HDLLinkCode(-2103, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_CONTROL_FAILURE_ERROR));
-    public static final HDLLinkCode HDL_GET_GATEWAY_FAILURE_ERROR = new HDLLinkCode(-2104, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_GATEWAY_FAILURE_ERROR));
-    public static final HDLLinkCode HDL_GET_Zigbee_FAILURE_ERROR = new HDLLinkCode(-2105, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_FAILURE_ERROR));
-    public static final HDLLinkCode HDL_GATEWAY_NOT_EXIST = new HDLLinkCode(-2106, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GATEWAY_NOT_EXIST));
-    public static final HDLLinkCode HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR = new HDLLinkCode(-2107, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR));
-    public static final HDLLinkCode HDL_MILLIMETER_NOT_EXIST = new HDLLinkCode(-2108, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_MILLIMETER_NOT_EXIST));
-    public static final HDLLinkCode HDL_APPLICATION_CODE = new HDLLinkCode(-2109, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_APPLICATION_EXCEPTION));
-    public static final HDLLinkCode HDL_TOPIC_NOT_RIGHT = new HDLLinkCode(-2110, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TOPIC_NOT_RIGHT));
-    public static final HDLLinkCode HDL_OBJECT_NOT_SUPPORT = new HDLLinkCode(-2111, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_OBJECT_NOT_SUPPORT));
-    public static final HDLLinkCode HDL_GATEWAY_REMOTE_NOT_RESPONSE = new HDLLinkCode(-2112, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GATEWAY_REMOTE_NOT_RESPONSE));
-    public static final HDLLinkCode HDL_SUCCESS = new HDLLinkCode(0, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.SUCCESS));
-    public static final HDLLinkCode HDL_GATEWAY_FOUND_LOCALLY = new HDLLinkCode(-2113, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GATEWAY_FOUND_LOCALLY));
-
+    public static final HDLLinkCode HDL_UNKOWN_CODE=new HDLLinkCode(-1000,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNKOWN_CODE));
+    public static final HDLLinkCode HDL_DATA_ERROR =new HDLLinkCode(-2000, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_ERROR)) ;
+    public static final HDLLinkCode HDL_DATA_NULL_ERROR=new HDLLinkCode(-2001, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_NULL_ERROR));
+    public static final HDLLinkCode HDL_AUTH_ERROR=new HDLLinkCode(2002,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR) );
+    public static final HDLLinkCode HDL_SEND_ERROR=new HDLLinkCode(2003, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEND_ERROR));
+    public static final HDLLinkCode HDL_TIMEOUT_ERROR=new HDLLinkCode(2004, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TIMEOUT_ERROR));
+    public static final HDLLinkCode HDL_UNAUTHORIZED_ERROR=new HDLLinkCode(-2005,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_UNAUTHORIZED_ERROR));
+    public static final HDLLinkCode HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED=new HDLLinkCode(-2006, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED));
+    public static final HDLLinkCode HDL_SEARCH_GATEWAY_TIMEOUT_ERROR=new HDLLinkCode(-2007, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_SEARCH_GATEWAY_TIMEOUT_ERROR));
+    public static final HDLLinkCode HDL_AUTH_MAC_KEY_ERROR=new HDLLinkCode(-2008, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_AUTH_MAC_KEY_ERROR));
+    public static final HDLLinkCode HDL_DATA_PARSING_ERROR=new HDLLinkCode(-2009, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_DATA_PARSING_ERROR));
+    public static final HDLLinkCode HDL_GET_DEVICE_LIST_ERROR=new HDLLinkCode(-2100, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_DEVICE_LIST_ERROR));
+    public static final HDLLinkCode HDL_GET_FUNCTION_LIST_ERROR=new HDLLinkCode(-2101, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_LIST_ERROR));
+    public static final HDLLinkCode HDL_GET_FUNCTION_PROPERTIES_ERROR=new HDLLinkCode(-2102, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_FUNCTION_PROPERTIES_ERROR));
+    public static final HDLLinkCode HDL_CONTROL_FAILURE_ERROR=new HDLLinkCode(-2103, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_CONTROL_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GET_GATEWAY_FAILURE_ERROR=new HDLLinkCode(-2104, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_GATEWAY_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GET_Zigbee_FAILURE_ERROR=new HDLLinkCode(-2105, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_GATEWAY_NOT_EXIST=new HDLLinkCode(-2106,HDLLinkLocalSdk.getInstance().getContext().getString( R.string.HDL_GATEWAY_NOT_EXIST));
+    public static final HDLLinkCode HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR=new HDLLinkCode(-2107, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR));
+    public static final HDLLinkCode HDL_MILLIMETER_NOT_EXIST=new HDLLinkCode(-2108, HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_MILLIMETER_NOT_EXIST));
+    public static final HDLLinkCode HDL_APPLICATION_CODE=new HDLLinkCode(-2109,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_APPLICATION_EXCEPTION));
+    public static final HDLLinkCode HDL_TOPIC_NOT_RIGHT=new HDLLinkCode(-2110,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_TOPIC_NOT_RIGHT));
+    public static final HDLLinkCode HDL_OBJECT_NOT_SUPPORT=new HDLLinkCode(-2111,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_OBJECT_NOT_SUPPORT));
+    public static final HDLLinkCode HDL_GATEWAY_REMOTE_NOT_RESPONSE=new HDLLinkCode(-2112,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.HDL_GATEWAY_REMOTE_NOT_RESPONSE));
+    public static final HDLLinkCode HDL_SUCCESS=new HDLLinkCode(0,HDLLinkLocalSdk.getInstance().getContext().getString(R.string.SUCCESS));
     private String msg;
     private int code;
 
@@ -48,7 +46,6 @@
         this.msg = msg;
         this.code = code;
     }
-
     public String getMsg() {
         return msg;
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java
index 2c2f4a1..e4f6a9d 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/common/utils/ByteUtils.java
@@ -203,8 +203,41 @@
     }
 
     public static int byteArrayToInt(byte[] b) {
-        return (b[0] & 0xFF) * 256 * 256 * 256 + (b[1] & 0xFF) * 256 * 256 + (b[2] & 0xFF) * 256 + (b[3] & 0xFF);
+        int i = (b[0] & 0xFF) * 256 * 256 * 256 + (b[1] & 0xFF) * 256 * 256 + (b[2] & 0xFF) * 256 + (b[3] & 0xFF);
+        return i;
     }
 
+    /**
+     * 瑙e瘑
+     *
+     * @param contentByte 寰呰В瀵嗗緟瀛楃涓瞙exStr
+     * @param contentByte 瀵嗛挜
+     * @return
+     */
+    public static byte[] decrypt(byte[] contentByte) {
+        try {
+            //KEY杞崲
+            Key key = new SecretKeySpec("HDLRDCENTER1985.".getBytes(), "AES");
+            //瑙e瘑
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            IvParameterSpec ivps = new IvParameterSpec("HDLRDCENTER1985.".getBytes());
+            cipher.init(Cipher.DECRYPT_MODE, key, ivps);
+            byte[] result = cipher.doFinal(contentByte);
+            return result;
+        } catch (NoSuchAlgorithmException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidKeyException e) {
+            LogUtils.e(e.getMessage());
+        } catch (NoSuchPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (BadPaddingException e) {
+            LogUtils.e(e.getMessage());
+        } catch (IllegalBlockSizeException e) {
+            LogUtils.e(e.getMessage());
+        } catch (InvalidAlgorithmParameterException e) {
+            LogUtils.e(e.getMessage());
+        }
+        return null;
+    }
 
 }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java
index b874aeb..2f8e8d7 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkRequest.java
@@ -4,8 +4,6 @@
 
 import com.hdl.sdk.link.common.utils.ByteUtils;
 
-import java.nio.charset.StandardCharsets;
-
 
 /**
  * Created by Tong on 2021/9/29.
@@ -125,7 +123,7 @@
                     "Length:" +
                     getLength() +
                     "\r\n\r\n";
-            return ByteUtils.concatBytes(header.getBytes(StandardCharsets.UTF_8), getData());
+            return ByteUtils.concatBytes(header.getBytes("utf-8"), getData());
         } catch (Exception e) {
             return new byte[]{};
         }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java
index 5a58a0d..ad2f655 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/LinkResponse.java
@@ -34,7 +34,7 @@
 
     public void setByteData(byte []data) {
         this.byteData = data;
-//        this.data = new String(data);
+        this.data = new String(data);
         this.length=data.length;
     }
 
@@ -45,7 +45,7 @@
     public void setData(String data) {
         this.data = data;
         if (!TextUtils.isEmpty(data)) {
-//            this.byteData = data.getBytes();
+            this.byteData = data.getBytes();
             setLength(data.length());
         } else {
             setLength(0);
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddAIMillimeterZTSuccessInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddAIMillimeterZTSuccessInfo.java
new file mode 100644
index 0000000..5daca20
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddAIMillimeterZTSuccessInfo.java
@@ -0,0 +1,13 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+/**
+ * Created by Zoro
+ * Created on 2023/9/18
+ * description:
+ */
+public class EventNotifyAddAIMillimeterZTSuccessInfo implements Serializable {
+    public EventNotifyAddAIMillimeterZTSuccessInfo() {
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddSlaveGatewaySuccessInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddSlaveGatewaySuccessInfo.java
new file mode 100644
index 0000000..c0b93ce
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAddSlaveGatewaySuccessInfo.java
@@ -0,0 +1,60 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2022/6/29
+ * description:
+ */
+public class EventNotifyAddSlaveGatewaySuccessInfo implements Serializable {
+
+    private String mac;
+    private String auth_code;
+    private String result;
+    private String message;
+
+    public EventNotifyAddSlaveGatewaySuccessInfo(String mac, String auth_code, String result, String message) {
+        this.mac = mac;
+        this.auth_code = auth_code;
+        this.result = result;
+        this.message = message;
+    }
+
+    public String getMac() {
+        return mac == null ? "" : mac;
+    }
+
+    public void setMac(@NonNull String mac) {
+        this.mac = mac;
+    }
+
+    public String getAuth_code() {
+        return auth_code == null ? "" : auth_code;
+    }
+
+    public void setAuth_code(@NonNull String auth_code) {
+        this.auth_code = auth_code;
+    }
+
+    public String getResult() {
+        return result == null ? "" : result;
+    }
+
+    public void setResult(@NonNull String result) {
+        this.result = result;
+    }
+
+    public String getMessage() {
+        return message == null ? "" : message;
+    }
+
+    public void setMessage(@NonNull String message) {
+        this.message = message;
+    }
+
+    public EventNotifyAddSlaveGatewaySuccessInfo() {
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAiMillimeterZTMacInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAiMillimeterZTMacInfo.java
new file mode 100644
index 0000000..a0004af
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/eventbus/EventNotifyAiMillimeterZTMacInfo.java
@@ -0,0 +1,26 @@
+package com.hdl.sdk.link.core.bean.eventbus;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/10/19
+ * description:
+ */
+public class EventNotifyAiMillimeterZTMacInfo implements Serializable {
+    private String mac;
+
+    public EventNotifyAiMillimeterZTMacInfo(String mac) {
+        this.mac = mac;
+    }
+
+    public String getMac() {
+        return mac == null ? "" : mac;
+    }
+
+    public void setMac(@NonNull String mac) {
+        this.mac = mac;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/DeviceRemoteInfo.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/DeviceRemoteInfo.java
new file mode 100644
index 0000000..465809b
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/DeviceRemoteInfo.java
@@ -0,0 +1,71 @@
+package com.hdl.sdk.link.core.bean.gateway;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/10/25
+ * description:
+ */
+public class DeviceRemoteInfo implements Serializable {
+
+    private String gatewayId;
+    private boolean encrypt;//鏄惁鍔犲瘑
+    private int algorithmType;//0.SM4  1.AES  2.涓嶅姞瀵�
+    private String spk;
+    private String mac;//璁惧mac
+    private String secret;//绉侀挜
+
+    public String getGatewayId() {
+        return gatewayId == null ? "" : gatewayId;
+    }
+
+    public void setGatewayId(@NonNull String gatewayId) {
+        this.gatewayId = gatewayId;
+    }
+
+    public boolean isEncrypt() {
+        return encrypt;
+    }
+
+    public void setEncrypt(@NonNull boolean encrypt) {
+        this.encrypt = encrypt;
+    }
+
+    public int getAlgorithmType() {
+        return algorithmType;
+    }
+
+    public void setAlgorithmType(@NonNull int algorithmType) {
+        this.algorithmType = algorithmType;
+    }
+
+    public String getSpk() {
+        return spk == null ? "" : spk;
+    }
+
+    public void setSpk(@NonNull String spk) {
+        this.spk = spk;
+    }
+
+    public String getMac() {
+        return mac == null ? "" : mac;
+    }
+
+    public void setMac(@NonNull String mac) {
+        this.mac = mac;
+    }
+
+    public String getSecret() {
+        return secret == null ? "" : secret;
+    }
+
+    public void setSecret(@NonNull String secret) {
+        this.secret = secret;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java
index 38dd20e..a16c7fd 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/GatewayBean.java
@@ -77,9 +77,10 @@
     private String deviceId;
 
     /**
-     * sid
+     * 姣背娉id
      */
     private String sid;
+
 
 
     private String spk = "energy.hdl_inverter";
@@ -87,9 +88,14 @@
 
     private String systemStatusDesc;//浜戠-鐘舵��
 
+
     private String hwVersion;//浜戠-杞欢鐗堟湰鍙�
     private String categorySecondName;//浜戠-璁惧绫诲瀷(浜у搧浜岀骇鍒嗙被鍚嶇О)
 
+    /**
+     * 璁惧鏉ユ簮(鑷畾涔�:0=琛ㄧず缃戝叧;1=琛ㄧず骞冲彴)
+     */
+    private String src;
 
     //瀛愮綉鍙�/璁惧鍙�
     private String addresses;
@@ -100,6 +106,26 @@
     private String powerPvNow;//鍙戠數鍔熺巼
     private String totalElectricityPvToday;//浠婃棩鍙戠數閲�
 
+    /**
+     * 鎴块棿褰掑睘
+     */
+    private List<String> uids = new ArrayList<>();
+
+    public List<String> getUids() {
+        return uids;
+    }
+
+    public void setUids(List<String> uids) {
+        this.uids = uids;
+    }
+
+    public String getSrc() {
+        return src == null ? "" : this.src;
+    }
+
+    public void setSrc(String src) {
+        this.src = src;
+    }
 
     public String getAesKey() {
         return aesKey == null ? "" : aesKey;
@@ -219,7 +245,7 @@
      */
     @NonNull
     public String getGatewayType() {
-        return gatewayType == null ? "" : gatewayType;
+        return gatewayType == null ? gateway_type == null ? "" : gateway_type : gatewayType;
     }
 
     /**
@@ -371,21 +397,26 @@
     }
 
 
+
     public String getSystemStatusDesc() {
         return systemStatusDesc == null ? "" : systemStatusDesc;
     }
+
 
     public void setSystemStatusDesc(String systemStatusDesc) {
         this.systemStatusDesc = systemStatusDesc;
     }
 
+
     public String getHwVersion() {
         return hwVersion == null ? "" : hwVersion;
     }
 
+
     public void setHwVersion(String hwVersion) {
         this.hwVersion = hwVersion;
     }
+
 
     public String getCategorySecondName() {
         return categorySecondName == null ? "" : categorySecondName;
@@ -395,42 +426,52 @@
         this.categorySecondName = categorySecondName;
     }
 
+
     public String getAddresses() {
         return addresses == null ? "" : addresses;
     }
+
 
     public void setAddresses(String addresses) {
         this.addresses = addresses;
     }
 
+
     public int getDeviceStatus() {
         return deviceStatus;
     }
+
 
     public void setDeviceStatus(int deviceStatus) {
         this.deviceStatus = deviceStatus;
     }
 
+
     public String getPowerPvNow() {
         return powerPvNow == null ? "" : powerPvNow;
     }
+
 
     public void setPowerPvNow(String powerPvNow) {
         this.powerPvNow = powerPvNow;
     }
 
+
     public String getTotalElectricityPvToday() {
         return totalElectricityPvToday == null ? "" : totalElectricityPvToday;
     }
+
 
     public void setTotalElectricityPvToday(String totalElectricityPvToday) {
         this.totalElectricityPvToday = totalElectricityPvToday;
     }
 
+
     public String getSpk() {
         return spk == null ? "" : spk;
     }
 
+
     public void setSpk(String spk) {
         this.spk = spk;
     }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinAllBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinAllBean.java
new file mode 100644
index 0000000..e707f63
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinAllBean.java
@@ -0,0 +1,45 @@
+package com.hdl.sdk.link.core.bean.gateway;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/10/24
+ * description:
+ */
+public class SlaveGatewayJoinAllBean implements Serializable {
+    private String id;
+    private String time_stamp;
+    private List<SlaveGatewayJoinBean> objects = new ArrayList<>();
+
+    public String getId() {
+        return id == null ? "" : id;
+    }
+
+    public void setId(@NonNull String id) {
+        this.id = id;
+    }
+
+    public String getTime_stamp() {
+        return time_stamp == null ? "" : time_stamp;
+    }
+
+    public void setTime_stamp(@NonNull String time_stamp) {
+        this.time_stamp = time_stamp;
+    }
+
+    public List<SlaveGatewayJoinBean> getObjects() {
+        if (objects == null) {
+            return objects = new ArrayList<>();
+        }
+        return objects;
+    }
+
+    public void setObjects(@NonNull List<SlaveGatewayJoinBean> objects) {
+        this.objects = objects;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinBean.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinBean.java
new file mode 100644
index 0000000..0bccc53
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/bean/gateway/SlaveGatewayJoinBean.java
@@ -0,0 +1,49 @@
+package com.hdl.sdk.link.core.bean.gateway;
+
+import java.io.Serializable;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Created by Zoro
+ * Created on 2023/10/24
+ * description:
+ */
+public class SlaveGatewayJoinBean implements Serializable {
+    private String mac;
+    private String auth_code;
+    private String result;
+    private String message;
+
+    public String getMac() {
+        return mac == null ? "" : mac;
+    }
+
+    public void setMac(@NonNull String mac) {
+        this.mac = mac;
+    }
+
+    public String getAuth_code() {
+        return auth_code == null ? "" : auth_code;
+    }
+
+    public void setAuth_code(@NonNull String auth_code) {
+        this.auth_code = auth_code;
+    }
+
+    public String getResult() {
+        return result == null ? "" : result;
+    }
+
+    public void setResult(@NonNull String result) {
+        this.result = result;
+    }
+
+    public String getMessage() {
+        return message == null ? "" : message;
+    }
+
+    public void setMessage(@NonNull String message) {
+        this.message = message;
+    }
+}
\ No newline at end of file
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java
index 200b35e..4bdf82f 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/callback/HDLLinkCallBack.java
@@ -5,6 +5,6 @@
  *
  * @Description : HDLLinkCallBack
  */
-public interface HDLLinkCallBack extends BaseCallBack {
+public interface HDLLinkCallBack extends BaseCallBack{
     void onSuccess(String msg);
 }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java
index 549d298..61564cc 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/connect/HDLConnectHelper.java
@@ -114,7 +114,7 @@
                         /**
                          * 鍙兘杩斿洖code灞炴�у彲鑳芥病鏈�   娌℃湁鐨勮瘽鐩存帴鎴愬姛  鏈夌殑璇濆彧鏈�200鎵嶄細鎴愬姛
                          */
-                        if (code == null || code == 200 || code == 0) {
+                        if (code == null || code.intValue() == 200 || code.intValue() == 0) {
                             notifySucceed(msg);
                         } else {
                             notifyFailure(ErrorUtils.getByCode(code));
@@ -325,8 +325,10 @@
                                     String requestTopic = linkRequest.getCloudTopic();
                                     byte[] encryBytes = null;
                                     GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getLocalGateway(mac);
-                                    if (gatewayBean != null && getGatewayTypeList().contains(gatewayBean.getGatewayType())) {
-                                        //閫嗗彉鍣ㄨ繙绋媘qtt绉橀挜涓嶄竴鏍�
+                                    if (gatewayBean != null && getMillimeterTypeList().contains(gatewayBean.getGatewayType())) {
+                                        /**
+                                         * 姣背娉㈣繖杈硅幏鍙栨暟鎹殑鏃跺��  宸茬粡璁剧疆浜嗕富浠庡瘑閽ヨ繘鍘讳簡 杩欒竟涓嶄綔澶勭悊
+                                         */
                                         encryBytes = EncryptUtil.encryBytes(linkRequest.getCloudSendBytes(), gatewayBean.getAesKey());
                                     } else {
                                         encryBytes = EncryptUtil.encryBytes(linkRequest.getCloudSendBytes(), HDLLinkConfig.getInstance().getAesKey());
@@ -334,20 +336,12 @@
                                     if (MqttRecvClient.getInstance() != null) {
                                         MqttRecvClient.getInstance().send(requestTopic, encryBytes);
                                     }
-                                    if (HDLConnectHelper.isInverterTopic(linkRequest.getCloudTopic())) {
-                                        LogUtils.i("杩滅▼鍙戦�佹暟鎹細" + linkRequest.getCloudTopic() + "\r\n" + Arrays.toString(byteArrayConvertIntArray(linkRequest.getCloudSendBytes())));
-                                    } else {
-                                        LogUtils.i("杩滅▼鍙戦�佹暟鎹細" + linkRequest.getCloudTopic() + "\r\n" + new String(linkRequest.getCloudSendBytes()));
-                                    }
+                                    LogUtils.i("杩滅▼鍙戦�佹暟鎹細" + linkRequest.getCloudTopic() + "\r\n" + new String(linkRequest.getCloudSendBytes()));
                                 }
                                 //鏈湴TCP
                                 else {
                                     if (!linkRequest.getTopic().endsWith("heartbeat")) {//蹇冭烦涓婚鏁版嵁杩囧锛岃繃婊や笅
-                                        if (HDLConnectHelper.isInverterTopic(linkRequest.getTopic())) {
-                                            LogUtils.i("鏈湴鍙戦�佹暟鎹細\r\n" + Arrays.toString(byteArrayConvertIntArray(linkRequest.getSendBytes())));
-                                        } else {
-                                            LogUtils.i("鏈湴鍙戦�佹暟鎹細\r\n" + new String(linkRequest.getSendBytes()));
-                                        }
+                                        LogUtils.i("鏈湴鍙戦�佹暟鎹細\r\n" + new String(linkRequest.getSendBytes()));
                                     }
                                     HDLTcpConnect.getTcpSocketBoot(ipAddress).sendMsg(EncryptUtil.getEncryBytes(linkRequest));
                                 }
@@ -419,6 +413,7 @@
     }
 
 
+
     /**
      * 鏀寔姣背绫诲瀷
      *
@@ -429,6 +424,24 @@
 //        typeList.add("sensor.mmv_sleep");//鐫$湢姣背娉pk
 //        typeList.add("sensor.mmv_pose");//濮挎�佹绫虫尝spk
         typeList.add("energy.hdl_inverter");//閫嗗彉鍣╯pk
+        typeList.add("sensor.mmv_sleep");//鐫$湢姣背娉pk
+        typeList.add("sensor.mmv_pose");//濮挎�佹绫虫尝spk
+        typeList.add("sensor.hdl_mmw_pose");//Wi-Fi姣背娉T鐗堟湰
+        return typeList;
+    }
+
+    public static List<String> getMillimeterTypeList() {
+        List<String> typeList = new ArrayList<>();
+//        typeList.add("AGATEWAY");//缃戝叧
+        typeList.add("sensor.mmv_sleep");//鐫$湢姣背娉pk
+        typeList.add("sensor.mmv_pose");//濮挎�佹绫虫尝spk
+        typeList.add("sensor.hdl_mmw_pose");//Wi-Fi姣背娉T鐗堟湰
+        return typeList;
+    }
+
+    public static List<String> getNewMillimeterTypeList() {
+        List<String> typeList = new ArrayList<>();
+        typeList.add("sensor.hdl_mmw_pose");//Wi-Fi姣背娉T鐗堟湰
         return typeList;
     }
 
@@ -446,6 +459,7 @@
     }
 
 
+
     public static boolean isInverterTopic(String topic) {
         if (TextUtils.isEmpty(topic)) {
             return false;
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java
index 1aac1f7..b4c04e5 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/QueueUtils.java
@@ -114,13 +114,14 @@
                 response.setByteData(bodyBytes);
             } else {
                 LogUtils.e("瑙e瘑澶辫触\r\n" + linkPacket.getTopic() + "\r\n" + ByteUtils.encodeHexString(linkPacket.getBody()));
-                response.setData(new String(linkPacket.getBody(), StandardCharsets.UTF_8));
                 response.setByteData(linkPacket.getBody());
+                response.setData(new String(linkPacket.getBody(), "utf-8"));
             }
         } else {
-            response.setData(new String(linkPacket.getBody(), StandardCharsets.UTF_8));
             response.setByteData(linkPacket.getBody());
+            response.setData(new String(linkPacket.getBody(), "utf-8"));
         }
+
 
         if (HDLConnectHelper.isLocal()) {
             if (HDLConnectHelper.isInverterTopic(response.getTopic())) {
@@ -128,6 +129,20 @@
             } else {
                 LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData());
             }
+//            if (!"/user/all/custom/gateway/broadcast".equals(response.getTopic())) {
+//                LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData());
+//            }
+//            if(response.getTopic().contains("/custom/scene/list/get_reply")){
+//                response.setData(response.getData()+"\":1}");
+//            }
+//            LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData()+ "\r\n" + response.getData().length());
+        }
+        if (response.getTopic().contains("/user/all/custom/gateway/")) {
+//            LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData() + "\r\n" + response.getData().length());
+        } else if (response.getTopic().contains("thing/property/up")) {
+//            LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData() + "\r\n" + response.getData().length());
+        } else {
+            LogUtils.i("鏈湴鎺ユ敹鍒版暟鎹�:\r\n" + response.getTopic() + "\r\n" + response.getData() + "\r\n" + response.getData().length());
         }
         //瑙f瀽瀹屾垚,topic鍙戦�佷竴娆�
         EventDispatcher.getInstance().post(response.getTopic(), response);
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java
index d6a0d1a..09cc1e0 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/core/utils/mqtt/MqttRecvClient.java
@@ -150,16 +150,16 @@
             connOpts.setCleanSession(true);
             connOpts.setKeepAliveInterval(10);
             connOpts.setAutomaticReconnect(true);
-            connOpts.setConnectionTimeout(10);
+            connOpts.setConnectionTimeout(60);
             connOpts.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);
             sampleClient.setCallback(new MqttCallbackExtended() {
                 public void connectComplete(boolean reconnect, String serverURI) {
-                    LogUtils.d(TAG, "mqtt杩炴帴鎴愬姛");
+                    LogUtils.d(TAG, "connect success");
                     checkAndsubscribeAllTopics("");
                 }
 
                 public void connectionLost(Throwable throwable) {
-                    LogUtils.d(TAG, "mqtt杩炴帴鏂紑");
+                    LogUtils.d(TAG, "杩炴帴鏂紑");
                     lastTopicFilters.clear();
                 }
 
@@ -209,13 +209,14 @@
                 return;
             }
             LogUtils.d(TAG, "缃戝叧閲嶈繛mqtt绉橀挜鏇存柊閫氱煡->" + topic);
+
             BaseEventBus baseEventBus=new BaseEventBus();
             baseEventBus.setTopic(topic);
             EventBus.getDefault().post(baseEventBus);
 
-//            EventNotifyRefreshGatewayAesKeyInfo eventNotifyRefreshGatewayAesKeyInfo = new EventNotifyRefreshGatewayAesKeyInfo();
-//            eventNotifyRefreshGatewayAesKeyInfo.setGatewayId(topics[2]);
-//            EventBus.getDefault().post(eventNotifyRefreshGatewayAesKeyInfo);
+            EventNotifyRefreshGatewayAesKeyInfo eventNotifyRefreshGatewayAesKeyInfo = new EventNotifyRefreshGatewayAesKeyInfo();
+            eventNotifyRefreshGatewayAesKeyInfo.setGatewayId(topics[2]);
+            EventBus.getDefault().post(eventNotifyRefreshGatewayAesKeyInfo);
             return;
         }
 
@@ -229,8 +230,9 @@
         GatewayBean gatewayBean = HDLLinkLocalGateway.getInstance().getGatewayByOidOrGatewayId(cloudsGatewayId);
         if (cloudsGatewayId.equals(HDLLinkConfig.getInstance().getHomeId())) {
             aes = getHomeAES();
-        } else if (gatewayBean != null && HDLConnectHelper.getGatewayTypeList().contains(gatewayBean.getGatewayType())) {
-            //閫嗗彉鍣╩qtt涓撶敤绉橀挜
+        }
+        else if (gatewayBean != null && HDLConnectHelper.getGatewayTypeList().contains(gatewayBean.getGatewayType())) {
+            //姣背娉qtt涓撶敤绉橀挜銆侀�嗗彉鍣╩qtt涓撶敤绉橀挜
             aes = gatewayBean.getAesKey();
         } else {
             aes = HDLLinkConfig.getInstance().getAesKey();
@@ -288,7 +290,10 @@
      * @param sendTopic 璇锋眰涓婚
      */
     public synchronized void checkAndsubscribeAllTopics(String sendTopic) {
-        if (null != sampleClient && !sampleClient.isConnected()) {
+        if (null == sampleClient) {
+            return;
+        }
+        if (null != sampleClient && sampleClient.isConnected() == false) {
             return;
         }
         try {
@@ -389,6 +394,9 @@
      * 鍒囨崲浣忓畢鐨勬椂鍊欒闃呰鍏ㄩ儴鍙栨秷
      */
     public void removeAllTopic() {
+        if (null == sampleClient) {
+            return;
+        }
         if (null != sampleClient && sampleClient.isConnected() == false) {
             return;
         }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java
index 1d2fd4b..ffc31ce 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/gateway/HDLLinkLocalGateway.java
@@ -140,7 +140,9 @@
         }
         List<GatewayBean> gatewayBeanList = new ArrayList<>();
         for (GatewayBean gatewayBean : this.getGatewayList()) {
-            if (spkList.contains(gatewayBean.getGatewayType()) && !"MIR01R-LK.10".equals(gatewayBean.getDevice_model()))
+            if ((spkList.contains(gatewayBean.getGatewayType()))
+                    && !"MIR01R-LK.10".equals(gatewayBean.getDevice_model())
+                    && !"MSMWP-LK.30".equals(gatewayBean.getDevice_model()))
                 gatewayBeanList.add(gatewayBean);
         }
         return gatewayBeanList;
@@ -158,8 +160,7 @@
         }
         for (GatewayBean gatewayBean : this.getGatewayList()) {
             if (macAndSid.equals(gatewayBean.getDevice_mac())
-                    || macAndSid.equals(gatewayBean.getSid())
-                    || macAndSid.equals(gatewayBean.getOid())) {
+                    || macAndSid.equals(gatewayBean.getSid())) {
                 return gatewayBean;
             }
         }
@@ -181,6 +182,24 @@
             }
         }
         return null;
+    }
+
+    /**
+     * 鍒ゆ柇浣忓畢鏄惁鏈変富缃戝叧
+     *
+     * @param homeId
+     * @return
+     */
+    public boolean hasMainGateway(String homeId) {
+        boolean hasMain = false;
+        for (GatewayBean gatewayBean : this.getGatewayList()) {
+            if (gatewayBean.getMaster().equals("true")
+                    && gatewayBean.getHomeId().equals(homeId)
+                    && gatewayBean.getGatewayType().equals("AGATEWAY")) {
+                hasMain = true;
+            }
+        }
+        return hasMain;
     }
 
     /**
@@ -220,6 +239,56 @@
     }
 
     /**
+     * 鏍规嵁浣忓畢id鑾峰彇缃戝叧
+     *
+     * @param homeId                 杩囨护鐨勪綇瀹卛d
+     * @param needEmptyHomeIdGateway 缃戝叧鐨勪綇瀹卛d涓虹┖鏃讹紝鏄惁鍙互鍔犲叆缃戝叧鍒楄〃
+     * @param callBack               鍥炶皟鏂规硶
+     */
+    public void refreshWifiMillimeterZT(boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
+        refreshGatewayBySpk(this.getWifiMillimeterZTTypeList(), needEmptyHomeIdGateway, callBack);
+    }
+
+    /**
+     * 鑾峰彇缃戠粶璁惧锛屽寘鎷綉鍏冲強姣背娉㈢瓑缃戠粶璁惧
+     *
+     * @param spk                    缃戠粶璁惧spk
+     * @param needEmptyHomeIdGateway 鏄惁闇�瑕佺┖浣忓畢Id璁惧
+     * @param callBack               鍥炶皟
+     */
+    public void refreshGatewayBySpk(List<String> spk, boolean needEmptyHomeIdGateway, GatewayCallBack callBack) {
+        String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
+        final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
+        EventListener eventListener = getSearchGatewayEvent(spk, needEmptyHomeIdGateway, tempGatewayBeanList);
+        EventDispatcher.getInstance().register(topicReply, eventListener);
+
+        ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
+            @Override
+            public void run() {
+                int count = 5;
+                while (0 < count--) {
+                    try {
+                        //鎼滅储缃戝叧
+                        serchGatewayOneTime();
+                        Thread.sleep(300L);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                //瓒呭嚭娆℃暟鍚庣Щ闄ょ洃鍚簨浠�
+                EventDispatcher.getInstance().remove(topicReply, eventListener);
+                if (callBack != null) {
+                    if (tempGatewayBeanList.size() == 0) {
+                        callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_GATEWAY_FAILURE_ERROR));
+                    } else {
+                        callBack.onSuccess(tempGatewayBeanList);
+                    }
+                }
+            }
+        });
+    }
+
+    /**
      * 鑾峰彇缃戠粶璁惧锛屽寘鎷綉鍏冲強姣背娉㈢瓑缃戠粶璁惧
      *
      * @param homeId                 浣忓畢Id
@@ -236,7 +305,7 @@
         ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
             @Override
             public void run() {
-                int count = 10;
+                int count = 5;
                 while (0 < count--) {
                     try {
                         //鎼滅储缃戝叧
@@ -264,11 +333,15 @@
      *
      * @param callBack 鍥炶皟
      */
+    public void refreshGateway(GatewayCallBack callBack) {
+        refreshGateway(callBack,this.getGatewayTypeList());
+    }
+
+
     public void refreshGateway(GatewayCallBack callBack, List<String> spks) {
         String topicReply = TopicConstant.GATEWAY_SEARCH_REPLY;
         final List<GatewayBean> tempGatewayBeanList = new ArrayList<>();
         EventListener eventListener = getSearchGatewayEvent(spks, tempGatewayBeanList);
-//        EventListener eventListener = getSearchGatewayEvent(this.getGatewayTypeList(), tempGatewayBeanList);
         EventDispatcher.getInstance().register(topicReply, eventListener);
         ThreadToolUtils.getInstance().newFixedThreadPool(1).execute(new Runnable() {
             @Override
@@ -345,6 +418,42 @@
     /**
      * 鑾峰彇鎼滅储缃戝叧浜嬩欢
      *
+     * @return
+     */
+    private EventListener getSearchGatewayEvent(List<String> spk, boolean needEmptyHomeIdGateway, final List<GatewayBean> tempGatewayBeanList) {
+        //娉ㄥ唽鎼滅储缃戝叧鐩戝惉
+        return new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                if (!(msg instanceof LinkResponse)) {
+                    return;
+                }
+                GatewayBean gateway = getGatewayBeanByResponse((LinkResponse) msg);
+                if (gateway == null) {
+                    return;
+                }
+                gateway.setOnline(true);
+                gateway.setIsLocalGateWay(true);//鏈湴鎼滅储鍒扮殑缃戝叧鏍囪瘑涓烘湰鍦扮綉鍏�
+                if ("av.zk.aiks".equals(gateway.getGatewayType())) {
+                    /** 灏嗕富缃戝叧鐨刪omeid璁剧疆鍒板焹鍏嬫柉涓绘満
+                     */
+//                    gateway.setHomeId(homeId);
+                }
+                //鍙姞杞戒綇瀹呬竴鏍风殑鎴栬�呯綉鍏宠繕娌℃湁閰嶇疆杩囩殑锛屾垨鑰呬笉闇�瑕佷綇瀹卛d涓虹┖鐨勭綉鍏�
+                //鏇存柊缂撳瓨缃戝叧锛屼細璁板綍鎵�鏈夋敹鍒扮殑缃戝叧锛屼互涓轰簡淇濆瓨缃戝叧鐨処P淇℃伅
+                updateGatewayList(gatewayBeanList, gateway);
+                //闈炴悳绱㈢殑缃戝叧绫讳技杩斿洖
+                if (spk.contains(gateway.getGatewayType())) {
+                    //鏇存柊褰撳墠璇诲彇缃戝叧鐨勫垪琛紝杩欎釜鍒楄〃姣忔閮芥槸娓呯┖鍐嶈鍙�
+                    updateGatewayList(tempGatewayBeanList, gateway);
+                }
+            }
+        };
+    }
+
+    /**
+     * 鑾峰彇鎼滅储缃戝叧浜嬩欢
+     *
      * @param homeId
      * @return
      */
@@ -362,6 +471,11 @@
                 }
                 gateway.setOnline(true);
                 gateway.setIsLocalGateWay(true);//鏈湴鎼滅储鍒扮殑缃戝叧鏍囪瘑涓烘湰鍦扮綉鍏�
+                if ("av.zk.aiks".equals(gateway.getGatewayType())) {
+                    /** 灏嗕富缃戝叧鐨刪omeid璁剧疆鍒板焹鍏嬫柉涓绘満
+                     */
+//                    gateway.setHomeId(homeId);
+                }
                 //鍙姞杞戒綇瀹呬竴鏍风殑鎴栬�呯綉鍏宠繕娌℃湁閰嶇疆杩囩殑锛屾垨鑰呬笉闇�瑕佷綇瀹卛d涓虹┖鐨勭綉鍏�
                 if (homeId.equals(gateway.getHomeId()) || (needEmptyHomeIdGateway == true && TextUtils.isEmpty(gateway.getHomeId()))) {
                     //鏇存柊缂撳瓨缃戝叧锛屼細璁板綍鎵�鏈夋敹鍒扮殑缃戝叧锛屼互涓轰簡淇濆瓨缃戝叧鐨処P淇℃伅
@@ -409,10 +523,10 @@
     /**
      * 鏇存柊鏀跺埌鐨勭綉鍏冲埌鍒楄〃
      *
-     * @param gatewayBeanList
-     * @param gateway         褰撳墠鏀跺埌鐨勭綉鍏�
+     * @param gatewayBeans
+     * @param gateway      褰撳墠鏀跺埌鐨勭綉鍏�
      */
-    void updateGatewayList(final List<GatewayBean> gatewayBeanList, GatewayBean gateway) {
+    synchronized void updateGatewayList(final List<GatewayBean> gatewayBeans, GatewayBean gateway) {
 
         if (TextUtils.isEmpty(gateway.getOid()) || TextUtils.isEmpty(gateway.getDevice_mac())) {
             LogUtils.e("缃戝叧Mac鎴栬�匫id涓虹┖锛屾棤鏁堢綉鍏�");
@@ -421,26 +535,36 @@
 
         boolean isFound = false;//鏄惁鍦ㄥ唴瀛樹腑鎵惧埌缃戝叧瀵硅薄
         //鎵惧嚭mac涓�鏍风殑缃戝叧鏇存柊鏈�鏂版暟鎹�
-        for (int i = 0; i < gatewayBeanList.size(); i++) {
-            if (gatewayBeanList.get(i).getDevice_mac().equals(gateway.getDevice_mac())) {
+        for (int i = 0; i < gatewayBeans.size(); i++) {
+            GatewayBean tempGatewayBean = gatewayBeans.get(i);
+            if (tempGatewayBean.getDevice_mac().equals(gateway.getDevice_mac())) {
+                /**
+                 * 濡傛灉宸茬粡鏈塽id  闇�瑕佽缃�
+                 */
+                if(null!=tempGatewayBean.getUids()&&tempGatewayBean.getUids().size()>0){
+                    gateway.setUids(tempGatewayBean.getUids());
+                }
                 isFound = true;
-                gatewayBeanList.set(i, gateway);
+                gatewayBeans.set(i, gateway);
+                gateway.setAesKey(tempGatewayBean.getAesKey());//淇濈暀浜戠鑾峰彇鐨刟eskey
+
 //                break;
             }
         }
 
         //娓呴櫎oid涓�鏍凤紝mac涓嶄竴鏍风殑缃戝叧缂撳瓨銆備竴鑸槸鍦ㄧ綉鍏虫浛鎹㈢殑鎯呭喌绌洪棿鍑虹幇
-        for (int i = 0; i < gatewayBeanList.size(); i++) {
-            if (gatewayBeanList.get(i).getDevice_mac().equals(gateway.getDevice_mac()) && !gatewayBeanList.get(i).getOid().equals(gateway.getOid())) {
-                gatewayBeanList.remove(i--);
+        for (int i = 0; i < gatewayBeans.size(); i++) {
+            if (gatewayBeans.get(i).getDevice_mac().equals(gateway.getDevice_mac()) && !gatewayBeans.get(i).getOid().equals(gateway.getOid())) {
+                gatewayBeans.remove(i--);
             }
         }
 
         //娌℃湁鎵惧埌灏辨坊鍔�
         if (!isFound) {
-            gatewayBeanList.add(gateway);
+            gatewayBeans.add(gateway);
         }
     }
+
 
     /**
      * 鑾峰彇缃戝叧瀵硅薄
@@ -499,6 +623,44 @@
 
     /*
      * 缁戝畾缃戝叧
+     * */
+    public void SetGatewayRemoteInfo(String homeId, String master, String mac, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_EDIT_REMOTE, mac);
+
+        JsonObject jObject = new JsonObject();
+        if (master.equals("true")) {
+            jObject.addProperty("server_addr", regionUrl);
+            jObject.addProperty("remote", "true");
+        } else {
+            jObject.addProperty("server_addr", "");
+            jObject.addProperty("remote", "false");
+        }
+        jObject.addProperty("homeId", homeId);
+        JsonObject sendJsonObj = new JsonObject();
+        sendJsonObj.add("objects", jObject);
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /*
+     * 缁戝畾缃戝叧
      * 缂栬緫homeId缁欑綉鍏�
      * */
     public void bindGateway(String master, String mac, String homeId, String regionUrl, String ip, boolean isEncrypt, HDLLinkCallBack callBack) {
@@ -527,6 +689,65 @@
             public void onSucceed(Object msg) {
                 if (callBack == null) return;
                 callBack.onSuccess("1");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
+    /*
+     * 缁戝畾姣背娉�
+     * 缂栬緫homeId缁欐绫虫尝
+     * */
+    public void bindMillimeterGateway(String homeId, String regionUrl, String ip, String mac, String master, boolean isEncrypt, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_EDIT_LOCAL, mac);
+
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("master", master);
+
+        JsonObject sendJsonObj = new JsonObject();
+        sendJsonObj.add("objects", jObject);
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        String sendStr = sendJsonObj.toString();
+
+        LinkRequest message = new LinkRequest(topic, sendStr, isEncrypt);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if ("true".equals(master)) {
+                    String longStr1 = SPUtils.getString("longitude");
+                    String latStr1 = SPUtils.getString("latitude");
+                    if (!TextUtils.isEmpty(longStr1) && !TextUtils.isEmpty(latStr1)) {
+                        HDLLinkLocalSdk.getInstance().gatewayLocation(mac, longStr1, latStr1, isEncrypt, new HDLLinkTCallBack<String>() {
+                            @Override
+                            public void onSuccess(String data) {
+                            }
+
+                            @Override
+                            public void onError(HDLLinkException e) {
+                            }
+                        });
+                    }
+                }
+                if (callBack == null) return;
+                callBack.onSuccess("1");
+                SetGatewayRemoteInfo(homeId, master, mac, regionUrl, ip, isEncrypt, new HDLLinkCallBack() {
+                    @Override
+                    public void onSuccess(String msg) {
+
+                    }
+
+                    @Override
+                    public void onError(HDLLinkException e) {
+
+                    }
+                });
             }
 
             @Override
@@ -686,6 +907,38 @@
         }, true).send();
     }
 
+    /**
+     * 璁剧疆缃戝叧鍏ョ綉浠庢満妯″紡  缃戝叧338鍙互浣跨敤
+     */
+    public void AuthGatewayNewVersion(String ip, String mac, String slaveMac, HDLLinkCallBack callBack) {
+        String topic = String.format(TopicConstant.GATEWAY_AUTH, mac);
+
+        JsonObject sendJsonObj = new JsonObject();
+        String time = String.valueOf(System.currentTimeMillis());
+        sendJsonObj.addProperty("time_stamp", time);
+        sendJsonObj.addProperty("id", IdUtils.getUUId());
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("spk", "LINKDEVICE");
+        jObject.addProperty("mac", slaveMac);
+        jObject.addProperty("time", "120");
+        sendJsonObj.add("objects", jObject);
+
+
+        String sendStr = sendJsonObj.toString();
+        LinkRequest message = new LinkRequest(topic, sendStr, false);
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                callBack.onSuccess("");
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+            }
+        }, true).send();
+    }
+
     /*
      * 鑾峰彇缃戝叧淇℃伅
      * */
@@ -718,6 +971,51 @@
     /**
      * 鍙戦�佹暟鎹埌Link缃戝叧
      *
+     * @param ip        缃戝叧IP
+     * @param mac       缃戝叧mac
+     * @param isEncrypt 鏄惁鍔犲瘑
+     * @param topic     璇锋眰涓婚
+     * @param jObject   璐熻浇鏁版嵁<娌℃湁濉玭ull></>
+     * @param sendPath  鍙戦�佽矾寰�<绫诲悕+鏂规硶鍚�>class->methodName</>
+     */
+    public void sendDataToLinkGateway(String ip, String mac, boolean isEncrypt,
+                                      String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
+        String topicSend = topic.replace("%s", mac);
+        //缁勮闇�瑕佸彂閫佺殑鏁版嵁
+        String sendStr = createSendData(jObject);
+//        LogUtils.i("sendDataToLinkGateway->" + sendPath + "->鏈湴鍙戦�乗r\n" + topicSend + "\r\n" + sendStr);
+        LinkRequest message = new LinkRequest(topicSend, sendStr, isEncrypt);
+        GatewayBean gatewayBean = this.getLocalGateway(mac);
+        if (gatewayBean != null) {
+            message.setCloudTopic(topic.replace("%s", gatewayBean.getGatewayId()));
+        }
+        new HDLConnectHelper(ip, message, new HDLConnectHelper.HdlSocketListener() {
+            @Override
+            public void onSucceed(Object msg) {
+                if (callBack == null) return;
+                try {
+                    JSONObject jsonObject = new JSONObject(new Gson().toJson(msg));
+                    if (jsonObject.has("data")) {
+                        callBack.onSuccess(jsonObject.getString("data"));
+                    }
+                } catch (Exception e) {
+                    callBack.onSuccess(e.getMessage());
+                }
+//                LogUtils.i("sendDataToLinkGateway->"+sendPath+"->鏈湴鎺ユ敹鏁版嵁\r\n"+msg.toString());
+            }
+
+            @Override
+            public void onFailure(HDLLinkCode hdlLinkCode) {
+                if (callBack == null) return;
+                callBack.onError(HDLLinkException.getErrorWithCode(hdlLinkCode));
+//                LogUtils.i("sendDataToLinkGateway->" + sendPath + "->鏈湴鎺ユ敹鏁版嵁->澶辫触(-200)");
+            }
+        }, true, mac).send();
+    }
+
+    /**
+     * 鍙戦�佹暟鎹埌Link缃戝叧
+     *
      * @param mac       缃戝叧mac
      * @param isEncrypt 鏄惁鍔犲瘑
      * @param topic     璇锋眰涓婚
@@ -728,10 +1026,10 @@
                                       String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
         GatewayBean gatewayBean = this.getLocalGateway(mac);
         if (gatewayBean == null) {
-            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_FOUND_LOCALLY));
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             return;
         }
-        String topicSend = topic.replace("%s", gatewayBean.getOid());
+        String topicSend = topic.replace("%s", mac);
         //缁勮闇�瑕佸彂閫佺殑鏁版嵁
         String sendStr = createSendData(jObject);
 //        LogUtils.i("sendDataToLinkGateway->" + sendPath + "->鏈湴鍙戦�乗r\n" + topicSend + "\r\n" + sendStr);
@@ -761,6 +1059,7 @@
         }, true, mac).send();
     }
 
+
     /**
      * 鍙戦�佹暟鎹埌Link缃戝叧
      *
@@ -773,7 +1072,7 @@
                                       String topic, Object jObject, String sendPath, HDLLinkCallBack callBack) {
         GatewayBean gatewayBean = this.getLocalGateway(mac);
         if (gatewayBean == null) {
-            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_FOUND_LOCALLY));
+            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GATEWAY_NOT_EXIST));
             return;
         }
         String topicSend = topic.replace("%s", gatewayBean.getOid());
@@ -797,6 +1096,7 @@
 //                LogUtils.i("sendDataToLinkGateway->"+sendPath+"->鏈湴鎺ユ敹鏁版嵁\r\n"+msg.toString());
             }
 
+
             @Override
             public void onFailure(HDLLinkCode hdlLinkCode) {
                 if (callBack == null) return;
@@ -805,6 +1105,7 @@
             }
         }, true, mac).send();
     }
+
 
     /**
      * 缁勮闇�瑕佸彂閫佺殑鏁版嵁
@@ -840,8 +1141,16 @@
     private List<String> getGatewayTypeList() {
         List<String> typeList = new ArrayList<>();
         typeList.add("AGATEWAY");//缃戝叧
+        typeList.add("av.zk.aiks");//鍩冨厠鏂奖闊充富鏈�
         typeList.add("sensor.mmv_sleep");//姣背娉pk
         typeList.add("sensor.mmv_pose");//姣背娉pk
+        typeList.add("sensor.hdl_mmw_pose");//Wi-Fi姣背娉T鐗堟湰spk
+        return typeList;
+    }
+
+    private List<String> getWifiMillimeterZTTypeList() {
+        List<String> typeList = new ArrayList<>();
+        typeList.add("sensor.hdl_mmw_pose");//Wi-Fi姣背娉T鐗堟湰spk
         return typeList;
     }
 }
diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java
index 6705fe2..d721eea 100644
--- a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/TcpSocketBoot.java
@@ -30,19 +30,17 @@
 
     private final IClient client;
     private IHeartbeat iHeartbeat;
-
-    public void SetHeartbeat(IHeartbeat iHeartbeat) {
-        this.iHeartbeat = iHeartbeat;
+    public void SetHeartbeat(IHeartbeat iHeartbeat){
+        this.iHeartbeat=iHeartbeat;
     }
-
     /**
      * 褰撳墠鎺ユ敹鍒版暟鎹殑鏃堕棿
      */
-    private long time = System.currentTimeMillis();
+    private  long time=System.currentTimeMillis();
     /**
      * tcp鏄惁宸茬粡杩炴帴
      */
-    private boolean connected = false;
+    private boolean connected=false;
 
     public IClient getClient() {
         return client;
@@ -56,7 +54,7 @@
 
     private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
 
-    public TcpSocketBoot(IClient client) {
+    public  TcpSocketBoot(IClient client) {
         TCP_SOCKET_BOOT_LIST.add(this);
         this.client = client;
         initConnectThread();
@@ -68,25 +66,25 @@
     /**
      * 璁板綍鎵�鏈塖ocketBoot
      */
-    final static List<TcpSocketBoot> TCP_SOCKET_BOOT_LIST = new ArrayList<>();
+    final static List<TcpSocketBoot> TCP_SOCKET_BOOT_LIST = new ArrayList();
 
     /**
      * 鏍规嵁IP鍦板潃鍙婄鍙h幏鍙栧綋鍓峴ocketBoot
-     *
      * @param ipAddress
      * @param port
      * @return
      */
-    public static TcpSocketBoot getByEndPoint(String ipAddress, int port) {
-        if (ipAddress == null) {
-            return null;
+    public static TcpSocketBoot getByEndPoint(String ipAddress, int port){
+        if(ipAddress==null){
+            return  null;
         }
-        for (TcpSocketBoot tcpSocketBoot : TCP_SOCKET_BOOT_LIST) {
-            if (ipAddress.equals(tcpSocketBoot.getClient().getOptions().getIp()) && tcpSocketBoot.getClient().getOptions().getPort() == port) {
+        for(TcpSocketBoot tcpSocketBoot : TCP_SOCKET_BOOT_LIST){
+            if(ipAddress.equals(tcpSocketBoot.getClient().getOptions().getIp())&& tcpSocketBoot.getClient().getOptions().getPort()==port)
+            {
                 return tcpSocketBoot;
             }
         }
-        return null;
+        return  null;
     }
 
     /**
@@ -94,14 +92,14 @@
      */
     private synchronized void connect() {
         try {
-            LogUtils.i("TCP杩炴帴锛�" + this.getClient().getOptions().getIp());
+            LogUtils.i("TCP杩炴帴锛�"+this.getClient().getOptions().getIp());
             client.onConnectStatus(ConnectStatus.CONNECTING);
 //            Thread.sleep(700);
             client.connect();
-            LogUtils.i("TCP杩炴帴鎴愬姛锛�" + this.getClient().getOptions().getIp());
-            connected = true;
+            LogUtils.i("TCP杩炴帴鎴愬姛锛�"+this.getClient().getOptions().getIp());
+            connected=true;
             client.onConnectStatus(ConnectStatus.CONNECTED);
-        } catch (Exception e) {
+        }catch(Exception e) {
             LogUtils.e(e.getMessage());
         }
     }
@@ -118,7 +116,7 @@
                 public void run() {
                     while (true) {
                         try {
-                            if (!connected) {
+                            if(connected==false){
                                 Thread.sleep(100);
                                 continue;
                             }
@@ -165,7 +163,7 @@
                             if (connected) {
                                 //璇诲彇鏁版嵁
                                 client.onHandleResponse();
-                                time = System.currentTimeMillis();
+                                time= System.currentTimeMillis();
                             } else {
                                 try {
                                     Thread.sleep(1000);
@@ -198,7 +196,7 @@
                             if (!connected) {
                                 reconect();
                             }
-                            Thread.sleep(5 * 1000);
+                            Thread.sleep(5*1000);
                         } catch (Exception e) {
 
                             LogUtils.e("瀹氭椂杩炴帴绾跨▼寮傚父:" + e.getMessage());
@@ -236,7 +234,6 @@
             });
         }
     }
-
     /**
      * 閲嶆柊杩炴帴
      */
@@ -247,7 +244,6 @@
 
     /**
      * 鍙戦�佹棤闇�鍥炶皟
-     *
      * @param msg 鍙戦�佺殑鏁版嵁
      */
     public void sendMsg(byte[] msg) {
@@ -283,6 +279,7 @@
         }
     }
 
+
 //    /**
 //     * 鏂紑鍏ㄩ儴鐨凩ink缃戝叧杩炴帴
 //     */
diff --git a/local.properties b/local.properties
index e7b3898..e8d918b 100644
--- a/local.properties
+++ b/local.properties
@@ -4,5 +4,6 @@
 # Location of the SDK. This is only used by Gradle.
 # For customization when using a Version Control System, please read the
 # header note.
-#Sun Aug 06 16:06:53 CST 2023
-sdk.dir=/Users/user/Library/Android/sdk
+#Thu Dec 14 10:02:46 CST 2023
+#sdk.dir=/Users/user/Library/Android/sdk
+sdk.dir=/Users/hdl/Library/Developer/Xamarin/android-sdk-macosx

--
Gitblit v1.8.0