From d31f2155237aa65cee1cb6ce1d39c48191663226 Mon Sep 17 00:00:00 2001
From: panlili2024 <14743743+panlili2024@user.noreply.gitee.com>
Date: 星期五, 21 二月 2025 18:02:41 +0800
Subject: [PATCH] 新增source屏接口及房间及绑定关系接口

---
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneFunctionsInfo.java                      |   75 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/Rk3566Manager.java                  |   59 +
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/EthernetUtils.java                                |   63 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/LogicEnableRequest.java |   37 
 HDLSDK/app/src/main/AndroidManifest.xml                                                   |    6 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java                |  179 +++
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneBean.java                               |   45 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IKnobListenerAdapter.java      |  169 +++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java                         |   49 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java                   |    3 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java                           |  556 +++++++++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java                           |   14 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/RoomFunctionBean.java                        |   41 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/OsEventListener.java           |   14 
 HDLSDK/app/build.gradle                                                                   |    4 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java        |    3 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java                    |    1 
 HDLSDK/hdl-connect/build.gradle                                                           |    5 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneDetailBean.java                         |   86 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IQuickKnobListenerAdapter.java |   87 +
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/FunctionBean.java                            |   17 
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/OsManager.java                      |  500 ++++++++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java             |   12 
 HDLSDK/hdl-connect/libs/hdlSDK_V1.0.7.jar                                                 |    0 
 HDLSDK/app/src/main/res/layout/activity_source_test.xml                                   |  508 ++++++++++
 HDLSDK_DEMO/.idea/misc.xml                                                                |    1 
 HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java                                 |  350 +++++-
 27 files changed, 2,792 insertions(+), 92 deletions(-)

diff --git a/HDLSDK/app/build.gradle b/HDLSDK/app/build.gradle
index 1960e0a..bdef389 100644
--- a/HDLSDK/app/build.gradle
+++ b/HDLSDK/app/build.gradle
@@ -7,7 +7,7 @@
 
     defaultConfig {
         applicationId "com.hdl.hdlsdk"
-        minSdk 21
+        minSdk 23
         targetSdk 28
         versionCode 1
         versionName "1.0"
@@ -28,6 +28,8 @@
 }
 
 dependencies {
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
+//    implementation files('libs/hdlSDK_V1.0.7.jar')
 
     implementation 'androidx.appcompat:appcompat:1.3.1'
     implementation 'com.google.android.material:material:1.4.0'
diff --git a/HDLSDK/app/src/main/AndroidManifest.xml b/HDLSDK/app/src/main/AndroidManifest.xml
index cd2cfe7..490bf4e 100644
--- a/HDLSDK/app/src/main/AndroidManifest.xml
+++ b/HDLSDK/app/src/main/AndroidManifest.xml
@@ -30,6 +30,12 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
+
+        <activity
+            android:name=".SourceTestActivity"
+            android:exported="false"
+            android:windowSoftInputMode="adjustPan|stateHidden" />
+
     </application>
 
 </manifest>
\ No newline at end of file
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/EthernetUtils.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/EthernetUtils.java
new file mode 100644
index 0000000..fdb9896
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/EthernetUtils.java
@@ -0,0 +1,63 @@
+package com.hdl.hdlsdk;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.regex.Pattern;
+
+public class EthernetUtils {
+
+    public boolean checkIPValue(String ipAddr, String gateway, String netMask, String dns1, String dns2) {
+        boolean enable = false;
+        Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$"); /*check subnet mask*/
+        if (isValidIpAddress(ipAddr) && isValidIpAddress(gateway)
+                && isValidIpAddress(dns1) && (pattern.matcher(netMask).matches())) {
+            if (TextUtils.isEmpty(dns2)) { // 涓虹┖鍙互涓嶈�冭檻
+                enable = true;
+            } else {
+                if (isValidIpAddress(dns2)) {
+                    enable = true;
+                } else {
+                    enable = false;
+                }
+            }
+        } else {
+            enable = false;
+        }
+        return enable;
+    }
+
+
+    private boolean isValidIpAddress(String value) {
+        int start = 0;
+        int end = value.indexOf('.');
+        int numBlocks = 0;
+
+        while (start < value.length()) {
+
+            if (-1 == end) {
+                end = value.length();
+            }
+
+            try {
+                int block = Integer.parseInt(value.substring(start, end));
+                if ((block > 255) || (block < 0)) {
+                    Log.w("EthernetIP",
+                            "isValidIpAddress() : invalid 'block', block = "
+                                    + block);
+                    return false;
+                }
+            } catch (NumberFormatException e) {
+                Log.w("EthernetIP", "isValidIpAddress() : e = " + e);
+                return false;
+            }
+
+            numBlocks++;
+
+            start = end + 1;
+            end = value.indexOf('.', start);
+        }
+        return numBlocks == 4;
+    }
+
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
index 94d2799..0fa735a 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -24,12 +24,15 @@
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.listener.OnItemClickListener;
 import com.google.gson.reflect.TypeToken;
+import com.hdl.hdlsdk.bean.FunctionBean;
+import com.hdl.hdlsdk.bean.RoomFunctionBean;
+import com.hdl.hdlsdk.bean.SceneBean;
+import com.hdl.hdlsdk.bean.SceneDetailBean;
 import com.hdl.hdlsdk.device.DevicesListActivity;
 import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.DeleteNetworkListener;
 import com.hdl.sdk.common.event.EventListener;
 import com.hdl.sdk.common.exception.HDLLinkException;
-import com.hdl.sdk.common.utils.AllTopicManagerUtils;
 import com.hdl.sdk.common.utils.IdUtils;
 import com.hdl.sdk.common.utils.LogUtils;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
@@ -41,7 +44,6 @@
 import com.hdl.sdk.connect.bean.request.ListSidRequest;
 import com.hdl.sdk.connect.bean.request.ListUploadRequest;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
-import com.hdl.sdk.connect.bean.response.DeviceInfoResponse;
 import com.hdl.sdk.connect.bean.response.GatewaySearchBean;
 import com.hdl.sdk.connect.bean.response.UpdateInfo;
 import com.hdl.sdk.connect.callback.HDLLinkCallBack;
@@ -70,8 +72,13 @@
     private EditText editText;
     boolean isOn;
     private EventListener allTopicsListener;
-    private String testLightSid = "02010131D9C03D01020300010107";
+    private String testLightSid = "020101A19B485D02020100010101";
     private String secret = "";
+    private List<FunctionBean> devicesList = new ArrayList<>();
+    private List<FunctionBean> roomDevicesList = new ArrayList<>();
+    private List<SceneBean> sceneList = new ArrayList<>();
+    private List<SceneDetailBean> sceneDetailList = new ArrayList<>();
+    private List<SceneDetailBean> roomSceneList = new ArrayList<>();
 
     void applyDeviceSecret() {
         tv.setText("寮�濮嬬敵璇疯澶囧瘑閽�...");
@@ -82,7 +89,7 @@
 //        String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret
 
         //娴嬭瘯鏈嶅姟鍣�
-        String appKey ="FcRyUJlLJFF";
+        String appKey = "FcRyUJlLJFF";
         String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ";
 
 //        String appKey = "L2OZliZRxHc";
@@ -203,28 +210,24 @@
         beans.add(new DemoBean("鍏ョ綉璁よ瘉"));
         beans.add(new DemoBean("鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎"));
         beans.add(new DemoBean("涓婃姤oid鍒楄〃"));
-        beans.add(new DemoBean("鑾峰彇鍔熻兘鍒楄〃"));
-        beans.add(new DemoBean("鍔熻兘灞炴�ц鍙�"));
+        beans.add(new DemoBean("鑾峰彇璁惧鍒楄〃"));
+        beans.add(new DemoBean("璁惧鍔熻兘灞炴�ц鍙�"));
         beans.add(new DemoBean("璁惧鎺у埗"));
         beans.add(new DemoBean("璇诲彇鐘舵��"));
         beans.add(new DemoBean("鑾峰彇鍦烘櫙鍒楄〃"));
+        beans.add(new DemoBean("鍦烘櫙璇︽儏"));
         beans.add(new DemoBean("鍦烘櫙鎺у埗"));
-        beans.add(new DemoBean("璁惧鍔熻兘鍒楄〃"));
-        beans.add(new DemoBean("UDP鍙戦��"));
-        beans.add(new DemoBean("TCP鍙戦��"));
         beans.add(new DemoBean("UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
         beans.add(new DemoBean("TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�"));
         beans.add(new DemoBean("閫�缃�"));
-        beans.add(new DemoBean("妫�娴嬫洿鏂�"));
+        beans.add(new DemoBean("Source鍔熻兘鏀寔"));
+        beans.add(new DemoBean("鑾峰彇鎴块棿鍒楄〃"));
+        beans.add(new DemoBean("鑾峰彇鎴块棿璁惧鍒楄〃"));
+        beans.add(new DemoBean("鑾峰彇鎴块棿鍦烘櫙鍒楄〃"));
+        beans.add(new DemoBean("鑾峰彇鑷姩鍖栧垪琛�"));
+        beans.add(new DemoBean("饩冨姩鍖栧惎饨ょ饨�"));
         demoAdapter = new DemoAdapter(beans);
         rv.setAdapter(demoAdapter);
-
-
-//        final SocketOptions options = new SocketOptions();
-//
-//        MessagePipeLine pipeLine = new MessagePipeLine();
-//        options.setHandleMessage(pipeLine);
-//        options.setEnabledHeartbeat(false);
 
         demoAdapter.setOnItemClickListener(new OnItemClickListener() {
             @Override
@@ -247,11 +250,12 @@
                         UploadOidList();
                         break;
                     case 4:
-                        //鑾峰彇鍔熻兘鍒楄〃
+                        //鑾峰彇璁惧鍒楄〃
                         getFunctionList();
+                        //startDevicesListActivity();
                         break;
                     case 5:
-                        //鍔熻兘灞炴�ц鍙�
+                        //璁惧鍔熻兘灞炴�ц鍙�
                         getFunctionAttribute();
                         break;
                     case 6:
@@ -267,36 +271,48 @@
                         getSceneList();
                         break;
                     case 9:
-                        //鍦烘櫙鎺у埗
-                        getScene();
+                        //鍦烘櫙璇︽儏
+                        getSceneDetail();
                         break;
                     case 10:
-                        //鍔熻兘鍒楄〃
-                        startDevicesListActivity();
+                        //鍦烘櫙鎺у埗
+                        controlScene();
                         break;
                     case 11:
-                        //UDP鍙戦��
-                        udpSend();
-                        break;
-                    case 12:
-                        //TCP鍙戦��
-                        tcpSend();
-                        break;
-                    case 13:
                         //UDP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         udpSendWithCallback();
                         break;
-                    case 14:
+                    case 12:
                         //TCP鍙戦�侊紝鐩戝惉涓婚鍥炲锛屽甫閲嶅彂甯﹀洖璋�
                         tcpSendWithCallback();
                         break;
-                    case 15:
+                    case 13:
                         //閫�缃�
                         deleteNetwork();
                         break;
+                    case 14:
+                        //Source鍔熻兘鏀寔
+                        startSourceTestActivity();
+                        break;
+                    case 15:
+                        //鑾峰彇鎴块棿鍒楄〃
+                        getRoomList();
+                        break;
                     case 16:
-                        //妫�娴嬫洿鏂�
-                        checkAppVersion();
+                        //鑾峰彇鎴块棿璁惧鍒楄〃
+                        getRoomDeviceList();
+                        break;
+                    case 17:
+                        //鑾峰彇鎴块棿鍦烘櫙鍒楄〃
+                        getRoomSceneList();
+                        break;
+                    case 18:
+                        //鑾峰彇鑷姩鍖栧垪琛�
+                        getLogicList();
+                        break;
+                    case 19:
+                        //饩冨姩鍖栧惎饨ょ饨�
+                        editEnableLogic();
                         break;
                 }
             }
@@ -390,8 +406,8 @@
         infoBean.setDeviceName("榄旈暅");//璁惧鍚嶅瓧
         infoBean.setDeviceModel("HDLSDK");//璁惧鍨嬪彿
         infoBean.setAccessMode("WIFI");
-        infoBean.setIPGateway("192.168.1.1");
-        infoBean.setIPAddress("192.168.1.103");
+        infoBean.setIPGateway("192.168.31.1");
+        infoBean.setIPAddress("192.168.31.103");
         infoBean.setGateway_type("screen.touch");
         infoBean.setHw_version("HW2.0");
         infoBean.setFw_version("Fw1.0");
@@ -466,8 +482,7 @@
 
         StringBuilder hex = new StringBuilder(hash.length * 2);
         for (byte b : hash) {
-            if ((b & 0xFF) < 0x10)
-                hex.append("0");
+            if ((b & 0xFF) < 0x10) hex.append("0");
             hex.append(Integer.toHexString(b & 0xFF));
         }
 
@@ -499,10 +514,10 @@
     }
 
     /**
-     * 鑾峰彇鍔熻兘鍒楄〃
+     * 鑾峰彇璁惧鍒楄〃
      */
     void getFunctionList() {
-        tv.setText("鑾峰彇鍔熻兘鍒楄〃涓�...");
+        tv.setText("鑾峰彇璁惧鍒楄〃涓�...");
         responseTv.setText("");
         HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() {
             @Override
@@ -512,18 +527,37 @@
 
             @Override
             public void onSuccess(String data) {
-                tv.setText("鑾峰彇鍔熻兘鍒楄〃鎴愬姛");
+                tv.setText("鑾峰彇璁惧鍒楄〃鎴愬姛");
                 responseTv.setText(data);
+
+                handelFunctionList(data);
             }
         });
     }
 
+    void handelFunctionList(String data) {
+        try {
+            final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
+            }.getType());
+
+            final BaseLocalResponse<List<FunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<FunctionBean>>>() {
+            }.getType());
+            devicesList.clear();
+            devicesList.addAll(bean.getObjects());
+
+            Log.d(TAG, "handelFunList-----> " + devicesList.toString());
+        } catch (Exception e) {
+            Log.e(TAG, "handelFunList: " + e.getMessage());
+        }
+
+    }
+
     /**
-     * 鍔熻兘灞炴�ц鍙�
+     * 璁惧鍔熻兘灞炴�ц鍙�
      * 鏀寔鎵归噺璇诲彇
      */
     void getFunctionAttribute() {
-        tv.setText("鍔熻兘灞炴�ц鍙�");
+        tv.setText("璁惧鍔熻兘灞炴�ц鍙�");
         responseTv.setText("");
         List<String> sids = new ArrayList<>();
         sids.add(testLightSid);
@@ -606,7 +640,8 @@
             @Override
             public void onSuccess(String msg) {
                 responseTv.setText(msg);
-                Log.d("panlili", "MainActivity.java:getSceneList-----> " + msg);
+
+                handelSceneList(msg);
             }
 
             @Override
@@ -616,31 +651,72 @@
         });
     }
 
