From 99bc815e07e39354f51421b77f4012ffd35594d8 Mon Sep 17 00:00:00 2001
From: wjc <1243177876@qq.com>
Date: 星期三, 28 六月 2023 18:03:00 +0800
Subject: [PATCH] 2023年06月28日18:02:58
---
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