Phát hiện nếu iphone / Android ở gần?


10

Tôi đang làm việc từ xa và sẽ rất hữu ích khi biết ai đó đã đi ra ngoài cho một cuộc họp / bữa trưa trong văn phòng của tôi.

Tôi nghĩ rằng tôi có thể có thể phát hiện một cách thụ động những điện thoại nào gần raspberry pi (và sau đó xuất bản chúng lên web / dropbox / bất cứ thứ gì)

Điều gì sẽ là cách dễ nhất để làm điều này? Phát hiện địa chỉ MAC? Bluetooth?

Câu trả lời:


10

Săn lùng nhiều - học được khá nhiều - không may mắn phát hiện các thiết bị của người khác mà không cần quét không dây ở mức độ thấp - Bluetooth hoạt động cho iphone nếu cả hai đều là thiết bị của riêng bạn:

  1. Quét wifi có thể hoạt động đối với một số thiết bị, nhưng các thiết bị iOS không kết nối khi màn hình tắt! IPhone 6 của tôi có thể được phát hiện bằng arplệnh đơn giản (đưa ra bảng số ip và mac của các thiết bị được kết nối trên cùng một mạng con) nhưng điều này chỉ xảy ra khi màn hình điện thoại sáng lên. Một khi màn hình điện thoại ngủ - nó vượt quá giới hạn của wifi! Tôi cá rằng đây là lợi ích của tuổi thọ pin.

  2. Bluetooth đã hoạt động. Không có tính toán khoảng cách không giống như một số thuật toán ưa thích ngoài kia - chỉ cần hiện diện / vắng mặt với mức tiêu thụ năng lượng rất ít trên rPi và iPhone. Cài đặt dongle bluetooth trên rPi dưới dạng: ( sudo aptitude install bluetooth bluez-utils bluez-compat). Tìm ra mac của thiết bị điện thoại của bạn bằng cách làm cho nó có thể tìm kiếm được và sau đó thực hiện ( hcitool scan) trên rPi. Sau đó kết nối với thiết bị của bạn (đảm bảo thiết bị có thể tìm kiếm được) dưới dạng: sudo bluez-simple-agent hci0 mac_of_your_devicevà nói có ở cả hai bên. Sau đó sudo bluez-test-device trusted mac_of_your_device. Bây giờ cả hai "biết" nhau. Sau đó làmsudo hcitool name mac_of_your_devicetrong tập lệnh yêu thích của bạn để tìm hiểu xem iphone có ở gần không. Điều này sẽ không tạo ra một kết nối - nhưng chỉ cần nói xin chào với nó. Nếu nó trả về một tên, điện thoại ở gần đó. Nếu nó không trả về gì - điện thoại không ở gần hoặc bluetooth bị tắt. So với việc tạo kết nối hoặc các phương pháp tính toán khoảng cách khác ngoài kia - phương pháp này bảo tồn pin ở cả hai bên và giữ cho ô nhiễm không khí ở mức tối thiểu.


9

Tôi và một số người bạn của tôi đã phát triển một máy quét gần bluetooth để mở khóa cửa trước của không gian tin tặc của chúng tôi .

Chúng tôi đã ghép nối tất cả các thiết bị được phép và về cơ bản được sử dụng hcitoolđể kiểm tra nếu một trong các thiết bị được ghép nối ở gần đó. Ví dụ: nếu thiết bị được ghép nối có địa chỉ "00: 00: 00: 00: 00", bạn sẽ thực hiện việc này trên bảng điều khiển dòng lệnh:

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

Nếu điều này trả về 0, thiết bị ở gần.

Một nhược điểm là việc này sẽ mất ~ 5 giây để hết thời gian nếu thiết bị không ở gần.

Chúng tôi đã xuất bản mã nguồn trên Github theo giấy phép nguồn mở apache.


2
Tôi có thể xác nhận rằng điều này đang làm việc bằng cách sử dụng hcitool .... Tuy nhiên, bạn phải xâu chuỗi các lệnh như trong ví dụ đã nêu ở trên. Kết nối chỉ hoạt động trong một khoảng thời gian rất ngắn. Bạn có thể thêm sự gần gũi vào hỗn hợp bằng cách làm hcitool rssi ....
Gunnar

2

Tôi đã thấy một số thiết lập sử dụng bluetooth cho các trường hợp sử dụng tương tự, nhưng nó có thể sẽ liên quan đến một số hack. Các điện thoại bạn muốn phát hiện thường không ở chế độ có thể khám phá.

Nếu điện thoại sử dụng wifi, bạn có thể phát hiện ra một số khoảng cách gần, nhưng điều này cũng có nghĩa là bạn sẽ phải quét chúng ở một lớp khá thấp, vì chúng sẽ không truy cập ăng-ten wifi của bạn và chúng có thể sẽ kết nối được mã hóa. Có một cái nhìn vào kismet cho một số bonanza không dây cấp thấp.

