当前位置: 首页 > 知识库问答 >
问题:

尝试使用 python 脚本在我的网络上发现 iOS 设备

公冶高峯
2023-03-14

尝试使用pybonjour,但不确定它是否是我需要的。https://code.google.com/p/pybonjour/

我希望能够自动发现出现在我的网络上的iOS设备,稍后将基于此运行一个html" target="_blank">脚本,但首先我想在它出现/消失在我的wifi网络上时立即发现iOS设备。

所以问题是,我该怎么做?在安装了python27和pybonjour包的windows机器上运行,这两个示例在pybonjour页面上运行,但是我应该运行什么命令来使用我的网络上包含的脚本发现iOS设备呢?还是只有我运行此脚本的pc上运行的发现服务!

如果我走错了方向,请告诉我,我好像找不到这个包的文档!

python browse_and_resolve.py xxxxxx

谢谢马特。

更新...

这篇文章和浏览器很有帮助,http://marknelson.us/2011/10/25/dns-service-discovery-on-windows/ 找到我需要搜索的服务。

例如;(这发现了我的苹果电视,不在家里的ATM上,所以无法检查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将打开)。还有其他想法吗?

共有3个答案

葛勇锐
2023-03-14

因此,我已经在同一问题上工作了大约一年。我很快就让它在我的mac上运行,但在我的PC上运行时遇到了很多麻烦。我尝试了很多不同的方法。我有一个家庭自动化系统,当我或我的伴侣在家时(也就是说,我们的iPhone可以在家庭WiFi上检测到),它可以打开暖气和热水(通过arduino和RF模块)。最后,我使用“nslookup”查找iPhone的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

如果您将代码直接复制到自己的脚本中,代码可能不起作用,因为有一些部分缺失,我没有复制这些部分,以尽量保持简单易读,但希望上面的代码能让每个人都了解我是如何做的。

董庆
2023-03-14

使用python nmap而不是Bonjour。或者您可以使用pyzeroconf(Bonjour是ZeroCon的一个实现),但它有点过时(但仍然可以工作)。

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设备上有一个监听端口,该端口将返回主机名(可能不是这样)。您可以使用<code>osscan

从命令行使用nmap(我相信python-nmap有nm.commandline()方法)是最简单的:

nmap -O -v ip

还可以尝试添加< code >-OS scan-guess;- fuzzy以获得最佳结果。示例:

nmap -O -v --osscan-guess ip

然后只需在输出中搜索iOS设备关键字(参见本示例)。它是人类可读的。请注意,您需要以管理员身份运行所有这些,才能使其正常工作(Windows:runas,其他:sudo)。

公羊俊
2023-03-14

你想做的事情(a)可能做不到,(b)如果可以的话可能没什么用处。

Bonjour的重点是发现服务,而不是设备。当然,每个服务都是由某些设备提供的,因此您可以间接地发现使用它的设备...

据我所知,(Apple TV除外)不会宣传任何服务,除非您正在运行一个使用Bonjour在其他机器上查找相同应用程序的应用程序。(越狱设备除外,它经常宣传SSH、法新社等。)

