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