Виявити, якщо iphone / Android поблизу?


10

Я працюю віддалено, і було б зручно дізнатися, коли хтось вийшов на зустріч / обід у мій кабінет.

Я подумав, що мені вдасться пасивно виявити, які телефони біля малинового пі (і потім опублікувати їх у Інтернеті / папці / в будь-якому іншому)

Який був би найпростіший спосіб зробити це? Виявлення MAC-адреси? Bluetooth?

Відповіді:


10

Багато полювання - навчилися зовсім небагато - не пощастить виявити пристрої інших людей без особливого низького рівня бездротового сканування - Bluetooth працює для iphone, якщо обидва є вашими власними пристроями:

  1. Сканування Wi-Fi може працювати на деяких пристроях, але iOS не підключаються, коли екран вимкнено! Мій iphone 6 можна було виявити за допомогою простої arpкоманди (дає таблицю ip та mac номерів підключених пристроїв у одній підмережі), але це станеться лише тоді, коли екран телефону буде освітлений. Як тільки екран телефону спить - це вже поза межами wifi! Надіваюсь, це цікавить ресурс акумулятора.

  2. Bluetooth ключ працював. Відсутність обчислень на відстані, на відміну від деяких фантазійних алгоритмів - просто наявний / відсутній може бути здійснено з дуже невеликим споживанням енергії на rPi та iPhone. Встановіть Bluetooth rіng на rPi як: ( sudo aptitude install bluetooth bluez-utils bluez-compat). hcitool scanВизначте mac свого пристрою телефону, зробивши його для пошуку, а потім зробіть ( ) на rPi. Потім підключіться до свого пристрою (переконайтеся, що його можна шукати) як: sudo bluez-simple-agent hci0 mac_of_your_deviceі скажіть так з обох сторін. Потім sudo bluez-test-device trusted mac_of_your_device. Тепер вони обоє "знають" один одного. Тоді робітьsudo hcitool name mac_of_your_deviceв улюбленому сценарії, щоб з’ясувати, чи знаходиться iphone поблизу. Це не створить зв’язку - а просто скажіть привіт. Якщо воно поверне ім’я, телефон знаходиться поруч. Якщо нічого не повертається - телефон не знаходиться поруч або Bluetooth вимкнено. Порівняно із створенням з'єднань або інших методів обчислення відстані - цей метод заощаджує акумулятор з обох сторін і зводить забруднення повітряної хвилі до мінімуму.


9

Я та деякі мої друзі розробляли сканер наближення до Bluetooth, щоб відкрити замок вхідних дверей нашого хакерського простору .

Ми поєднали всі дозволені пристрої і по суті використовуємо hcitoolдля перевірки, чи є один із парних пристроїв поруч. Наприклад, якщо в парному пристрої є адреса "00: 00: 00: 00: 00: 00", ви зробите це на консолі командного рядка:

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

Якщо цей показник повертає нуль, пристрій знаходиться в безпосередній близькості.

Одним із мінусів є те, що цей час очікуватиме приблизно 5 секунд, якщо пристрій знаходиться поруч.

Ми опублікували вихідний код на Github під ліцензією apache open-source.


2
Я можу підтвердити, що це працює за допомогою hcitool .... Однак ви повинні ланцюжок команд, як у наведеному вище прикладі. З'єднання активне лише дуже короткий час. Ви можете додати близькості до суміші, зробивши це hcitool rssi ....
Гуннар

2

Я бачив деякі установки, що використовують Bluetooth для подібних випадків використання, але, ймовірно, це матиме певний злом. Телефони, які ви хочете виявити, зазвичай не знаходяться в режимі виявлення.

Якщо телефони використовують Wi-Fi, ви, ймовірно, можете виявити деяку близькість, але це також, ймовірно, означає, що вам доведеться сканувати їх на досить низькому шарі, оскільки вони не отримають доступ до вашої антени Wi-Fi, і вони, ймовірно, підключать зашифровані. Погляньте на kismet для низького рівня бездротового бонанса.

Самий простий спосіб визначити , є чи хто - то в кімнаті чи ні, хоча, я думаю, буде використовувати модуль камери і panaramic дзеркало.


1

Якщо у вас є мережа Wi-Fi, до якої вони підключаються, коли вони знаходяться в офісі, ви можете проводити PI-сканування MAC-адреси кожні х періоди часу та оновлювати веб-сторінку (dropbox, що б там не було) з поточним статусом. Мабуть, найнадійніший маршрут.

Можливо, ви зможете зробити щось із Bluetooth та USB-адаптером Bluetooth, але я не маю цього досвіду.

Без них, підключених до pi, або до мережі, в якій пі увімкнено, я не думаю, що ви матимете великий успіх.


Приємно. Отже, яку техніку / додаток / платформу ви думали, що я використаю для сканування MAC-адрес?
ACooleman

Так, як я це зробив би з nmap, версією командного рядка та невеликим користувацьким кодом python (я впевнений, що є api python), зробіть швидкий розгортання ping / MAC-запиту, порівняйте його з попередньо створеним списком, використовуйте це, щоб створити сторінку php (HTML?) та обслуговувати її за допомогою веб-сервера lightppd (Apache?). Встановіть завдання python для виконання будь-якого періоду часу, а веб-сторінка автоматично оновить кожен y період. Це крута ідея проекту ... Можливо, мені доведеться спробувати після того, як я закінчу всі інші проекти, які є в моїй плиті.
Масляни

Можливо, ви зможете запитати свій маршрутизатор на таблицю ARP, або ви також DHCP-сервер ... Можливо, це зробити трохи швидше ..
Масляни

1

Читання вищезазначених відповідей також спонукало мене до роздумів про наступну можливість:

використовувати airmon-ng для постійного сканування мережі для клієнтських пристроїв на wifi. Вихід може бути записаний у файл, тому якщо файл зміни або клієнт ввійшов, або залишив діапазон пі. Наявність списку відомих mac-адрес дозволяє вам ідентифікувати користувача, і завдяки зміні файлу ви можете викликати деякі дії ....

це досить цікава ідея! Дякую!

Аржен


Великі магазини використовують цю техніку для спостереження за тим, як покупці переглядають товари, який район вони пропускають і т. Д. Але через закони про конфіденційність не завжди законно пов’язувати мак-адресу з людиною в кожній країні.
Гавнар

1

Поки пристрої знаходяться в одній мережі, ви можете легко використовувати Raspberry Pi для цього. Ось повний проект з усім кодом, який вам потрібен ...

http://www.element14.com/community/people/mcollinge/blog/2014/09/12/raspberry-pi-network-spy--part-1


У посиланні, яке ви надаєте, є цікава інформація, проте ви можете покращити свою відповідь, включаючи відповідь на питання.
mpromonet

1

Тож я над цим питанням працюю вже близько року. Я змусив його працювати над своїм комп'ютером досить швидко, але у мене виникло багато проблем з його роботою на моєму ПК. Я спробував багато різних підходів. У мене є система домашньої автоматизації, яка вмикає опалення та гарячу воду (через модуль arduino та RF), коли я або мій партнер є вдома (тобто наші iPhone можна виявити на домашньому Wi-Fi). Врешті-решт я використав 'nslookup', щоб знайти IP-адресу для iPhone (у випадку, якщо 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

Код може не спрацювати, якщо ви скопіюєте його прямо у свій власний сценарій, оскільки відсутні деякі частини, які я не копіював, щоб спробувати зробити речі простими та легкими для читання, але, сподіваємось, вищевказаний код дає зрозуміти, як я це зробив речі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.