2010-11-30 101 views
12

Apple的Finder.app能夠一致地確定每個使用bonjour的物理計算機的確切模型(如圖標對於每種設備類型唯一的證明:iMac,MacPro,MBP等)。他們如何做到這一點以及他們使用哪些API?如何獲取聯網設備的「型號名稱」(可能使用Bonjour)?

在附註中,Bonjour爲網絡上的所有服務提供名稱,服務類型,域和端口 - 但我一直未能找到有關如何查找設備模型本身的信息。

回答

12

我相信這使用_device-info._tcp。 mDNS記錄的IP地址。你可以親自看到這個。在終端中,您可以使用dig @224.0.0.251 -p5353執行mDNS請求。您可以使用dig @224.0.0.251 -p5353 Foo.local.來解析計算機Foo.local的IP地址。採取這一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 

通知附加部分。

不幸的是,我不知道如何使用Bonjour API獲取這些信息。

編輯:您也可以在帶有dig @224.0.0.251 -p5353 Foo._device-info._tcp.local. TXT的單個查詢中獲得此信息。

+0

非常感謝!如果其他人遇到同樣的問題,可以使用以下命令挑選模型:dig @ 224.0.0.251 -p5353 BigMac._device-info._tcp.local。 TXT | grep模型| awk'{print $ 5}'| sed -e's /「model = //; s /」//' 如果有人知道如何使用Apple的API來做到這一點,我仍然對此感興趣。 – 2010-11-30 02:27:15

7

如果某臺網絡服務在本機上運行,​​OSX正在廣播這些信息。據我所知,這些是_afpovertcp,_rfb和_airport(當然只有機場路由器)。您正在尋找名爲_device-info._tcp的bonjour服務。麻煩的是,它沒有顯示出來通過一個簡單的

[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字符串。