Android – jmdns не обнаруживает устройства

Я пытаюсь реализовать класс для обнаружения сервисов в сети. Я пробовал работать с NSD от Android, и он отлично разбирается в сервисах, но поддерживает только уровни API 16 и выше, и я не могу найти поле txtRecord в служебной информации (по какой-то причине он возвращает null). Оказывается, это известная проблема …

Итак, теперь я пытаюсь работать с jMDns, который, похоже, не находит службы вообще. Вот мой класс (я работаю с платформой AndroidAnnotations) MDnsHelper:

@EBean public class MDnsHelper implements ServiceListener { public static final String SERVICE_TYPE = "_http._tcp.local"; Activity activity; private JmDNS jmdns; private MulticastLock multicastLock; WifiManager wm; InetAddress bindingAddress; boolean isDiscovering; public void init(Activity activity) { this.activity = activity; isDiscovering = false; wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE); multicastLock = wm.createMulticastLock(activity.getPackageName()); multicastLock.setReferenceCounted(false); } @Background public void startDiscovery() { if (isDiscovering) return; System.out.println("starting..."); multicastLock.acquire(); try { System.out.println("creating jmdns"); jmdns = JmDNS.create(); System.out.println("jmdns created"); } catch (IOException e) { e.printStackTrace(); } finally { if (jmdns != null) { jmdns.addServiceListener(SERVICE_TYPE, MDnsHelper.this); isDiscovering = true; System.out.println("discovering services of type: " + SERVICE_TYPE); } } } @Background public void stopDiscovery() { if (!isDiscovering || jmdns == null) return; System.out.println("stopping..."); multicastLock.release(); jmdns.removeServiceListener(SERVICE_TYPE, MDnsHelper.this); System.out.println("listener for " + SERVICE_TYPE + " removed"); try { jmdns.close(); isDiscovering = false; System.out.println("jmdns closed"); } catch (IOException e) { e.printStackTrace(); } } @Override public void serviceAdded(ServiceEvent service) { System.out.println("found: " + service.getInfo().toString()); } @Override public void serviceRemoved(ServiceEvent service) { System.out.println("lost: " + service.getInfo().toString()); } @Override public void serviceResolved(ServiceEvent service) { System.out.println("resolved: " + service.getInfo().toString()); } } 

И в своем приложении я звоню:

 init(getActivity()); 

И затем startDiscovery(); Для запуска сканирования и stopDiscovery(); Для остановки сканирования.

И, конечно же, я дал приложению необходимые разрешения в манифесте … Что мне здесь не хватает? Если вам нужно предоставить дополнительный код / ​​информацию – просто спросите. благодаря!!

Solutions Collecting From Web of "Android – jmdns не обнаруживает устройства"

Я являюсь автором ZeroConf Browser для Android, и я использую JmDNS с открытым исходным кодом для всех моих решений. Он отлично работает, но есть несколько трюков, чтобы заставить его работать правильно.

  1. В вашем манифесте Android.xml убедитесь, что у вас есть эти разрешения, по крайней мере.

     <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> 
  2. Перед началом работы вы должны разрешить многолистовые пакеты, приобретая блокировку многоадресной передачи.

     @Override protected void onStart() { Log.i(TAG, "Starting ServiceActivity..."); super.onStart(); try { Log.i(TAG, "Starting Mutlicast Lock..."); WifiManager wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); // get the device ip address final InetAddress deviceIpAddress = getDeviceIpAddress(wifi); multicastLock = wifi.createMulticastLock(getClass().getName()); multicastLock.setReferenceCounted(true); multicastLock.acquire(); Log.i(TAG, "Starting ZeroConf probe...."); jmdns = JmDNS.create(deviceIpAddress, HOSTNAME); jmdns.addServiceTypeListener(this); } catch (IOException ex) { Log.e(TAG, ex.getMessage(), ex); } Log.i(TAG, "Started ZeroConf probe...."); } 
  3. И не забывайте останавливать сканирование, чтобы разблокировать блокировку многоадресной рассылки и отключить JmDNS.

     @Override protected void onStop() { Log.i(TAG, "Stopping ServiceActivity..."); super.onStop(); stopScan(); } private static void stopScan() { try { if (jmdns != null) { Log.i(TAG, "Stopping ZeroConf probe...."); jmdns.unregisterAllServices(); jmdns.close(); jmdns = null; } if (multicastLock != null) { Log.i(TAG, "Releasing Mutlicast Lock..."); multicastLock.release(); multicastLock = null; } } catch (Exception ex) { Log.e(TAG, ex.getMessage(), ex); } } 
  4. Самое главное не использовать конструктор по умолчанию. Вы должны использовать конструктор IP-адресов. Я заметил в вашем коде, что вы просто делаете JmDNS.create (). Я думаю, что по какой-то причине единственный способ, которым он работает на Android, – использовать нижеприведенный конструктор.

     jmdns = JmDNS.create(deviceIpAddress, HOSTNAME);