Mi respuesta a ¿Por qué "mdnsd" consume mi batería y cómo detenerlo? explica el papel del demonio mDNS de Android, que es un init
servicio, iniciado bajo demanda. Proporciona DNS multidifusión (resolución de nombres de host/dominio) y DNS-SD (DNS-Based Service Discovery); ambos forman parte de Red de configuración cero .
¿Cómo resolver el nombre de host mDNS de Android a la dirección IP?
Técnicamente es posible que DNS-SD utilice el antiguo DNS unicast para resolver el nombre de dominio encontrado en el registro SRV (de un servicio difundido) a una dirección IP. Pero la mayoría de las veces mDNS y DNS-SD están vinculados entre sí. Y este es el caso de Android.
Android no expone ningún ajuste o API para hacer sólo la resolución del nombre (como mDNS Responder o Querier) y no el descubrimiento del servicio. Ni el mecanismo de resolución de nombres utiliza mDNS. Android's mdnsd
sirve como emisor/respondedor de mDNS sólo para el servicio DNS-SD. No se puede utilizar ninguno de los dos de forma independiente (que yo sepa).
Pero hay algunas opciones:
-
Ejecuta una aplicación en tu dispositivo Android con un servicio descubrible (aunque sea ficticio), que utiliza la API oficial de Android (que a su vez interactúa con mdnsd
por debajo) a emitir y descubra servicios. Así, cualquier otro host de la red local con capacidad mDNS/DNS-SD puede descubrir el servicio. Por ejemplo, utilice avahi-browse
en un sistema Linux. La resolución del servicio proporciona la dirección IP del dispositivo Android.
-
Cuando mdnsd
se está ejecutando, el dispositivo Android ya se está transmitiendo con un nombre codificado : Android.local
. Si no quieres difundir un servicio, hay otra opción.
ADB se basa en mDNS para descubrir dispositivos en la red local mediante el registro de un servicio de tipo _adb._tcp
(ver referencias aquí , aquí y aquí ). Así que activa la "Depuración USB" en las Opciones de Desarrollador y verás mdnsd
que se ejecuta en su dispositivo.
O en un dispositivo rooteado iniciar mdnsd
solo, sin iniciar ADB, ejecutando setprop ctl.start mdnsd
o simplemente start mdnsd
.
En los dos casos anteriores, cuando mdnsd
está en marcha, ejecutando avahi-resolve-host-name
Android.local
en un PC Linux debería devolver la dirección IP de su dispositivo Android.
¿Qué pasa si dos dispositivos Android tienen el mismo nombre de host?
En caso de conflicto de nombres, como el nombre Android.local
está codificado, el dispositivo Android que se une más tarde se renombra automáticamente como Android-2.lcoal
, Android-3.local
y así sucesivamente (véase la referencia aquí ). Así que puede resolver los nombres en consecuencia.
¿Hay alguna opción para cambiar el nombre de host mDNS?
Llegando al siguiente problema, ¿qué pasa si el desarrollador de su OEM/ROM eliminó o modificó el mdnsd
o si desea ejecutar con un nombre de su elección, no el codificado?
-
Construya y ejecute su propia respuesta mDNS más configurable como Avahi en el dispositivo Android.
-
Más sencillo aún, parchear y reconstruir la mdnsd
para recibir un argumento de línea de comandos para el nombre, o leer de un archivo de configuración si existe.
No, no necesita un dispositivo rooteado. El parcheado mdnsd
binario debería funcionar bien desde adb shell
o incluso en una aplicación de emulador de terminal como Termux. En el momento de escribir esto, sólo hay una llamada al sistema en mdnsd
código fuente que el seccomp
bloques para aplicaciones. Pero se puede eliminar fácilmente. Ni el DAC ni el MAC bloquean la ejecución.
0 votos
Relacionado con esto: Android.stackexchange.com/a/213830/218526
0 votos
@IrfanLatif Gracias, me ha ayudado mucho. Veo muchas aplicaciones para escanear mdns / dns-sd, pero ninguna que pueda hacer visible mi teléfono. Eso me parece bastante sorprendente - si puede enviar paquetes udp a 224.0.0.251:5353, ¿por qué no puede responder a otros?
0 votos
No he utilizado mucho el MDNS salvo para aprender, así que no puedo recomendar una aplicación. Pero en lo que respecta a la API oficial de Android está documentado, es muy simple de difundir su servicio así como a descubra otros servicios . También hay bibliotecas de terceros disponibles como jmdns . Esta aplicación de ejemplo demuestra las posibilidades con mucho detalle.
0 votos
@IrfanLatif Eso es dns-sd (service discovery). Esta pregunta es sobre mdns (multicast dns). Pero lo primero probablemente incluye lo último. Si es correcto, entonces cualquier aplicación que pueda anunciarse en dns-sd, será también hacer mi teléfono referible como myandroidthing.local .