@Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { mdnsSd.stop(); ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mEth = connManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET); NetworkInterface netInterface = null; // search the network interface with the ip address returned by the wifi manager if ((mWifi != null) && (mWifi.isConnected())) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (wifiManager != null) { WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddressInt = wifiInfo.getIpAddress(); String ipAddress = String.format( "%d.%d.%d.%d", (ipAddressInt & 0xff), (ipAddressInt >> 8 & 0xff), (ipAddressInt >> 16 & 0xff), (ipAddressInt >> 24 & 0xff)); try { InetAddress addr = InetAddress.getByName(ipAddress); Enumeration<NetworkInterface> intfs = NetworkInterface.getNetworkInterfaces(); while (netInterface == null && intfs.hasMoreElements()) { NetworkInterface intf = intfs.nextElement(); Enumeration<InetAddress> interfaceAddresses = intf.getInetAddresses(); while (netInterface == null && interfaceAddresses.hasMoreElements()) { InetAddress interfaceAddr = interfaceAddresses.nextElement(); if (interfaceAddr.equals(addr)) { netInterface = intf; } } } } catch (Exception e) { ARSALPrint.e(TAG, "Unable to get the wifi network interface", e); } } } // for ethernet, it's not possible to find the correct netInterface. Assume there is // a default route don't specify the netinterface if (((mWifi != null) && (mWifi.isConnected())) || ((mEth != null) && (mEth.isConnected()))) { ARSALPrint.v(TAG, "Restaring MdsnSd"); mdnsSd.start(netInterface); } else { netDeviceServicesHmap.clear(); broadcaster.broadcastDeviceServiceArrayUpdated(); } } }
public synchronized void close() { ARSALPrint.v(TAG, "Closing MdsnSd based ARDiscovery"); if (started) { stop(); } mdnsSd.stop(); this.broadcaster = null; this.context = null; }
public synchronized void stop() { if (started) { ARSALPrint.v(TAG, "Stopping MdsnSd based ARDiscovery"); started = false; if (multicastLock.isHeld()) { multicastLock.release(); } context.unregisterReceiver(networkStateIntentReceiver); mdnsSd.stop(); netDeviceServicesHmap.clear(); broadcaster.broadcastDeviceServiceArrayUpdated(); } }
@Override public void onServiceAdded( String name, String serviceType, String ipAddress, int port, String[] txts) { ARSALPrint.d( TAG, "onServiceAdded : " + name + " |type : " + serviceType + " |ip : " + ipAddress + " |port : " + port + " |txts = " + txts); String serialNumber = null; if (txts != null && txts.length >= 1) { serialNumber = txts[0]; } ARDiscoveryDeviceNetService deviceNetService = new ARDiscoveryDeviceNetService(name, serviceType, ipAddress, port, serialNumber); ARDISCOVERY_PRODUCT_ENUM product = devicesServices.get(deviceNetService.getType()); if (product != null) { int productID = ARDiscoveryService.nativeGetProductID(product.getValue()); ARDiscoveryDeviceService deviceService = new ARDiscoveryDeviceService(name, deviceNetService, productID); netDeviceServicesHmap.put(deviceService.getName(), deviceService); if (broadcaster != null) { // got an answer, stop sending queries mdnsSd.cancelSendQueries(); // broadcast the new deviceServiceList broadcaster.broadcastDeviceServiceArrayUpdated(); } } }