No se pueden descubrir servicios a través de JMDNS: Android
-
02-01-2020 - |
Pregunta
Tengo que proporcionar soporte para API-14 y superior, por lo que no puedo usar el servicio de descubrimiento de red proporcionado por Android.
Entonces, he intentado la biblioteca JMDNS para este propósito.
Tengo dos preguntas sobre la implementación de JMDNS. Pregunta # 1
He implementado el siguiente código, pero no puedo descubrir ningún servicio.Cuando uso NSD para el mismo propósito y en la misma red, entonces puedo descubrir el servicio respectivo.Así que no soy seguro, lo que está mal con mi código.¿Podría alguien ayudar?
public void onDiscoveryRequested(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
setUp();
}});
thread.start();
}
private String type = "_http._tcp.";
private JmDNS jmdns = null;
private ServiceInfo serviceInfo;
android.net.wifi.WifiManager.MulticastLock lock;
android.os.Handler handler = new android.os.Handler();
private void setUp() {
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
WifiInfo wifiinfo = wifi.getConnectionInfo();
int intaddr = wifiinfo.getIpAddress();
byte[] byteaddr = new byte[] { (byte) (intaddr & 0xff), (byte) (intaddr >> 8 & 0xff),
(byte) (intaddr >> 16 & 0xff), (byte) (intaddr >> 24 & 0xff) };
InetAddress addr = null;
try {
addr = InetAddress.getByAddress(byteaddr);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
lock = wifi.createMulticastLock("mylockthereturn");
lock.setReferenceCounted(true);
lock.acquire();
try {
jmdns = JmDNS.create(addr);
jmdns.addServiceListener(type, new ServiceListener() {
@Override
public void serviceResolved(ServiceEvent ev) {
Log.e("tag", "Service resolved: " + ev.getInfo().getQualifiedName() + " port:" + ev.getInfo().getPort()
+ " ip:" + ev.getInfo().getInetAddresses().toString());
}
@Override
public void serviceRemoved(ServiceEvent ev) {
Log.e("tag", "Service removed: " + ev.getName());
}
@Override
public void serviceAdded(ServiceEvent ev) {
// Required to force serviceResolved to be called again (after the first search)
jmdns.requestServiceInfo(ev.getType(), ev.getName(), 1);
Log.e("tag", "Service added: " + ev.getInfo().getQualifiedName() + " port:" + ev.getInfo().getPort()
+ " ip:" + ev.getInfo().getInetAddresses());
}
});
} catch (IOException e) {
e.printStackTrace();
return;
}
}
Pregunta # 2 ¿Hay alguna manera de descubrir todos los servicios de ejecución en una red a través de JMDNS?
¿Podría alguien por favor ayudarme con las dos preguntas anteriores?
gracias y saludos, Soleado
Solución
Pruebe "_http._tcp.local".como su tipo de servicio.Vi un problema similar al usar JMDNS con Airplay.