วิธีการตรวจสอบอุปกรณ์มือถือเมื่อเชื่อมต่อกับเครือข่าย wifi ที่บ้าน?


10

อะไรจะเป็นวิธีที่ดีที่สุดในการให้เซิร์ฟเวอร์รับรู้เมื่ออุปกรณ์มือถือที่เฉพาะเจาะจง (โทรศัพท์มือถือ, iPad, ฯลฯ ) เชื่อมต่อกับเครือข่าย (ไร้สายแน่นอน)

เป็นสถานการณ์ตัวอย่างบุคคลมีเครือข่าย wifi ที่บ้านของเขากำหนดค่าอย่างเหมาะสมบนมือถือของเขา เมื่อเขาอยู่ในระยะของเราเตอร์มันจะเชื่อมต่อ (ไม่มีอะไรใหม่เกี่ยวกับเรื่องนี้) เมื่อเชื่อมต่อกับเราเตอร์นั้นเซิร์ฟเวอร์ภายในบ้านของเขาจะเปิดโปรแกรมบางโปรแกรม (หรือโยนการแจ้งเตือนเขียนไปยังไฟล์ ฯลฯ )

ฉันคิดว่าทางออกที่เป็นไปได้จะเป็น "เว็บแอพ" ที่โฮสต์โดยเครือข่ายซึ่งจะเปิดตัวจากโทรศัพท์เพื่อให้เซิร์ฟเวอร์จดจำหน้าเว็บได้ อย่างไรก็ตามหากสามารถทำได้เมื่อโทรศัพท์เชื่อมต่อโดยอัตโนมัตินั่นจะดีที่สุด

ความคิดหรือวิธีแก้ปัญหาอื่น ๆ จะได้รับการชื่นชมอย่างมากดังนั้นขอบคุณล่วงหน้า!


ถ้ามันเป็นโทรศัพท์ Android งาน cron wgetting เว็บไซต์ท้องถิ่นจะง่ายที่สุด ในการดำเนินการจากด้านเครือข่ายคุณจะต้องใช้โปรโตคอล RADIUS และตั้งค่าเซิร์ฟเวอร์ RADIUS อย่างถูกต้อง
Huckle

ทำไมไม่เพียงแค่ตรวจสอบบันทึกเราเตอร์ของคุณ เนื่องจากบันทึกเหล่านี้เป็นแบบข้อความจึงง่ายต่อการค้นหาบันทึกและรับเฉพาะข้อมูลที่คุณต้องการ แน่นอนว่ามีบางคนเขียนรหัสเพื่อทำสิ่งนี้ แต่ถ้าไม่ใช่จะเป็นการออกกำลังกายที่เรียบง่าย

คำตอบ:


4

ฉันคิดว่านี่สามารถทำได้โดยarp-scanง่าย

ติดตั้งarp-scan: sudo apt-get install arp-scan
ตรวจหาโฮสต์ทั้งหมดในเครือข่ายท้องถิ่น:sudo arp-scan -l

คุณสามารถตั้งค่า crontab ให้ทำงานเป็นระยะ ๆ (ทุกๆ 2 นาที) เรียกใช้สคริปต์ที่สแกนเครือข่ายด้วย arp-scan และแยกวิเคราะห์ผลลัพธ์เพื่อค้นหาโฮสต์ที่ใช้งานอยู่

บางครั้งฉันต้องการ-r 3ธงซึ่งใช้สามครั้ง ทำงานได้ดีขึ้นมากเป็นค่าเริ่มต้น 2 ครั้งซึ่งบางครั้งก็พลาดอุปกรณ์บางอย่าง ดังนั้น:

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

ทำงานได้ดีขึ้นสำหรับฉันกับ LG V30 +


ควรสังเกตว่าอุปกรณ์บางอย่างอาจไม่ปรากฏขึ้นเว้นแต่ว่าพวกเขาจะเปิด Nexus 4 ของฉันจะไม่ปรากฏเว้นแต่ว่าหน้าจอเปิดอยู่
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!"

วิธีนี้คุณสามารถสแกนหา MAC ของอุปกรณ์ของคุณ :)


2

ฉันคิดจะใช้โซลูชันสำหรับสิ่งนี้ซึ่งตรงตามข้อกำหนดต่อไปนี้:

  1. โทรศัพท์ไม่จำเป็นต้องกำหนดที่อยู่ IP ในเครือข่าย
  2. โทรศัพท์ไม่จำเป็นต้องส่งสัญญาณเป็นระยะ ๆ ซึ่งจะทำให้แบตเตอรี่หมด
  3. หากมีโทรศัพท์จำนวนมากในเครือข่ายทั้งหมดจะถูกตรวจพบ

