ตรวจสอบว่ามี iphone / Android ในบริเวณใกล้เคียงหรือไม่


10

ฉันทำงานจากระยะไกลและมันจะเป็นประโยชน์ที่จะรู้ว่าเมื่อมีคนออกไปประชุม / อาหารกลางวันในสำนักงานของฉัน

ฉันคิดว่าฉันอาจสามารถตรวจจับสิ่งที่โทรศัพท์ใกล้กับราสเบอร์รี่ pi (และเผยแพร่ไปยังเว็บ / dropbox / อะไรก็ได้)

อะไรจะเป็นวิธีที่ง่ายที่สุดในการทำเช่นนี้? ตรวจสอบที่อยู่ MAC? บลูทู ธ?

คำตอบ:


10

การล่าสัตว์มาก - เรียนรู้ค่อนข้างน้อย - ไม่มีโชคในการตรวจจับอุปกรณ์ของคนอื่น ๆ โดยไม่ต้องสแกนไร้สายระดับต่ำมาก - บลูทู ธ ใช้งานได้กับ iPhone ถ้าทั้งคู่เป็นอุปกรณ์ของคุณเอง:

  1. การสแกนไร้สายอาจใช้งานได้กับอุปกรณ์บางอย่าง แต่อุปกรณ์ iOS ไม่ได้เชื่อมต่อเมื่อปิดหน้าจอ! iphone 6 ของฉันสามารถตรวจจับได้ด้วยarpคำสั่งง่าย ๆ(ให้ตารางหมายเลข ip และ mac ของอุปกรณ์ที่เชื่อมต่อในซับเน็ตเดียวกัน) แต่สิ่งนี้จะเกิดขึ้นเฉพาะเมื่อหน้าจอโทรศัพท์สว่างขึ้น เมื่อหน้าจอโทรศัพท์หลับ - มันไร้ขอบเขตบน wifi! ฉันเดิมพันว่านี่คือความสนใจในชีวิตของแบตเตอรี่

  2. บลูทู ธ ดองเกิลทำงานได้ ไม่มีการคำนวณระยะทางซึ่งแตกต่างจากอัลกอริธึมที่แปลกใหม่ - เพียงแค่ปัจจุบัน / ขาดหายไปสามารถทำได้โดยใช้พลังงานเพียงเล็กน้อยใน rPi และ iPhone ติดตั้งดองเกิลบลูทู ธ บน 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 อยู่ใกล้หรือไม่ สิ่งนี้จะไม่สร้างการเชื่อมต่อ แต่เพียงแค่ทักทายคุณ หากส่งคืนชื่อโทรศัพท์จะอยู่ใกล้คุณ หากไม่มีอะไรคืน - โทรศัพท์ไม่ได้อยู่ใกล้หรือปิดบลูทู ธ เปรียบเทียบกับการสร้างการเชื่อมต่อหรือวิธีการคำนวณระยะทางอื่น ๆ ในนั้น - วิธีนี้ช่วยประหยัดแบตเตอรี่ทั้งสองด้านและช่วยลดมลพิษทางอากาศให้น้อยที่สุด


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;

หากสิ่งนี้ส่งกลับค่าศูนย์อุปกรณ์อยู่ใกล้

ข้อเสียอย่างหนึ่งคือจะใช้เวลาประมาณ 5 วินาทีในการหมดเวลาหากอุปกรณ์ไม่ได้อยู่ใกล้เคียง

เราได้เผยแพร่ซอร์สโค้ดบนGithubภายใต้ใบอนุญาตโอเพนซอร์สของ Apache


2
ฉันสามารถยืนยันได้ว่านี่ใช้งานhcitool ...ได้ อย่างไรก็ตามคุณจะต้องเชื่อมโยงคำสั่งต่าง ๆ ดังตัวอย่างด้านบน การเชื่อมต่อใช้งานได้ในระยะเวลาสั้น ๆ เท่านั้น hcitool rssi ...คุณสามารถเพิ่มความใกล้ชิดเข้าผสมด้วยการทำ
Gunnar

2

ฉันเคยเห็นการตั้งค่าบางอย่างโดยใช้บลูทู ธ สำหรับกรณีการใช้งานที่คล้ายกัน แต่อาจเกี่ยวข้องกับการแฮ็ค โทรศัพท์ที่คุณต้องการตรวจจับมักไม่อยู่ในโหมดที่สามารถค้นพบได้

หากโทรศัพท์ใช้ wifi คุณอาจตรวจจับระยะใกล้ได้ แต่นี่อาจหมายความว่าคุณจะต้องสแกนหาพวกมันในระดับที่ค่อนข้างต่ำเนื่องจากพวกเขาจะไม่เข้าถึงเสาอากาศ wifi ของคุณและพวกเขาอาจเชื่อมต่อเข้ารหัส ลองดูที่kismetเพื่อรับโบนันซ่าไร้สายระดับต่ำ

