근처에 아이폰 / 안드로이드 감지?


10

나는 원격으로 일하고 있는데 누군가 내 사무실에서 회의 / 점심을 위해 외출 한 시간을 아는 것이 편리 할 것입니다.

라즈베리 파이 근처의 전화를 수동으로 감지 할 수 있다고 생각했습니다 (웹 / 드롭 박스 / 기타에 게시).

가장 쉬운 방법은 무엇입니까? MAC 주소 감지? 블루투스?

답변:


10

낮은 수준의 무선 스캔없이 많은 사람들이 다른 장치를 감지하지 못하는 경우가 많았습니다. Bluetooth는 둘 다 자신의 장치 인 경우 iPhone에서 작동합니다.

  1. 일부 장치에서는 Wi-Fi 스캔이 작동 할 수 있지만 화면이 꺼져 있으면 iOS 장치가 연결되지 않습니다! 내 아이폰 6는 간단한 arp명령 (동일한 서브넷에 연결된 장치의 ip 및 mac 번호 표 제공) 으로 감지 할 수 있지만 전화 화면이 켜진 경우에만 발생합니다. 전화 화면이 잠 자면 Wi-Fi의 범위를 벗어났습니다! 나는 이것이 배터리 수명에 관심이 있다고 확신합니다.

  2. 블루투스 동글이 작동했습니다. rPi 및 iPhone에서 전력 소비가 거의 없어 현재의 / 아무런도없는 일부 고급 알고리즘과 달리 거리 계산이 없습니다. rPi에 블루투스 동글을 다음과 같이 설치하십시오 : ( sudo aptitude install bluetooth bluez-utils bluez-compat). 전화 장치를 검색 가능하게 hcitool scan하여 rPi에서 ( ) 를 수행하여 전화 장치의 Mac을 파악하십시오 . 그런 다음 다음과 같이 장치에 연결하고 (검색 가능해야 함) 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아이폰이 근처에 있는지 알아 내기 위해 좋아하는 스크립트에서. 이것은 연결을 만들지 않고 단지 hi라고 말합니다. 이름을 반환하면 전화가 근처에 있습니다. 아무 것도 반환하지 않으면 전화가 근처에 있지 않거나 블루투스가 꺼져있는 것입니다. 연결 또는 다른 거리 계산 방법을 만드는 것과 비교하여이 방법은 배터리를 양쪽에 절약하고 전파 오염을 최소화합니다.


9

저와 제 친구들은 해커 공간의 현관 문을 여는 블루투스 근접 식 스캐너를 개발하고 있습니다.

허용 된 모든 장치를 페어링했으며 기본적으로 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;

이것이 0을 반환하면 장치는 근접한 것입니다.

한 가지 단점은 장치가 근처에 있지 않으면 시간이 초과 될 때까지 ~ 5 초가 걸린다는 것입니다.

우리는 한 소스 코드 공개Github에서 아파치 오픈 소스 라이선스를.


2
이 사용하여 작동하는지 확인할 수 있습니다 hcitool .... 그러나 위 예제와 같이 명령을 연결해야합니다. 연결은 매우 짧은 시간 동안 만 활성화됩니다. 를 수행하여 믹스에 근접성을 추가 할 수 있습니다 hcitool rssi ....
Gunnar

2

비슷한 사용 사례에 블루투스를 사용하는 일부 설정을 보았지만 해킹이 필요할 수 있습니다. 감지하려는 전화는 일반적으로 검색 가능한 모드가 아닙니다.

전화가 Wi-Fi를 사용하는 경우 근접성을 감지 할 수 있지만 Wi-Fi 안테나에 액세스하지 않고 암호화 된 연결을하기 때문에 다소 낮은 계층에서 검색해야 할 수도 있습니다. 저수준 무선 보난자에 대한 키즈 멧 을 살펴보십시오 .

누군가가 방에 있는지 여부를 감지 하는 가장 쉬운 방법은 카메라 모듈과 파노라마 미러를 사용하는 것입니다.


1

