我注意到一些更好的网络发现应用程序(如Fing for iOS和iNet for Mac)能够发现iOS设备和Mac设备的设备名称,即使它们没有宣传诸如iTunes Wi-Fi Sync等Bonjour服务。这是怎么做到的?我知道如何进行反向mDNS查询https://serverfault.com/questions/143184/how-do-i-get-the-machine-name-from-an-ip-via-multicast-dns。但是,虽然反向mDNS查找(至少由dig命令dig -x the.ip @224.0.0.251 -p 5353
完成)将对不能以其他方式广播任何Bonjour服务的Mac起作用,但除非Wi-Fi同步正在运行或其他一些,否则它不起作用在iOS设备上的Bonjour服务。我不知道如何获得这个名称,但这些应用程序可靠地得到它。我在iNet发现时使用了Wireshark,我只看到所有返回0个答案的ICMP和NetBios查询。
另请注意,我已经通过广播ping然后解析ARP表来获取设备的IP地址。我想通过获取设备名称并查找字符串“iPhone”或“iPad”来发现以这种方式发现的设备是iOS设备。
另请注意,iNet应用程序网站提供了有关如何进行反向IP查找的以下内容。我认为这意味着他们为每个IP执行反向DNS查找和反向mDNS查找。
Reverse IP lookups (hostnames) are performed as unicast and multicast queries for every IP found.
- http://www.bananaglue.de/inet/index_e.php
答案 0 :(得分:6)
您是否尝试过dns-sd命令行工具?
如果您输入dns-sd -B _services._dns-sd._udp
来获取所有可用服务,那么您会看到_whats-my-name
服务可用。
$ dns-sd -B _services._dns-sd._udp
Browsing for _services._dns-sd._udp
DATE: ---Tue 16 Dec 2014---
14:38:30.746 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
14:38:30.747 Add 3 5 . _tcp.local. _nfs
14:38:30.747 Add 3 5 . _tcp.local. _afpovertcp
14:38:30.747 Add 3 5 . _tcp.local. _smb
14:38:30.747 Add 2 0 . _tcp.local. _whats-my-name
14:38:31.330 Add 3 10 . _tcp.local. _nfs
14:38:31.330 Add 3 10 . _tcp.local. _afpovertcp
14:38:31.330 Add 2 10 . _tcp.local. _smb
之后我们可以查询输出以下内容的服务:
$ dns-sd -B _whats-my-name._tcp
Browsing for _whats-my-name._tcp
DATE: ---Tue 16 Dec 2014---
14:40:20.738 ...STARTING...
Timestamp A/R Flags if Domain Service Type Instance Name
14:40:20.742 Add 2 0 local. _whats-my-name._tcp. Blub MacBook Pro
Instance Name
是这里有趣的部分。我假设每台运行bonjour的计算机都可以使用_whats-my-name
服务。如果您无法在每种情况下访问dns-sd,也许您可以使用基本的bash工具搜索已发送的查询并重新构建它们。你不应该在你的脚本中使用dns-sd。相反,您应该为您的编程语言使用协议的特定实现。
注意:请注意,设备名称可能不可靠,无法检测与您通信的设备
希望有所帮助。