Sto cercando di implementare una classe per scoprire i servizi sulla rete. Ho provato a lavorare con Android's NSD e rileva bene i servizi, ma supporta solo i livelli API 16 e successivi, e non riesco a recuperare il campo txtRecord all'interno delle informazioni sul servizio (restituisce null per qualche motivo). Risulta it's a known problem...Android - jmdns non rileva i dispositivi
Così ora sto provando a lavorare con jMDns, che non sembra affatto trovare servizi. ecco la mia classe (sto lavorando con il quadro 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());
}
}
E nella mia app che io chiamo:
init(getActivity());
E poi startDiscovery();
per avviare la scansione e stopDiscovery();
per fermare la scansione.
E ovviamente, ho dato all'app le autorizzazioni necessarie nel manifest ... Cosa mi manca qui? Se hai bisogno di me per fornire codice/informazioni aggiuntive - basta chiedere. grazie !!
Opere! È venuto fuori che ho usato il costruttore sbagliato, quindi il proiettile 4 è stato quello che l'ha risolto. Grazie mille!! :) – orenk86
Una cosa che mi uccide è come si può trovare rapidamente i dispositivi nella rete locale con alcuni tipi di servizio disponibili. Il tuo browser è veloce! Puoi dare un suggerimento su come lo fai? Sto lavorando a un telecomando per dispositivi IoT e ho bisogno di sapere tutto ciò che vive sulla rete locale velocemente (e ottenere informazioni sul dispositivo nel processo) – German
Quindi stai dicendo che il tuo codice non sta trovando abbastanza velocemente i servizi dal mio browser ZeroConf l'app è? Tutto quello che sto usando è il codice sopra così teoricamente il tuo dovrebbe essere veloce come il mio? – Melloware