Как получить название модели сетевого устройства (возможно, с использованием Bonjour)?

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

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


person Marcus Tallhamn    schedule 30.11.2010    source источник


Ответы (2)


Я считаю, что здесь используется _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.

person Lily Ballard    schedule 30.11.2010
comment
спасибо это очень круто! Если у кого-то такая же проблема, вы можете выбрать модель, используя: dig @ 224.0.0.251 -p5353 BigMac._device-info._tcp.local. TXT | grep model | awk '{print $ 5}' | sed -e 's / model = //; s ///' Если кто-то знает, как это сделать с помощью API Apple, меня это все равно интересует. - person Marcus Tallhamn; 30.11.2010
comment
это отлично работает для всего оборудования Apple в моей сети, но для принтера Brother DCP-8085DN, объявляющего о себе под _printer._tcp. Время ожидания соединения истекло; к серверам не удалось подключиться - не могли бы вы предоставить некоторую информацию о том, когда мне ожидать, что dig заработает? Спасибо!!! - person Marcus Tallhamn; 30.11.2010
comment
Вы должны ожидать, что он будет работать с оборудованием Apple. Скорее всего, никакое другое устройство не поддерживает его, но это действительно зависит от устройства. Я предполагаю, что информация о принтере (используемая для отображения значка принтера) дается как часть записи TXT для соответствующей службы Bonjour, а не как дополнительные данные, как эта модель, по-видимому, есть. - person Lily Ballard; 30.11.2010
comment
macOS Sierra, похоже, не выдает никаких _device-info записей bonjour, даже если службы включены. - person adib; 31.01.2017
comment
@adib Я только что тестировал на своем ноутбуке OS X 10.12.3 (16D32) и до сих пор вижу: Kefka._device-info._tcp.local. 10 IN TXT "model=MacBookPro11,4" "osxvers=16" - person Lily Ballard; 01.02.2017
comment
@KevinBallard Странно, я использовал ваше приложение Bonjour Browser и не вижу свой ноутбук в разделе _device_info._tcp.. Хотя там появляется мой собственный iChat AV, что, кажется, сводит на нет брандмауэр. macOS 10.12.3 (16D32) - person adib; 03.02.2017
comment
Кстати, Apple TV (4-го поколения), похоже, тоже не выдаёт _device_info запись. - person adib; 03.02.2017
comment
@adib О, я понимаю, о чем вы говорите. Да, macOS не рекламирует себя в рамках службы _device-info._tcp., но вы все равно можете использовать запрос mDNS, описанный выше, для запроса информации об устройстве данной машины. - person Lily Ballard; 04.02.2017

OSX передает эту информацию, если на этом компьютере запущены определенные сетевые службы. Насколько мне известно, это _afpovertcp, _rfb и _airport (конечно, только маршрутизатор аэропорта). Вы ищете сервис Bonjour под названием _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.

person Monobono    schedule 14.03.2011