Làm cách nào để phát hiện thiết bị di động khi kết nối với mạng wifi gia đình?


10

Điều gì sẽ là cách tốt nhất để máy chủ nhận ra khi một thiết bị di động cụ thể (điện thoại di động, iPad, v.v.) kết nối với mạng (tất nhiên là không dây)?

Ví dụ, một người có mạng wifi nhà mình được cấu hình đúng trên điện thoại di động. Khi anh ta vào trong phạm vi của bộ định tuyến, nó sẽ kết nối (không có gì mới về điều đó). Khi kết nối với bộ định tuyến đó, máy chủ gia đình của anh ta sẽ khởi chạy một chương trình nhất định (hoặc gửi thông báo, ghi vào tệp, v.v.).

Tôi nghĩ rằng một giải pháp khả thi sẽ là một "ứng dụng web" tùy chỉnh được lưu trữ trên mạng sẽ được khởi chạy từ điện thoại để máy chủ nhận ra trang được gọi. Tuy nhiên, nếu điều này có thể được thực hiện khi điện thoại kết nối tự động, đó sẽ là điều tốt nhất.

Bất kỳ suy nghĩ hoặc giải pháp thay thế sẽ được đánh giá rất cao, vì vậy cảm ơn trước!


Nếu đó là một điện thoại Android, một công việc định kỳ đặt ra một trang web địa phương sẽ là dễ dàng nhất. Để làm điều đó từ phía mạng, bạn sẽ phải sử dụng giao thức RADIUS và có một máy chủ RADIUS được thiết lập đúng.
Huckle

Tại sao không chỉ xem lại nhật ký bộ định tuyến của bạn. Vì các nhật ký này dựa trên văn bản, sẽ dễ dàng truy vấn nhật ký và chỉ nhận thông tin bạn cần. Chắc chắn ai đó đã viết mã để làm điều này nhưng nếu không nó sẽ là một bài tập đơn giản.

Câu trả lời:


4

Tôi nghĩ rằng điều này có thể dễ dàng thực hiện bằng arp-scan.

Cài đặt arp-scan: sudo apt-get install arp-scan
Phát hiện tất cả các máy chủ trên mạng cục bộ:sudo arp-scan -l

Bạn có thể thiết lập một crontab để định kỳ (cứ sau 2 phút có thể) chạy một tập lệnh quét mạng bằng arp-scan và phân tích cú pháp đầu ra của nó để khám phá các máy chủ hoạt động.

Đôi khi tôi cần -r 3cờ, nó chạy ba lần; hoạt động tốt hơn nhiều như mặc định 2 lần, đôi khi bỏ lỡ một số thiết bị. Như vậy:

 sudo arp-scan -l -r 3 | grep {Phone Static Assigned IP} 

hoạt động tốt hơn đối với tôi để LG V30 +.


Cần lưu ý rằng một số thiết bị có thể không hiển thị trừ khi chúng được bật. Nexus 4 của tôi sẽ không xuất hiện trừ khi màn hình được bật.
Nicolas Bouliane

3
import subprocess

if __name__ == '__main__':
    while True:
        sleep(5)
        p = subprocess.Popen("arp-scan -l | grep xx:xx:xx:xx:xx:xx", stdout=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        p_status = p.wait()
        if output:
            print "Yay, the devine is connected to your network!"
        else:
            print "The device is not present!"

Bằng cách này bạn có thể quét MAC của thiết bị của mình :)


2

Tôi thực sự đang dự tính thực hiện một giải pháp cho việc này đáp ứng các yêu cầu sau:

  1. Điện thoại không cần phải gán địa chỉ IP trên mạng.
  2. Điện thoại không cần định kỳ gửi tín hiệu sẽ làm cạn kiệt pin.
  3. Nếu có nhiều điện thoại trên mạng, tất cả chúng sẽ được phát hiện.

Ý định của tôi là gắn kết hệ thống tập tin điện thoại với ssh, nhưng nó có thể được sử dụng cho bất cứ điều gì.