+    void handelSceneList(String data) {
+        try {
+            final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
+            }.getType());
+
+            final BaseLocalResponse<List<SceneBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneBean>>>() {
+            }.getType());
+            sceneList.clear();
+            sceneList.addAll(bean.getObjects());
+
+            Log.d(TAG, "handelSceneList-----> " + sceneList.toString());
+        } catch (Exception e) {
+            Log.e(TAG, "handelSceneList: " + e.getMessage());
+        }
+
+    }
+
     //鍦烘櫙鍒楄〃
-    // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"鍥炲妯″紡","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"绂诲妯″紡","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]}
+//    {"id":"98a683eca5384f2db2ca1ed688953439","time_stamp":"1740024067320","code":"0","msg":"Success","objects":[{"sid":"0201039965BF5D0A0A0100011100","name":"鍦烘櫙-1","status":"off","group":"255","delay":"0","modify_time":"1735293636","local":"false"},{"sid":"030105016B84AA0A0A0100020000","name":"澶у巺鐏紑","status":"off","group":"255","delay":"0","modify_time":"1740023916","local":"false"},{"sid":"030105016D14240A0A0100030000","name":"澶у巺鐏叧","status":"off","group":"255","delay":"0","modify_time":"1740023969","local":"false"},{"sid":"020103D465BF5D0A0A0100041100","name":"鍦烘櫙-4","status":"off","group":"255","delay":"0","modify_time":"1735200096","local":"false"}]}
 
     /**
      * 鑾峰彇鍦烘櫙璇︽儏
      * 鎵ц鎴愬姛鐨勮瘽 鍝嶅簲code涓�200
      */