Các đơn giản nhất cách để phát hiện xem một người nào đó là trong một căn phòng hay không, tuy nhiên, tôi sẽ đoán, sẽ được sử dụng các mô-đun máy ảnh và gương panaramic.


1

Nếu bạn có mạng WiFi mà họ kết nối khi họ ở trong văn phòng, bạn có thể quét PI cho các địa chỉ MAC mỗi x thời gian và cập nhật một trang web (dropbox, bất cứ điều gì) với trạng thái hiện tại. Có lẽ là tuyến đường đáng tin cậy nhất.

Bạn có thể làm gì đó với bluetooth và bộ chuyển đổi USB Bluetooth, nhưng tôi không có kinh nghiệm về điều đó.

Không có chúng được kết nối với pi, hoặc mạng pi được bật, tôi không nghĩ bạn sẽ có nhiều thành công.


Đẹp. Vậy bạn nghĩ tôi sẽ sử dụng công nghệ / ứng dụng / nền tảng nào để quét các địa chỉ MAC?
ACooleman

Cách tôi sẽ làm là với nmap, phiên bản dòng lệnh và một mã python tùy chỉnh nhỏ (tôi chắc chắn có api python), thực hiện truy vấn ping / MAC nhanh, so sánh với danh sách được xây dựng sẵn, sử dụng điều đó để xây dựng trang php (HTML?) và phục vụ nó bằng máy chủ web lightppd (Apache?). Đặt công việc python để chạy từng khoảng thời gian x và để trang web tự động làm mới mỗi khoảng thời gian y. Đó là một ý tưởng dự án tuyệt vời ... Tôi có thể phải thực hiện nó sau khi tôi hoàn thành tất cả các dự án khác trên đĩa của mình.
Butters

Bạn có thể truy vấn bộ định tuyến của mình cho bảng ARP hoặc máy chủ DHCP của bạn ... Có thể làm cho nó nhanh hơn một chút ..
Butters

1

Đọc các câu trả lời trên cũng khiến tôi suy nghĩ về khả năng sau đây:

sử dụng airmon-ng để liên tục quét mạng cho các thiết bị khách trên wifi. Đầu ra có thể được ghi vào một tệp, vì vậy nếu tệp thay đổi thì máy khách đã nhập hoặc rời khỏi phạm vi của số pi. Có một danh sách các địa chỉ mac đã biết cho phép bạn xác định người dùng và do tệp thay đổi, bạn có thể kích hoạt một số hành động ....

đó là một ý tưởng khá thú vị Cảm ơn!

Arjen


Các cửa hàng lớn sử dụng kỹ thuật này để theo dõi cách người mua hàng duyệt qua hàng hóa của họ, loại rayon nào họ bỏ qua, v.v. Nhưng do luật riêng tư, việc liên kết địa chỉ mac với một người ở mọi quốc gia không phải lúc nào cũng hợp pháp.
Havnar

1

Miễn là các thiết bị đều nằm trên cùng một mạng, bạn có thể dễ dàng sử dụng Raspberry Pi để làm điều này .. Đây là một dự án hoàn chỉnh với tất cả mã bạn cần ...

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


Có thông tin thú vị trong liên kết bạn cung cấp, tuy nhiên bạn có thể cải thiện câu trả lời của mình bao gồm câu trả lời nào cho câu hỏi.
mpromonet

1

Vì vậy, tôi đã làm việc về cùng một vấn đề trong khoảng một năm nay. Tôi đã làm cho nó hoạt động trên máy Mac của mình khá nhanh, nhưng gặp nhiều rắc rối khi khiến nó hoạt động ngay trên PC. Tôi đã thử nhiều cách tiếp cận khác nhau. Tôi có một hệ thống tự động hóa gia đình bật hệ thống sưởi và nước nóng (thông qua mô-đun arduino và RF) khi tôi hoặc đối tác của tôi ở nhà (đó là iPhone của chúng tôi có thể phát hiện được trên WiFi gia đình). Cuối cùng, tôi đã sử dụng 'nslookup' để tìm địa chỉ IP cho iPhone (trong trường hợp địa chỉ IP đã thay đổi khi chúng động (nhưng thực tế chúng không bao giờ thực hiện trên bộ định tuyến của tôi)) và 'nmap' để phát hiện xem iPhone có bật không mạng lưới. Nếu iPhone đang ngủ rất sâu, 'nmap' không phải lúc nào cũng tìm thấy điện thoại, vì vậy tôi đã kiểm tra 10 lần trước khi điện thoại không ở nhà. Dưới đây là một phần của mã tự động hóa nhà của tôi trong python. Tôi đã sử dụng luồng. Bất kỳ câu hỏi với mã dưới đây cho tôi biết.

# 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

và mã chính

   # 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

Mã có thể không hoạt động nếu bạn sao chép thẳng vào tập lệnh của mình, vì có một số phần bị thiếu mà tôi chưa sao chép để thử và giữ mọi thứ đơn giản và dễ đọc, nhưng hy vọng đoạn mã trên mang lại cho mọi người cảm giác về cách tôi đã làm nhiều thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.