ความตั้งใจของฉันคือการเมานต์ระบบไฟล์โทรศัพท์ด้วย ssh แต่สามารถใช้เพื่ออะไร

สมมติว่าเครือข่ายท้องถิ่นคือ 192.168.1.0 ...

ดังนั้นผมจะใช้ app ที่ฟังการออกอากาศ UDP 192.168.1.255จากที่อยู่ออกอากาศ: แอพนี้จะไม่ทำให้แบตเตอรี่หมด (มันจะใช้งานได้เฉพาะเมื่อได้รับแพ็คเก็ต)

ภูตบนคอมพิวเตอร์จะเป็นระยะ ๆ 192.168.1.255จะส่งออกไปยังที่อยู่ที่ออกอากาศออกอากาศ โทรศัพท์จะตอบกลับสัญญาณดังกล่าวโดยระบุชื่อรหัสที่อยู่ IP และอื่น ๆ

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

แน่นอนว่าสิ่งนี้ต้องการงานจำนวนมากรวมถึงงานเขียนโปรแกรมและไม่ใช่เรื่องง่าย แต่ฉันคิดว่ามันจะเป็นทางออกที่น่าเชื่อถือและสมเหตุสมผลที่สุด


1
ว้าวดังนั้นโดยทั่วไปโปรโตคอลที่กำหนดเอง ... ใครจะคิดว่าจะมีบางอย่างเช่นนี้อยู่แล้ว
Michael

1

วิธีที่ดีที่สุดที่ฉันสามารถนึกได้ก็คือให้ที่อยู่ IP แบบคงที่กับอุปกรณ์ดังกล่าวและใช้สคริปต์เพียงเพื่อ ping อุปกรณ์ทุก ๆ X วินาทีและเรียกโปรแกรม / การแจ้งเตือนของคุณ

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


0

ฉันเขียนสคริปต์ที่ทำสิ่งที่คล้ายกันโดยใช้ arp-scan และที่อยู่ IP แบบคงที่บน iPhone

คุณสามารถค้นหารหัสได้ที่นี่: https://github.com/blackairplane/pydetect

ต้องทำความสะอาดเพราะฉันใหม่กับ Python แต่ฉันคิดว่ามันแสดงให้เห็นถึงแนวคิด


0

ฉันสะดุดในเรื่องนี้และเมื่อฉันทำสิ่งที่คล้ายกันตัดสินใจโพสต์คำตอบ

ฉันทำต่อไปนี้:

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.

ในกรณีของฉันฉันมีเซิร์ฟเวอร์ HTTP ที่ทำงานบนอุปกรณ์ของฉัน ดังนั้นฉันเพิ่งส่งคำขอ HTTP HEAD สำหรับสิ่งใดเป็นหลักในพอร์ต 80 ถ้าอุปกรณ์ตอบสนองและส่วนหัวของเซิร์ฟเวอร์ตั้งชื่ออย่างถูกต้องนี่คืออุปกรณ์ของฉัน

แต่ฉันไม่สามารถไปอย่างรวดเร็วโดยไม่กระตุกก่อน HTTP เป็น TCP และคำขอมีขนาดใหญ่ดังนั้นการหมดเวลาต้องเป็น 4 วินาทีสำหรับ WiFi การทำเช่นนี้กับ 253 ที่อยู่นั้นช้ามาก แต่คุณจะไม่มีอุปกรณ์ 253 (อาจ) เซิร์ฟเวอร์ HTTP น้อยลง (หรือในกรณีของคุณโทรศัพท์)

พิจารณาบันทึกเราเตอร์เป็นความคิดที่ดีมากและง่าย และเร็วยิ่งกว่าส่ง Ping ทั้งหมด เราเตอร์บางตัวไม่จำเป็นต้องเข้าสู่ระบบเพื่อเข้าใช้

นอกจากนี้ควรตรวจสอบว่าอุปกรณ์ของคุณรองรับ UPNP หรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถใช้ UPNP เพื่อตรวจสอบสถานะของมัน นี่จะเป็นวิธีแก้ปัญหาอย่างเป็นทางการ (การฟังการออกอากาศสำหรับ UDP ของ UPNP) แต่อุปกรณ์ทั้งหมดไม่รองรับ แต่อุปกรณ์ทั้งหมดไม่รองรับ ICMP ด้วย (พวกเขาไม่ต้องการถูกทิ้งระเบิดโดยไม่จำเป็น)

