7

pybonjour を使用しようとしていますが、それが必要かどうかはわかりません。https://code.google.com/p/pybonjour/

ネットワークに自動的に表示される iOS デバイスを検出できるようにしたいのですが、これに基づいて後でスクリプトを実行しますが、最初に、wifi ネットワークに表示/非表示になるとすぐに iOS デバイスを検出したいと考えています。

質問ですが、これを行うにはどうすればよいですか?python27 と pybonjour パッケージがインストールされた Windows マシンで実行すると、2 つの例は pybonjour ページから動作しますが、ネットワークに含まれているスクリプトを使用して iOS デバイスを検出するには、どのコマンドを実行すればよいですか? または、このスクリプトを実行している PC で実行されているのは、これだけの検出サービスでしょうか!

間違った方向に進んでいる場合はお知らせください。このパッケージのドキュメントが見つからないようです!

python browse_and_resolve.py xxxxxx

Thxマット。

アップデート...

この記事とブラウザーは、検索する必要のあるサービスを見つけるのに役立ちました。

例; (これは、自宅の ATM ではなく、私の Apple TV を発見したので、iPhone の名前を確認できません! iPhone だと思います!

python browse_and_resolve.py _appletv._tcp

また、Windows ユーティリティ dns-sd.exe がある場合、これはネットワーク上で利用可能なすべてのサービスを検索します。これを使って探していたものを見つけました。

dns-sd -B _services._dns-sd._udp

アップデート...

「Bonjour は 2 つの方法で使用されます: - サービスの公開 - 利用可能なサービスの検出 (ブラウジング)」.

私がやりたいことについては、サービスを宣伝するアプリを実行していない限り(またはiPhone / iPadをジェイルブレイクしてからsshを開く)、iPad / iPhoneがサービスを宣伝しないため、機能しないと思います。 . 他にアイデアはありますか?

4

3 に答える 3

3

Bonjour ではなくpython-nmapを使用します。または、 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どちらが優先されるかは、python-nmap ライブラリを使用してコマンドとして実行することで使用できます。これは明らかにはるかに優れたアプローチです。上記の私の概念は、それをどのように使用できるかの簡単な例です。

コマンドラインから nmap を使用する (python-nmap にはnm.commandline()メソッドがあると思います) のが最も簡単です:

nmap -O -v ip

--osscan-guess; --fuzzyまた、最良の結果を得るために追加してみてください。例:

nmap -O -v --osscan-guess ip

次に、出力で iOS デバイスのキーワードを検索します (この例を参照してください)。人間が読める形式です。正しく機能させるには、これらすべてを管理者として実行する必要があることに注意してください (Windows: runas、その他: sudo)。

于 2013-05-10T16:16:41.730 に答える
0

そのため、私は約1年間同じ問題に取り組んできました。Mac ではすぐに動作するようになりましたが、PC で正しく動作させるには多くの問題がありました。私は多くのさまざまなアプローチを試してきました。私または私のパートナーが家にいるときに暖房とお湯をオンにするホームオートメーションシステムがあります(arduinoとRFモジュールを介して)(つまり、私たちのiPhoneは自宅のWiFiで検出可能です)。最後に、「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

コードを自分のスクリプトに直接コピーすると、コードが機能しない可能性があります。単純で読みやすいようにコピーしていない部分がいくつかあるためです。事をした。

于 2019-09-22T12:41:08.740 に答える