2010-11-30 9 views
12

Apple's Finder.app puede determinar constantemente el modelo exacto de cada computadora física que utiliza bonjour (como lo demuestran los iconos que son únicos para cada tipo de dispositivo individual: iMac, MacPro, MBP, etc.). ¿Cómo lo hacen y qué API usan?¿Cómo obtengo el "nombre del modelo" para un dispositivo en red (potencialmente usando Bonjour)?

Como nota al margen, Bonjour proporciona Nombre, Tipo de servicio, Dominio y Puerto para todos los servicios en la red, pero no he podido encontrar información sobre cómo encontrar el modelo del dispositivo.

Respuesta

12

Creo que esto usa _device-info._tcp. Registro mDNS para la dirección IP. Puedes ver esto por ti mismo. En la terminal, puede usar dig @224.0.0.251 -p5353 para realizar solicitudes de mDNS. Puede usar dig @224.0.0.251 -p5353 Foo.local. para resolver la dirección IP de la computadora Foo.local. Tome esa IP y vuelva a conectarlo a dig @224.0.0.251 -p5353 -x $IP y debería ver algo como lo siguiente:

> dig @224.0.0.251 -p5353 -x 10.0.1.1 
; <<>> DiG 9.6.0-APPLE-P2 <<>> @224.0.0.251 -p5353 -x 10.0.1.1 
; (1 server found) 
;; global options: +cmd 
;; Got answer: 
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22887 
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 

;; QUESTION SECTION: 
;1.0.0.10.in-addr.arpa.  IN PTR 

;; ANSWER SECTION: 
1.0.0.10.in-addr.arpa. 10 IN PTR Foo.local. 

;; ADDITIONAL SECTION: 
Foo._device-info._tcp.local. 10 IN TXT "model=MacBookPro5,3" 

;; Query time: 4 msec 
;; SERVER: 10.0.0.1#5353(224.0.0.251) 
;; WHEN: Mon Nov 29 18:00:23 2010 
;; MSG SIZE rcvd: 131 

Aviso la sección adicional.

Lamentablemente, no sé cómo obtener esta información utilizando las API de Bonjour.

Editar: También puede obtener esta información en una sola consulta con dig @224.0.0.251 -p5353 Foo._device-info._tcp.local. TXT.

+0

gracias eso es genial! En caso de que alguien más tenga el mismo problema, puede elegir el modelo usando: dig @ 224.0.0.251 -p5353 BigMac._device-info._tcp.local. TXT | grep model | awk '{print $ 5}' | sed-e 's/"model = //; s /" //' Si alguien sabe cómo hacer esto usando las API de Apple, todavía estoy interesado en eso. –

+0

esto funciona bien para todos los equipos de Apple en mi red, pero para una impresora "Brother DCP-8085DN" que se anuncia bajo _printer._tcp. Recibo "tiempo de espera de conexión agotado, no se pudo llegar a ningún servidor". ¿Podría proporcionarnos alguna información sobre cuándo debería funcionar Cave? ¡¡¡Gracias!!! –

+0

Debería esperar que funcione para Apple. Lo más probable es que ningún otro dispositivo lo admita, pero eso depende realmente del dispositivo. Imagino que la información de la impresora (que se utiliza para mostrar el icono de la impresora) se proporciona como parte del registro TXT para el servicio bonjour apropiado, en lugar de como datos aparentemente extra parecidos a este modelo. –

7

OSX está transmitiendo esta información si ciertos servicios de red se están ejecutando en esta máquina. Que yo sepa, estos son _afpovertcp, _rfb y _airport (enrutador del aeropuerto solo por supuesto). Está buscando un servicio bonjour llamado _device-info._tcp. El problema es, que no se muestra a través de un simple

[someNSNetServiceBrowserInstance searchForServicesOfType:@"_services._dns-sd._udp." inDomain:@""]; 

lugar que necesita para iniciar la supervisión de un host específico que usted piensa que podría transmitir _device-info._tcp.

NSNetService *aNetService = [[NSNetService alloc]initWithDomain:@"" type:@"_device-info._tcp." name:@"MyFancyIMacWithAFPOn"]; 
    [aNetService setDelegate:self]; 
    [aNetService startMonitoring]; 

Implementar la devolución de llamada

- (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)data 

que le dará la cadena DeviceModel.

Cuestiones relacionadas