Giả sử mạng cục bộ là 192.168.1.0 ...

Vì vậy, tôi sẽ triển khai một ứng dụng nghe các chương trình phát sóng UDP từ địa chỉ quảng bá : 192.168.1.255. Ứng dụng này sẽ không tiêu hao pin vì nó hoàn toàn thụ động. (nó chỉ được kích hoạt khi nhận được một gói).

Một daemon trên máy tính sẽ định kỳ gửi các chương trình phát sóng đến địa chỉ phát sóng 192.168.1.255. Điện thoại sẽ trả lời các tín hiệu như vậy cho biết tên, id, địa chỉ IP, v.v.

Bây giờ máy tính biết rằng điện thoại tồn tại trên mạng và trong trường hợp của tôi có thể gọi sshfs mount.

Chắc chắn điều này cần rất nhiều công việc, bao gồm cả công việc lập trình, và không dễ dàng. Nhưng tôi nghĩ nó sẽ là giải pháp đáng tin cậy và hợp lý nhất.


1
Wow, về cơ bản là một giao thức tùy chỉnh ... người ta sẽ nghĩ rằng đã tồn tại một cái gì đó như thế này rồi.
Michael

1

Cách tốt nhất tôi có thể nghĩ đến là cung cấp cho thiết bị nói địa chỉ IP tĩnh và sử dụng tập lệnh đơn giản để ping thiết bị sau mỗi X giây và kích hoạt chương trình / thông báo của bạn.

Những điều cần lưu ý: Nhiều điện thoại sẽ không kết nối với mạng wifi cho đến khi thức dậy. Kịch bản của bạn sẽ cần có khả năng cho biết sự khác biệt giữa điện thoại đi ngủ và điện thoại rời khỏi nhà, có thể bằng cách xem xét thời gian trong ngày. Sau đó, có kịch bản kích hoạt một chương trình để chạy hoặc một thông báo xuất hiện là chuyện nhỏ.


0

Tôi đã viết một tập lệnh thực hiện một cái gì đó tương tự bằng cách sử dụng arp-scan và một địa chỉ IP tĩnh trên iPhone.

Bạn có thể tìm thấy mã ở đây: https://github.com/blackairplane/pydetect

Nó cần được dọn sạch vì tôi chưa quen với Python, nhưng tôi nghĩ nó minh họa khái niệm này.


0

Tôi vấp phải điều này và khi tôi đã làm điều gì đó tương tự đã quyết định đăng một câu trả lời.

Tôi đã làm như sau:

1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.

Trong trường hợp của tôi, tôi đã có một máy chủ HTTP chạy trên thiết bị của mình. Vì vậy, tôi vừa gửi yêu cầu HTTP Head về cơ bản không có gì trên cổng 80. Nếu thiết bị phản hồi và tiêu đề Máy chủ được đặt tên chính xác, thì đây là thiết bị của tôi.

Nhưng tôi không thể đi nhanh mà không ping trước. HTTP là TCP và yêu cầu rất lớn, vì vậy thời gian chờ phải là 4 giây cho WiFi. Làm điều này cho 253 địa chỉ là chậm như địa ngục. Nhưng bạn sẽ không có 253 thiết bị (có thể) ít máy chủ HTTP hơn. (hoặc trong trường hợp của bạn, điện thoại)

Xem xét các bản ghi bộ định tuyến là ý tưởng rất tốt, và dễ dàng. Và thậm chí nhanh hơn so với ping tất cả. Một số bộ định tuyến thậm chí không cần đăng nhập để truy cập chúng.

Ngoài ra, cần kiểm tra xem thiết bị của bạn có hỗ trợ UPNP hay không. Nếu có, bạn có thể sử dụng UPNP để phát hiện sự hiện diện của nó. Đây sẽ là giải pháp chính thức (nghe trên phát sóng cho UDP của UPNP). Nhưng tất cả các thiết bị không hỗ trợ nó. Nhưng tất cả các thiết bị cũng không hỗ trợ ICMP. (họ không muốn bị bắn phá không cần thiết).