ง่ายที่สุดวิธีการตรวจสอบว่ามีใครบางคนที่อยู่ในห้องหรือไม่แม้ว่าฉันจะคาดเดาจะใช้โมดูลกล้องและกระจก panaramic


1

หากคุณมีเครือข่าย WiFi ที่พวกเขาเชื่อมต่อกับเมื่อพวกเขาอยู่ในสำนักงานคุณอาจมีการสแกน PI สำหรับที่อยู่ MAC ทุกช่วงเวลา x และปรับปรุงหน้าเว็บ (ดรอปบ็อกซ์, อะไรก็ตาม) ที่มีสถานะปัจจุบัน อาจเป็นเส้นทางที่น่าเชื่อถือที่สุด

คุณอาจจะสามารถทำอะไรกับบลูทู ธ และอะแดปเตอร์บลูทู ธ USB แต่ฉันไม่มีประสบการณ์กับมัน

หากไม่มีพวกเขาที่เชื่อมต่อกับ pi หรือเครือข่ายที่ pi เปิดอยู่ฉันไม่คิดว่าคุณจะประสบความสำเร็จมากนัก


ดี ดังนั้นคุณคิดว่าฉันจะใช้เทคโนโลยี / แอพ / แพลตฟอร์มในการสแกนที่อยู่ MAC?
ACooleman

วิธีที่ฉันจะทำคือกับ nmap, รุ่นบรรทัดคำสั่ง, และรหัสหลามที่กำหนดเองเล็กน้อย (ฉันแน่ใจว่ามี python api), ทำคำสั่ง ping sweep / MAC อย่างรวดเร็ว, เปรียบเทียบกับรายการที่สร้างไว้ล่วงหน้า, ใช้สิ่งนั้นเพื่อสร้างหน้า php (HTML?) และแสดงมันโดยใช้เว็บเซิร์ฟเวอร์ lightppd (Apache?) ตั้งค่าให้งาน python รันเป็นระยะเวลา x และให้หน้าเว็บรีเฟรชอัตโนมัติทุก ๆ ระยะเวลา y มันเป็นความคิดที่ยอดเยี่ยมสำหรับโครงการ ... ฉันอาจจะต้องให้มันหลังจากที่ฉันทำโปรเจ็กต์อื่น ๆ
Butters

คุณอาจจะสามารถสอบถามเราเตอร์ของคุณสำหรับตาราง ARP หรือเซิร์ฟเวอร์ DHCP ของคุณเช่นกัน ... อาจทำให้เร็วขึ้นเล็กน้อย ..
Butters

1

การอ่านคำตอบข้างต้นทำให้ฉันนึกถึงความเป็นไปได้ดังต่อไปนี้:

ใช้airmon-ngเพื่อสแกนเครือข่ายอย่างต่อเนื่องสำหรับอุปกรณ์ไคลเอ็นต์บน wifi สามารถเขียนเอาต์พุตไปยังไฟล์ได้ดังนั้นหากไฟล์เปลี่ยนไปไคลเอ็นต์จะเข้าหรือออกจากช่วงของ pi การมีรายการที่อยู่ mac ที่รู้จักกันช่วยให้คุณสามารถระบุผู้ใช้และเนื่องจากการเปลี่ยนแปลงไฟล์คุณสามารถเรียกการกระทำบางอย่าง ....

มันเป็นความคิดที่น่าสนใจทีเดียว! ขอบคุณ!

อาร์เยน


ร้านค้าขนาดใหญ่ใช้เทคนิคนี้เพื่อตรวจสอบว่าผู้ซื้อเรียกดูสินค้าของพวกเขาอย่างไรพวกเรยอนที่พวกเขาข้าม ฯลฯ แต่เนื่องจากกฎหมายความเป็นส่วนตัวจึงไม่ถูกกฎหมายที่จะเชื่อมโยงที่อยู่ mac กับบุคคลในทุกประเทศ
Havnar

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) เมื่อฉันหรือคู่ของฉันอยู่บ้าน (นั่นคือไอโฟนของเราสามารถตรวจจับได้ใน WiFi ที่บ้าน) ในที่สุดฉันใช้ 'nslookup' เพื่อค้นหาที่อยู่ IP สำหรับ iPhones (ในกรณีที่ที่อยู่ IP เปลี่ยนแปลงเนื่องจากเป็นแบบไดนามิก (แต่จริง ๆ แล้วพวกเขาไม่เคยทำบนเราเตอร์ของฉัน)) และ 'nmap' เพื่อตรวจสอบว่า iPhone เปิดอยู่หรือไม่ เครือข่าย. หาก 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.