From 14de918a79943e4961b09fa01ed320c6cad41f2e Mon Sep 17 00:00:00 2001
From: wjc <1243177876@qq.com>
Date: 星期三, 28 六月 2023 17:14:51 +0800
Subject: [PATCH] Revert "Revert "Merge branch 'hxb' into wjc""

---
 HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java |  392 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 392 insertions(+), 0 deletions(-)

diff --git a/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java
new file mode 100644
index 0000000..957bac3
--- /dev/null
+++ b/HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/zigbee/HDLLinkLocalZigBee.java
@@ -0,0 +1,392 @@
+package com.hdl.sdk.link.zigbee;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.hdl.sdk.link.common.event.EventListener;
+import com.hdl.sdk.link.common.exception.HDLLinkCode;
+import com.hdl.sdk.link.common.exception.HDLLinkException;
+import com.hdl.sdk.link.common.utils.LogUtils;
+import com.hdl.sdk.link.common.utils.ThreadToolUtils;
+import com.hdl.sdk.link.common.utils.gson.GsonConvert;
+import com.hdl.sdk.link.core.bean.ZigbeeResponse;
+import com.hdl.sdk.link.core.callback.ZigbeeCallBack;
+import com.hdl.sdk.link.core.connect.HDLZigbeeConnect;
+import com.hdl.sdk.link.zigbee.bean.PanelVibrationBean;
+import com.hdl.sdk.link.zigbee.bean.TimeDataBean;
+import com.hdl.sdk.link.zigbee.bean.ZBBaseSendBean;
+import com.hdl.sdk.link.zigbee.bean.ZBDeviceBean;
+import com.hdl.sdk.link.zigbee.callback.ZBDeviceListCallBack;
+import com.hdl.sdk.link.zigbee.config.ZigBee;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by jlchen on 12/16/21.
+ * ZigBee鍘熺敓鍗忚鐩稿叧
+ */
+public class HDLLinkLocalZigBee {
+    private static final String TAG = "HDLLinkLocalZigBee";
+    private static final String Cluster_ID = "Cluster_ID";
+    private static final String Command = "Command";
+    //instance
+    private volatile static HDLLinkLocalZigBee instance;
+
+    //getInstance
+    public static synchronized HDLLinkLocalZigBee getInstance() {
+        if (instance == null) {
+            synchronized (HDLLinkLocalZigBee.class) {
+                if (instance == null) {
+                    instance = new HDLLinkLocalZigBee();
+                }
+            }
+        }
+        return instance;
+    }
+
+
+    /**
+     * 鍙戦�佹秷鎭粰缃戝叧
+     *
+     * @param gatewayOid
+     * @param replyTopic 鍥炲涓婚
+     * @param payload
+     * @param callback
+     */
+    public void sendData(String gatewayOid, String replyTopic, String payload, ZigbeeCallBack callback) {
+        //娉ㄦ剰 gatewayId鏄~瑕佽繛鎺ョ殑缃戝叧锛屽彲浠ユ槸涓荤綉鍏崇殑Id锛屼篃鍙互鏄粠缃戝叧鐨処d
+        HDLZigbeeConnect.getInstance().Send(gatewayOid, replyTopic, payload, callback);
+    }
+
+    /********************************缃戝叧鐩稿叧********************************/
+    /**
+     * 鍙戦�佹寚浠ゅ埌缃戝叧杩涜瀹氫綅(缃戝叧LED闂儊璇嗗埆)
+     *
+     * @param gatewayOid 缃戝叧id
+     * @param callback
+     */
+    public void locationGateway(String gatewayOid, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.GwLinuxLocate);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.GwLinuxLocate, jObject.toString(), callback);
+    }
+
+    /********************************璁惧鐩稿叧********************************/
+    /**
+     * 璁剧疆璁惧鍏ョ綉鏂瑰紡
+     * 璁剧疆1娆′箣鍚庝繚鎸佽缃殑鏂瑰紡
+     * 閲嶅惎鎭㈠榛樿鏂瑰紡
+     *
+     * @param gatewayOid        缃戝叧oid
+     * @param deviceJoiningMode 0锛氶粯璁わ紱1锛氭柊鏂瑰紡锛堝揩閫熷叆缃戯級
+     */
+    public void setDeviceJoiningMode(String gatewayOid, int deviceJoiningMode, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("Cluster_ID", 0);
+        jObject.addProperty("Command", 180);
+        JsonObject data = new JsonObject();
+        data.addProperty("mode", deviceJoiningMode);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SetJoiningModeRespon, jObject.toString(), callback);
+    }
+
+    /**
+     * 璁剧疆鎼滅储鏂拌澶囧紑鍚垨鑰呭叧闂�
+     *
+     * @param gatewayOid 缃戝叧oid
+     * @param time       寮�鍚悳绱㈣澶囩殑鏃堕棿(鍗曚綅锛氱) 0:鍏抽棴鎼滅储 255锛氫竴鐩村紑鍚�
+     * @param callback
+     */
+    public void sendSearchDevice(String gatewayOid, int time, ZigbeeCallBack callback) {
+        ZBBaseSendBean<TimeDataBean> baseSendBean = new ZBBaseSendBean(0, ZigBee.CommandType.SearchNewDevice, new TimeDataBean(time));
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SearchNewDevice, GsonConvert.getGson().toJson(baseSendBean), callback);
+    }
+
+    /**
+     * 鎼滅储璁惧
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void startSearchDevice(String gatewayOid, ZigbeeCallBack callback) {
+        sendSearchDevice(gatewayOid, 255, callback);
+    }
+
+    /**
+     * 鏆傚仠鎼滅储璁惧
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void stopSearchDevice(String gatewayOid, ZigbeeCallBack callback) {
+        sendSearchDevice(gatewayOid, 0, callback);
+    }
+
+    /**
+     * 瀹氫綅璁惧 闂儊5绉�
+     * 璇ユ潯鎸囦护璁惧涓嶅洖澶嶏紝鎵�鏈夋病callBack
+     * 鍙戦�佽鍛戒护锛岃澶囨寚绀虹伅灏嗛棯鐑併�俢luster 鍒楄〃涓敮鎸� Identify 鍔熻兘锛屽嵆鍖呭惈 cluster=3 鐨勮 澶囧彲浠ヤ娇鐢ㄨ鎺ュ彛銆�
+     *
+     * @param gatewayOid
+     * @param deviceAddr 鍗曟挱鏃朵负璁惧鑺傜偣鐨� mac 鍦� 鍧� 绫诲瀷鏄瓧绗︼紙16 涓瓧绗︼級 缁勬挱鏃朵负缁� id 绫诲瀷鏄暟鍊� 骞挎挱鏃朵负 null
+     * @param epoint     璁惧绔彛鍙� 鍜� mac 鍦板潃鍏卞悓鏍囪瘑鍞竴鐨� zigbee 璁惧 鏁板�艰寖鍥� 0-255
+     */
+    public void locationDevice(String gatewayOid, String deviceAddr, int epoint) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 3);
+        jObject.addProperty(Command, 0);
+        jObject.addProperty("SendMode", 2);//鍙戦�佹ā寮� 缁勬挱: 1 鍗曟挱: 2 骞挎挱: 15
+        JsonObject data = new JsonObject();
+        data.addProperty("Time", 5);//闂儊鏃堕棿锛堢锛�
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.Identify, jObject.toString(), null);
+    }
+
+
+    /**
+     * 璁惧鍒楄〃-璁惧鍒犻櫎锛堜娇璁惧绂荤綉锛�
+     * 閫氳繃璇ユ寚浠ゅ彲浠ヤ娇璁惧鑴辩褰撳墠 zigbee 缃戠粶锛岃璁惧淇℃伅涔熷皢浼氬湪缃戝叧涓婂垹闄ゃ��
+     * 娉ㄦ剰锛氬皢浼氬垹闄ゅ悓涓� MAC 鍦板潃涓嬫墍鏈変笉鍚岀鍙g殑璁惧锛屽涓�涓� 2 璺寜閿澶囷紝瀹冨叿鏈変袱涓� 鎸夐敭锛屽湪璁惧鍒楄〃涓婅繖涓や釜鎸夐敭鍏锋湁鐩稿悓鐨� mac锛屼絾绔彛鍙锋槸涓嶅悓鐨勩�備娇鐢ㄨ鎸囦护璁╀换鎰� 涓�涓寜閿缃戯紝鍙︿竴涓篃浼氱缃戙��
+     *
+     * @param gatewayOid
+     * @param compelClear 0锛氫笉寮哄埗娓呴櫎銆傞渶瑕佽妭鐐硅澶� 鍙嶉绂荤綉纭淇℃伅鍚庢墠鑳藉垹闄よ 澶囦俊鎭��
+     *                    1锛氬己鍒舵竻闄ゃ�備笉闇�瑕佽妭鐐硅澶� 鍙嶉绂荤綉纭淇℃伅锛岀洿鎺ュ垹闄よ 澶囦俊鎭��
+     */
+    public void removeDevice(String gatewayOid, int compelClear, List<String> deviceAddrList, ZigbeeCallBack callback) {
+        if (deviceAddrList == null || deviceAddrList.size() == 0) {
+            LogUtils.e("娌℃湁瑕佸垹闄ゅ埌鏁版嵁");
+            return;
+        }
+        JsonArray addrList = new JsonArray();
+        for (String addr : deviceAddrList) {
+            JsonObject aObject = new JsonObject();
+            aObject.addProperty("DeviceAddr", addr);
+            addrList.add(aObject);
+        }
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.RemoveDevice);
+        JsonObject data = new JsonObject();
+        data.addProperty("CompelClear", compelClear);
+        data.add("DeviceAddrList", addrList);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.RemoveDevice, jObject.toString(), callback);
+    }
+
+    /**
+     * 璁惧鍒楄〃-鑾峰彇鏈湴缃戝叧璁惧 EPDeviceId 鍒楄〃
+     * 锛堢綉鍏充竴涓竴涓繑鍥炵鐐硅澶囪缁嗕俊鎭級
+     *
+     * @param gatewayOid
+     * @param callback
+     */
+    public void getZigBeeDeviceList(String gatewayOid, ZBDeviceListCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.GetDeviceInfo);
+        //鏄惁鑾峰彇鍒楄〃鎴愬姛鏍囪
+        AtomicBoolean isSuccess = new AtomicBoolean(false);
+        //鎼滅储5s绛夊緟鏍囪
+        AtomicInteger timeOut = new AtomicInteger(0);
+        //璁惧鍒楄〃
+        List<ZBDeviceBean> list = new ArrayList<>();
+        //娉ㄥ唽鐩戝惉浜嬩欢
+        EventListener zigBeeEventListener = new EventListener() {
+            @Override
+            public synchronized void onMessage(Object msg) {
+                if (msg instanceof ZigbeeResponse) {
+                    ZigbeeResponse zigbeeResponse = (ZigbeeResponse) msg;
+                    try {
+                        if (zigbeeResponse.getTopic().equals(ZigBee.ReplyTopicType.GetDeviceInfo)) {
+                            final ZBDeviceBean bean = GsonConvert.getGson().fromJson(zigbeeResponse.getData(), new TypeToken<ZBDeviceBean>() {
+                            }.getType());
+
+
+                            if (bean == null) {
+                                LogUtils.i("鑾峰彇鍒扮殑Zigbee璁惧鍒楄〃鍙嶇郴鍒楀寲澶辫触:\r\n" + zigbeeResponse.getData());
+                            } else {
+                                bean.setGatewayMac(zigbeeResponse.getOid());
+                                LogUtils.i("zigbeeResponse ZBDeviceBean:" + bean.getDeviceAddr() + "锛�" + bean.getEpoint());
+                                if (bean.getData().getTotalNum() == 0) {
+                                    //鍥炲绌虹殑璁惧鍒楄〃
+                                    list.clear();
+                                    if (callback != null) {
+                                        callback.onSuccess(list);
+                                    }
+                                    HDLZigbeeConnect.getInstance().removeListener(this);
+                                    isSuccess.set(true);
+                                } else {
+                                    list.add(bean);
+//                                LogUtils.i("getZigBeeDeviceList 閲嶇疆鏃堕棿涓�0");
+                                    timeOut.set(0);//鏀跺埌涓�涓澶囧垯閲嶇疆鏃堕棿
+                                    //濡傛灉褰撳墠搴忓彿绛変簬鎬绘暟锛屼唬琛ㄦ槸鏈�鍚庝竴涓澶囦簡锛屽洖璋冩垚鍔�
+                                    if (bean.getData().getDeviceNum() == bean.getData().getTotalNum()) {
+                                        if (callback != null) {
+                                            callback.onSuccess(list);
+                                        }
+                                        HDLZigbeeConnect.getInstance().removeListener(this);
+                                        isSuccess.set(true);
+                                        LogUtils.i("getZigBeeDeviceList璇诲彇瀹屾垚");
+                                        timeOut.set(6);//璁℃椂缁撴潫鏍囪
+                                    }
+
+                                }
+                            }
+                        }
+                    } catch (Exception e) {
+                        LogUtils.e(TAG, "鎺ユ敹鐨勬暟鎹唴瀹�:" + zigbeeResponse.getData() + "  寮傚父淇℃伅:" + e.getMessage());
+                    }
+                }
+            }
+        };
+        HDLZigbeeConnect.getInstance().registerListener(zigBeeEventListener);
+        //鍙戦�佹暟鎹�
+        sendData(gatewayOid, "", jObject.toString(), null);
+        //5绉掑悗杩樻病鏈夋帴鏀跺埌鏁版嵁锛屽氨鍥炶皟澶辫触
+        ScheduledExecutorService scheduledExecutorService = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
+        scheduledExecutorService.schedule(new Runnable() {
+            @Override
+            public void run() {
+                while (timeOut.get() < 5) {
+                    try {
+                        timeOut.set(timeOut.get() + 1);
+                        LogUtils.i("getZigBeeDeviceList 璁℃椂锛�" + timeOut.get() + "s");
+                        Thread.sleep(1000);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+                //绉婚櫎鐩戝惉浜嬩欢
+                HDLZigbeeConnect.getInstance().removeListener(zigBeeEventListener);
+                if (!isSuccess.get()) {
+                    if (null != callback) {
+                        callback.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_Zigbee_DEVICE_LIST_FAILURE_ERROR));
+                    }
+                }
+                LogUtils.i("getZigBeeDeviceList 5s鍊掕鏃剁粨鏉�");
+                scheduledExecutorService.shutdownNow();
+            }
+        }, 1, TimeUnit.SECONDS);
+
+    }
+
+    /**
+     * 淇敼璁惧绔彛锛堟寜閿級鍚嶇О
+     *
+     * @param gatewayOid
+     * @param deviceAddr
+     * @param epoint
+     * @param deviceName
+     * @param callback
+     */
+    public void renameDeviceName(String gatewayOid, String deviceAddr, int epoint, String deviceName, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.DeviceRename);
+        JsonObject data = new JsonObject();
+        data.addProperty("DeviceName", deviceName);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.DeviceRename, jObject.toString(), callback);
+    }
+
+    /**
+     * 瀵圭鐐瑰洖璺澶囧姛鑳界被鍨嬭繘琛岃缃 onoffoutput 鍥炶矾,杩涜璁剧疆涓烘櫘閫氬紑鍏虫垨鎻掑骇鎴栫伅鍏�
+     *
+     * @param gatewayOid
+     * @param deviceAddr   璁惧鑺傜偣鐨� mac 鍦板潃 锛堟渶澶� 16 涓瓧绗︼級
+     * @param epoint       璁惧绔彛鍙� 鍜� mac 鍦板潃鍏卞悓鏍囪瘑鍞竴鐨� zigbee 璁惧 鏁板�艰寖鍥� 0-255
+     * @param functionType 鐢ㄦ潵琛ㄧず瀹為檯鍥炶矾鐢ㄤ簬浠�涔� 鍔熻兘锛屽彲鎵╁睍 0-缁х數鍣ㄦ帴鏅�氬紑鍏� 1-缁х數鍣ㄦ帴鐏厜 2-鎻掑骇
+     * @param callback
+     */
+    public void setEPDeviceFunctionType(String gatewayOid, String deviceAddr, int epoint, int functionType, ZigbeeCallBack callback) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceAddr);
+        jObject.addProperty("Epoint", epoint);
+        jObject.addProperty(Cluster_ID, 0);
+        jObject.addProperty(Command, ZigBee.CommandType.SetEPDeviceFunctionType);
+        JsonObject data = new JsonObject();
+        data.addProperty("FunctionType", functionType);
+        jObject.add("Data", data);
+        sendData(gatewayOid, ZigBee.ReplyTopicType.SetEPDeviceFunctionType, jObject.toString(), callback);
+    }
+
+
+    /********闈㈡澘闇囧姩鍔熻兘********/
+    /**
+     * 鑾峰彇绠�绾﹂潰鏉块渿鍔ㄥ姛鑳界殑淇℃伅
+     */
+    public void getPanelVibrationInfo(String gatewayOid, String deviceAddr, int epoint, String passData, ZigbeeCallBack callback) {
+//        //缁勮鍙戦�佹暟鎹�
+//        JsonObject jObject = new JsonObject();
+//        jObject.addProperty("DeviceAddr", deviceAddr);
+//        jObject.addProperty("Epoint", 200);
+//        jObject.addProperty(Cluster_ID, 64513);
+//        jObject.addProperty(Command, 0);
+//        JsonObject data = new JsonObject();
+//        data.addProperty("PassData", "050108110101");
+//        jObject.add("Data", data);
+//        sendClientDataPassthrough(device, jObject.toString(), "0802", 18, 6, null, callback);
+//        sendClientDataPassthrough(gatewayOid,deviceAddr,epoint,passData,callback);
+
+    }
+
+    /**
+     * 璁剧疆绠�绾﹂潰鏉块渿鍔ㄥ姛鑳界殑淇℃伅
+     *
+     * @param device
+     * @param deviceAddr
+     * @param panelVibrationBean
+     * @param callback
+     */
+    public void setPanelVibrationInfo(String device, String deviceAddr, PanelVibrationBean panelVibrationBean, ZigbeeCallBack callback) {
+//        String passData = "0800081104";
+//        passData += panelVibrationBean.getIsEnable() ? "01" : "00";
+////        passData += Convert.ToString(panelVibrationBean.getStrength(), 16).PadLeft(2, '0');
+////        String time = Convert.ToString(panelVibrationBean.getTime(), 16).PadLeft(4, '0');
+////        //浣庝綅鍦ㄥ墠锛岄珮浣嶅湪鍚�
+////        passData += time.Substring(2, 2);
+////        passData += time.Substring(0, 2);
+//
+////        var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
+////        var data = new Newtonsoft.Json.Linq.JObject { { "PassData", passData } };
+////        jObject.Add("Data", data);
+//
+//        JsonObject jObject = new JsonObject();
+//        jObject.addProperty("DeviceAddr", deviceAddr);
+//        jObject.addProperty("Epoint", 200);
+//        jObject.addProperty(Cluster_ID, 64513);
+//        jObject.addProperty(Command, 0);
+//        JsonObject data = new JsonObject();
+//        data.addProperty("PassData", passData);
+//        jObject.add("Data", data);
+//
+//        sendClientDataPassthrough(device, jObject.toString(), "0002", 16, 6, null, callback);
+    }
+
+
+    /**
+     * 寮�鍏虫帶鍒�(浠呯敤浜巆luster=6鐨勮澶囷級 璁惧鏀寔cluster=6鐨勮澶囨墠鑳借皟鐢ㄨ鎺ュ彛
+     *
+     * @param command 0:鍏抽棴 1:鎵撳紑 2:鍙栧弽
+     */
+    public void switchControl(String gatewayOid, int command, ZBDeviceBean deviceBean) {
+        JsonObject jObject = new JsonObject();
+        jObject.addProperty("DeviceAddr", deviceBean.getDeviceAddr());
+        jObject.addProperty("Epoint", deviceBean.getEpoint());
+        jObject.addProperty(Cluster_ID, 6);
+        jObject.addProperty(Command, command);
+        jObject.addProperty("SendMode", 2);
+        sendData(gatewayOid, "", jObject.toString(), null);
+    }
+
+}

--
Gitblit v1.8.0