有几种方法可以间接获取网络上任何人正在宣传的所有服务的列表。最简单的可能是使用Bonjour Browser for Windows。(我从来没有真正使用过它,但是我使用过的原始Mac工具和Java端口都为Windows用户推荐了这个Windows端口。启动它,您将获得一个服务列表,您可以单击每个服务以获取详细信息。

因此,您可以验证您的iPhone和iPad是否没有宣传任何服务,这将表明无法通过Bonjour检测到它们。

同时,即使您确实找到了设备,您也打算做什么?想必你想以某种方式与设备通信,对吧?无论您尝试与什么服务进行通信...只需浏览该服务,然后,如果合适,请筛选到iOS设备。这必须比浏览iOS设备然后过滤到具有您想要的服务的设备更容易。

至于有没有办法检测iOS设备......嗯,至少有两种可能。我不知道他们中的任何一个是否有效,但是......

首先,即使iOS设备没有为您做广告,我也假设它正在浏览您可以宣传的服务。否则,它怎么会发现有一个Apple TV到AirTunes,LAN上有一个iTunes可以同步,等等?

因此,使用Bonjour Browser获得您的iTunes运行的桌面、Apple TV等所有服务的列表。都是广告。然后关闭桌面上的所有服务,使用PyBonjour来广告任何看起来似乎相关的服务(如果需要,使用netcat在您广告的端口上放置琐碎的侦听器)。然后打开你的iPhone,看看它是否连接到其中任何一个。你可能想让它运行一段时间,或者关闭WiFi,然后再打开。(我猜,尽管苹果公司提出了建议,但它并没有连续浏览大多数服务,而是每隔一段时间和/或每次网络状态变化时检查一次。毕竟苹果的推荐是针对前台交互app,而不是后台服务。)

不幸的是,即使您可以找到所有iOS设备都将连接到的服务,您也可能无法通过在那里获得连接来将iOS设备与其他设备区分开来。例如,我很确定任何运行iTunes的Mac或Windows box都会启动你的假AirTunes服务,任何Mac都会启动您的AirPrint,等等。那么,你如何区分这与iPhone启动它的区别呢?您可能需要实际提供足够的协议以从中获取信息。这对于苹果的无文档协议来说尤其困难。

但希望你运气好,会有所有iOS设备,而不是其他设备,想要与之交谈的东西。iTunes Sync似乎是显而易见的可能性。

或者,有一些事情他们必须广播,否则他们就不会工作。没有广播就上不了WiFi网络。大多数家庭WiFi网络使用DHCP,这意味着它们也必须广播DHCP发现(和请求)。您可以在这些邮件中检测到某种启发式签名。如果没有其他情况,启用DDNS应该会导致设备发送其主机名,您可以基于此进行猜测(例如,除非您更改默认值< code>hostname.lower()。endswith('iphone'))。

最简单的方法可能是将桌面设置为家庭网络的主要接入点。我相信这就像在控制面板的某个地方打开互联网连接共享一样简单。(设置为DHCP中继代理的开销要比设置为完整路由器的开销小得多,但我不知道您如何在Windows上开始这样做。)然后,您可以在接收到DHCP广播(或者,如果没有,802.11广播)时捕获它们。Wireshark将为您轻松捕获和解析消息,因此您可以观察并查看这是否值得进一步研究。(有关格式的详细信息,请参见RFC 2131,这些信息在Wireshark隐晦的一行程序描述中并不明显。)

你可以更进一步,观察每台主机接入互联网后的互联网连接。任何定期检查App Store、iOS升级服务器等的设备。…嗯,除非有一个越狱开发团队的人住在你家,那很可能是iPhone,对吧?缺点是,其中一些检查可能非常定期,在iPhone连接到网络6小时后检测它并不是很令人兴奋。

 类似资料:
  • 实验性的Web Bluetooth API在Chrome for Android Marshmallow的开发版本中运行良好。我可以简单地在<code>处启用实验标志chrome://flags/#enable-网络蓝牙和我很好去。 遗憾的是,网络蓝牙API在我的AndroidLollipop设备上不起作用。为什么?

  • 我正在使用selenium打开并登录google帐户,这是我的第一步。我已成功打开并填写了电子邮件回复,但在提交后,我收到了以下错误 “此浏览器或应用程序可能不安全。了解更多尝试使用不同的浏览器。如果您已经在使用受支持的浏览器,您可以刷新屏幕并重试登录。”来自谷歌。 有什么办法可以绕过这个问题吗?下面是我的代码。

  • 问题内容: 我正在尝试按顺序加载一组脚本,但是onload事件对我没有触发。 我猜想当使用jQuery将元素添加到DOM时,不会触发诸如el.onload之类的本地事件。如果我使用本机,则可以正常启动。 问题答案: 您应该在事件f.ex 之后* 设置属性: * 您还应该 在 附加事件 之前 将脚本附加到DOM : 请记住,您需要检查IE支持。如果您使用的是jQuery,则还可以尝试以下方法:htt

  • 我希望能够在我的网络上发现Android设备,并可能检索一些关于它们的设备信息。这对于苹果设备来说非常容易,因为它们运行Bonjour服务。然而,我似乎找不到任何类似的服务运行在Android上。 这必须在不修改Android设备,安装某些服务或打开某些端口的情况下工作。它旨在与vanilla Android设备配合使用,就像Bonjour帮助您找到vanilla Apple设备一样。即使能够验证

  • 本文向大家介绍对Python 网络设备巡检脚本的实例讲解,包括了对Python 网络设备巡检脚本的实例讲解的使用技巧和注意事项,需要的朋友参考一下 1、基本信息 我公司之前采用的是人工巡检,但奈何有大量网络设备,往往巡检需要花掉一上午(还是手速快的话),浪费时间浪费生命。 这段时间正好在学 Python ,于是乎想(其)要(实)解(就)放(是)双(懒)手。 好了,脚本很长又比较挫,有耐心就看看吧。

  • 有人能帮我让VS2017与. NET Core测试项目一起使用吗? 我尝试从VS 2017模板为. NET Core创建MSTest和xUnit单元测试项目。它们都不适用于测试资源管理器(未发现),但是从项目文件夹运行可以正常工作。 复制步骤: < li >在VS 2017中创建新项目 < li >选择< code >单元测试项目(NET Core)或< code>xUnit测试项目(。NET C