|  |  | 
 |  |  | package com.hdl.sdk.connect.socket; | 
 |  |  |  | 
 |  |  | import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST; | 
 |  |  |  | 
 |  |  | import android.text.TextUtils; | 
 |  |  | import android.util.Log; | 
 |  |  |  | 
 |  |  | import com.google.gson.Gson; | 
 |  |  | import com.google.gson.JsonArray; | 
 |  |  | import com.google.gson.JsonObject; | 
 |  |  | import com.google.gson.reflect.TypeToken; | 
 |  |  | import com.hdl.sdk.common.HDLSdk; | 
 |  |  | import com.hdl.sdk.common.config.TopicConstant; | 
 |  |  | import com.hdl.sdk.common.event.EventDispatcher; | 
 |  |  | import com.hdl.sdk.common.event.EventListener; | 
 |  |  | import com.hdl.sdk.common.exception.HDLLinkCode; | 
 |  |  | import com.hdl.sdk.common.exception.HDLLinkException; | 
 |  |  | import com.hdl.sdk.common.utils.IdUtils; | 
 |  |  | import com.hdl.sdk.common.utils.IpUtils; | 
 |  |  | import com.hdl.sdk.common.utils.LogUtils; | 
 |  |  | import com.hdl.sdk.common.utils.ThreadToolUtils; | 
 |  |  | import com.hdl.sdk.common.utils.gson.GsonConvert; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.request.AuthenticateRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.request.GatewayInfoRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.AuthenticateResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.response.BaseLocalResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.response.GatewaySearchBean; | 
 |  |  | import com.hdl.sdk.connect.bean.response.NetworkAccessBroadcastResponse; | 
 |  |  | import com.hdl.sdk.connect.callback.BaseCallBack; | 
 |  |  | import com.hdl.sdk.connect.callback.HDLLinkCallBack; | 
 |  |  | import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack; | 
 |  |  | import com.hdl.sdk.connect.config.HDLLinkConfig; | 
 |  |  | import com.hdl.sdk.common.config.TopicConstant; | 
 |  |  | import com.hdl.sdk.common.utils.IdUtils; | 
 |  |  | import com.hdl.sdk.common.utils.IpUtils; | 
 |  |  | import com.hdl.sdk.common.utils.gson.GsonConvert; | 
 |  |  | import com.hdl.sdk.connect.bean.request.AuthenticateRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.BaseLocalResponse; | 
 |  |  | import com.hdl.sdk.connect.bean.request.DeviceControlRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.response.GatewaySearchBean; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkRequest; | 
 |  |  | import com.hdl.sdk.connect.bean.LinkResponse; | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageDecoder; | 
 |  |  | import com.hdl.sdk.connect.protocol.LinkMessageEncoder; | 
 |  |  | import com.hdl.sdk.socket.SocketBoot; | 
 |  |  | import com.hdl.sdk.socket.SocketOptions; | 
 |  |  | import com.hdl.sdk.socket.client.UdpClient; | 
 |  |  | import com.hdl.sdk.socket.codec.MessagePipeLine; | 
 |  |  | import com.hdl.sdk.socket.listener.SendListener; | 
 |  |  | import com.hdl.sdk.socket.udp.UdpSocketBoot; | 
 |  |  | import com.hdl.sdk.socket.udp.UdpSocketOptions; | 
 |  |  |  | 
 |  |  | import java.io.UnsupportedEncodingException; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | import static com.hdl.sdk.common.config.TopicConstant.DEIVCE_AUTH_REQUEST; | 
 |  |  | import java.util.concurrent.atomic.AtomicBoolean; | 
 |  |  | import java.util.concurrent.atomic.AtomicInteger; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * Created by jlchen on 11/11/21. | 
 |  |  |  * | 
 |  |  |  * @Description : HDLAuthSocket | 
 |  |  |  * @Description : HDLAuthSocket 由于前期已经命名好,不做更改,可用作Udp服务端使用 | 
 |  |  |  */ | 
 |  |  | public class HDLAuthSocket { | 
 |  |  |     private static final String TAG = "HDLAuth"; | 
 |  |  | 
 |  |  |      * udp默认端口 | 
 |  |  |      */ | 
 |  |  |     private static final int UDP_PORT = 8585; | 
 |  |  |     private static SocketBoot updBoot; | 
 |  |  | //    private EventListener authEvent; | 
 |  |  |     /** | 
 |  |  |      * 因为考虑到使用一个端口,要支持接收多网关的数据,所以只允许使用一个 | 
 |  |  |      */ | 
 |  |  |     private static UdpSocketBoot udpSocketBoot; | 
 |  |  |     //    private EventListener authEvent; | 
 |  |  |     //搜索网关 | 
 |  |  |     private EventListener searchGatewayEvent; | 
 |  |  |     /** | 
 |  |  |      * udp默认组播ip | 
 |  |  |      */ | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * instance | 
 |  |  |      */ | 
 |  |  |     private volatile static HDLAuthSocket instance; | 
 |  |  |     private static final HDLAuthSocket instance = new HDLAuthSocket(); | 
 |  |  |  | 
 |  |  |     private HDLAuthSocket() { | 
 |  |  |         initListenerGatewayEvent(); | 
 |  |  |         initSearchGatewayEvent(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | //    public interface CallBack extends BaseCallBack { | 
 |  |  | //        void onSuccess(String msg); | 
 |  |  | 
 |  |  |      * | 
 |  |  |      * @return HDLAuthSocket | 
 |  |  |      */ | 
 |  |  |     public static synchronized HDLAuthSocket getInstance() { | 
 |  |  |         if (instance == null) { | 
 |  |  |             synchronized (HDLLinkConfig.class) { | 
 |  |  |                 if (instance == null) { | 
 |  |  |                     instance = new HDLAuthSocket(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     public static HDLAuthSocket getInstance() { | 
 |  |  | //        if (instance == null) { | 
 |  |  | //            synchronized (HDLAuthSocket.class) { | 
 |  |  | //        if (instance == null) { | 
 |  |  | //            instance = new HDLAuthSocket(); | 
 |  |  | //        } | 
 |  |  | //            } | 
 |  |  | //        } | 
 |  |  |         return instance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private SocketOptions getUdpOptions() { | 
 |  |  |         final SocketOptions options = new SocketOptions(); | 
 |  |  |     private UdpSocketOptions getUdpOptions() { | 
 |  |  |         final UdpSocketOptions options = new UdpSocketOptions(); | 
 |  |  |         final MessagePipeLine pipeLine = new MessagePipeLine(); | 
 |  |  |         pipeLine.add(new LinkMessageDecoder()); | 
 |  |  |         pipeLine.add(new LinkMessageEncoder()); | 
 |  |  |         options.setHandleMessage(pipeLine); | 
 |  |  |         options.setEnabledHeartbeat(false); | 
 |  |  |         return options; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private SocketBoot getUdpBoot(String ip) { | 
 |  |  |         if (updBoot == null) { | 
 |  |  |             updBoot = UdpClient.init(ip, UDP_PORT, getUdpOptions()); | 
 |  |  |             updBoot.connect(); | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取当前udp对象,如果不存在就创建 | 
 |  |  |      * | 
 |  |  |      * @return 返回当前对象 | 
 |  |  |      */ | 
 |  |  |     private synchronized UdpSocketBoot getUdpBoot() { | 
 |  |  |         try { | 
 |  |  |             if (udpSocketBoot == null) { | 
 |  |  |                 udpSocketBoot = UdpClient.init(UDP_PORT, getUdpOptions()); | 
 |  |  |                 udpSocketBoot.bind(); | 
 |  |  |  | 
 |  |  |                 LogUtils.i("初始化Socket udp"); | 
 |  |  |             } | 
 |  |  |         } catch (Exception e) { | 
 |  |  |             LogUtils.e("初始化Socket udp异常" + e.getMessage()); | 
 |  |  |         } | 
 |  |  |         return updBoot; | 
 |  |  |  | 
 |  |  |         return udpSocketBoot; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void init() { | 
 |  |  |         getUdpBoot(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |     public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) { | 
 |  |  |         HDLLinkConfig.getInstance().clearConfig(); | 
 |  |  |         //1.启动Socket 开启监听 | 
 |  |  |         getUdpBoot(IpUtils.getBroadcastAddress()); | 
 |  |  |         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()); | 
 |  |  |                 if (bean != null) { | 
 |  |  |                     //移除监听 | 
 |  |  |                     EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); | 
 |  |  |                     LogUtils.i("网关入网广播IP: " + bean.getIPAddress()); | 
 |  |  |                     HDLLinkConfig.getInstance().setIpAddress(bean.getIPAddress()); | 
 |  |  |                     String ipStr = bean.getIPAddress(); | 
 |  |  |                     if(!TextUtils.isEmpty(ipStr)){ | 
 |  |  |                     if (!TextUtils.isEmpty(ipStr)) { | 
 |  |  |                         sendAuthenticateRequest(ipStr, request, callBack); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 //移除监听 | 
 |  |  |                 EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); | 
 |  |  |                 LogUtils.i(TAG, "移除监听 authEvent"); | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 结束监听入网及认证广播 | 
 |  |  |      */ | 
 |  |  |     public void endAuthenticateRequest(){ | 
 |  |  |     public void endAuthenticateRequest() { | 
 |  |  |         //移除监听 | 
 |  |  |         EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_AUTH_BROADCAST); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 上报从网关信息 | 
 |  |  |      * | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void UploadGatewayInfo(HDLLinkCallBack callBack) { | 
 |  |  |         String time = String.valueOf(System.currentTimeMillis()); | 
 |  |  |         final BaseLocalResponse<GatewayInfoRequest> data = new BaseLocalResponse<>(); | 
 |  |  |         data.setId(IdUtils.getUUId()); | 
 |  |  |         data.setTime_stamp(time); | 
 |  |  |  | 
 |  |  |         final GatewayInfoRequest request = new GatewayInfoRequest(); | 
 |  |  |         AuthenticateRequest.AuthenticateDeviceInfoBean authenticateDeviceInfoBean = HDLLinkConfig.getInstance().getDeviceInfoBean(); | 
 |  |  |         request.setDevice_model(authenticateDeviceInfoBean.getDeviceModel()); | 
 |  |  |         request.setDevice_mac(authenticateDeviceInfoBean.getDeviceMAC()); | 
 |  |  |         request.setDevice_name(authenticateDeviceInfoBean.getDeviceName()); | 
 |  |  |         request.setGateway_type(authenticateDeviceInfoBean.getGateway_type()); | 
 |  |  |         request.setAccess_mode(authenticateDeviceInfoBean.getAccessMode()); | 
 |  |  |         request.setOid(authenticateDeviceInfoBean.getOID()); | 
 |  |  |         request.setSid(authenticateDeviceInfoBean.getSid()); | 
 |  |  |         request.setSupplier(authenticateDeviceInfoBean.getSupplier()); | 
 |  |  |  | 
 |  |  |         if (authenticateDeviceInfoBean.getSupplier() == null) { | 
 |  |  |             AuthenticateRequest.RequestBean requestBean = HDLLinkConfig.getInstance().getRequestBean(); | 
 |  |  |             request.setSupplier(requestBean.getSupplier()); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         request.setHw_version(authenticateDeviceInfoBean.getHw_version()); | 
 |  |  |         request.setFw_version(HDLSdk.getInstance().getVersion());//sdk版本 | 
 |  |  |         request.setIp_address(authenticateDeviceInfoBean.getIPAddress()); | 
 |  |  |         request.setMaster("false"); | 
 |  |  |         request.setLocalEncrypt(false); | 
 |  |  |  | 
 |  |  |         data.setObjects(request); | 
 |  |  |  | 
 |  |  |         String topic = HDLLinkConfig.getInstance().getFullTopic(TopicConstant.GATEWAY_SEARCH_REPLY); | 
 |  |  |         LinkRequest message = new LinkRequest(topic, | 
 |  |  |                 GsonConvert.getGson().toJson(data)); | 
 |  |  |  | 
 |  |  |         String ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onSucceed(Object msg) { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onSuccess("上报成功"); | 
 |  |  |                 LogUtils.i("UploadGatewayInfo onSucceed = " + msg); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure() { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UPLOAD_GATEWAYINFO_FAILURE_ERROR)); | 
 |  |  |                 LogUtils.i("UploadGatewayInfo onFailure"); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |         String requestStr = gs.toJson(request); | 
 |  |  |         LinkRequest message = new LinkRequest(topic, requestStr); | 
 |  |  |  | 
 |  |  |         HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onSucceed(Object msg) { | 
 |  |  |                 if(callBack == null) return; | 
 |  |  |                 AuthenticateResponse bean = getAuthenticateResponseBean(msg); | 
 |  |  |                 if(bean != null){ | 
 |  |  |                     String localSecret = bean.getAuth().getLocalSecret(); | 
 |  |  |                     String gatewayId = bean.getObjects().getGatewayID(); | 
 |  |  |                     String ipAddress = bean.getObjects().getIPAddress(); | 
 |  |  |                     HDLLinkConfig.getInstance().saveConfig(localSecret,gatewayId,ipAddress); | 
 |  |  |                     callBack.onSuccess("认证成功"); | 
 |  |  |                 }else{ | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 try { | 
 |  |  |                     AuthenticateResponse bean = getAuthenticateResponseBean(msg); | 
 |  |  |                     if (bean != null) { | 
 |  |  |                         if (bean.getCode().equals("200") || bean.getCode().equals("0")) { | 
 |  |  |                             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 (ipAddress == null) { | 
 |  |  |                                 ipAddress = bean.getIp_address(); | 
 |  |  |                             } | 
 |  |  |                             HDLLinkConfig.getInstance().setAuthBean(request.getAuth()); | 
 |  |  |  | 
 |  |  |                             //判断网关是否已经注册到云端 | 
 |  |  |                             Log.d("panlili", "认证成功----->localSecret= " + localSecret); | 
 |  |  |                             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); | 
 |  |  |                                 HDLLinkConfig.getInstance().setRequestBean(request.getAuth().getRequest()); | 
 |  |  |                                 callBack.onSuccess("认证成功"); | 
 |  |  |  | 
 |  |  | //                                UploadDeviceAuth(request.getObjects().getDeviceMAC(), "0", "success", bean.getCode(), null); | 
 |  |  |                             } | 
 |  |  |                         } else if (bean.getCode().equals("14013")) { | 
 |  |  |                             //认证失败,该MAC对应的设备密钥不存在 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_MAC_KEY_ERROR_)); | 
 |  |  |  | 
 |  |  | //                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null); | 
 |  |  |                         } else if (bean.getCode().equals("124013")) { | 
 |  |  |                             //认证失败,该MAC对应的设备密钥不存在 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124013_ERROR)); | 
 |  |  |  | 
 |  |  |                         } else if (bean.getCode().equals("124015")) { | 
 |  |  |                             //认证失败,设备厂家不匹配 | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_124015_ERROR)); | 
 |  |  |  | 
 |  |  |                         } else { | 
 |  |  |                             //认证失败,错误码: | 
 |  |  |                             LogUtils.e("认证失败,错误码:" + bean.getCode()); | 
 |  |  |                             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_AUTH_ERROR)); | 
 |  |  |  | 
 |  |  | //                            UploadDeviceAuth(request.getObjects().getDeviceMAC(), "-1", "fail", bean.getCode(), null); | 
 |  |  |                         } | 
 |  |  |                     } else { | 
 |  |  |                         callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure() { | 
 |  |  |                 LogUtils.i(TAG, "onFailure: "); | 
 |  |  |                 if(callBack == null) return; | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public void UploadDeviceAuth(String mac, String result, String message, String auth_code, HDLLinkCallBack callBack) { | 
 |  |  |         HDLSocket.getInstance().UploadDeviceAuth(mac, result, message, auth_code, new HDLLinkCallBack() { | 
 |  |  |             @Override | 
 |  |  |             public void onSuccess(String msg) { | 
 |  |  |                 if (callBack != null) { | 
 |  |  |                     callBack.onSuccess(msg); | 
 |  |  |                 } | 
 |  |  |                 LogUtils.i(TAG, "onSuccess: " + msg); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onError(HDLLinkException e) { | 
 |  |  |                 if (callBack != null) { | 
 |  |  |                     callBack.onError(e); | 
 |  |  |                 } | 
 |  |  |                 LogUtils.i(TAG, "onError: " + e.getMsg() + " " + e.getCode()); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     public void linkBroadcast(String oid, HDLLinkCallBack callBack) { | 
 |  |  |         if (TextUtils.isEmpty(oid)) { | 
 |  |  |             callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_NULL_ERROR)); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         Gson gs = new Gson(); | 
 |  |  |         JsonArray jsonArray = new JsonArray(); | 
 |  |  |         JsonObject jsonObject = new JsonObject(); | 
 |  |  |         jsonObject.addProperty("oid", oid); | 
 |  |  |         jsonArray.add(jsonObject); | 
 |  |  |         String requestStr = gs.toJson(jsonArray); | 
 |  |  |  | 
 |  |  |         String topic = String.format(TopicConstant.LINK_BROADCAST, HDLLinkConfig.getInstance().getDeviceInfoBean().getOID()); | 
 |  |  |         LinkRequest message = new LinkRequest(topic, requestStr); | 
 |  |  |  | 
 |  |  |         String ip = IpUtils.getBroadcastAddress(); | 
 |  |  |  | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onSucceed(Object msg) { | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 try { | 
 |  |  |                     callBack.onSuccess("更新成功"); | 
 |  |  |                     LogUtils.i(TAG, "onSucceed: msg= " + msg); | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_DATA_ERROR)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             @Override | 
 |  |  |             public void onFailure() { | 
 |  |  |                 LogUtils.i(TAG, "onFailure: "); | 
 |  |  |                 if (callBack == null) return; | 
 |  |  |                 callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_TIMEOUT_ERROR)); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | //    /** | 
 |  |  | //     * 发送入网及认证请求 | 
 |  |  | 
 |  |  | //        sendAuthenticateRequest(ip, request, callBack); | 
 |  |  | //    } | 
 |  |  |  | 
 |  |  |     public interface SearchGatewayCallBack extends BaseCallBack{ | 
 |  |  |     public interface SearchGatewayCallBack extends BaseCallBack { | 
 |  |  |         /** | 
 |  |  |          * 搜索网关成功 | 
 |  |  |          * | 
 |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      * | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      */ | 
 |  |  |     public void searchGatewayMulticast(SearchGatewayCallBack callBack) { | 
 |  |  |         searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, callBack); | 
 |  |  |         searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, UDP_PORT, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 组播搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      * | 
 |  |  |      * @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(), ip, callBack); | 
 |  |  |         searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip, UDP_PORT, callBack); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * | 
 |  |  |      * @param gatewayId 网关id | 
 |  |  |      * @param ip 接收目标的ip地址 | 
 |  |  |      * @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)); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  | 
 |  |  |                 GsonConvert.getGson().toJson(data)); | 
 |  |  |  | 
 |  |  |         String ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() { | 
 |  |  |         HdlSocketHelper.sendUdp(getUdpBoot(), ip, UDP_PORT, 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)); | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用发送指令 | 
 |  |  |      * 1秒没响应就让他重新发送,重试3次 | 
 |  |  |      * @param topic 发送数据 | 
 |  |  |      * @param bodyStr 回复的主题 | 
 |  |  |      * @param callBack 回调 | 
 |  |  |      * | 
 |  |  |      * @param topic     发送数据 | 
 |  |  |      * @param bodyStr   回复的主题 | 
 |  |  |      * @param broadcast 是否要广播 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr, HDLLinkResponseCallBack callBack) { | 
 |  |  |         if(TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { | 
 |  |  |             if(callBack != null){ | 
 |  |  |     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(ip), 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; | 
 |  |  |                         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)); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |         ); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 通用发送指令 只发一次,不监听回复,不重发 | 
 |  |  |      * | 
 |  |  |      * @param topic     发送数据 | 
 |  |  |      * @param bodyStr   回复的主题 | 
 |  |  |      * @param broadcast 是否广播 | 
 |  |  |      */ | 
 |  |  |     public void udpSendMsg(String topic, String bodyStr, boolean broadcast) { | 
 |  |  |         if (TextUtils.isEmpty(topic) || TextUtils.isEmpty(bodyStr)) { | 
 |  |  |             LogUtils.e("参数不能为空,不能发送UDP数据"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         if (!HDLLinkConfig.getInstance().checkIfCertified()) { | 
 |  |  |             LogUtils.e("未认证,请先认证再调用UDP发送方法"); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |         LinkRequest message = new LinkRequest(topic, bodyStr); | 
 |  |  |         String ip = HDLLinkConfig.getInstance().getIpAddress(); | 
 |  |  |         if (broadcast) { | 
 |  |  |             ip = IpUtils.getBroadcastAddress(); | 
 |  |  |         } | 
 |  |  |         HdlSocketHelper.sendUdpOne(getUdpBoot(), ip, UDP_PORT, message); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private GatewaySearchBean getGatewaySearchBean(Object msg) { | 
 |  |  |         GatewaySearchBean searchBean = null; | 
 |  |  | 
 |  |  |         return mBean; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private NetworkAccessBroadcastResponse getNetworkAccessBroadcastResponse(Object msg){ | 
 |  |  |     private NetworkAccessBroadcastResponse getNetworkAccessBroadcastResponse(Object msg) { | 
 |  |  |         NetworkAccessBroadcastResponse mBean = null; | 
 |  |  |         if (msg instanceof LinkResponse) { | 
 |  |  |             LinkResponse linkResponse = (LinkResponse) msg; | 
 |  |  | 
 |  |  |         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())) { | 
 |  |  |                                 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);//设置当前网关 | 
 |  |  |                                     if (mSearchGatewayCallBack != null) { | 
 |  |  |                                         mSearchGatewayCallBack.onSuccess(searchBean); | 
 |  |  |                                     } | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     LogUtils.i("panlili:" + e.toString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void initListenerGatewayEvent() { | 
 |  |  |         LogUtils.i("初始化永久监听网关广播事件,不用移除此事件"); | 
 |  |  |         EventListener gatewayEvent = new EventListener() { | 
 |  |  |             @Override | 
 |  |  |             public void onMessage(Object msg) { | 
 |  |  |                 try { | 
 |  |  |                     if (msg instanceof LinkResponse) { | 
 |  |  |                         LinkResponse linkResponse = (LinkResponse) msg; | 
 |  |  |                         String data = linkResponse.getData(); | 
 |  |  |                         LogUtils.i("接收到网关信息:" + data); | 
 |  |  |                         if (!TextUtils.isEmpty(data)) { | 
 |  |  |                             final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() { | 
 |  |  |                             }.getType()); | 
 |  |  |                             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()); | 
 |  |  |                                         LogUtils.i("接收到网关信息:" + HDLLinkConfig.getInstance().getIpAddress()); | 
 |  |  |                                     } | 
 |  |  |                                     //更新当前网关的信息 | 
 |  |  |                                     HDLLinkConfig.getInstance().reSaveConfig(); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 } catch (Exception e) { | 
 |  |  |                     LogUtils.i("panlili:" + e.toString()); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }; | 
 |  |  |         EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, gatewayEvent); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 搜索指定网关是否在线,搜索到则返回指定的网关对象 | 
 |  |  |      * | 
 |  |  |      * @param gatewayId 网关id | 
 |  |  |      * @param ipAddress 目标的IP地址 | 
 |  |  |      * @param port      目标的端口 | 
 |  |  |      * @param callBack  回调 | 
 |  |  |      */ | 
 |  |  |     public void searchGateway(String gatewayId, 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()) { | 
 |  |  |                     try { | 
 |  |  |                         LogUtils.e("搜索网关", "搜索10次,指定网关都没回复,回调超时"); | 
 |  |  |                         //搜索10次,指定网关都没回复,回调超时 | 
 |  |  |                         callBackSearchGatewayTimeout(); | 
 |  |  |                     } catch (Exception e) { | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }).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)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 搜索在线所有的网关,包括当前住宅的及没有绑定过其它住宅的网关 | 
 |  |  |      * | 
 |  |  |      * @param ipAddress 目标的IP地址 | 
 |  |  |      * @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(); | 
 |  |  |     } | 
 |  |  | } |