มีความเป็นไปได้ที่น่าสนใจอีกอย่างหนึ่งคือ คุณสามารถหาแพ็กเก็ต DHCP และดูว่าเมื่อเราเตอร์ให้ที่อยู่ IP ของอุปกรณ์ใหม่ แต่สิ่งนี้จะไม่ทำงานสำหรับอุปกรณ์ที่มี IP คงที่ พวกเขาจะไม่แตะต้องเครือข่ายจนกว่าพวกเขาจะต้องการอะไร การเชื่อมต่อกับ WiFi นั้นอยู่ในเลเยอร์อื่นและไม่สามารถตรวจจับได้ง่ายเว้นแต่คุณต้องการทำท่าเหมือนดมกลิ่น ฉันไม่แน่ใจว่าจะสามารถใช้งานอะแดปเตอร์เครือข่ายได้ในโหมด promisquous หรือไม่ ฉันคิดว่าจะต้องใช้ฮาร์ดแวร์เพิ่มเติมสำหรับสิ่งนี้

เพื่อให้การ ping ใน Python ประสบความสำเร็จโดยไม่ต้อง subing โปรแกรม ping และลดความเร็วคุณต้องสร้าง socket socket ใหม่และสร้าง ICMP packet ด้วยตนเอง มันไม่ยาก มีตัวอย่างบางส่วนในเว็บ แน่นอนว่าในการส่งคุณจะต้องได้รับอนุญาตรูทเช่นเดียวกับการ ping นี่คือข้อเสียเปรียบ หากคุณจะเผยแพร่ซอฟต์แวร์คุณไม่สามารถคาดหวังให้ผู้ใช้ต้องการเรียกใช้ในฐานะรูท


0

ฉันมีสองวิธีที่ฉันใช้ (งูใหญ่)

โซลูชันที่ 1

อย่างแรกคือต้องทราบจำนวน ipnumbers ที่ต้องการติดตาม ฉันทำสิ่งนี้ในสามขั้นตอน 1 # ใช้ "-c1" เพื่อส่ง ping.if เพียงอันเดียวหากอุปกรณ์เปิดใช้งานอยู่อุปกรณ์จะตอบกลับและ ฟังก์ชั่นจะจบลงด้วยความสำเร็จ 2 # ใช้ "-c3" ตอนนี้ให้เวลามากขึ้นในการตอบกลับหนึ่งในสาม นี่มักจะเพียงพอเมื่อเป็นสัญญาณ wifi ที่ไม่ดี 3 # use "-c10" อาจจำเป็นต้องใช้เมื่อสัญญาณ wifi แย่มาก (สังเกตเห็นว่า iPad รุ่นเก่าต้องการคำตอบประมาณ 10 คำตอบ) เพื่อเร่งความเร็วสิ่งที่ฉันสร้างกระบวนการแยกต่างหากสำหรับแต่ละหมายเลขไอพีที่ฉันต้องการติดตาม

ฉันยังเปลี่ยนช่วงเวลากระตุกเป็นจังหวะขึ้นอยู่กับว่ามันประสบความสำเร็จหรือไม่ หากพบอุปกรณ์มันจะรออีกต่อไปจนกว่าจะตรวจสอบอีกครั้ง ถ้ามันล้มเหลวมันจะลองอีกครั้งใน 60 วินาที (ฉันต้องการแสงเมื่อฉันเข้าบ้านของฉัน) ดังนั้น 60s ก็เพียงพอที่จะหาฉันบนถนน

มันทำงานได้อย่างสมบูรณ์แบบ! เมื่อฉันกลับถึงบ้านมันรู้สึกฉันและเปิดไฟและออกเมื่อฉันจากไป

โซลูชันที่ 2

Arping อาจไม่หนักในเครือข่าย แต่ฉันเปลี่ยนวิธีการข้าม ping ทั้งหมดและสร้างเซิร์ฟเวอร์ DHCP ของฉันเองบน raspberry pi ของฉัน

ฉันเพิ่ม "on commit" ที่เรียกสคริปต์เมื่ออุปกรณ์ได้รับ ipnumber สคริปต์นี้ใช้ 'การเรียก http http curl' เพื่อแจ้งเตือนเซิร์ฟเวอร์ www ของฉัน (Flask) ทันทีที่อุปกรณ์ได้รับหรือต่ออายุ ipnumber

บน Android ฉันเปลี่ยนการตั้งค่าเป็นไม่ปิด wifi เมื่อปิดหน้าจอ ไม่แน่ใจว่าเป็นไปได้บน iPhone ไม่แตกต่างกันมากกับแบตเตอรี่ (OnePlus 5)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.