Có một khả năng thú vị khác. Bạn có thể câu cá cho các gói DHCP và xem khi nào bộ định tuyến cung cấp cho thiết bị mới một địa chỉ IP. Nhưng điều này sẽ không hoạt động cho các thiết bị có IP tĩnh. Họ thậm chí sẽ không chạm vào mạng cho đến khi họ cần một cái gì đó. Bản thân việc kết nối với WiFi nằm trên một lớp khác và không thể dễ dàng phát hiện trừ khi bạn muốn hoạt động như một trình thám thính. Tôi không chắc chắn ngay cả khi nó có thể thực hiện được với bộ điều hợp mạng ở chế độ hứa hẹn. Tôi nghĩ phần cứng bổ sung sẽ là cần thiết cho việc này.

Để đạt được ping trong Python, không cần xử lý chương trình ping và mất tốc độ, bạn phải tạo ổ cắm thô và xây dựng gói ICMP theo cách thủ công. Nó không khó Có ví dụ về nó ở đâu đó trên web. Tất nhiên, để gửi nó, bạn sẽ cần quyền root cũng như ping. Đây là một nhược điểm. Nếu bạn sẽ phân phối phần mềm, bạn không thể mong đợi người dùng muốn chạy nó dưới quyền root.


0

Tôi đã có hai giải pháp mà tôi đã sử dụng. (Con trăn)

Giải pháp 1

Đầu tiên là arping ipnumbers mà tôi muốn theo dõi. Tôi đã làm điều này trong ba bước. 1 # sử dụng "-c1" để chỉ gửi một ping. Nếu thiết bị đang hoạt động, nó sẽ trả lời và. Hàm sẽ thoát với thành công 2 # sử dụng "-c3" bây giờ cho nó thêm thời gian để trả lời trên một trong ba. Điều này thường là đủ khi đó là tín hiệu wifi kém. 3 # sử dụng "-c10" có thể cần thiết khi tín hiệu wifi thực sự xấu. (Thông báo iPad cũ cần khoảng 10 lần thử trả lời) Để tăng tốc mọi thứ tôi đã tạo Quy trình riêng cho mỗi số ip tôi muốn theo dõi.

Tôi cũng thay đổi khoảng thời gian ping tùy thuộc vào việc nó có thành công hay không. Nếu nó tìm thấy thiết bị, nó sẽ đợi lâu hơn cho đến khi nó kiểm tra lại. Nếu đó là một thất bại, nó sẽ thử lại sau 60 giây. (Tôi muốn đèn sáng khi tôi vào nhà) vì vậy thập niên 60 là đủ để tìm thấy tôi trên đường phố

Điều này làm việc hoàn hảo! Khi tôi về đến nhà, nó cảm nhận được tôi và tắt đèn, và tắt khi tôi rời đi.

Giải pháp 2

Arping có thể không nặng trên mạng nhưng tôi đã thay đổi giải pháp để bỏ qua tất cả các lệnh ping và tạo máy chủ DHCP của riêng tôi trên pi mâm xôi.

Sau đó tôi đã thêm "on commit" để kích hoạt tập lệnh ngay khi thiết bị nhận được số ip. Tập lệnh này sử dụng 'lệnh gọi API http' để thông báo cho máy chủ www của tôi (Flask) ngay khi thiết bị nhận hoặc gia hạn ipnumber.

Trên Android của tôi, tôi đã thay đổi cài đặt để không bao giờ tắt wifi khi màn hình tắt. Không chắc chắn nếu nó có thể trên iPhone. Không có sự khác biệt lớn về pin (OnePlus 5)

Giải pháp đầu tiên cũng bao gồm quét Bluetooth cho máy Mac cụ thể. Vì vậy, ngay cả khi WiFi của tôi bị tắt trên điện thoại, nó vẫn sẽ cảm nhận được Bluetooth. Sử dụng địa chỉ Mac không cần ghép nối hoặc có sẵn cho mọi người xem.

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.