From 17b81245f31d032d5eed69c190e42edb1949f46b Mon Sep 17 00:00:00 2001 From: hxb <hxb@hdlchina.com.cn> Date: 星期二, 12 四月 2022 16:37:39 +0800 Subject: [PATCH] 修复接听后闪退的问题 --- HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java | 219 +++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 157 insertions(+), 62 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 c823c46..0016adc 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 @@ -11,6 +11,7 @@ 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.HDLLink; import com.hdl.sdk.connect.bean.response.AuthenticateResponse; import com.hdl.sdk.connect.bean.response.NetworkAccessBroadcastResponse; import com.hdl.sdk.connect.callback.BaseCallBack; @@ -67,11 +68,11 @@ /** * instance */ - private volatile static HDLAuthSocket instance; + private static final HDLAuthSocket instance=new HDLAuthSocket(); private HDLAuthSocket() { - initSearchGatewayEvent(); initListenerGatewayEvent(); + initSearchGatewayEvent(); } // public interface CallBack extends BaseCallBack { @@ -83,16 +84,14 @@ * * @return HDLAuthSocket */ - public static synchronized HDLAuthSocket getInstance() { - if (instance == null) { - synchronized (HDLLinkConfig.class) { - if (instance == null) { - instance = new HDLAuthSocket(); - //1.鍚姩Socket 寮�鍚洃鍚� - instance.getUdpBoot(); - } - } - } + public static HDLAuthSocket getInstance() { +// if (instance == null) { +// synchronized (HDLAuthSocket.class) { +// if (instance == null) { +// instance = new HDLAuthSocket(); +// } +// } +// } return instance; } @@ -108,16 +107,17 @@ /** * 鑾峰彇褰撳墠udp瀵硅薄锛屽鏋滀笉瀛樺湪灏卞垱寤� + * * @return 杩斿洖褰撳墠瀵硅薄 */ - private UdpSocketBoot getUdpBoot() { + private synchronized UdpSocketBoot getUdpBoot() { try { if (udpSocketBoot == null) { udpSocketBoot = UdpClient.init(UDP_PORT, getUdpOptions()); udpSocketBoot.bind(); } } catch (Exception e) { - return null; + LogUtils.e("鍒濆鍖朣ocket udp寮傚父"+e.getMessage()); } return udpSocketBoot; @@ -131,23 +131,27 @@ */ public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) { HDLLinkConfig.getInstance().clearConfig(); + //1.鍚姩Socket 寮�鍚洃鍚� + getUdpBoot(); //2.鏋勫缓鐩戝惉Listener // authEvent = //3.鐩戝惉缃戝叧骞挎挱鐨勫叆缃戞寚浠� + EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); EventDispatcher.getInstance().register(TopicConstant.GATEWAY_AUTH_BROADCAST, new EventListener() { @Override public void onMessage(Object msg) { + LogUtils.i("鏀跺埌缃戝叧璁よ瘉淇℃伅: "); NetworkAccessBroadcastResponse bean = getNetworkAccessBroadcastResponse(msg); if (bean != null) { - LogUtils.i(TAG, "缃戝叧鍏ョ綉骞挎挱IP: " + bean.getIPAddress()); + //绉婚櫎鐩戝惉 + EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); + LogUtils.i("缃戝叧鍏ョ綉骞挎挱IP: " + bean.getIPAddress()); String ipStr = bean.getIPAddress(); if (!TextUtils.isEmpty(ipStr)) { sendAuthenticateRequest(ipStr, request, callBack); } } - //绉婚櫎鐩戝惉 - EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); - LogUtils.i(TAG, "绉婚櫎鐩戝惉 authEvent"); + } }); } @@ -176,30 +180,39 @@ String requestStr = gs.toJson(request); LinkRequest message = new LinkRequest(topic, requestStr); - HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { + HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { if (callBack == null) return; try { AuthenticateResponse bean = getAuthenticateResponseBean(msg); if (bean != null) { - String localSecret = ""; - String gatewayId = ""; - String ipAddress = ""; - if(bean.getAuth() != null) { - localSecret = bean.getAuth().getLocalSecret(); - } - if(bean.getObjects() != null){ - gatewayId = bean.getObjects().getGatewayID(); - ipAddress = bean.getObjects().getIPAddress(); - } - //鍒ゆ柇缃戝叧鏄惁宸茬粡娉ㄥ唽鍒颁簯绔� - 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); - callBack.onSuccess("璁よ瘉鎴愬姛"); + if (bean.getCode().equals("200")) { + String localSecret = ""; + String gatewayId = ""; + String ipAddress = ""; + if (bean.getAuth() != null) { + localSecret = bean.getAuth().getLocalSecret(); + } + if (bean.getObjects() != null) { + gatewayId = bean.getObjects().getGatewayID(); + ipAddress = bean.getObjects().getIPAddress(); + } + //鍒ゆ柇缃戝叧鏄惁宸茬粡娉ㄥ唽鍒颁簯绔� + 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); + callBack.onSuccess("璁よ瘉鎴愬姛"); + } + } else if (bean.getCode().equals("14013")){ + //璁よ瘉澶辫触锛岃MAC瀵瑰簲鐨勮澶囧瘑閽ヤ笉瀛樺湪 + callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_MAC_KEY_ERROR_)); + } else{ + //璁よ瘉澶辫触锛岄敊璇爜锛� + LogUtils.e("璁よ瘉澶辫触锛岄敊璇爜锛�" + bean.getCode()); + callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR)); } } else { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); @@ -217,6 +230,7 @@ } }); } + // /** // * 鍙戦�佸叆缃戝強璁よ瘉璇锋眰 @@ -292,7 +306,7 @@ * @param callBack 鍥炶皟 */ public void searchGatewayMulticast(SearchGatewayCallBack callBack) { - searchGateway(HDLLinkConfig.getInstance().getGatewayId(), InetSocketAddress.createUnresolved(UDP_GROUP_IP,UDP_PORT), callBack); + searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, UDP_PORT, callBack); } /** @@ -301,8 +315,14 @@ * @param callBack 鍥炶皟 */ public void searchGatewayBroadcast(SearchGatewayCallBack callBack) { + if (!HDLLinkConfig.getInstance().checkIfCertified()) { + if (callBack != null) { + callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); + } + return; + } String ip = IpUtils.getBroadcastAddress(); - searchGateway(HDLLinkConfig.getInstance().getGatewayId(), InetSocketAddress.createUnresolved(ip,UDP_PORT), callBack); + searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip, UDP_PORT, callBack); } @@ -320,7 +340,7 @@ GsonConvert.getGson().toJson(data)); String ip = IpUtils.getBroadcastAddress(); - HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { + HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { if (callBack == null) return; @@ -342,18 +362,30 @@ * * @param topic 鍙戦�佹暟鎹� * @param bodyStr 鍥炲鐨勪富棰� + * @param broadcast 鏄惁瑕佸箍鎾� * @param callBack 鍥炶皟 */ - public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) { + public void udpSendMsg(String topic, String bodyStr,boolean broadcast, HDLLinkResponseCallBack callBack) { if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR)); } return; } + + if (!HDLLinkConfig.getInstance().checkIfCertified()) { + if (callBack != null) { + callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); + } + return; + } + LinkRequest message = new LinkRequest(topic, bodyStr); - String ip = IpUtils.getBroadcastAddress(); - HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() { + String ip = HDLLinkConfig.getInstance().getIpAddress(); + if(broadcast) { + ip = IpUtils.getBroadcastAddress(); + } + HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { @Override public void onSucceed(Object msg) { if (callBack == null) return; @@ -374,15 +406,23 @@ * * @param topic 鍙戦�佹暟鎹� * @param bodyStr 鍥炲鐨勪富棰� + * @param broadcast 鏄惁骞挎挱 */ - public void udpSendMsg(String topic, String bodyStr) { + public void udpSendMsg(String topic, String bodyStr,boolean broadcast) { if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { - LogUtils.e("udpSendMsg", "鍙傛暟涓嶈兘涓虹┖"); + LogUtils.e( "鍙傛暟涓嶈兘涓虹┖锛屼笉鑳藉彂閫乁DP鏁版嵁"); + return; + } + if (!HDLLinkConfig.getInstance().checkIfCertified()) { + LogUtils.e("鏈璇侊紝璇峰厛璁よ瘉鍐嶈皟鐢║DP鍙戦�佹柟娉�"); return; } LinkRequest message = new LinkRequest(topic, bodyStr); - String ip = IpUtils.getBroadcastAddress(); - getUdpBoot().sendMsg( InetSocketAddress.createUnresolved(ip,UDP_PORT),message.getSendBytes()); + String ip = HDLLinkConfig.getInstance().getIpAddress(); + if(broadcast) { + ip = IpUtils.getBroadcastAddress(); + } + HdlSocketHelper.sendUdpOne(getUdpBoot(), ip, UDP_PORT, message); } private GatewaySearchBean getGatewaySearchBean(Object msg) { @@ -454,12 +494,12 @@ }.getType()); GatewaySearchBean searchBean = response.getObjects(); if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) { - if (searchBean.getGatewayId().contains(searchGatewayId)) { + searchBean.setIp_address(linkResponse.getSource_ipAddress()); + if (searchBean.getGatewayId().contains(searchGatewayId)&&!TextUtils.isEmpty(searchGatewayId)) { removeSearchGatewayEvent();//绉婚櫎鎼滅储缃戝叧鐩戝惉 isSearchGatewaySuccess.set(true);//鎼滅储鎴愬姛鏍囪 searchGatewayCount.set(11);//娆℃暟鏍囪 HDLLinkConfig.getInstance().setCurrentGateway(searchBean);//璁剧疆褰撳墠缃戝叧 - HDLLinkConfig.getInstance().setLocalEncrypt(searchBean.isLocalEncrypt());//璁剧疆鏄惁鍔犲瘑 if (mSearchGatewayCallBack != null) { mSearchGatewayCallBack.onSuccess(searchBean); } @@ -475,8 +515,8 @@ } private void initListenerGatewayEvent() { - LogUtils.i( "鍒濆鍖栨案涔呯洃鍚綉鍏冲箍鎾簨浠讹紝涓嶇敤绉婚櫎姝や簨浠�"); - EventListener gatewayEvent = new EventListener() { + LogUtils.i("鍒濆鍖栨案涔呯洃鍚綉鍏冲箍鎾簨浠讹紝涓嶇敤绉婚櫎姝や簨浠�"); + EventListener gatewayEvent = new EventListener() { @Override public void onMessage(Object msg) { try { @@ -487,11 +527,18 @@ 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().equals(HDLLinkConfig.getInstance().getGatewayId())) { - HDLLinkConfig.getInstance().setCurrentGateway(searchBean);//璁剧疆褰撳墠缃戝叧 - HDLLinkConfig.getInstance().setLocalEncrypt(searchBean.isLocalEncrypt());//璁剧疆鏄惁鍔犲瘑 + GatewaySearchBean gateway = response.getObjects(); + if (gateway != null && !TextUtils.isEmpty(gateway.getGatewayId())) { + //鍙兘缃戝叧甯﹁繃鏉ョ殑ip涓嶅 + gateway.setIp_address(linkResponse.getSource_ipAddress()); + //涓荤綉鍏冲苟涓旀槸褰撳墠缁戝畾鐨勭綉鍏� + if ("true".equals(gateway.getMaster().toLowerCase()) && gateway.getGatewayId().equals(HDLLinkConfig.getInstance().getGatewayId())) { + HDLLinkConfig.getInstance().setCurrentGateway(gateway);//璁剧疆褰撳墠缃戝叧 + if(!TextUtils.isEmpty( gateway.getIp_address())) { + HDLLinkConfig.getInstance().setIpAddress(gateway.getIp_address()); + } + //鏇存柊褰撳墠缃戝叧鐨勪俊鎭� + HDLLinkConfig.getInstance().reSaveConfig(); } } } @@ -508,10 +555,11 @@ * 鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄 * * @param gatewayId 缃戝叧id - * @param desInetSocketAddress 鐩爣鐨勫湴鍧� + * @param ipAddress 鐩爣鐨処P鍦板潃 + * @param port 鐩爣鐨勭鍙� * @param callBack 鍥炶皟 */ - public void searchGateway(String gatewayId, InetSocketAddress desInetSocketAddress, SearchGatewayCallBack callBack) { + public void searchGateway(String gatewayId, String ipAddress, int port, SearchGatewayCallBack callBack) { this.searchGatewayId = gatewayId; this.mSearchGatewayCallBack = callBack; //閲嶇疆鍙傛暟 @@ -533,7 +581,7 @@ //鎼滅储缃戝叧 searchGatewayCount.set(searchGatewayCount.get() + 1); LogUtils.i("鎼滅储缃戝叧", "鎼滅储缃戝叧绗�" + searchGatewayCount.get() + "娆�"); - getUdpBoot().sendMsg(desInetSocketAddress,message.getSendBytes()); + getUdpBoot().sendMsg(ipAddress, port, message.getSendBytes()); Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); @@ -541,14 +589,16 @@ } if (!isSearchGatewaySuccess.get()) { - //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃� - callBackSearchGatewayTimeout(); - LogUtils.e("鎼滅储缃戝叧--", "鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�"); + try { + LogUtils.e("鎼滅储缃戝叧", "鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�"); + //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃� + callBackSearchGatewayTimeout(); + }catch (Exception e){} } } }).start(); - } + /** * 娉ㄥ唽鎼滅储缃戝叧鐩戝惉 @@ -581,4 +631,49 @@ }); } + + /** + * 鎼滅储鍦ㄧ嚎鎵�鏈夌殑缃戝叧锛屽寘鎷綋鍓嶄綇瀹呯殑鍙婃病鏈夌粦瀹氳繃鍏跺畠浣忓畢鐨勭綉鍏� + * + * @param ipAddress 鐩爣鐨処P鍦板潃 + * @param port 鐩爣鐨勭鍙� + * @param callBack 鍥炶皟 + */ + public void searchGateway(String ipAddress, int port, 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().sendMsg(ipAddress, port, message.getSendBytes()); + Thread.sleep(1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + if (!isSearchGatewaySuccess.get()) { + //鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃� + callBackSearchGatewayTimeout(); + LogUtils.e("鎼滅储缃戝叧", "鎼滅储10娆★紝鎸囧畾缃戝叧閮芥病鍥炲锛屽洖璋冭秴鏃�"); + } + } + }).start(); + } } -- Gitblit v1.8.0