How do I obtain “model name” for a networked device (potentially using Bonjour)?

后端 未结 2 809
无人及你
无人及你 2021-02-02 18:10

Apple\'s Finder.app is able to consistently determine the exact model of each physical computer that uses bonjour (as evidenced by the icons being unique for each individual dev

相关标签:
2条回答
  • 2021-02-02 18:36

    I believe this uses the _device-info._tcp. mDNS record for the IP address. You can see this for yourself. In the terminal, you can use dig @224.0.0.251 -p5353 to perform mDNS requests. You can use dig @224.0.0.251 -p5353 Foo.local. to resolve the IP address of the computer Foo.local. Take that IP and plug it back into dig @224.0.0.251 -p5353 -x $IP and you should see something like the following:

    > 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
    

    Notice the ADDITIONAL SECTION.

    Unfortunately, I don't know how to get at this information using the Bonjour APIs.

    Edit: You can also get this info in a single query with dig @224.0.0.251 -p5353 Foo._device-info._tcp.local. TXT.

    0 讨论(0)
  • 2021-02-02 18:47

    OSX is broadcasting this information if certain network services are running on this machine. To my knowledge these are _afpovertcp, _rfb and _airport (Airport router only of course). You are looking for a bonjour service called _device-info._tcp. The trouble is, that it is not showing up via a simple

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

    Instead you need to start monitoring a specific Host which you think could broadcast _device-info._tcp.

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

    Implement the callback

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

    Which will give you the deviceModel string.

    0 讨论(0)
提交回复
热议问题