2010-11-30 6 views
12

Apples Finder.app ist in der Lage, das genaue Modell jedes physischen Computers, der Bonjour verwendet, konsistent zu bestimmen (wie die Symbole für jeden einzelnen Gerätetyp eindeutig zeigen: iMac, MacPro, MBP usw.). Wie machen sie das und welche APIs verwenden sie?Wie erhalte ich "Modellname" für ein Netzwerkgerät (möglicherweise mit Bonjour)?

Nebenbei bietet Bonjour Name, Diensttyp, Domäne und Port für alle Dienste im Netzwerk - aber ich konnte keine Informationen finden, wie das Gerätemodell selbst zu finden ist.

Antwort

12

Ich glaube, das verwendet die _device-info._tcp. mDNS zeichnet für die IP-Adresse auf. Sie können das für sich selbst sehen. Im Terminal können Sie dig @224.0.0.251 -p5353 verwenden, um mDNS-Anfragen auszuführen. Sie können dig @224.0.0.251 -p5353 Foo.local. verwenden, um die IP-Adresse des Computers Foo.local aufzulösen. Nehmen Sie das IP und stecken Sie es wieder in dig @224.0.0.251 -p5353 -x $IP und Sie sollten in etwa wie folgt sehen:

> 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 

Beachten Sie den zusätzlichen Abschnitt.

Leider weiß ich nicht, wie man diese Informationen mithilfe der Bonjour-APIs erhält.

Bearbeiten: Sie können diese Informationen auch in einer einzigen Abfrage mit dig @224.0.0.251 -p5353 Foo._device-info._tcp.local. TXT erhalten.

+0

danke das ist sehr cool! Falls jemand anderes das gleiche Problem hat, können Sie das Modell mit dem folgenden Befehl auswählen: dig @ 224.0.0.251 -p5353 BigMac._device-info._tcp.local. TXT | grep Modell | awk '{print $ 5}' | sed -e 's/"model = //; s /" //' Wenn jemand weiß, wie man dies mit Apple's APIs macht, bin ich immer noch daran interessiert. –

+0

das funktioniert gut für alle Apple-Geräte in meinem Netzwerk, aber für einen "Brother DCP-8085DN" -Drucker, der sich unter _printer._tcp meldet. Ich bekomme "Zeitüberschreitung bei der Verbindung; keine Server konnten erreicht werden" - Könnten Sie bitte einige Informationen darüber geben, wann ich mit der Arbeit von Dig arbeiten sollte? Vielen Dank!!! –

+0

Sie sollten damit rechnen, dass es für Apple-Geräte funktioniert. Wahrscheinlich unterstützt kein anderes Gerät es, aber das liegt wirklich am Gerät. Ich stelle mir vor, dass Druckerinformationen (die für die Anzeige des Druckersymbols verwendet werden) als Teil des TXT-Datensatzes für den entsprechenden Bonjour-Dienst angegeben werden, und nicht so, wie es für zusätzliche Daten wie dieses Modell offensichtlich ist. –

7

OSX sendet diese Informationen, wenn bestimmte Netzwerkdienste auf diesem System ausgeführt werden. Nach meinem Wissen sind das _afpovertcp, _rfb und _airport (nur natürlich Airport-Router). Sie suchen nach einem Bonjour-Service namens _device-info._tcp. Das Problem ist, dass es nicht

über eine einfache zeigt sich
[someNSNetServiceBrowserInstance searchForServicesOfType:@"_services._dns-sd._udp." inDomain:@""]; 

Stattdessen müssen Sie einen bestimmten Host starten Überwachung, die Sie denken konnte _device-info._tcp ausgestrahlt.

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

Implementieren Sie die Callback-

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

dem Sie die Device String geben wird.