Определить, есть ли поблизости iPhone / Android?


10

Я работаю удаленно, и было бы полезно узнать, когда кто-то вышел на встречу / ланч в моем офисе.

Я думал, что смогу пассивно определить, какие телефоны рядом с Raspberry Pi (и затем опубликовать их в Интернете / Dropbox / что угодно)

Что было бы самым простым способом сделать это? Обнаружение MAC-адреса? Блютуз?

Ответы:


10

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

  1. Сканирование Wi-Fi может работать на некоторых устройствах, но iOS не подключаются, когда экран выключен! Мой iphone 6 может быть обнаружен с помощью простой arpкоманды (показывает таблицу номеров ip и mac подключенных устройств в одной подсети), но это происходит только при включенном экране телефона. Как только экран телефона засыпает - он выходит за пределы Wi-Fi! Бьюсь об заклад, это в интересах батареи.

  2. Bluetooth ключ работал. Нет вычислений расстояния в отличие от некоторых модных алгоритмов - просто сделать / пропустить можно с очень небольшим энергопотреблением на RPI и iPhone. Установите ключ Bluetooth на RPI как: ( sudo aptitude install bluetooth bluez-utils bluez-compat). Определите mac вашего телефонного устройства, сделав его доступным для поиска, а затем выполните ( hcitool scan) на 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 с открытым исходным кодом.


2
Я могу подтвердить, что это работает с помощью hcitool .... Однако вы должны объединить команды, как в примере, приведенном выше. Соединение активно только в течение очень короткого промежутка времени. Вы можете добавить близость в микс, делая hcitool rssi ....
Гуннар

2

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

Если телефоны используют Wi-Fi, вы, вероятно, можете обнаружить некоторую близость, но это также может означать, что вам придется сканировать их на довольно низком уровне, так как они не получат доступ к вашей Wi-Fi-антенне и, вероятно, будут подключаться в зашифрованном виде. Взгляните на kismet для небольшого беспроводного бонанса.

Самым простым способом определить, находится ли кто-то в комнате или нет, хотя, я думаю, было бы использование модуля камеры и панорамного зеркала.


1

Если у вас есть сеть Wi-Fi, к которой они подключаются, когда находятся в офисе, вы можете проводить PI-сканирование на наличие MAC-адресов каждые x периодов времени и обновлять веб-страницу (раскрывающийся список, что угодно) с текущим состоянием. Наверное, самый надежный маршрут.

Возможно, вы сможете что-то сделать с помощью Bluetooth и USB-адаптера Bluetooth, но у меня нет опыта в этом.

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


Приятно. Итак, какую технологию / приложение / платформу вы думаете, я бы использовал для сканирования MAC-адресов?
ACooleman

Я бы сделал это с помощью nmap, версии командной строки и небольшого пользовательского кода Python (я уверен, что есть Python API), выполните быструю проверку связи ping / MAC, сравните это с предварительно созданным списком, используйте это, чтобы создать страницу php (HTML?) и обработать ее с помощью веб-сервера lightppd (Apache?). Установите задание python на выполнение любого периода времени x, и веб-страница будет автоматически обновляться каждый период y. Это классная идея проекта ... Возможно, мне придется попробовать ее после того, как я закончу все остальные проекты, которые у меня на тарелке.
Баттерс

Возможно, вы сможете запросить у вашего маршрутизатора таблицу ARP или у вас также DHCP-сервер ... Возможно, это будет немного быстрее ..
Butters

1

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

используйте airmon-ng для непрерывного сканирования сети на наличие клиентских устройств по Wi-Fi. Вывод может быть записан в файл, поэтому, если файл изменяется, либо клиент вошел, либо вышел из диапазона числа пи. Наличие списка известных mac-адресов позволяет вам идентифицировать пользователя, и из-за изменения файла вы можете вызвать некоторые действия ....

это довольно интересная идея! Спасибо!

Арьен


Крупные магазины используют эту технику для отслеживания того, как покупатели просматривают свои товары, в каком районе они пропускают и т. Д. Но из-за законов о конфиденциальности не всегда законно привязывать mac-адрес к человеку в каждой стране.
Гавнар

1

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

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


В предоставленной вами ссылке содержится интересная информация, однако вы можете улучшить свой ответ, в том числе ответ на вопрос.
mpromonet

1

Так что я работаю над этой проблемой уже около года. Я заставил его работать на моем Mac довольно быстро, но мне было очень трудно заставить его работать прямо на моем ПК. Я перепробовал много разных подходов. У меня есть система домашней автоматизации, которая включает отопление и горячую воду (через модуль 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.