Mendeteksi apakah iphone / Android di dekatnya?


10

Saya bekerja dari jarak jauh dan akan berguna untuk mengetahui kapan seseorang keluar untuk rapat / makan siang di kantor saya.

Saya pikir saya mungkin dapat secara pasif mendeteksi ponsel apa yang ada di dekat raspberry pi (dan kemudian menerbitkannya ke web / dropbox / apa pun)

Apa cara termudah untuk melakukan ini? Deteksi alamat MAC? Bluetooth?

Jawaban:


10

Banyak perburuan - sedikit belajar - tidak ada keberuntungan mendeteksi perangkat orang lain tanpa banyak pemindaian nirkabel tingkat rendah - Bluetooth berfungsi untuk iphone jika keduanya adalah perangkat Anda sendiri:

  1. Pemindaian wifi mungkin berfungsi untuk beberapa perangkat, tetapi yang iOS tidak terhubung saat layar mati! IPhone 6 saya dapat dideteksi dengan arpperintah sederhana (memberikan tabel nomor ip dan mac dari perangkat yang terhubung pada subnet yang sama) tetapi ini hanya akan terjadi ketika layar ponsel menyala. Setelah layar ponsel tidur - itu di luar batas pada wifi! Saya yakin ini adalah untuk masa pakai baterai.

  2. Dongle Bluetooth bekerja. Tidak ada perhitungan jarak tidak seperti beberapa algoritma mewah di luar sana - hanya hadir / absen dapat dilakukan dengan konsumsi daya yang sangat sedikit pada rPi dan iPhone. Instal bluetooth dongle di rPi sebagai: ( sudo aptitude install bluetooth bluez-utils bluez-compat). Cari tahu mac perangkat ponsel Anda dengan membuatnya dapat dicari dan kemudian lakukan ( hcitool scan) pada rPi. Kemudian sambungkan ke perangkat Anda (pastikan dapat dicari) sebagai: sudo bluez-simple-agent hci0 mac_of_your_devicedan katakan ya di kedua sisi. Lalu sudo bluez-test-device trusted mac_of_your_device. Sekarang mereka berdua "mengenal" satu sama lain. Lalu lakukansudo hcitool name mac_of_your_devicedi skrip favorit Anda untuk mengetahui apakah iphone ada di dekat Anda. Ini tidak akan membuat koneksi - tetapi hanya menyapa. Jika mengembalikan nama, ponsel ada di dekat Anda. Jika tidak mengembalikan apa-apa - ponsel tidak ada di dekat Anda atau bluetooth dimatikan. Dibandingkan membuat koneksi atau metode perhitungan jarak lain di luar sana - metode ini menghemat baterai di kedua sisi dan menjaga polusi gelombang udara seminimal mungkin.


9

Saya dan beberapa teman saya telah mengembangkan pemindai kedekatan bluetooth untuk membuka kunci pintu depan ruang peretas kami .

Kami telah memasangkan semua perangkat yang diizinkan dan pada dasarnya digunakan hcitooluntuk menguji apakah salah satu perangkat yang dipasangkan berada di dekatnya. Sebagai contoh, jika perangkat yang dipasangkan memiliki alamat "00: 00: 00: 00: 00: 00", Anda akan melakukan ini pada konsol baris perintah:

hcitool cc 00:00:00:00:00:00 && hcitool auth 00:00:00:00:00:00 && hcitool dc 00:00:00:00:00:00;

Jika ini mengembalikan nol, perangkat berada di dekatnya.

Satu kelemahannya adalah ini akan memakan waktu ~ 5 detik untuk time-out jika perangkat tidak di dekatnya.

Kami telah menerbitkan kode sumber di Github di bawah lisensi open-source apache.


2
Saya dapat mengkonfirmasi bahwa ini berfungsi menggunakan hcitool .... Namun, Anda harus mem-chain perintah seperti pada contoh di atas. Koneksi hanya aktif untuk waktu yang sangat singkat. Anda dapat menambahkan kedekatan ke dalam campuran dengan melakukan hcitool rssi ....
Gunnar

2

Saya telah melihat beberapa pengaturan menggunakan bluetooth untuk kasus penggunaan yang serupa, tetapi mungkin akan melibatkan beberapa peretasan. Ponsel yang ingin Anda deteksi biasanya tidak dalam mode yang dapat ditemukan.

