尝试使用pybonjour,但不确定它是否是我需要的。https://code.google.com/p/pybonjour/
我希望能够自动发现出现在我的网络上的iOS设备,稍后将基于此运行脚本,但首先我想要在iOS设备在我的wifi网络上出现/消失时立即发现它。
所以问题是,我该怎么做呢?这两个示例在安装了python27和pybonjour包的windows机器上运行,从pybonjour页面开始工作,但是我应该运行什么命令来使用网络中包含的脚本来发现iOS设备呢?或者,这将仅在我运行此脚本的pc上运行发现服务!
如果我走错了方向,请告诉我,我好像找不到这个包上的文档了!
python browse_and_resolve.py xxxxxx谢谢马特。
更新...
这篇文章和浏览器很有帮助,http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/帮助我找到了需要搜索的服务。
例如:(这发现了我的苹果电视,不在家里的自动取款机上,所以无法检查iphone叫什么!)我猜是iphone吧!
python browse_and_resolve.py _appletv._tcp此外,如果您有windows实用程序dns-sd.exe,这将搜索网络上所有可用的服务。我用这个找到了我要找的东西。
dns-sd -B _services._dns-sd._udp更新...
"Bonjour有两种用途:-发布服务--检测(浏览)可用的服务“。
对于我想做的事情,我认为它不会工作,因为ipad/iPhone不会广告一个服务,除非我运行一个广告服务的应用程序(或者越狱我的iPhone/ipad,然后ssh就会打开)。还有更多的想法吗?
发布于 2013-05-11 02:27:52
你想要做的事情(a)可能做不到,(b)如果可以的话,可能没有多大用处。
Bonjour的目的是发现服务,而不是设备。当然,每个服务都是由某个设备提供的,因此您可以间接地使用它…发现设备但只能通过发现他们正在广告的服务。
据我所知,(苹果电视除外)不要宣传任何服务,除非你运行的应用程序使用Bonjour在其他机器上找到相同的应用程序。(越狱设备除外,这些设备通常宣传SSH、AFP等)
有几种方法可以间接获得网络上任何人所通告的所有服务的列表。最简单的可能是使用Bonjour Browser for Windows。(我实际上从未用过它,但我曾经使用过的原始Mac工具和Java端口都建议Windows用户使用这个Windows端口。)启动它,您将获得一个服务列表,您可以单击每个服务来获取详细信息。
因此,你可以验证你的iPhone和iPad没有广告任何服务,这将表明没有办法通过Bonjour检测到它们。
同时,即使你找到了一台设备,你打算怎么做?想必你想以某种方式与设备通信,对吧?无论您尝试与…通信的是什么服务只需浏览该服务-然后,如果合适,则过滤到iOS设备。这比浏览iOS设备,然后过滤到那些有你想要的服务的设备要容易得多。
至于是否有任何方法可以检测iOS设备…好吧,至少有两种可能性。我不知道这两个能不能用,但是…
首先,即使iOS设备没有为你做任何广告,我也假设它是在浏览你可以做广告的服务。除此之外,它怎么会发现有一台苹果电视可以AirTunes到,局域网上有一台iTunes可以同步,等等?
所以,使用Bonjour浏览器来获得你的iTunes运行的所有服务的列表-运行桌面,苹果电视等都是广告。然后关闭桌面上的所有服务,使用PyBonjour来通告任何看似相关的服务(如果需要,还可以使用netcat在您通告的端口上放置无关紧要的侦听器)。然后打开你的iPhone,看看它是否连接到它们中的任何一个。您可能想让它运行一段时间,或者关闭WiFi然后再打开。(我猜,尽管苹果提出了建议,但它并不会持续浏览大多数服务,而只是偶尔和/或每次网络状态发生变化时进行检查。毕竟,苹果的推荐是针对前台互动应用,而不是后台服务。)
不幸的是,即使你能找到一个所有iOS设备都能连接的服务,你可能也不能仅仅通过连接就将iOS设备与其他设备区分开来。例如,我非常确定任何运行iTunes的Mac或Windows机器都会攻击你的假AirTunes服务,任何Mac都会攻击你的AirPrint,以此类推。那么,如何将其与iPhone命中它区分开来呢?您可能需要实际为协议提供足够的服务,才能从中获取信息。对于苹果公司的未记录协议来说,这将特别困难。
但希望你能走运,有一些东西,所有的iOS设备,而不是其他东西,都会想要交谈。iTunes同步似乎是显而易见的可能性。
或者,他们必须广播一些东西,否则他们就不会工作。没有广播,你就不能进入WiFi网络。而且大多数家庭WiFi网络使用动态主机配置协议,这意味着它们也必须广播动态主机配置协议发现(和请求)。您可能会在这些消息中检测到某种启发式签名。如果没有其他问题,启用DDNS应该会导致设备发送其主机名,您可以根据这一点进行猜测(例如,除非您更改了默认值hostname.lower().endswith('iphone'))。
最简单的方法可能是将桌面设置为家庭网络的主要接入点。我相信这很简单,只需在控制面板的某处打开Internet连接共享即可。(设置为DHCP中继代理比作为完整路由器的开销要小得多,但我不知道如何在Windows上开始这样做。)然后,您可以在DHCP广播传入时捕获它们(如果没有捕获,则捕获前802.11个广播)。Wireshark将为您轻松地捕获和解析消息,因此您可以观察并查看这是否值得进一步研究。(有关该格式的详细信息,请参阅RFC 2131,这些细节在Wireshark隐秘的一行描述中并不明显。)
你可以走得更远,观察每台主机连接到互联网后的网络连接。任何定期检查应用商店、iOS升级服务器等的设备。…除非有越狱小组的人住在你的房子里,那可能是个iPhone,对吧?缺点是,其中一些检查可能是非常周期性的,并且在iPhone连接到您的网络6小时后检测到它并不是很令人兴奋。
发布于 2013-05-11 00:16:42
使用python-nmap而不是Bonjour。或者你可以使用pyzeroconf (Bonjour是zeroconf的一个实现),但是它有点过时(但仍然可以工作)。
python-nmap可能是最简单的,假设您想要查找所有主机名中包含'iPhone‘或'iPad’的连接设备(这只是一个简单的概念):
import nmap
...
def notify_me(ip, hostname):
print("I found an iOS device! IP Address: %s, Hostname: %s" % (ip, hostname))
iOS_device_list = ['iPhone', 'iPad']
iOS_devices_on_net = {}
nm = nmap.PortScanner()
# scan ip range
for i in range(2, 50, 1):
ip = "192.168.1." + str(i)
# specify ports to scan
nm.scan(ip, '62078') # Matt mentioned that it picks up iphone-sync on this port
hostname = nm[ip].hostname()
for device in iOS_device_list:
if device.lower() in hostname.lower():
iOS_devices_on_net.update({ip:hostname})
notify_me(ip, hostname)
# show all iOS devices in ip range
print iOS_devices_on_net这种方法的局限性在于,它依赖于个人没有更改其主机名,该主机名最初包括其名称和设备名称。它还假设iOS设备上有一个端口正在侦听,该端口将返回主机名(实际情况可能并非如此)。您可以通过使用osscan -nmap库将其作为命令运行来使用python。这显然是一种更好的方法。我上面的概念只是一个如何使用它的简单示例。
从命令行使用nmap (我相信python-nmap有nm.commandline()方法)是最简单的:
nmap -O -v ip也可以尝试添加--osscan-guess; --fuzzy以获得最佳结果。示例:
nmap -O -v --osscan-guess ip然后,只需在输出中搜索iOS设备关键字(请参阅this example)。它是人类可读的。请注意,您需要以管理员身份运行所有这些程序才能正常工作(Windows:runas,其他:sudo)。
发布于 2019-09-22 20:41:09
因此,我已经在这个问题上工作了大约一年。我很快就让它在我的mac上工作了,但在我的PC上却遇到了很多麻烦。我尝试了许多不同的方法。我有一个家庭自动化系统,当我或我的伴侣在家时,它会打开暖气和热水(通过arduino和RF模块)(也就是说,在家里的WiFi上可以检测到我们的iPhones )。最后,我使用'nslookup‘来查找iPhones的IP地址(以防IP地址发生变化,因为它们是动态的(但实际上在我的路由器上从来不会发生变化)),并使用'nmap’来检测iPhone是否在网络上。如果iPhone处于非常深的睡眠状态,'nmap‘并不总是能找到手机,所以我让它检查了10次,然后它才会说手机在家。下面是我用python编写的家庭自动化代码的一部分。我已经使用了线程。如果你对下面的代码有任何疑问,请告诉我。
# Dictionary to store variables to reuse on program restart
v = {
'boilerControlCH' : 'HIH', # 'scheduled' or 'HIH' (Honey I'm Home)
'boilerControlHW' : 'scheduled',
'thermostatSetPoint' : 20.8,
'thermostatVariance' : 0.1,
'morningTime' : datetime(1970,1,1,6,0,0),
'nightTime' : datetime(1970,1,1,23,0,0),
'someOneHome' : False,
'guest' : False,
'minimumTemperatureOO' : False,
'minimumTemperature' : 4.0,
'iPhoneMark' : {'iPhoneHostname' : 'marks-iphone', 'home' : False},
'iPhoneJessica' : {'iPhoneHostname' :'jessicaesiphone', 'home' : False}
}和
# Check if anyone at home
def occupancyStatus(person, Bol = False):
with lockOccupancyStatus:
someOneHome = False
if 'iPhone' in person:
v[person]['home'] = Bol
elif 'retest' in person:
pass
else:
v[person] = Bol
if v['guest'] == True:
someOneHome = True
for key in v:
if 'iPhone' in key:
if v[key]['home'] == True:
someOneHome = True
v['someOneHome'] = someOneHome
variablesToFile()
return和主代码
# iPhone home status threading code
class nmapClass(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global exitCounter
nmapThread()
msg.log('Exited nmapThread')
waitEvent.set()
waitEventAdjustable.set()
serialDataWaiting.set()
exitCounter += 1
def nmapThread():
iPhone = {}
maxCounts = 10
for phone in v:
if 'iPhone' in phone:
iPhone[phone] = {}
iPhone[phone]['hostname'] = v[phone]['iPhoneHostname']
iPhone[phone]['count'] = maxCounts
#msg.log(iPhone)
while exitFlag[0] == 0:
for phone in iPhone:
if iPhone[phone]['count'] > 0:
phoneFound = False
IPAddress = '0.0.0.0'
# Find iPhones IP address using its hostname
commandNsloolup = 'nslookup %s' %iPhone[phone]['hostname']
childNslookup = pexpect.popen_spawn.PopenSpawn(commandNsloolup, timeout = None)
output = childNslookup.readline()
while '\r\n' in output:
#msg.log(output)
if 'Name:' in output:
output = childNslookup.readline()
if 'Address:' in output:
tempStr = output
startPoint = tempStr.find('192')
tempStr = tempStr[startPoint:]
IPAddress = tempStr.replace('\r\n', '')
#msg.log(IPAddress)
output = childNslookup.readline()
if IPAddress == '0.0.0.0':
pass
#msg.error('Error finding IP address for %s' %iPhone[phone]['hostname'], GFI(CF()).lineno)
else:
#commandNmap = 'nmap -PR -sn %s' %IPAddress
#commandNmap = 'nmap -p 62078 -Pn %s' %IPAddress # -p specifies ports to try and access, -Pn removes pinging
commandNmap = 'nmap -p 62078 --max-rate 100 %s' %IPAddress
childNmap = pexpect.popen_spawn.PopenSpawn(commandNmap, timeout = None)
output = childNmap.readline()
while '\r\n' in output:
if 'Host is up' in output:
phoneFound = True
break
output = childNmap.readline()
#if phoneFound:
# break
if phoneFound:
iPhone[phone]['count'] = 0
if v[phone]['home'] == False:
msg.log('%s\'s iPhone has returned home' %phone)
occupancyStatus(phone, True)
waitEventAdjustable.set()
#else:
#msg.log('%s\'s iPhone still at home' %phone)
else:
iPhone[phone]['count'] -= 1
if v[phone]['home'] == True and iPhone[phone]['count'] == 0:
msg.log('%s\'s iPhone has left home' %phone)
occupancyStatus(phone, False)
waitEventAdjustable.set()
#else:
#msg.log('%s\'s iPhone still away from home' %phone)
elif iPhone[phone]['count'] < 0:
msg.error('Error with count variable in iPhone dictionary', GFI(CF()).lineno)
longWait = True
for phone in iPhone:
if iPhone[phone]['count'] > 0:
longWait = False
#msg.log('%s: %s' %(phone, iPhone[phone]['count']))
if longWait:
#msg.log('wait long')
# 600 = run every 10 minutes
waitEvent.wait(timeout=600)
for phone in iPhone:
iPhone[phone]['count'] = maxCounts
else:
#msg.log('wait short')
waitEvent.wait(timeout=60)
return如果你直接将它复制到你自己的脚本中,代码可能无法工作,因为有一些我没有复制的部分,试图保持简单和易于阅读,但希望上面的代码能让每个人对我是如何做事情的有一个感觉。
https://stackoverflow.com/questions/16473379
复制相似问题