Как получить «название модели» для сетевого устройства (возможно, с использованием Bonjour)? - PullRequest
12 голосов
/ 30 ноября 2010

Apple Finder.app способен последовательно определять точную модель каждого физического компьютера, который использует Bonjour (о чем свидетельствуют уникальные значки для каждого отдельного типа устройства: iMac, MacPro, MBP и т. Д.). Как они это делают и какие API они используют?

Кроме того, Bonjour предоставляет имя, тип службы, домен и порт для всех служб в сети, но я не смог найти информацию о том, как найти модель устройства.

Ответы [ 2 ]

12 голосов
/ 30 ноября 2010

Я считаю, что здесь используется _device-info._tcp. Запись mDNS для IP-адреса. Вы можете убедиться в этом сами. В терминале вы можете использовать dig @224.0.0.251 -p5353 для выполнения запросов mDNS. Вы можете использовать dig @224.0.0.251 -p5353 Foo.local. для разрешения IP-адреса компьютера Foo.local. Возьмите этот IP и подключите его обратно к dig @224.0.0.251 -p5353 -x $IP, и вы увидите что-то вроде следующего:

> 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

Обратите внимание на ДОПОЛНИТЕЛЬНЫЙ РАЗДЕЛ.

К сожалению, я не знаю, как получить эту информацию с помощью API Bonjour.

Редактировать : Вы также можете получить эту информацию в одном запросе с помощью dig @224.0.0.251 -p5353 Foo._device-info._tcp.local. TXT.

7 голосов
/ 14 марта 2011

OSX передает эту информацию, если на этом компьютере запущены определенные сетевые службы. Насколько мне известно, это _afpovertcp, _rfb и _airport (только для маршрутизатора аэропорта). Вы ищете бесплатный сервис под названием _device-info._tcp. Беда в том, что он не появляется через простой

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

Вместо этого вам нужно начать мониторинг определенного хоста, который, по вашему мнению, может передавать _device-info._tcp.

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

Реализация обратного вызова

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

Что даст вам строку deviceModel.

...