From d6a2ca78cc573243a44ff805ac01935fd36bb6d8 Mon Sep 17 00:00:00 2001 From: JLChen <551775569@qq.com> Date: 星期二, 07 十二月 2021 15:40:00 +0800 Subject: [PATCH] 2021-12-07 1.调整搜索网关机制 --- HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java | 213 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 154 insertions(+), 59 deletions(-) diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java index 0fb853c..820d1a7 100644 --- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java +++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java @@ -1,5 +1,6 @@ package com.hdl.sdk.connect.socket; +import android.net.ipsec.ike.TunnelModeChildSessionParams; import android.text.TextUtils; import com.google.gson.Gson; @@ -10,6 +11,7 @@ import com.hdl.sdk.common.exception.HDLLinkCode; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.LogUtils; +import com.hdl.sdk.common.utils.ThreadToolUtils; import com.hdl.sdk.connect.bean.response.AuthenticateResponse; import com.hdl.sdk.connect.bean.response.NetworkAccessBroadcastResponse; import com.hdl.sdk.connect.callback.BaseCallBack; @@ -36,6 +38,9 @@ import java.io.UnsupportedEncodingException; import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST; @@ -51,7 +56,9 @@ */ private static final int UDP_PORT = 8585; private static SocketBoot updBoot; -// private EventListener authEvent; + // private EventListener authEvent; + //鎼滅储缃戝叧 + private EventListener searchGatewayEvent; /** * udp榛樿缁勬挱ip */ @@ -61,6 +68,10 @@ * instance */ private volatile static HDLAuthSocket instance; + + private HDLAuthSocket() { + initSearchGatewayEvent(); + } // public interface CallBack extends BaseCallBack { // void onSuccess(String msg); @@ -117,10 +128,10 @@ @Override public void onMessage(Object msg) { NetworkAccessBroadcastResponse bean = getNetworkAccessBroadcastResponse(msg); - if(bean != null){ + if (bean != null) { LogUtils.i(TAG, "缃戝叧鍏ョ綉骞挎挱IP: " + bean.getIPAddress()); String ipStr = bean.getIPAddress(); - if(!TextUtils.isEmpty(ipStr)){ + if (!TextUtils.isEmpty(ipStr)) { sendAuthenticateRequest(ipStr, request, callBack); } } @@ -134,7 +145,7 @@ /** * 缁撴潫鐩戝惉鍏ョ綉鍙婅璇佸箍鎾� */ - public void endAuthenticateRequest(){ + public void endAuthenticateRequest() { //绉婚櫎鐩戝惉 EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); } @@ -158,21 +169,21 @@ HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { - if(callBack == null) return; + if (callBack == null) return; AuthenticateResponse bean = getAuthenticateResponseBean(msg); - if(bean != null){ + if (bean != null) { String localSecret = bean.getAuth().getLocalSecret(); String gatewayId = bean.getObjects().getGatewayID(); String ipAddress = bean.getObjects().getIPAddress(); //鍒ゆ柇缃戝叧鏄惁宸茬粡娉ㄥ唽鍒颁簯绔� - if(TextUtils.isEmpty(localSecret) ||TextUtils.isEmpty(gatewayId)){ + if (TextUtils.isEmpty(localSecret) || TextUtils.isEmpty(gatewayId)) { //璁よ瘉澶辫触锛岀綉鍏虫湭娉ㄥ唽鍒颁簯绔� callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR_GATEWAY_NOT_REGISTERED)); - }else{ - HDLLinkConfig.getInstance().saveConfig(localSecret,gatewayId,ipAddress); + } else { + HDLLinkConfig.getInstance().saveConfig(localSecret, gatewayId, ipAddress); callBack.onSuccess("璁よ瘉鎴愬姛"); } - }else{ + } else { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); } } @@ -180,7 +191,7 @@ @Override public void onFailure() { LogUtils.i(TAG, "onFailure: "); - if(callBack == null) return; + if (callBack == null) return; callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); } }); @@ -229,7 +240,7 @@ // sendAuthenticateRequest(ip, request, callBack); // } - public interface SearchGatewayCallBack extends BaseCallBack{ + public interface SearchGatewayCallBack extends BaseCallBack { /** * 鎼滅储缃戝叧鎴愬姛 * @@ -256,7 +267,8 @@ /** * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄 - * @param callBack 鍥炶皟 + * + * @param callBack 鍥炶皟 */ public void searchGatewayMulticast(SearchGatewayCallBack callBack) { searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, callBack); @@ -264,49 +276,14 @@ /** * 缁勬挱鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄 - * @param callBack 鍥炶皟 + * + * @param callBack 鍥炶皟 */ public void searchGatewayBroadcast(SearchGatewayCallBack callBack) { String ip = IpUtils.getBroadcastAddress(); searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip, callBack); } - /** - * 鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄 - * - * @param gatewayId 缃戝叧id - * @param ip 鎺ユ敹鐩爣鐨刬p鍦板潃 - * @param callBack 鍥炶皟 - */ - public void searchGateway(String gatewayId, String ip, SearchGatewayCallBack callBack) { - String time = String.valueOf(System.currentTimeMillis()); - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("id", IdUtils.getUUId()); - jsonObject.addProperty("time_stamp", time); - LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH, - jsonObject.toString()); - - HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { - @Override - public void onSucceed(Object msg) { - GatewaySearchBean searchBean = getGatewaySearchBean(msg); - if (searchBean != null && searchBean.getGatewayId().contains(gatewayId)) { - LogUtils.i(TAG, "onSuccess: "); - HDLLinkConfig.getInstance().setCurrentGateway(searchBean); - HDLLinkConfig.getInstance().setLocalEncrypt(searchBean.isLocalEncrypt()); - callBack.onSuccess(searchBean); - }else { - - } - } - - @Override - public void onFailure() { - LogUtils.i(TAG, "onFailure: "); - callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); - } - }); - } @@ -327,13 +304,13 @@ HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { - if(callBack == null) return; + if (callBack == null) return; callBack.onSuccess("鎺у埗鎴愬姛"); } @Override public void onFailure() { - if(callBack == null) return; + if (callBack == null) return; callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_CONTROL_FAILURE_ERROR)); } }); @@ -343,13 +320,14 @@ /** * 閫氱敤鍙戦�佹寚浠� * 1绉掓病鍝嶅簲灏辫浠栭噸鏂板彂閫�,閲嶈瘯3娆� - * @param topic 鍙戦�佹暟鎹� - * @param bodyStr 鍥炲鐨勪富棰� + * + * @param topic 鍙戦�佹暟鎹� + * @param bodyStr 鍥炲鐨勪富棰� * @param callBack 鍥炶皟 */ public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) { - if(TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { - if(callBack != null){ + if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { + if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR)); } return; @@ -359,13 +337,13 @@ HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { - if(callBack == null) return; + if (callBack == null) return; callBack.onSuccess((LinkResponse) msg); } @Override public void onFailure() { - if(callBack == null) return; + if (callBack == null) return; callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); } } @@ -403,7 +381,7 @@ return mBean; } - private NetworkAccessBroadcastResponse getNetworkAccessBroadcastResponse(Object msg){ + private NetworkAccessBroadcastResponse getNetworkAccessBroadcastResponse(Object msg) { NetworkAccessBroadcastResponse mBean = null; if (msg instanceof LinkResponse) { LinkResponse linkResponse = (LinkResponse) msg; @@ -418,4 +396,121 @@ return mBean; } + /** + * 缃戝叧鎼滅储鐩稿叧 + */ + private static final int MAX_SEARCH_COUNT = 10;//鎬诲叡鎼滅储娴嬭瘯 + private final AtomicInteger searchGatewayCount = new AtomicInteger(0);; + private final AtomicBoolean isSearchGatewaySuccess = new AtomicBoolean(true); + private String searchGatewayId = ""; + private SearchGatewayCallBack mSearchGatewayCallBack; + private void initSearchGatewayEvent(){ + LogUtils.i("鎼滅储缃戝叧--","initSearchGatewayEvent"); + searchGatewayEvent = new EventListener() { + @Override + public void onMessage(Object msg) { + try { + if (msg instanceof LinkResponse) { + LinkResponse linkResponse = (LinkResponse) msg; + String data = linkResponse.getData(); + if (!TextUtils.isEmpty(data)) { + final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { + }.getType()); + GatewaySearchBean searchBean = response.getObjects(); + if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) { + if (searchBean.getGatewayId().contains(searchGatewayId)) { + removeSearchGatewayEvent();//绉婚櫎鎼滅储缃戝叧鐩戝惉 + isSearchGatewaySuccess.set(true);//鎼滅储鎴愬姛鏍囪 + searchGatewayCount.set(11);//娆℃暟鏍囪 + if(mSearchGatewayCallBack != null){ + mSearchGatewayCallBack.onSuccess(searchBean); + } + } + } + } + + } + } catch (Exception e) { + + } + } + }; + } + + /** + * 鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄 + * + * @param gatewayId 缃戝叧id + * @param ip 鎺ユ敹鐩爣鐨刬p鍦板潃 + * @param callBack 鍥炶皟 + */ + public void searchGateway(String gatewayId, String ip, SearchGatewayCallBack callBack) { + this.searchGatewayId = gatewayId; + this.mSearchGatewayCallBack = callBack; + //閲嶇疆鍙傛暟 + searchGatewayCount.set(0); + isSearchGatewaySuccess.set(false); + String time = String.valueOf(System.currentTimeMillis()); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("id", IdUtils.getUUId()); + jsonObject.addProperty("time_stamp", time); + LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH, + jsonObject.toString()); + //娉ㄥ唽鎼滅储缃戝叧鐩戝惉 + registerSearchGatewayEvent(); + new Thread(new Runnable() { + @Override + public void run() { + while (searchGatewayCount.get() < 10 && (!isSearchGatewaySuccess.get()) ) { + try { + //鎼滅储缃戝叧 + searchGatewayCount.set(searchGatewayCount.get() + 1); + LogUtils.i("鎼滅储缃戝叧--","鎼滅储缃戝叧绗�"+searchGatewayCount.get()+"娆�"); + getUdpBoot(ip).sendMsg(message.getSendBytes()); + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + if(!isSearchGatewaySuccess.get()){ + //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃� + callBackSearchGatewayTimeout(); + LogUtils.e("鎼滅储缃戝叧--","鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�"); + } + } + }).start(); + + } + + /** + * 娉ㄥ唽鎼滅储缃戝叧鐩戝惉 + */ + private void registerSearchGatewayEvent(){ + LogUtils.i("鎼滅储缃戝叧--","娉ㄥ唽鎼滅储缃戝叧鐩戝惉"); + EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent); + } + /** + * 绉婚櫎鎼滅储缃戝叧鐩戝惉 + */ + private void removeSearchGatewayEvent(){ + LogUtils.i("鎼滅储缃戝叧--","绉婚櫎鎼滅储缃戝叧鐩戝惉"); + EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent); + } + + /** + * 鍥炶皟鎼滅储缃戝叧瓒呮椂 + */ + private void callBackSearchGatewayTimeout(){ + removeSearchGatewayEvent(); + ThreadToolUtils.getInstance().runOnUiThread(new Runnable() { + @Override + public void run() { + if(mSearchGatewayCallBack != null){ + mSearchGatewayCallBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEARCH_GATEWAY_TIMEOUT_ERROR)); + } + } + }); + } + } -- Gitblit v1.8.0