Jika ponsel menggunakan wifi, Anda mungkin dapat mendeteksi kedekatan, tetapi ini juga mungkin berarti Anda harus memindai mereka pada lapisan yang agak rendah, karena mereka tidak akan mengakses antena wifi Anda, dan mereka mungkin akan menghubungkan terenkripsi. Lihatlah kismet untuk beberapa bonanza nirkabel tingkat rendah.

Namun, cara termudah untuk mendeteksi apakah seseorang berada di ruangan atau tidak, adalah dengan menggunakan modul kamera dan cermin panaramik.


1

Jika Anda memiliki jaringan WiFi yang terhubung dengan mereka ketika berada di kantor, Anda bisa meminta PI memindai alamat MAC setiap x periode waktu, dan memperbarui halaman web (dropbox, apa pun) dengan status saat ini. Mungkin rute yang paling bisa diandalkan.

Anda mungkin dapat melakukan sesuatu dengan bluetooth, dan adaptor Bluetooth USB, tapi saya tidak punya pengalaman dengan itu.

Tanpa mereka terhubung ke pi, atau jaringan pi aktif, saya tidak berpikir Anda akan sukses.


Bagus. Jadi, teknologi / aplikasi / platform apa yang Anda pikir akan saya gunakan untuk memindai alamat MAC?
ACooleman

Cara saya akan melakukannya adalah dengan nmap, versi baris perintah, dan sedikit kode python kustom (saya yakin ada api python), lakukan ping sweep / MAC query, bandingkan dengan daftar yang sudah dibuat sebelumnya, gunakan itu untuk membangun halaman php (HTML?) dan sajikan menggunakan server web lightppd (Apache?). Atur pekerjaan python untuk menjalankan x periode waktu, dan minta halaman web me-refresh secara otomatis setiap periode y. Itu ide proyek yang keren ... Saya mungkin harus mencobanya setelah saya menyelesaikan semua proyek lain yang ada di piring saya.
Butters

Anda mungkin dapat meminta router Anda untuk tabel ARP, atau Anda DHCP server juga ... Mungkin membuatnya sedikit lebih cepat ..
Butters

1

Membaca jawaban di atas juga membuat saya berpikir tentang kemungkinan berikut ini:

gunakan airmon-ng untuk terus memindai jaringan untuk perangkat klien di wifi. Output dapat ditulis ke file, jadi jika file berubah baik klien telah masuk atau meninggalkan rentang pi. Memiliki daftar alamat mac yang dikenal memungkinkan Anda untuk mengidentifikasi pengguna dan karena perubahan file Anda dapat memicu beberapa tindakan ....

itu ide yang cukup menarik! Terima kasih!

Arjen


Toko-toko besar menggunakan teknik ini untuk memantau bagaimana pembeli menelusuri barang-barang mereka, rayon mana yang mereka lewati dll. Tetapi karena undang-undang privasi tidak selalu sah untuk menautkan alamat mac ke seseorang di setiap negara.
Havnar


1

Jadi saya telah mengerjakan masalah yang sama selama sekitar satu tahun sekarang. Saya mendapatkannya untuk bekerja di mac saya cukup cepat, tetapi memiliki banyak kesulitan membuatnya berfungsi tepat di PC saya. Saya telah mencoba banyak pendekatan berbeda. Saya memiliki sistem otomasi rumah yang menyalakan pemanas dan air panas (melalui modul Arduino dan RF) ketika saya atau pasangan saya ada di rumah (yaitu iPhone kami dapat terdeteksi pada WiFi rumah). Pada akhirnya saya menggunakan 'nslookup' untuk menemukan alamat IP untuk iPhone (jika alamat IP memang berubah karena bersifat dinamis (tetapi sebenarnya tidak pernah dilakukan pada router saya)) dan 'nmap' untuk mendeteksi apakah iPhone aktif. jaringan. Jika iPhone dalam keadaan tidur sangat nyenyak 'nmap' tidak selalu menemukan telepon, jadi saya telah memeriksanya 10 kali sebelum mengatakan bahwa telepon tidak ada di rumah. Di bawah ini adalah bagian dari kode otomatisasi rumah saya dengan python. Saya telah menggunakan threading. Setiap pertanyaan dengan kode di bawah ini beri tahu saya.

# 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}
        }

dan

# 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

dan kode utama

   # 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

Kode mungkin tidak berfungsi jika Anda menyalinnya langsung ke skrip Anda sendiri, karena ada beberapa bagian yang hilang yang belum saya salin untuk mencoba dan menjaga hal-hal sederhana dan mudah dibaca, tetapi mudah-mudahan kode di atas memberi semua orang perasaan bagaimana saya melakukannya sesuatu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.