사무실에있을 때 연결되는 WiFi 네트워크가있는 경우, x 시간마다 PI가 MAC 주소를 검색하고 현재 상태로 웹 페이지 (드롭 박스 등)를 업데이트 할 수 있습니다. 아마도 가장 신뢰할 수있는 경로 일 것입니다.

블루투스 및 USB 블루투스 어댑터로 무언가를 할 수는 있지만 경험이 없습니다.

파이 또는 파이가 연결된 네트워크에 연결되어 있지 않으면 많은 성공을 거둘 것이라고 생각하지 않습니다.


좋은. MAC 주소를 스캔하는 데 어떤 기술 / 앱 / 플랫폼을 사용한다고 생각 했습니까?
ACooleman

내가하는 방법은 nmap, 명령 줄 버전 및 약간의 사용자 정의 파이썬 코드 (파이썬 API가 있다고 확신합니다), 빠른 핑 스윕 / MAC 쿼리를 사용하여 사전 작성된 목록과 비교하는 것입니다. 이를 사용하여 php (HTML?) 페이지를 작성하고 lightppd (Apache?) 웹 서버를 사용하여 제공하십시오. python 작업을 x 기간 동안 실행하도록 설정하고 y 기간마다 웹 페이지를 자동으로 새로 고치십시오. 멋진 프로젝트 아이디어입니다 ... 내 접시에있는 다른 모든 프로젝트를 마친 후에 샷을 주어야 할 수도 있습니다.
버터

라우터에 ARP 테이블을 쿼리하거나 DHCP 서버를 쿼리 할 수도 있습니다. 조금 더 빨라질 수 있습니다.
Butters

1

위의 답변을 읽으면 다음과 같은 가능성에 대해 생각하게되었습니다.

airmon-ng 를 사용 하여 wifi에서 클라이언트 장치에 대한 네트워크를 지속적으로 스캔하십시오. 출력은 파일에 기록 될 수 있으므로 파일이 변경되면 클라이언트가 pi의 범위를 입력하거나 그 범위를 벗어나게됩니다. 알려진 mac 주소 목록을 사용하면 사용자를 식별 할 수 있으며 파일 변경으로 인해 일부 작업이 트리거 될 수 있습니다.

꽤 흥미로운 아이디어입니다! 감사!

아르 연


대형 상점에서는이 기술을 사용하여 쇼핑객이 상품을 탐색하는 방법, 건너 뛰는 레이온 등을 모니터링합니다. 그러나 개인 정보 보호법 때문에 모든 국가의 사람과 맥 주소를 연결하는 것이 항상 합법적 인 것은 아닙니다.
Havnar


1

그래서 나는 약 1 년 동안 같은 문제를 연구 해 왔습니다. Mac에서 상당히 빨리 작동하도록했지만 PC에서 올바르게 작동하는 데 많은 문제가있었습니다. 나는 많은 다른 접근법을 시도했다. 저와 제 파트너가 집에있을 때 (아두 이노와 RF 모듈을 통해) 난방과 온수를 켜는 가정용 자동화 시스템이 있습니다 (즉, iPhone은 가정용 WiFi에서 감지 가능). 결국 나는 'nslookup'을 사용하여 iPhone의 IP 주소를 찾았습니다 (IP 주소가 동적으로 변경되었지만 실제로 라우터에서 절대로 변경하지 않는 경우) iPhone이 켜져 있는지 감지하기 위해 'nmap' 네트워크. iPhone이 매우 깊은 잠자기 상태 인 경우 'nmap'이 항상 전화를 찾지는 못하므로 전화가 집에 없다고 말하기 전에 10 번 확인했습니다. 아래는 파이썬의 홈 오토메이션 코드의 일부입니다. 스레딩을 사용했습니다. 아래 코드가있는 질문은 알려주십시오.

# 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

코드를 직접 스크립트에 직접 복사하면 코드가 작동하지 않을 수 있습니다. 누락 된 부분이있어서 간단하고 읽기 쉬운 것을 시도하기 위해 복사하지 않았지만 위의 코드가 모든 사람에게 내가 한 일에 대한 감각을 줄 수 있기를 바랍니다. 소지품.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.