-    void getScene() {
+    void getSceneDetail() {
         tv.setText("鍦烘櫙璇诲彇");
         responseTv.setText("");
         //鍦烘櫙sid鍒楄〃锛屾敮鎸佹壒閲忚鍙�
-        List<String> sids = new ArrayList<>();
-        sids.add("0201034C50B53F0A0A0100011100");
-        sids.add("0201037F50B53F0A0A0100021100");
-        HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() {
-            @Override
-            public void onSuccess(String msg) {
-                responseTv.setText(msg);
+        if (sceneList != null && sceneList.size() != 0) {
+            List<String> sids = new ArrayList<>();
+            for (SceneBean s : sceneList) {
+                sids.add(s.getSid());//閬嶅巻鎵�鏈夊満鏅嬁鍒拌鎯呬俊鎭�
             }
+            HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() {
+                @Override
+                public void onSuccess(String msg) {
+                    responseTv.setText(msg);
 
-            @Override
-            public void onError(HDLLinkException e) {
-                responseTv.setText(e.getMsg());
-            }
-        });
+                    handelSceneDetailList(msg);
+                }
+
+                @Override
+                public void onError(HDLLinkException e) {
+                    responseTv.setText(e.getMsg());
+                }
+            });
+        } else {
+            Toast.makeText(MainActivity.this, "璇峰厛鑾峰彇鍦烘櫙鍒楄〃", Toast.LENGTH_SHORT).show();
+        }
+    }
+
+    void handelSceneDetailList(String data) {
+        try {
+            final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
+            }.getType());
+
+            final BaseLocalResponse<List<SceneDetailBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneDetailBean>>>() {
+            }.getType());
+            sceneDetailList.clear();
+            sceneDetailList.addAll(bean.getObjects());
+
+            Log.d(TAG, "handelSceneDetailList-----> " + sceneDetailList.toString());
+        } catch (Exception e) {
+            Log.e(TAG, "handelSceneDetailList: " + e.getMessage());
+        }
+
     }
 
     /**
@@ -654,9 +730,9 @@
         List<String> sids = new ArrayList<>();
         isOn = !isOn;
         if (isOn) {
-            sids.add("04010560D2C7170A0A0100000000");
+            sids.add("030105016D14240A0A0100030000");
         } else {
-            sids.add("04010560D2C76E0A0A0100010000");
+            sids.add("030105016B84AA0A0A0100020000");
         }
         HDLLink.getInstance().controlScene(sids, new HDLLinkCallBack() {
             @Override
@@ -671,12 +747,164 @@
         });
     }
 
+    /**
+     * 鑾峰彇鎴块棿鍒楄〃
+     */
+    void getRoomList() {
+        tv.setText("璇诲彇鎴块棿鍒楄〃");
+        responseTv.setText("");
+        HDLLink.getInstance().getRoomList(new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
+     * 鑾峰彇鎴块棿璁惧鍒楄〃
+     * 鍏堣幏鍙栨埧闂寸粦瀹氬叧绯诲垪琛紝閫氳繃sid鍜岃澶囧垪琛ㄥ尮閰嶇瓫閫�
+     */
+    void getRoomDeviceList() {
+        tv.setText("鑾峰彇鎴块棿璁惧鍒楄〃");
+        responseTv.setText("");
+        //鎴块棿uid鍒楄〃锛屾敮鎸佹壒閲忚鍙�
+        List<String> uid = new ArrayList<>();
+        uid.add("64a4fc6f-4eae-4d1d-82e4-40140c802c48");
+        HDLLink.getInstance().getRoomBindList(uid, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                if (!TextUtils.isEmpty(msg)) {
+                    handelRoomFunctionList(msg);
+                }
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    void handelRoomFunctionList(String data) {
+        try {
+            final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() {
+            }.getType());
+
+            final BaseLocalResponse<List<RoomFunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<RoomFunctionBean>>>() {
+            }.getType());
+
+            List<RoomFunctionBean> roomFunctionBeans = bean.getObjects();
+            List<RoomFunctionBean.Functions> functions = roomFunctionBeans.get(0).getFunctions();
+
+            roomDevicesList.clear();
+
+            if (devicesList != null && devicesList.size() != 0) {
+                for (int i = 0; i < functions.size(); i++) {
+                    for (int j = 0; j < devicesList.size(); j++) {
+                        //涓庤澶囧垪琛ㄧ殑鏁版嵁鍖归厤锛宻id瀵瑰簲
+                        if (functions.get(i).getSid().equals(devicesList.get(j).getSid())) {
+                            roomDevicesList.add(devicesList.get(j));
+                        }
+                    }
+                }
+                responseTv.setText(roomDevicesList.toString());
+                Log.d(TAG, "handelRoomFunctionList-----> " + roomDevicesList.toString());
+            } else {
+                Toast.makeText(MainActivity.this, "璇峰厛鑾峰彇璁惧鍒楄〃", Toast.LENGTH_SHORT).show();
+            }
+
+        } catch (Exception e) {
+            Log.e(TAG, "handelRoomFunctionList: " + e.getMessage());
+        }
+
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栧垪琛�
+     */
+    void getLogicList() {
+        tv.setText("璇诲彇鑷姩鍖栧垪琛�");
+        responseTv.setText("");
+        HDLLink.getInstance().getLogicList(new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
+     * 饩冨姩鍖栧惎饨ょ饨�
+     */
+    void editEnableLogic() {
+        tv.setText("饩冨姩鍖栧惎饨ょ饨�");
+        responseTv.setText("");
+
+        String sid = "0301050041800C161501000A0000";//鑷姩鍖杝id
+        boolean enable = true;//true=鍚饯 false=绂佲饯
+
+        HDLLink.getInstance().editEnableLogic(sid, enable, new HDLLinkCallBack() {
+            @Override
+            public void onSuccess(String msg) {
+                responseTv.setText(msg);
+            }
+
+            @Override
+            public void onError(HDLLinkException e) {
+                responseTv.setText(e.getMsg());
+            }
+        });
+    }
+
+    /**
+     * 鑾峰彇鎴块棿鍦烘櫙鍒楄〃锛堥渶瑕佸厛鎷垮埌鍦烘櫙璇︽儏锛�
+     */
+    void getRoomSceneList() {
+        tv.setText("鑾峰彇鎴块棿鍦烘櫙鍒楄〃");
+        responseTv.setText("");
+        String uid = "64a4fc6f-4eae-4d1d-82e4-40140c802c48";
+
+        roomSceneList.clear();
+        if (sceneDetailList != null && sceneDetailList.size() != 0) {
+            for (SceneDetailBean s : sceneDetailList) {
+                List<String> roomUids = s.getUids();
+                if (roomUids != null && roomUids.size() != 0) {
+                    for (int i = 0; i < roomUids.size(); i++) {
+                        if (uid.equals(roomUids.get(i))) {
+                            roomSceneList.add(s);
+                        }
+                    }
+                }
+            }
+            responseTv.setText(roomSceneList.toString());
+            Log.d(TAG, "getRoomSceneList-----> " + roomSceneList.toString());
+        } else {
+            Toast.makeText(MainActivity.this, "璇峰厛鑾峰彇鍦烘櫙鍒楄〃璇︽儏", Toast.LENGTH_SHORT).show();
+        }
+
+    }
 
     void startDevicesListActivity() {
         Intent intent = new Intent(this, DevicesListActivity.class);
         startActivity(intent);
     }
 
+    void startSourceTestActivity() {
+        Intent intent = new Intent(this, SourceTestActivity.class);
+        startActivity(intent);
+    }
+
     /**
      * TCP鍙戦�� 鍙彂涓�娆★紝涓嶇洃鍚洖澶嶏紝涓嶉噸鍙�
      */
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java
new file mode 100644
index 0000000..8c26596
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java
@@ -0,0 +1,556 @@
+package com.hdl.hdlsdk;
+
+import android.Manifest;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.storage.StorageManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Surface;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.RequiresApi;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.app.NotificationCompat;
+
+import com.hdl.sdk.sourceos.knob.OsEventListener;
+import com.hdl.sdk.sourceos.OsManager;
+import com.hdl.sdk.sourceos.knob.IQuickKnobListenerAdapter;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+
+public class SourceTestActivity extends AppCompatActivity implements View.OnClickListener {
+
+    private Button btnApiVersion, btnDeviceModel, btnOsVersion, btnRunningMemory, btnInnerStorage, btnFreeStorage, btnKernelVersion, btnBuilderNumber, btnFwVersion, btnShutDown, btnReboot, btnSystemConfiginfo, btnBrightness, btnRotation, notifyOpen, notifyClose, btnOpenBackLight, btnCloseBackLight, btnStatusBarShow, btnStatusBarHide, btnMicEnable, btnEthMacAddress, btnEthIpAddress, btnScardPath, btnInner, btnInstall, btnEthernetConnect, btnSubmitStaticIp, btnSleep, btnWakeUp, btnFilterPermission, btnOta, btnNetmask, btnGateway, btnDns, btnDisconnectEth, btnConnectEth, btnWwitchDhcp;
+    private TextView tvContent;
+    private EditText editIpAddress, editGateway, editNetmask, editDns1, editDns2, editBrightness, editRotation;
+
+    final private int LED_NOTIFICATION_ID = 100;
+
+    private NotificationManager notificationManager;
+    private String notificationId = "leds";
+    private String notificationName = "ledsTest";
+    private Timer mTimer;
+    private static String TAG = "SourceTestActivity";
+    private IQuickKnobListenerAdapter knobListenerAdapter;
+    private final int PERMISSION_REQUEST = 0xa00;
+    private OsEventListener eventListener = new OsEventListener() {
+        @Override
+        public void onKeyEvent(int keyCode, int state) {
+            try {
+                if (KeyEvent.KEYCODE_MUTE == keyCode) {
+                    //楹﹀厠椋庣姸鎬佸彉鍖�
+                    boolean micState = OsManager.getMicEnable();
+                }
+
+
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    };
+
+    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_source_test);
+        initView();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REBOOT, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST);
+        }
+        //绯荤粺鎺ュ彛鍒濆鍖�
+        OsManager.init(SourceTestActivity.this);
+
+        OsManager.addEventListener(eventListener);
+
+        OsManager.startTof(1);
+
+        startTimerTask();
+
+        //鏃嬮挳鍒濆鍖�
+        initKnob();
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
+
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        switch (requestCode) {
+            case PERMISSION_REQUEST:
+                if (grantResults != null && permissions != null) {
+                    for (int i = 0; i < grantResults.length; i++) {
+                        Log.d(TAG, "grantResults[" + i + "]:" + grantResults[i]);
+                        Log.d(TAG, "permissions[" + i + "]:" + permissions[i]);
+                    }
+                }
+
+                break;
+        }
+    }
+
+    // 寮�鍚换鍔�
+    private void startTimerTask() {
+        mTimer = new Timer();
+        mTimer.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                int data = OsManager.readTofData();
+                Log.d(TAG, "Tof data:" + data);
+            }
+        }, 500, 3000);
+    }
+
+    // 鍙栨秷浠诲姟
+    private void cancelTask() {
+        if (mTimer != null) {
+            mTimer.cancel();
+        }
+    }
+
+
+    private void initView() {
+        tvContent = findViewById(R.id.tv_content);
+        btnApiVersion = findViewById(R.id.btn_api_version);
+        btnDeviceModel = findViewById(R.id.btn_device_model);
+        btnOsVersion = findViewById(R.id.btn_os_version);
+        btnRunningMemory = findViewById(R.id.btn_running_memory);
+        btnInnerStorage = findViewById(R.id.btn_inner_storage);
+        btnFreeStorage = findViewById(R.id.btn_free_storage);
+        btnKernelVersion = findViewById(R.id.btn_kernel_version);
+        btnBuilderNumber = findViewById(R.id.btn_builder_number);
+        btnFwVersion = findViewById(R.id.btn_fwversion);
+        btnShutDown = findViewById(R.id.btn_shut_down);
+        btnReboot = findViewById(R.id.btn_reboot);
+        btnSystemConfiginfo = findViewById(R.id.btn_system_configinfo);
+
+        btnBrightness = findViewById(R.id.btn_brightness);
+        btnRotation = findViewById(R.id.btn_rotation);
+        notifyOpen = findViewById(R.id.btn_notifyLight_open);
+        notifyClose = findViewById(R.id.btn_notifyLight_close);
+        btnOpenBackLight = findViewById(R.id.btn_open_back_light);
+        btnCloseBackLight = findViewById(R.id.btn_close_back_light);
+        btnStatusBarShow = findViewById(R.id.btn_statusBar_show);
+        btnStatusBarHide = findViewById(R.id.btn_statusBar_hide);
+        btnMicEnable = findViewById(R.id.btn_mic_enable);
+        btnEthMacAddress = findViewById(R.id.btn_eth_mac_address);
+        btnEthIpAddress = findViewById(R.id.btn_eth_ip_address);
+        btnScardPath = findViewById(R.id.btn_sdcard);
+        btnInner = findViewById(R.id.btn_inner);
+
+        btnInstall = findViewById(R.id.btn_install);
+        btnEthernetConnect = findViewById(R.id.btn_ethernet_connect);
+        editRotation = findViewById(R.id.edit_rotation);
+
+        editIpAddress = findViewById(R.id.edit_ip_address);
+        editGateway = findViewById(R.id.edit_gateway);//缃戝叧
+        editNetmask = findViewById(R.id.edit_netmask);//鎺╃爜
+        editDns1 = findViewById(R.id.edit_dns1);
+        editDns2 = findViewById(R.id.edit_dns2);
+        btnSubmitStaticIp = findViewById(R.id.btn_submit_static_ip);
+
+        btnSleep = findViewById(R.id.btn_sleep);
+        editBrightness = findViewById(R.id.edit_brightness);
+        btnWakeUp = findViewById(R.id.btn_wake_up);
+        btnFilterPermission = findViewById(R.id.btn_filter_permission);
+        btnOta = findViewById(R.id.btn_ota);
+
+        btnNetmask = findViewById(R.id.btn_netmask);
+        btnGateway = findViewById(R.id.btn_gateway);
+        btnDns = findViewById(R.id.btn_dns);
+        btnDisconnectEth = findViewById(R.id.btn_disconnect_eth);
+        btnConnectEth = findViewById(R.id.btn_connect_eth);
+        btnWwitchDhcp = findViewById(R.id.btn_switch_dhcp);
+
+        btnApiVersion.setOnClickListener(this);
+        btnDeviceModel.setOnClickListener(this);
+        btnOsVersion.setOnClickListener(this);
+        btnRunningMemory.setOnClickListener(this);
+        btnInnerStorage.setOnClickListener(this);
+        btnFreeStorage.setOnClickListener(this);
+        btnKernelVersion.setOnClickListener(this);
+        btnBuilderNumber.setOnClickListener(this);
+        btnFwVersion.setOnClickListener(this);
+        btnShutDown.setOnClickListener(this);
+        btnReboot.setOnClickListener(this);
+        btnSystemConfiginfo.setOnClickListener(this);
+
+        btnBrightness.setOnClickListener(this);
+        btnRotation.setOnClickListener(this);
+        notifyOpen.setOnClickListener(this);
+        notifyClose.setOnClickListener(this);
+        btnOpenBackLight.setOnClickListener(this);
+        btnCloseBackLight.setOnClickListener(this);
+        btnStatusBarShow.setOnClickListener(this);
+        btnStatusBarHide.setOnClickListener(this);
+        btnMicEnable.setOnClickListener(this);
+        btnEthMacAddress.setOnClickListener(this);
+        btnEthIpAddress.setOnClickListener(this);
+        btnScardPath.setOnClickListener(this);
+        btnInner.setOnClickListener(this);
+        btnInstall.setOnClickListener(this);
+
+        btnEthernetConnect.setOnClickListener(this);
+        btnSubmitStaticIp.setOnClickListener(this);
+        btnSleep.setOnClickListener(this);
+        btnWakeUp.setOnClickListener(this);
+        btnFilterPermission.setOnClickListener(this);
+        btnOta.setOnClickListener(this);
+
+        btnNetmask.setOnClickListener(this);
+        btnGateway.setOnClickListener(this);
+        btnDns.setOnClickListener(this);
+        btnDisconnectEth.setOnClickListener(this);
+        btnConnectEth.setOnClickListener(this);
+        btnWwitchDhcp.setOnClickListener(this);
+
+    }
+
+    private void initKnob() {
+        knobListenerAdapter = new IQuickKnobListenerAdapter() {
+            @Override
+            public void onKnobLeftListener() {
+                super.onKnobLeftListener();
+                //婊戝姩鍒颁笂涓�涓�
+                //scrollPre();
+                tvContent.setText("鏃嬮挳婊戝姩鍒颁笂涓�涓�");
+            }
+
+            @Override
+            public void onKnobRightListener() {
+                super.onKnobRightListener();
+                //婊戝姩鍒颁笅涓�涓�
+                //scrollNext();
+                tvContent.setText("鏃嬮挳婊戝姩鍒颁笅涓�涓�");
+            }
+        };
+        OsManager.addEventListener(knobListenerAdapter);
+    }
+
+    // 鍒ゆ柇瀛樺偍鍗$殑璺緞鏄惁鍙敤
+    public static boolean getStorageState(Context context, String path) {
+        try {
+            StorageManager sm = (StorageManager) context.getSystemService(context.STORAGE_SERVICE);
+            Method getVolumeStateMethod = StorageManager.class.getMethod("getVolumeState", new Class[]{String.class});
+            String state = (String) getVolumeStateMethod.invoke(sm, path);
+            if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) || state.equals(Environment.MEDIA_MOUNTED)) {
+                return true;
+            }
+            return false;
+        } catch (Exception e) {
+            Log.e(TAG, "getStorageState() failed", e);
+            return false;
+        }
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_api_version:
+                String apiVersion = OsManager.getAPIVersion();
+                Log.e(TAG, "apiVersion :" + apiVersion);
+                tvContent.setText(apiVersion);
+                Toast.makeText(this, "aip鐗堟湰 :" + apiVersion, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_device_model:
+                String deviceModel = OsManager.getDeviceModel();
+                Log.e(TAG, "deviceModel :" + deviceModel);
+                tvContent.setText(deviceModel);
+                Toast.makeText(this, "璁惧model :" + deviceModel, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_os_version:
+                String androidOSVersion = OsManager.getAndroidOSVersion();
+                Log.e(TAG, "androidOSVersion :" + androidOSVersion);
+                tvContent.setText(androidOSVersion);
+                Toast.makeText(this, "绯荤粺鐗堟湰 :" + androidOSVersion, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_running_memory:
+                String runningMemory = OsManager.getRunningMemory();
+                Log.e(TAG, "runningMemory :" + runningMemory);
+                tvContent.setText(runningMemory);
+                Toast.makeText(this, "杩愯鍐呭瓨 :" + runningMemory, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_inner_storage:
+                String internalStorageMemory = OsManager.getInternalStorageMemory();
+                Log.e(TAG, "internalStorageMemory :" + internalStorageMemory);
+                tvContent.setText(internalStorageMemory);
+                Toast.makeText(this, "鍐呴儴瀛樺偍璺緞 :" + internalStorageMemory, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_free_storage:
+                String internalFreeStorageMemory = OsManager.getInternalFreeStorageMemory();
+                Log.e(TAG, "internalFreeStorageMemory :" + internalFreeStorageMemory);
+                tvContent.setText(internalFreeStorageMemory);
+                Toast.makeText(this, "鍐呴儴瀛樺偍鍙敤瀹归噺 :" + internalFreeStorageMemory, Toast.LENGTH_SHORT).show();
+
+                break;
+            case R.id.btn_kernel_version:
+                String kernelVersion = OsManager.getKernelVersion();
+                Log.e(TAG, "kernelVersion :" + kernelVersion);
+                tvContent.setText(kernelVersion);
+                Toast.makeText(this, "kernel鐗堟湰淇℃伅 :" + kernelVersion, Toast.LENGTH_SHORT).show();
+
+                break;
+            case R.id.btn_builder_number:
+                String builderNumberDisplay = OsManager.getBuilderNumberDisplay();
+                Log.e(TAG, "builderNumberDisplay :" + builderNumberDisplay);
+                tvContent.setText(builderNumberDisplay);
+                Toast.makeText(this, "DisplayId :" + builderNumberDisplay, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_fwversion:
+                String fwVersion = OsManager.getFwVersion();
+                Log.e(TAG, "fwVersion :" + fwVersion);
+                tvContent.setText(fwVersion);
+                Toast.makeText(this, "fwVersion :" + fwVersion, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_shut_down:
+                OsManager.shutdown();
+                break;
+            case R.id.btn_reboot:
+                OsManager.reboot();
+                break;
+            case R.id.btn_system_configinfo:
+                String jsondata = OsManager.readSystemConfigInfo();
+                tvContent.setText(jsondata);
+                break;
+            case R.id.btn_brightness:
+                String trim = editBrightness.getText().toString().trim();
+                if (!TextUtils.isEmpty(trim)) {
+                    OsManager.setBrightness(Integer.parseInt(trim));
+                } else {
+                    Toast.makeText(SourceTestActivity.this, "璇疯緭鍏ヤ寒搴﹀��", Toast.LENGTH_LONG).show();
+                }
+                break;
+            case R.id.btn_rotation:
+                String rotation = editRotation.getText().toString().trim();
+                if (!TextUtils.isEmpty(rotation)) {
+                    OsManager.setRotation(rotation);
+                } else {
+                    Toast.makeText(SourceTestActivity.this, "璇疯緭鍏ユ棆杞柟鍚�", Toast.LENGTH_LONG).show();
+                }
+                int value = Surface.ROTATION_0;
+                if (rotation.equals("90")) {
+                    value = Surface.ROTATION_90;
+                } else if (rotation.equals("180")) {
+                    value = Surface.ROTATION_180;
+                } else if (rotation.equals("270")) {
+                    value = Surface.ROTATION_270;
+                }
+                //Settings.System.putInt(getContentResolver(), Settings.System.USER_ROTATION, value);
+                Toast.makeText(SourceTestActivity.this, "鏃嬭浆锛�" + rotation, Toast.LENGTH_LONG).show();
+                break;
+            case R.id.btn_notifyLight_open:
+//                setNotificationAndForeground();
+                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+                if (notificationManager.isNotificationPolicyAccessGranted()) {
+                    Toast.makeText(SourceTestActivity.this, "閫氱煡OK锛�", Toast.LENGTH_LONG).show();
+                }
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                    NotificationChannel channel = new NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTANCE_DEFAULT);
+                    channel.enableLights(true);
+                    channel.setLightColor(0x00ff1288);
+
+                    notificationManager.createNotificationChannel(channel);
+                }
+                Notification.Builder builder = new Notification.Builder(this).setLights(0x00ff1288, 50, 50).setDefaults(NotificationCompat.DEFAULT_LIGHTS).setSound(Uri.EMPTY).setSmallIcon(R.drawable.ic_launcher_foreground).setColor(Color.RED).setAutoCancel(true).setWhen(System.currentTimeMillis()).setContentTitle("鍛煎惛鐏�氱煡").setContentText("宸叉垚鍔熷紑鍚�");
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+                    builder.setChannelId(notificationId);
+                }
+                notificationManager.notify(LED_NOTIFICATION_ID, builder.build()); //鍙戦�侀�氱煡
+                break;
+            case R.id.btn_notifyLight_close:
+                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+                manager.cancel(LED_NOTIFICATION_ID);             //鍏抽棴閫氱煡鐏�
+                break;
+            case R.id.btn_open_back_light:
+                OsManager.setLcdBlackLight(true);
+                break;
+            case R.id.btn_close_back_light:
+                OsManager.setLcdBlackLight(false);
+                break;
+            case R.id.btn_statusBar_show:
+                Intent intent = new Intent();
+                intent.setAction("com.android.navigation.status");
+                intent.putExtra("hide", false);//auto true 涓烘樉绀� 锛宖alse 涓� 闅愯棌
+                sendBroadcast(intent);
+                break;
+            case R.id.btn_statusBar_hide:
+                Intent intent1 = new Intent();
+                intent1.setAction("com.android.navigation.status");
+                intent1.putExtra("hide", true);//auto true 涓烘樉绀� 锛宖alse 涓� 闅愯棌
+                sendBroadcast(intent1);
+                break;
+            case R.id.btn_mic_enable:
+                boolean micEnable = OsManager.getMicEnable();
+                Log.e(TAG, "micEnable :" + micEnable);
+                Toast.makeText(this, "楹﹀厠椋庣姸鎬� :" + micEnable, Toast.LENGTH_SHORT).show();
+
+                break;
+            case R.id.btn_eth_mac_address:
+                String ethMacAddress = OsManager.getEthMacAddress();
+                Log.e(TAG, "ethMacAddress :" + ethMacAddress);
+                tvContent.setText(ethMacAddress);
+                Toast.makeText(this, "Mac 鍦板潃 :" + ethMacAddress, Toast.LENGTH_SHORT).show();
+                break;
+            case R.id.btn_eth_ip_address:
+                String ethIPAddress = OsManager.getEthIpAddress();
+                Log.e(TAG, "ethIPAddress :" + ethIPAddress);
+                tvContent.setText(ethIPAddress);
+                Toast.makeText(this, "浠ュお缃慽p鍦板潃 :" + ethIPAddress, Toast.LENGTH_SHORT).show();
+
+                break;
+            case R.id.btn_sdcard:
+//                String sdcardPath = OsManager.getSdcardPath();
+//                Log.e(TAG, "sdcardPath :" + sdcardPath);
+//                tvContent.setText(sdcardPath);
+//                Toast.makeText(this, "sdcard璺緞 :" + sdcardPath, Toast.LENGTH_SHORT).show();
+
+                try {
+                    List<String> sdPaths = new ArrayList<>();
+                    StorageManager sm = (StorageManager) this.getSystemService(this.STORAGE_SERVICE);
+                    Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths");
+                    String[] paths = (String[]) getVolumePathsMethod.invoke(sm);//鑾峰彇鎵�鏈塻d鍗¤矾寰�
+                    if (paths.length >= 1) {
+                        for (int i = 1; i < paths.length; i++) {
+                            if (getStorageState(this, paths[i])) {
+                                sdPaths.add(paths[i]);
+                            }
+                        }
+                    }
+                    Toast.makeText(this, "sdcard璺緞 :" + sdPaths, Toast.LENGTH_SHORT).show();
+//                    return sdPaths;
+                } catch (Exception e) {
+                    Log.e(TAG, "getSecondaryStoragePath() failed", e);
+                }
+                break;
+
+            case R.id.btn_inner: {
+//                String primaryStoragePath = OsManager.getPrimaryStoragePath();
+//                Log.e(TAG, "primaryStoragePath :" + primaryStoragePath);
+//                tvContent.setText(primaryStoragePath);
+//                Toast.makeText(this, "鍐呴儴瀛樺偍璺緞 :" + primaryStoragePath, Toast.LENGTH_SHORT).show();
+
+                try {
+                    StorageManager sm = (StorageManager) this.getSystemService(this.STORAGE_SERVICE);
+                    Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths");
+                    String[] paths = (String[]) getVolumePathsMethod.invoke(sm);
+                    // first element in paths[] is primary storage path
+//                    return paths[0];
+                    Toast.makeText(this, "鍐呴儴瀛樺偍璺緞 :" + paths[0], Toast.LENGTH_SHORT).show();
+                } catch (Exception e) {
+                    Log.e(TAG, "getPrimaryStoragePath() failed", e);
+                }
+                break;
+            }
+
+            case R.id.btn_install:
+                Intent intent3 = new Intent();
+                intent3.setAction("com.hdl.os.SilentInstall");
+                intent3.putExtra("com.hdl.os.SilentInstall.path", "/storage/emulated/0/FactoryTools.apk");
+                intent3.putExtra("com.hdl.os.SilentInstall.packageName", "com.hdl.factory");
+                intent3.putExtra("com.hdl.os.SilentInstall.activityName", "MainMobile");
+                sendBroadcast(intent3);
+
+                break;
+
+            case R.id.btn_ethernet_connect:
+                int ethernetLinkStatus = OsManager.getEthernetLinkStatus();
+                Log.e(TAG, "ethernetLinkStatus :" + ethernetLinkStatus);
+                Toast.makeText(this, "浠ュお缃戣繛鎺ョ姸鎬� :" + ethernetLinkStatus, Toast.LENGTH_SHORT).show();
+
+                break;
+
+            case R.id.btn_submit_static_ip:
+                //璁剧疆闈欐�乮p
+                String ipAddress = editIpAddress.getText().toString().trim();
+                String gateway = editGateway.getText().toString().trim();
+                String netmask = editNetmask.getText().toString().trim();
+                String dns1 = editDns1.getText().toString().trim();
+                String dns2 = editDns2.getText().toString().trim();
+
+                EthernetUtils ethernetUtils = new EthernetUtils();
+                boolean b = ethernetUtils.checkIPValue(ipAddress, gateway, netmask, dns1, dns2);
+                if (b) {
+                    OsManager.setStaticIp(ipAddress, netmask, gateway, dns1, dns2);
+                }
+                break;
+            case R.id.btn_sleep:
+                OsManager.goToSleep("screen");
+                break;
+            case R.id.btn_wake_up:
+                OsManager.wakeUp("screen");
+                break;
+            case R.id.btn_filter_permission:
+                Log.d(TAG, "setFilterPermissionPackageName");
+                OsManager.setFilterPermissionPackageName("com.kugou.android");
+                OsManager.setFilterPermissionPackageName("com.tencent.qqmusic");
+                //Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0);
+
+                break;
+            case R.id.btn_ota:
+                Intent intent2 = new Intent();
+                intent2.setAction("com.hdl.os.OTA");
+                intent2.putExtra("com.hdl.os.OTA.path", "/storage/emulated/0/rk3566-ota-115442.zip");
+                sendBroadcast(intent2);
+                break;
+
+            case R.id.btn_netmask:  //瀛愮綉鎺╃爜
+                String netmask1 = OsManager.getEthNetmask();
+                Toast.makeText(this, "瀛愮綉鎺╃爜锛�" + netmask1, Toast.LENGTH_LONG).show();
+                break;
+
+            case R.id.btn_gateway: //缃戝叧
+                String gateway1 = OsManager.getEthGateway();
+                Toast.makeText(this, "缃戝叧锛�" + gateway1, Toast.LENGTH_LONG).show();
+                break;
+
+            case R.id.btn_dns://dns
+                String ethDns1 = OsManager.getEthDns1();
+                String ethDns2 = OsManager.getEthDns1();
+                Toast.makeText(this, "ethDns1锛�" + ethDns1 + " ethDns2锛� " + ethDns2, Toast.LENGTH_LONG).show();
+                break;
+
+            case R.id.btn_disconnect_eth: //鏂紑浠ュお缃�
+                OsManager.disconnectEthernet("eth0");
+                break;
+
+            case R.id.btn_connect_eth: //杩炴帴浠ュお缃�
+                OsManager.connectEthernet("eth0");
+                break;
+
+            case R.id.btn_switch_dhcp: //鍒囨崲鍔ㄦ�乮p
+                OsManager.switchDHCP();
+                break;
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        cancelTask();
+        OsManager.stopTof();
+
+        if (eventListener != null) {
+            OsManager.removeEventListener(eventListener);
+        }
+
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/FunctionBean.java
similarity index 79%
rename from HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java
rename to HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/FunctionBean.java
index 232b657..ad872af 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/FunctionBean.java
@@ -1,6 +1,4 @@
-package com.hdl.hdlsdk.device;
-
-import com.chad.library.adapter.base.entity.MultiItemEntity;
+package com.hdl.hdlsdk.bean;
 
 import java.io.Serializable;
 import java.util.List;
@@ -103,4 +101,17 @@
         }
     }
 
+    @Override
+    public String toString() {
+        return "FunctionBean{" +
+                "sid='" + sid + '\'' +
+                ", oid='" + oid + '\'' +
+                ", name='" + name + '\'' +
+                ", spk='" + spk + '\'' +
+                ", omodel='" + omodel + '\'' +
+                ", src='" + src + '\'' +
+                ", online='" + online + '\'' +
+                ", status=" + status +
+                '}';
+    }
 }
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/RoomFunctionBean.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/RoomFunctionBean.java
new file mode 100644
index 0000000..7c83392
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/RoomFunctionBean.java
@@ -0,0 +1,41 @@
+package com.hdl.hdlsdk.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by jlchen on 12/7/21.
+ */
+public class RoomFunctionBean implements Serializable {
+    private String uid;
+    private List<Functions> functions;
+
+    public String getUid() {
+        return uid;
+    }
+
+    public void setUid(String uid) {
+        this.uid = uid;
+    }
+
+    public List<Functions> getFunctions() {
+        return functions;
+    }
+
+    public void setFunctions(List<Functions> functions) {
+        this.functions = functions;
+    }
+
+    public class Functions implements Serializable {
+        private String sid;
+
+        public String getSid() {
+            return sid;
+        }
+
+        public void setSid(String sid) {
+            this.sid = sid;
+        }
+    }
+
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneBean.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneBean.java
new file mode 100644
index 0000000..4d6317b
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneBean.java
@@ -0,0 +1,45 @@
+package com.hdl.hdlsdk.bean;
+
+import java.io.Serializable;
+
+/**
+ * Created by panlili on 25/2/21.
+ */
+public class SceneBean implements Serializable {
+    private String sid;
+    private String status;
+    private String name;
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "SceneBean{" +
+                "sid='" + sid + '\'' +
+                ", status='" + status + '\'' +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneDetailBean.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneDetailBean.java
new file mode 100644
index 0000000..1fd29ba
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneDetailBean.java
@@ -0,0 +1,86 @@
+package com.hdl.hdlsdk.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by panlili on 25/2/21.
+ */
+public class SceneDetailBean implements Serializable {
+    private String sid;
+    private String status;
+    private String name;
+    private List<String> uids;
+    private String delay;
+    private String group;
+    private List<SceneFunctionsInfo> functions;
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<String> getUids() {
+        return uids;
+    }
+
+    public void setUids(List<String> uids) {
+        this.uids = uids;
+    }
+
+    public String getDelay() {
+        return delay;
+    }
+
+    public void setDelay(String delay) {
+        this.delay = delay;
+    }
+
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
+
+    public List<SceneFunctionsInfo> getFunctions() {
+        return functions;
+    }
+
+    public void setFunctions(List<SceneFunctionsInfo> functions) {
+        this.functions = functions;
+    }
+
+    @Override
+    public String toString() {
+        return "SceneDetailBean{" +
+                "sid='" + sid + '\'' +
+                ", status='" + status + '\'' +
+                ", name='" + name + '\'' +
+                ", uids=" + uids +
+                ", delay='" + delay + '\'' +
+                ", group='" + group + '\'' +
+                ", functions=" + functions +
+                '}';
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneFunctionsInfo.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneFunctionsInfo.java
new file mode 100644
index 0000000..919f067
--- /dev/null
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneFunctionsInfo.java
@@ -0,0 +1,75 @@
+package com.hdl.hdlsdk.bean;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by panlili on 25/2/21.
+ */
+public class SceneFunctionsInfo implements Serializable {
+    private String sid;
+    private List<SceneStatusInfo> status;
+    private String delay;
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public List<SceneStatusInfo> getStatus() {
+        return status;
+    }
+
+    public void setStatus(List<SceneStatusInfo> status) {
+        this.status = status;
+    }
+
+    public String getDelay() {
+        return delay;
+    }
+
+    public void setDelay(String delay) {
+        this.delay = delay;
+    }
+
+    public class SceneStatusInfo implements Serializable {
+        private String key;
+        private String value;
+
+        public String getKey() {
+            return key;
+        }
+
+        public void setKey(String key) {
+            this.key = key;
+        }
+
+        public String getValue() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            this.value = value;
+        }
+
+        @Override
+        public String toString() {
+            return "SceneStatusInfo{" +
+                    "key='" + key + '\'' +
+                    ", value='" + value + '\'' +
+                    '}';
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "SceneFunctionsInfo{" +
+                "sid='" + sid + '\'' +
+                ", status=" + status +
+                ", delay='" + delay + '\'' +
+                '}';
+    }
+}
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
index dc7156d..cc0c140 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
@@ -10,6 +10,7 @@
 
 import com.google.gson.reflect.TypeToken;
 import com.hdl.hdlsdk.R;
+import com.hdl.hdlsdk.bean.FunctionBean;
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.gson.GsonConvert;
 import com.hdl.sdk.connect.HDLLink;
@@ -49,7 +50,7 @@
     }
 
     /**
-     * 鑾峰彇鍔熻兘鍒楄〃
+     * 鑾峰彇璁惧鍒楄〃
      */
     void getFunctionList(){
 
diff --git a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
index 773df27..730e98e 100644
--- a/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
+++ b/HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
@@ -12,6 +12,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.hdl.hdlsdk.R;
+import com.hdl.hdlsdk.bean.FunctionBean;
 import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.connect.HDLLink;
 import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
diff --git a/HDLSDK/app/src/main/res/layout/activity_source_test.xml b/HDLSDK/app/src/main/res/layout/activity_source_test.xml
new file mode 100644
index 0000000..4810053
--- /dev/null
+++ b/HDLSDK/app/src/main/res/layout/activity_source_test.xml
@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical">
+
+
+        <TextView
+            android:id="@+id/tv_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:padding="10dp" />
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_api_version"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="褰撳墠API鐗堟湰" />
+
+            <Button
+                android:id="@+id/btn_device_model"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="璁惧model" />
+
+            <Button
+                android:id="@+id/btn_os_version"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="android绯荤粺鐗堟湰" />
+
+            <Button
+                android:id="@+id/btn_running_memory"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="杩愯鍐呭瓨" />
+
+
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_inner_storage"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鍐呴儴瀛樺偍绌洪棿" />
+
+            <Button
+                android:id="@+id/btn_free_storage"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鍐呴儴瀛樺偍鍙敤瀹归噺" />
+
+            <Button
+                android:id="@+id/btn_kernel_version"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鑾峰彇褰撳墠Kernel鐗堟湰" />
+
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_builder_number"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鑾峰彇璁惧鐨勫浐浠剁郴缁熺増鏈拰缂栬瘧鏃ユ湡" />
+
+            <Button
+                android:id="@+id/btn_fwversion"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鑾峰彇绯荤粺鐗堟湰" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_shut_down"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鍏虫満" />
+
+            <Button
+                android:id="@+id/btn_reboot"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="閲嶅惎" />
+
+            <Button
+                android:id="@+id/btn_system_configinfo"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鑾峰彇绯荤粺閰嶇疆淇℃伅" />
+
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <EditText
+                android:id="@+id/edit_brightness"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:hint="鍙栧��0锝�255"
+                android:inputType="number" />
+
+
+            <Button
+                android:id="@+id/btn_brightness"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="璁剧疆灞忓箷浜害" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <EditText
+                android:id="@+id/edit_rotation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:hint="杈撳叆鏂瑰悜 0銆�90銆�180銆�270 "
+                android:inputType="number" />
+
+            <Button
+                android:id="@+id/btn_rotation"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="璁剧疆灞忓箷鏂瑰悜" />
+
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+
+            <Button
+                android:id="@+id/btn_notifyLight_open"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="鍛煎惛鐏�" />
+
+            <Button
+                android:id="@+id/btn_notifyLight_close"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鍏抽棴鍛煎惛鐏�" />
+
+            <Button
+                android:id="@+id/btn_open_back_light"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鎵撳紑鑳屽厜" />
+
+            <Button
+                android:id="@+id/btn_close_back_light"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鍏抽棴鑳屽厜" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_statusBar_show"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="鐘舵�佹爮鏄剧ず" />
+
+            <Button
+                android:id="@+id/btn_statusBar_hide"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鐘舵�佹爮闅愯棌" />
+
+            <Button
+                android:id="@+id/btn_mic_enable"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:text="鑾峰彇楹﹀厠椋庣姸鎬�" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_eth_mac_address"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="浠ュお缃� mac鍦板潃" />
+
+            <Button
+                android:id="@+id/btn_eth_ip_address"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="浠ュお缃� ip鍦板潃" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_sdcard"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="sdcard 璺緞" />
+
+            <Button
+                android:id="@+id/btn_inner"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鍐呴儴瀛樺偍 璺緞" />
+
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_install"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="闈欓粯瀹夎" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_ethernet_connect"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="浠ュお缃戣繛鎺ョ姸鎬�" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="ip鍦板潃锛�" />
+
+            <EditText
+                android:id="@+id/edit_ip_address"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="192.168.0.123" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="缃戝叧锛�" />
+
+            <EditText
+                android:id="@+id/edit_gateway"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="192.168.0.1" />
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="netmask锛�" />
+
+            <EditText
+                android:id="@+id/edit_netmask"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="255.255.225.0" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="dns1锛�" />
+
+            <EditText
+                android:id="@+id/edit_dns1"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="192.168.0.1" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="dns2锛�" />
+
+            <EditText
+                android:id="@+id/edit_dns2"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:hint="0.0.0.0" />
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/btn_submit_static_ip"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="璁剧疆浠ュお缃戦潤鎬両P" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_netmask"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="瀛愮綉鎺╃爜" />
+
+            <Button
+                android:id="@+id/btn_gateway"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="缃戝叧" />
+
+            <Button
+                android:id="@+id/btn_dns"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="DNS" />
+
+            <Button
+                android:id="@+id/btn_disconnect_eth"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鏂紑浠ュお缃�" />
+
+            <Button
+                android:id="@+id/btn_connect_eth"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="杩炴帴浠ュお缃�" />
+
+            <Button
+                android:id="@+id/btn_switch_dhcp"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鍒囨崲DHCP" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_sleep"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:text="浼戠湢" />
+
+            <Button
+                android:id="@+id/btn_wake_up"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="鍞ら啋" />
+
+            <Button
+                android:id="@+id/btn_filter_permission"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="10dp"
+                android:layout_weight="1"
+                android:text="杩囨护鏉冮檺" />
+
+        </LinearLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_ota"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="ota鍗囩骇" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</ScrollView>
diff --git a/HDLSDK/hdl-connect/build.gradle b/HDLSDK/hdl-connect/build.gradle
index 44857b8..060a215 100644
--- a/HDLSDK/hdl-connect/build.gradle
+++ b/HDLSDK/hdl-connect/build.gradle
@@ -27,11 +27,12 @@
 }
 
 dependencies {
-//    implementation fileTree(include: ['*.jar'], dir: 'libs')
+    implementation fileTree(include: ['*.jar'], dir: 'libs')
 
     api 'com.hdl.hdlhttp:hxhttp:1.0.4'
     api 'com.squareup.okhttp3:logging-interceptor:4.9.1'
-//    embed(name: 'hxhttp_1.0.4_230201',ext: 'aar')
+    api files('libs/hdlSDK_V1.0.7.jar')
+//    embed(name: 'hdlSDK_V1.0.2',ext: 'jar')
 
     api 'com.google.code.gson:gson:2.8.8'
 }
diff --git a/HDLSDK/hdl-connect/libs/hdlSDK_V1.0.7.jar b/HDLSDK/hdl-connect/libs/hdlSDK_V1.0.7.jar
new file mode 100644
index 0000000..94dd1a8
--- /dev/null
+++ b/HDLSDK/hdl-connect/libs/hdlSDK_V1.0.7.jar
Binary files differ
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
index 5ccb8bf..2d8d0db 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
@@ -2,21 +2,12 @@
 
 import android.content.Context;
 import android.content.pm.PackageInfo;
-import android.text.TextUtils;
-import android.util.Log;
 
-import com.hdl.sdk.common.config.TopicConstant;
 import com.hdl.sdk.common.event.EventListener;
-import com.hdl.sdk.common.exception.HDLLinkException;
 import com.hdl.sdk.common.utils.AllTopicManagerUtils;
-import com.hdl.sdk.common.utils.IdUtils;
 import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.common.utils.gson.GsonConvert;
 import com.hdl.sdk.connect.HDLLink;
 import com.hdl.sdk.connect.bean.LinkResponse;
-import com.hdl.sdk.connect.bean.request.BroadcastRequest;
-import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack;
-import com.hdl.sdk.connect.config.HDLLinkConfig;
 import com.hdl.sdk.connect.socket.HDLAuthSocket;
 import com.hdl.sdk.connect.socket.HDLSocket;
 
@@ -34,8 +25,9 @@
      */
     public String getVersion() {
         try {
+
             PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
-            String versionName =  packageInfo.versionName; // 鐗堟湰鍚嶇О锛堝瓧绗︿覆锛�
+            String versionName = packageInfo.versionName; // 鐗堟湰鍚嶇О锛堝瓧绗︿覆锛�
             return versionName;
         } catch (Exception e) {
             LogUtils.e("鑾峰彇鐗堟湰澶辫触:" + e.getMessage());
@@ -90,4 +82,6 @@
     public void setLogEnabled(boolean enable) {
         LogUtils.setEnabled(enable);
     }
+
+
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
index dd52c06..d8fa8b2 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
@@ -139,4 +139,16 @@
     public static final String GATEWAY_EDIT_REMOTE = "/user/%s/custom/gateway/remote/edit";
 
     public static final String GATEWAY_EDIT_REMOTE_REPLY = "/user/%s/custom/gateway/remote/edit_reply";
+
+    //鑾峰彇鎴块棿
+    public static final String ROOM_LIST_GET = "/user/%s/custom/room/list/get";
+
+    //鎴块棿缁戝畾鍏崇郴鍒楄〃鑾峰彇
+    public static final String ROOM_BIND_LIST_GET = "/user/%s/custom/room/bind/list/get";
+
+    //鑾峰彇饩冨姩鍖栧垪琛�
+    public static final String LOGIC_LIST_GET = "/user/%s/custom/logic/list/get";
+
+    //饩冨姩鍖栧惎饨ょ饨�
+    public static final String EDIT_LOGIC_ENABLE = "/user/%s/custom/logic/enable/edit";
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
index 8e9851e..0e30ae9 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -4,9 +4,10 @@
 
 import com.hdl.hdlhttp.HxHttpConfig;
 import com.hdl.sdk.common.event.DeleteNetworkListener;
+import com.hdl.sdk.common.event.EventDispatcher;
+import com.hdl.sdk.common.event.EventListener;
 import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.common.utils.ThreadToolUtils;
-import com.hdl.sdk.connect.bean.request.DeviceAuthRequest;
+import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 import com.hdl.sdk.connect.bean.request.DeviceControlRequest;
 import com.hdl.sdk.connect.bean.request.ListSidRequest;
 import com.hdl.sdk.connect.bean.request.ListUploadRequest;
@@ -19,16 +20,11 @@
 import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor;
 import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor;
 import com.hdl.sdk.connect.config.HDLLinkConfig;
-import com.hdl.sdk.common.event.EventDispatcher;
-import com.hdl.sdk.common.event.EventListener;
-import com.hdl.sdk.connect.bean.request.AuthenticateRequest;
 import com.hdl.sdk.connect.socket.HDLAuthSocket;
 import com.hdl.sdk.connect.socket.HDLSocket;
 
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
-import io.reactivex.rxjava3.disposables.Disposable;
 import okhttp3.logging.HttpLoggingInterceptor;
 
 /**
@@ -253,14 +249,14 @@
     }
 
     /**
-     * 鑾峰彇鍔熻兘鍒楄〃
+     * 鑾峰彇璁惧鍒楄〃
      */
     public void getFunctionList(HDLLinkCallBack callBack) {
         HDLSocket.getInstance().getFunctionList(callBack);
     }
 
     /**
-     * 鑾峰彇鍔熻兘灞炴��
+     * 鑾峰彇璁惧鍔熻兘灞炴��
      *
      * @param sids
      * @param callBack
@@ -337,6 +333,41 @@
     }
 
     /**
+     * 鑾峰彇鎴块棿鍒楄〃
+     */
+    public void getRoomList(HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().getRoomList(callBack);
+    }
+
+    /**
+     * 鎴块棿缁戝畾鍏崇郴鍒楄〃鑾峰彇
+     *
+     * @param uid      鎴块棿uid鍒楄〃
+     * @param callBack 鍥炶皟
+     */
+    public void getRoomBindList(List<String> uid, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().getRoomBindList(uid, callBack);
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栧垪琛�
+     */
+    public void getLogicList(HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().getLogicList(callBack);
+    }
+
+    /**
+     * 饩冨姩鍖栧惎饨ょ饨�
+     *
+     * @param sid      鑷姩鍖杝id
+     * @param enable   true=鍚饯 false=绂佲饯
+     * @param callBack 鍥炶皟
+     */
+    public void editEnableLogic(String sid, boolean enable, HDLLinkCallBack callBack) {
+        HDLSocket.getInstance().editEnableLogic(sid, enable, callBack);
+    }
+
+    /**
      * 閫氱敤UDP鍙戦�佹寚浠�
      * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆�
      *
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/LogicEnableRequest.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/LogicEnableRequest.java
new file mode 100644
index 0000000..31ca93b
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/LogicEnableRequest.java
@@ -0,0 +1,37 @@
+package com.hdl.sdk.connect.bean.request;
+
+import java.io.Serializable;
+
+/**
+ * Created by Tong on 2021/10/8.
+ */
+public class LogicEnableRequest implements Serializable
+{
+
+    private String sid;
+    private boolean enable;
+
+    public LogicEnableRequest() {
+    }
+
+    public LogicEnableRequest(String sid, boolean enable) {
+        this.sid = sid;
+        this.enable = enable;
+    }
+
+    public String getSid() {
+        return sid;
+    }
+
+    public void setSid(String sid) {
+        this.sid = sid;
+    }
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java
index 3a0f1c3..fd52428 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java
@@ -1,8 +1,5 @@
 package com.hdl.sdk.connect.callback;
 
-import com.hdl.sdk.common.exception.HDLLinkException;
-import com.hdl.sdk.connect.bean.LinkResponse;
-
 /**
  * Created by jlchen on 11/16/21.
  *
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
index 57afa7b..0149de2 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -28,6 +28,7 @@
 import com.hdl.sdk.connect.bean.request.ListOidRequest2;
 import com.hdl.sdk.connect.bean.request.ListSidRequest;
 import com.hdl.sdk.connect.bean.request.ListUploadRequest;
+import com.hdl.sdk.connect.bean.request.LogicEnableRequest;
 import com.hdl.sdk.connect.bean.request.PropertyReadRequest;
 import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse;
 import com.hdl.sdk.connect.bean.response.BaseLocalResponse;
@@ -547,7 +548,7 @@
     }
 
     /**
-     * 鑾峰彇鍦烘櫙鍒楄〃
+     * 鑾峰彇鍦烘櫙璇︽儏
      */
     public void getScene(List<String> sids, HDLLinkCallBack callBack) {
         if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
@@ -1168,4 +1169,180 @@
         }
     }
 
+    /**
+     * 鑾峰彇鎴块棿鍒楄〃
+     */
+    public void getRoomList(HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            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.ROOM_LIST_GET, getGatewayId());
+
+            LinkRequest message = new LinkRequest(topic,
+                    jsonObject.toString());
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 鎴块棿缁戝畾鍏崇郴鍒楄〃鑾峰彇
+     */
+    public void getRoomBindList(List<String> uid, HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<String>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            data.setObjects(uid);
+
+            String topic = String.format(TopicConstant.ROOM_BIND_LIST_GET, getGatewayId());
+            LinkRequest message = new LinkRequest(topic,
+                    GsonConvert.getGson().toJson(data));
+
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鑷姩鍖栧垪琛�
+     */
+    public void getLogicList(HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            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.LOGIC_LIST_GET, getGatewayId());
+
+            LinkRequest message = new LinkRequest(topic,
+                    jsonObject.toString());
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR));
+            }
+        }
+    }
+
+    /**
+     * 饩冨姩鍖栧惎饨ょ饨�
+     *
+     * @param sid      鑷姩鍖杝id
+     * @param enable   true=鍚饯 false=绂佲饯
+     * @param callBack 鍥炶皟
+     */
+    public void editEnableLogic(String sid, boolean enable, HDLLinkCallBack callBack) {
+        if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) {
+            String time = String.valueOf(System.currentTimeMillis());
+            final BaseLocalResponse<List<LogicEnableRequest>> data = new BaseLocalResponse<>();
+            data.setId(IdUtils.getUUId());
+            data.setTime_stamp(time);
+
+            List<LogicEnableRequest> list = new ArrayList<>();
+            LogicEnableRequest request = new LogicEnableRequest(sid, enable);
+            list.add(request);
+
+            data.setObjects(list);
+
+            String topic = String.format(TopicConstant.EDIT_LOGIC_ENABLE, getGatewayId());
+            LinkRequest message = new LinkRequest(topic,
+                    GsonConvert.getGson().toJson(data));
+
+            String replyTopic = topic + "_reply";
+            try {
+                sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() {
+                    @Override
+                    public void onSucceed() {
+
+                    }
+
+                    @Override
+                    public void onError() {
+                        if (callBack != null) {
+                            callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                        }
+                    }
+                });
+            } catch (Exception e) {
+                if (callBack != null) {
+                    callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+                }
+            }
+        } else {
+            if (callBack != null) {
+                callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR));
+            }
+        }
+    }
+
 }
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/OsManager.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/OsManager.java
new file mode 100644
index 0000000..3e9e36f
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/OsManager.java
@@ -0,0 +1,500 @@
+package com.hdl.sdk.sourceos;
+
+import android.app.HdlSystemManager;
+import android.content.Context;
+import android.content.Intent;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.hdl.sdk.sourceos.knob.OsEventListener;
+
+/**
+ * Created by panlili on 2025/2/14
+ * description:
+ */
+public class OsManager {
+    public static final String TAG = "Rk3566Manager";
+
+    public OsManager() {
+    }
+
+    public static void init(Context context) {
+        Rk3566Manager.getInstance().init(context);
+        Log.i(TAG, "init");
+    }
+
+    public static void addEventListener(OsEventListener listener) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.registerEventListener(listener);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public static void removeEventListener(OsEventListener listener) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.unregisterEventListener(listener);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鑾峰彇褰撳墠API鐗堟湰
+    public static String getAPIVersion() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getApiVersion();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇璁惧model
+    public static String getDeviceModel() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getDeviceModel();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇android绯荤粺鐗堟湰
+    public static String getAndroidOSVersion() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getAndroidOsVersion();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇杩愯鍐呭瓨
+    public static String getRunningMemory() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getRunningMemory();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇鍐呴儴瀛樺偍绌洪棿
+    public static String getInternalStorageMemory() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getInternalStorageMemory();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇鍐呴儴瀛樺偍鍙敤瀹归噺
+    public static String getInternalFreeStorageMemory() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getInternalFreeStorageMemory();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇褰撳墠Kernel鐗堟湰
+    public static String getKernelVersion() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getKernelVersion();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇璁惧鐨勫浐浠剁郴缁熺増鏈拰缂栬瘧鏃ユ湡
+    public static String getBuilderNumberDisplay() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getBuilderNumberDisplay();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇绯荤粺鐗堟湰
+    public static String getFwVersion() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getFwVersion();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鍏虫満
+    public static void shutdown() {
+        try {
+            Log.d("Rk3566Manager", "shutdown");
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.reset();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //閲嶅惎
+    public static void reboot() {
+        try {
+            Log.d("Rk3566Manager", "reboot");
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.reboot();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鑾峰彇绯荤粺閰嶇疆淇℃伅
+    public static String readSystemConfigInfo() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.readSystemConfigInfo();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+
+    //璁剧疆灞忓箷浜害
+    public static void setBrightness(int b) {
+        Log.i("Rk3566Manager", "setBrightness: " + b);
+
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.setBrightness(b);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //璁剧疆灞忓箷鏂瑰悜
+    public static void setRotation(String value) {
+        Log.i("Rk3566Manager", "setRotation: " + value);
+
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.setRotation(value);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鎵撳紑/鍏抽棴鑳屽厜锛宼rue涓烘墦寮�锛宖alse涓哄叧闂�
+    public static void setLcdBlackLight(boolean value) {
+        Log.i("Rk3566Manager", "setLcdBlackLight: " + value);
+
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.setLcdBlackLight(value);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鑾峰彇浠ュお缃憁ac鍦板潃
+    public static String getEthMacAddress() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getEthMacAddress();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鑾峰彇浠ュお缃慽p鍦板潃
+    public static String getEthIpAddress() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getEthIpAddress();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "";
+        }
+    }
+
+    //鐘舵�佹爮鏄剧ず/闅愯棌
+    public static void hideNavigationBar(boolean isShow) {
+        Log.i("Rk3566Manager", "hideNavigationBar: " + isShow);
+
+        try {
+            Intent intent = new Intent();
+            intent.setAction("com.android.navigation.status");
+            intent.putExtra("hide", !isShow);
+            Rk3566Manager.getInstance().getContext().sendBroadcast(intent);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鑾峰彇浠ュお缃戣繛鎺ョ姸鎬�
+    public static int getEthernetLinkStatus() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getEthernetLinkStatus();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    //璁剧疆浠ュお缃戦潤鎬両P
+    public static int setStaticIp(String ipAddress, String netmask, String gateway, String dns1, String dns2) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.setStaticIp(ipAddress, netmask, gateway, dns1, dns2);
+        } catch (Exception var6) {
+            var6.printStackTrace();
+        }
+
+        return 0;
+    }
+
+    //鑾峰彇瀛愮綉鎺╃爜
+    public static String getEthNetmask() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.getEthNetmask();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+
+    //鑾峰彇缃戝叧ip
+    public static String getEthGateway() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.getEthGateway();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+
+    //鑾峰彇DNS1
+    public static String getEthDns1() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.getEthDns1();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+
+    //鑾峰彇DNS2
+    public static String getEthDns2() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.getEthDns2();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "";
+    }
+
+    //鏂紑浠ュお缃�
+    public static boolean disconnectEthernet(String iface) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.disconnectEthernet(iface);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+    //杩炴帴浠ュお缃�
+    public static boolean connectEthernet(String iface) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.connectEthernet(iface);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+    //鍒囨崲鍔ㄦ�乮p
+    public static boolean switchDHCP() {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                return manager.setDhcp();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+    //浼戠湢
+    public static void goToSleep(String msg) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.goToSleep(msg);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //鍞ら啋
+    public static void wakeUp(String msg) {
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            if (manager != null) {
+                manager.wakeUp(msg);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //ota鍗囩骇
+    public static void ota(String path) {
+        try {
+            Intent intent = new Intent();
+            intent.setAction("com.hdl.os.OTA");
+            intent.putExtra("com.hdl.os.OTA.path", path);
+            Rk3566Manager.getInstance().getContext().sendBroadcast(intent);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //闈欓粯瀹夎
+    public static void install(String path, String packageName, String activityName) {
+        try {
+            Intent intent = new Intent();
+            intent.setAction("com.hdl.os.SilentInstall");
+            intent.putExtra("com.hdl.os.SilentInstall.path", path);
+            if (!TextUtils.isEmpty(packageName)) {
+                intent.putExtra("com.hdl.os.SilentInstall.packageName", packageName);
+            }
+
+            if (!TextUtils.isEmpty(activityName)) {
+                intent.putExtra("com.hdl.os.SilentInstall.activityName", activityName);
+            }
+
+            Rk3566Manager.getInstance().getContext().sendBroadcast(intent);
+        } catch (Exception var4) {
+            var4.printStackTrace();
+        }
+
+    }
+
+    //璁剧疆杩囨护鏉冮檺
+    public static void setFilterPermissionPackageName(String packageName) {
+        Log.i("Rk3566Manager", "setFilterPermissionPackageName: " + packageName);
+
+        try {
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            manager.setFilterPermissionPackageName(packageName);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //寮�鍚紶鎰熷櫒璇诲彇
+    public static boolean startTof(int readMode) {
+        Log.i("Rk3566Manager", "readMode=" + readMode);
+
+        try {
+            Rk3566Manager.getInstance().getManager().startTof(readMode);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return false;
+    }
+
+    //璇诲彇浼犳劅鍣ㄦ暟鎹�
+    public static int readTofData() {
+        Log.i("Rk3566Manager", "readTofData");
+
+        try {
+            return Rk3566Manager.getInstance().getManager().readTofData();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return -1;
+        }
+    }
+
+    //缁撴潫浼犳劅鍣ㄨ鍙�
+    public static boolean stopTof() {
+        Log.i("Rk3566Manager", "stopTof");
+
+        try {
+            return Rk3566Manager.getInstance().getManager().stopTof();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    //鑾峰彇楹﹀厠椋庣姸鎬�
+    public static boolean getMicEnable() {
+        try {
+            Log.i("Rk3566Manager", "getMicEnable()");
+            HdlSystemManager manager = Rk3566Manager.getInstance().getManager();
+            return manager.getMicEnable();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/Rk3566Manager.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/Rk3566Manager.java
new file mode 100644
index 0000000..ba0fdcb
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/Rk3566Manager.java
@@ -0,0 +1,59 @@
+package com.hdl.sdk.sourceos;
+
+import android.annotation.SuppressLint;
+import android.app.HdlSystemManager;
+import android.content.Context;
+
+/**
+ * Created by panlili on 2025/2/14
+ * description:
+ */
+public class Rk3566Manager {
+    private static final String TAG = "Rk3566Manager";
+    private Context context;
+    private HdlSystemManager manager;
+
+    private Rk3566Manager() {
+    }
+
+    public static Rk3566Manager getInstance() {
+        return Rk3566Manager.SingletonInstance.INSTANCE;
+    }
+
+    @SuppressLint({"WrongConstant"})
+    public void init(Context context) {
+        this.context = context;
+
+        try {
+            this.manager = (HdlSystemManager) context.getSystemService("hdl");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    public Context getContext() {
+        return this.context;
+    }
+
+    public void setContext(Context context) {
+        this.context = context;
+    }
+
+    @SuppressLint({"WrongConstant"})
+    public HdlSystemManager getManager() {
+        return this.manager;
+    }
+
+    public void setManager(HdlSystemManager manager) {
+        this.manager = manager;
+    }
+
+    private static class SingletonInstance {
+        private static final Rk3566Manager INSTANCE = new Rk3566Manager();
+
+        private SingletonInstance() {
+        }
+    }
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IKnobListenerAdapter.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IKnobListenerAdapter.java
new file mode 100644
index 0000000..671f515
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IKnobListenerAdapter.java
@@ -0,0 +1,169 @@
+package com.hdl.sdk.sourceos.knob;
+
+
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+
+
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * 鏃嬮挳澶т簬200姣
+ * 宸﹀彸浜掓枼锛岀伒鍔ㄥ乏鍙虫棆閽崐鏍兼湁闂
+ */
+public abstract class IKnobListenerAdapter extends OsEventListener {
+
+
+
+    //宸︽棆
+    public static final int LEFT_KEY_CODE = 132;
+    //鍙虫棆
+    public static final int RIGHT_KEY_CODE = 131;
+
+    private static final long MAX_LONG_CLICK_TIME = 500L;
+    private static final long MAX_ROTATE_TIME = 500L;
+
+    private static final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    //涓婁竴娆$偣鍑绘椂闂�
+    private final AtomicLong lastClickTime = new AtomicLong(0);
+
+    //涓婁竴娆℃棆杞椂闂�
+    private final AtomicLong lastRotateTime = new AtomicLong(0);
+    private final AtomicLong rotateCount = new AtomicLong(0);
+
+
+    //涓婁竴娆�
+    public IKnobListenerAdapter() {
+    }
+
+    public void clear() {
+        mHandler.removeCallbacksAndMessages(null);
+    }
+
+    /**
+     * 闀挎寜
+     */
+    public void onKnobLongClickListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLongClick");
+    }
+
+    /**
+     * 鐐瑰嚮
+     */
+    public void onKnobClickListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobClick");
+    }
+
+    /**
+     * 鍚戝乏鏃嬭浆
+     */
+    public void onKnobLongLeftListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLongLeft");
+    }
+
+    public void onKnobLeftListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLeft");
+    }
+
+
+    /**
+     * 鍚戝彸鏃嬭浆
+     */
+    public void onKnobRightListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLongRight");
+    }
+
+    public void onKnobLongRightListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobRight");
+    }
+
+
+    @Override
+    public void onKeyEvent(int keyCode, int action) {
+        long time = System.currentTimeMillis();
+        if (keyCode == LEFT_KEY_CODE) {
+            //鍚戝乏鏃嬭浆
+            if (action == 1) {//1鏄ǔ瀹氱姸鎬�
+                mHandler.removeCallbacks(mKnobRightRunnable);
+                mHandler.postDelayed(mKnobLeftRunnable, 150);
+                if (time - lastRotateTime.get() < MAX_ROTATE_TIME) {
+                    if (rotateCount.get() > 4) {
+                        rotateCount.set(0);
+                        lastRotateTime.set(0);
+                        //蹇�熸棆杞�
+                        mHandler.post(mKnobLongLeftRunnable);
+                    }
+                    rotateCount.set(rotateCount.get() + 1);
+                } else {
+                    lastRotateTime.set(time);
+                }
+
+            }
+        } else if (keyCode == RIGHT_KEY_CODE) {
+            //鍚戝彸鏃嬭浆
+            if (action == 1) {//1鏄ǔ瀹氱姸鎬�
+                mHandler.removeCallbacks(mKnobLeftRunnable);
+                mHandler.postDelayed(mKnobRightRunnable, 150);
+                if (time - lastRotateTime.get() < MAX_ROTATE_TIME) {
+                    if (rotateCount.get() > 4) {
+                        rotateCount.set(0);
+                        lastRotateTime.set(0);
+                        //蹇�熸棆杞�
+                        mHandler.post(mKnobLongRightRunnable);
+                    }
+                    rotateCount.set(rotateCount.get() + 1);
+                } else {
+                    lastRotateTime.set(time);
+                }
+            }
+        }
+
+    }
+
+
+    private final Runnable mKnobLeftRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobLeftListener();
+        }
+    };
+
+    private final Runnable mKnobLongLeftRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobLongLeftListener();
+        }
+    };
+
+    private final Runnable mKnobRightRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobRightListener();
+        }
+    };
+
+    private final Runnable mKnobLongRightRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobLongRightListener();
+        }
+    };
+
+    private final Runnable mKnobLongClickRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobLongClickListener();
+        }
+    };
+
+    private final Runnable mKnobClickRunnable = new Runnable() {
+        @Override
+        public void run() {
+            onKnobClickListener();
+        }
+    };
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IQuickKnobListenerAdapter.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IQuickKnobListenerAdapter.java
new file mode 100644
index 0000000..8d2de4c
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IQuickKnobListenerAdapter.java
@@ -0,0 +1,87 @@
+package com.hdl.sdk.sourceos.knob;
+
+
+import android.os.Handler;
+import android.os.Looper;
+import android.util.Log;
+
+/**
+ * Created by Tong on 2022/8/29.
+ * 蹇�熷搷搴�
+ */
+public abstract class IQuickKnobListenerAdapter extends OsEventListener {
+
+
+    //宸︽棆
+    public static final int LEFT_KEY_CODE = 132;
+    //鍙虫棆
+    public static final int RIGHT_KEY_CODE = 131;
+
+
+    private static final Handler mHandler = new Handler(Looper.getMainLooper());
+
+
+    //涓婁竴娆�
+    public IQuickKnobListenerAdapter() {
+    }
+
+    public void clear() {
+        mHandler.removeCallbacksAndMessages(null);
+    }
+
+
+    public void onKnobLeftListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLeft");
+    }
+
+
+    /**
+     * 鍚戝彸鏃嬭浆
+     */
+    public void onKnobRightListener() {
+        Log.i("knob", "IKnobListenerAdapter:onKnobLongRight");
+    }
+
+
+    @Override
+    public void onKeyEvent(int keyCode, int action) {
+
+        if (keyCode == LEFT_KEY_CODE) {
+            //鍚戝乏鏃嬭浆
+            mHandler.post(mKnobLeftRunnable);
+
+        } else if (keyCode == RIGHT_KEY_CODE) {
+            //鍚戝彸鏃嬭浆
+            mHandler.post(mKnobRightRunnable);
+        }
+
+    }
+
+
+    private final Runnable mKnobLeftRunnable = new Runnable() {
+        @Override
+        public void run() {
+            try {
+                onKnobLeftListener();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    };
+
+
+    private final Runnable mKnobRightRunnable = new Runnable() {
+        @Override
+        public void run() {
+            try {
+                onKnobRightListener();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+
+        }
+    };
+
+
+}
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/OsEventListener.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/OsEventListener.java
new file mode 100644
index 0000000..d6aa82e
--- /dev/null
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/OsEventListener.java
@@ -0,0 +1,14 @@
+package com.hdl.sdk.sourceos.knob;
+
+import android.os.IEventListener;
+import android.os.RemoteException;
+
+/**
+ * Created by panlili on 2025/2/14
+ * description:
+ */
+public abstract class OsEventListener extends IEventListener.Stub{
+
+    public OsEventListener() {
+    }
+}
diff --git a/HDLSDK_DEMO/.idea/misc.xml b/HDLSDK_DEMO/.idea/misc.xml
index 84606c4..d1d25ee 100644
--- a/HDLSDK_DEMO/.idea/misc.xml
+++ b/HDLSDK_DEMO/.idea/misc.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="DesignSurface">
     <option name="filePathToZoomLevelMap">

--
Gitblit v1.8.0