HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -106,6 +106,8 @@ beans.add(new DemoBean("设备功能列表")); beans.add(new DemoBean("UDP发送")); beans.add(new DemoBean("TCP发送")); beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调")); beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); @@ -129,12 +131,12 @@ searchGatewayBroadcast(); break; case 2: //获取功能列表 //获取功能列表 getFunctionList(); break; case 3: //功能属性读取 getFunctionAttribute(); getFunctionAttribute(); break; case 4: //设备控制 @@ -164,11 +166,18 @@ //TCP发送 tcpSend(); break; case 11: //UDP发送,监听主题回复,带重发带回调 udpSendWithCallback(); break; case 12: //TCP发送,监听主题回复,带重发带回调 tcpSendWithCallback(); break; } } }); } public void showToast(String text) { @@ -178,9 +187,9 @@ /** * 检测是否认证过 */ void checkIfCertified(){ void checkIfCertified() { boolean isCertified = HDLLink.getInstance().checkIfCertified(); String mes = isCertified?"已经认证过":"未认证"; String mes = isCertified ? "已经认证过" : "未认证"; showToast(mes); tv.setText(mes); } @@ -188,11 +197,11 @@ /** * 注册所有主题数据的监听 */ void registerAllTopicsListener(){ void registerAllTopicsListener() { allTopicsListener = new EventListener() { @Override public void onMessage(Object msg) { LinkResponse response = (LinkResponse)msg; LinkResponse response = (LinkResponse) msg; } }; HDLLink.getInstance().registerAllTopicsListener(allTopicsListener); @@ -200,20 +209,21 @@ /** * 处理收到的主题 * * @param response */ private void handleLinkResponse(LinkResponse response){ private void handleLinkResponse(LinkResponse response) { //网关搜索回复 if(response.getTopic().contains("/user/all/custom/gateway/search_reply")){ if (response.getTopic().contains("/user/all/custom/gateway/search_reply")) { String data = response.getData(); if (!TextUtils.isEmpty(data)) { Log.i("handleLinkResponse", "data:"+data); Log.i("handleLinkResponse", "data:" + data); final BaseLocalResponse<GatewaySearchBean> bean = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { }.getType()); GatewaySearchBean searchBean = bean.getObjects(); Log.i("handleLinkResponse", "GatewaySearchBean: "+searchBean.getGatewayId()); Log.i("handleLinkResponse", "GatewaySearchBean: " + searchBean.getGatewayId()); } }else{ } else { //其它主题 } @@ -236,14 +246,14 @@ /** * 移除所有主题数据的监听 */ void removeAllTopicsListener(){ void removeAllTopicsListener() { HDLLink.getInstance().removeAllTopicsListener(allTopicsListener); } /** * 入网认证 */ void sendAuthenticateRequest(){ void sendAuthenticateRequest() { tv.setText("开始入网认证..."); //认证提交参数准备 @@ -330,7 +340,7 @@ * 如果已经认证后,搜索指定网关是否在线 * 广播搜索认证过的网关是否在线 */ void searchGatewayBroadcast(){ void searchGatewayBroadcast() { tv.setText("搜索网关中..."); HDLLink.getInstance().searchGatewayBroadcast(new HDLAuthSocket.SearchGatewayCallBack() { @Override @@ -338,10 +348,11 @@ tv.setText("网关不在线"); responseTv.setText(e.getMsg()); } @Override public void onSuccess(GatewaySearchBean gatewaySearchBean) { tv.setText("网关在线"); responseTv.setText("搜索成功 网关id:"+gatewaySearchBean.getGatewayId()); responseTv.setText("搜索成功 网关id:" + gatewaySearchBean.getGatewayId()); // LogUtils.i("TAG", "onSuccess: 搜索成功:"+gatewaySearchBean.getGatewayId()); } }); @@ -350,7 +361,7 @@ /** * 获取功能列表 */ void getFunctionList(){ void getFunctionList() { tv.setText("获取功能列表中..."); responseTv.setText(""); HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @@ -371,7 +382,7 @@ * 功能属性读取 * 支持批量读取 */ void getFunctionAttribute(){ void getFunctionAttribute() { tv.setText("功能属性读取"); List<String> sids = new ArrayList<>(); sids.add(testLightSid); @@ -392,7 +403,7 @@ * 读取设备状态 * 支持批量读取 */ void propertyRead(){ void propertyRead() { tv.setText("读取状态中..."); List<String> list = new ArrayList<>(); list.add(testLightSid);//要读取设备的sid @@ -402,6 +413,7 @@ tv.setText("读取成功"); responseTv.setText(data); } @Override public void onError(HDLLinkException e) { tv.setText("读取失败"); @@ -414,14 +426,14 @@ * 控制失败 * 回复响应code为200 代表执行成功 */ void controlDecide(){ void controlDecide() { tv.setText("控制设备"); isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(testLightSid); List<DeviceControlRequest.StatusBean> statusBeanList= new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); @@ -443,7 +455,7 @@ /** * 获取场景列表 */ void getSceneList(){ void getSceneList() { tv.setText("读取场景列表"); HDLLink.getInstance().getSceneList(new HDLLinkCallBack() { @Override @@ -460,21 +472,22 @@ //场景列表 // {"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"}]} /** * 控制场景 * 执行成功的话 响应code为200 */ void controlScene(){ void controlScene() { tv.setText("场景控制"); //控制场景sid列表,支持批量控制 List<String> sids = new ArrayList<>(); isOn = !isOn; if(isOn){ if (isOn) { sids.add("04010560D2C7170A0A0100000000"); }else{ } else { sids.add("04010560D2C76E0A0A0100010000"); } HDLLink.getInstance().controlScene(sids,new HDLLinkCallBack() { HDLLink.getInstance().controlScene(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); @@ -488,7 +501,7 @@ } void startDevicesListActivity(){ void startDevicesListActivity() { Intent intent = new Intent(this, DevicesListActivity.class); startActivity(intent); } @@ -497,27 +510,29 @@ * TCP发送 只发一次,不监听回复,不重发 */ private void tcpSend() { tv.setText("TCP发送 只发一次,不监听回复,不重发"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr); } /** * 只发一次,不监听回复,不重发 * UDP只发一次,不监听回复,不重发 */ private void udpSend() { tv.setText("UDP发送 只发一次,不监听回复,不重发"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr); } private String getPropertyDownBodyStr(){ private String getPropertyDownBodyStr() { isOn = !isOn; List<DeviceControlRequest> requestList = new ArrayList<>(); DeviceControlRequest request = new DeviceControlRequest(); request.setSid(testLightSid); List<DeviceControlRequest.StatusBean> statusBeanList= new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); List<DeviceControlRequest.StatusBean> statusBeanList = new ArrayList<>(); DeviceControlRequest.StatusBean bean = new DeviceControlRequest.StatusBean(); bean.setKey("on_off"); bean.setValue(isOn ? "on" : "off"); statusBeanList.add(bean); @@ -532,4 +547,46 @@ return GsonConvert.getGson().toJson(data); } /** * UDP发送,监听主题回复,带重发带回调 */ private void udpSendWithCallback() { tv.setText("UDP发送,监听主题回复,带重发带回调"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().udpSendMsg(propertyDownTopic, bodyStr, new HDLLinkResponseCallBack() { @Override public void onSuccess(LinkResponse msg) { Log.i("udpSendWithCallback", "udpSendWithCallback"); responseTv.setText(GsonConvert.getGson().toJson(msg)); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * TCP发送,监听主题回复,带重发带回调 */ private void tcpSendWithCallback() { tv.setText("TCP发送,监听主题回复,带重发带回调"); String propertyDownTopic = String.format(TopicConstant.PROPERTY_DOWN, HDLLinkConfig.getInstance().getGatewayId()); String bodyStr = getPropertyDownBodyStr(); HDLLink.getInstance().tcpSendMsg(propertyDownTopic, bodyStr, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { Log.i("tcpSendWithCallback", "tcpSendWithCallback"); responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
@@ -4,6 +4,7 @@ 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.LinkRequest; import com.hdl.sdk.socket.SocketBoot; @@ -48,37 +49,16 @@ private ScheduledExecutorService sendThread; private String observeTopic; public interface HdlSocketListener { void onSucceed(Object msg); void onFailure(); } private HdlSocketHelper(Long sendAwaitTime, int maxRetry, SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) { this.sendAwaitTime = sendAwaitTime; this.maxRetry = maxRetry; this.boot = boot; this.linkRequest = linkRequest; this.listener = listener; this.sendNumber = new AtomicInteger(0); eventListener = new EventListener() { @Override public void onMessage(Object msg) { isSend.set(true); if (listener != null) { listener.onSucceed(msg); } if (sendThread != null) { sendThread.shutdownNow(); } EventDispatcher.getInstance().remove(eventListener); } }; EventDispatcher.getInstance().register(observeTopic, eventListener); } private HdlSocketHelper(Long sendAwaitTime, int maxRetry, UdpSocketBoot udpSocketBoot, String ipAddress,int port , LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) { String ipAddress, int port, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) { this.sendAwaitTime = sendAwaitTime; this.maxRetry = maxRetry; this.udpSocketBoot = udpSocketBoot; @@ -86,6 +66,7 @@ this.port = port; this.linkRequest = linkRequest; this.listener = listener; this.observeTopic = observeTopic; this.sendNumber = new AtomicInteger(0); eventListener = new EventListener() { @Override @@ -97,75 +78,79 @@ if (sendThread != null) { sendThread.shutdownNow(); } EventDispatcher.getInstance().remove(eventListener); //移除监听 removeListener(); } }; EventDispatcher.getInstance().register(observeTopic, eventListener); //注册监听 registerListener(); } public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener, Long sendAwaitTime, int maxRetry) { if (TextUtils.isEmpty(observeTopic)) { observeTopic = linkRequest.getTopic() + "_reply"; /** * 注册监听 */ void registerListener() { if (!TextUtils.isEmpty(observeTopic)) { EventDispatcher.getInstance().register(observeTopic, eventListener); // LogUtils.i("HdlSocketHelper", "register event"); } HdlSocketHelper socketHelper = new HdlSocketHelper(sendAwaitTime, maxRetry, boot, linkRequest, observeTopic, listener); socketHelper.send(); } public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) { send(boot, linkRequest, observeTopic, listener, DEF_SEND_TIMEOUT, DEF_MAX_RETRY); } public static void send(SocketBoot boot, LinkRequest linkRequest, HdlSocketListener listener) { send(boot, linkRequest, "", listener, DEF_SEND_TIMEOUT, DEF_MAX_RETRY); } public static void sendOne(SocketBoot boot, LinkRequest linkRequest, HdlSocketListener listener) { send(boot, linkRequest, "", listener, DEF_SEND_TIMEOUT, DEF_SEND_ONE); /** * 移除监听 */ void removeListener() { if (!TextUtils.isEmpty(observeTopic)) { EventDispatcher.getInstance().remove(observeTopic, eventListener); // LogUtils.i("HdlSocketHelper", "remove event"); } } /** * Udp的发送方法 * * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 * @param observeTopic 发送的主题 * @param retry 重发数次 * @param listener 回调 * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 * @param observeTopic 发送的主题 * @param retry 重发数次 * @param listener 回调 */ public static void sendUdp(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, LinkRequest linkRequest, String observeTopic, int retry,HdlSocketListener listener) { public static void sendUdp(UdpSocketBoot udpSocketBoot, String ipAddress, int port, LinkRequest linkRequest, String observeTopic, int retry, HdlSocketListener listener) { if (TextUtils.isEmpty(observeTopic)) { observeTopic = linkRequest.getTopic() + "_reply"; } HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, retry, udpSocketBoot, ipAddress,port, linkRequest, observeTopic, listener); HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, retry, udpSocketBoot, ipAddress, port, linkRequest, observeTopic, listener); socketHelper.send(); } /** * Udp的发送方法 * * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 * @param listener 回调 * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 * @param listener 回调 */ public static void sendUdp(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, LinkRequest linkRequest, HdlSocketListener listener) { sendUdp(udpSocketBoot,ipAddress,port,linkRequest,null,DEF_MAX_RETRY,listener); public static void sendUdp(UdpSocketBoot udpSocketBoot, String ipAddress, int port, LinkRequest linkRequest, HdlSocketListener listener) { sendUdp(udpSocketBoot, ipAddress, port, linkRequest, "", DEF_MAX_RETRY, listener); } /** * Udp的发送方法 * * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 * @param udpSocketBoot Udp当前对接 * @param ipAddress 发送的目标IP地址 * @param port 目的端口 * @param linkRequest 发送的数据 */ public static void sendUdpOne(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, LinkRequest linkRequest) { sendUdp(udpSocketBoot, ipAddress, port, linkRequest, null, DEF_SEND_ONE, null); public static void sendUdpOne(UdpSocketBoot udpSocketBoot, String ipAddress, int port, LinkRequest linkRequest) { HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, ipAddress, port, linkRequest, null, null); socketHelper.send(); } private void send() { @@ -184,7 +169,7 @@ } //如果是udp if (null != udpSocketBoot) { udpSocketBoot.sendMsg(ipAddress,port, linkRequest.getSendBytes()); udpSocketBoot.sendMsg(ipAddress, port, linkRequest.getSendBytes()); } } } catch (Exception e) { @@ -219,7 +204,8 @@ * 发送失败 */ private void notifyFailure() { EventDispatcher.getInstance().remove(eventListener); //移除监听 removeListener(); if (sendThread != null) { sendThread.shutdownNow(); sendThread = null;