홈 와이파이 네트워크에 연결할 때 모바일 장치를 감지하는 방법?


10

특정 모바일 장치 (휴대 전화, iPad 등)가 네트워크에 (무선으로) 연결될 때 서버가 인식하도록하는 가장 좋은 방법은 무엇입니까?

예시적인 상황에서, 사람은 자신의 핸드폰에 홈 와이파이 네트워크가 적절히 구성되어있다. 그가 라우터 범위 내에 들어가면 연결될 것입니다. 해당 라우터에 연결되면 홈 서버는 특정 프로그램을 시작합니다 (또는 알림을 던지거나 파일에 쓰는 등).

가능한 해결책은 서버에서 페이지가 호출되었음을 인식 할 수 있도록 전화에서 시작되는 네트워크 호스팅 사용자 정의 "웹 앱"이 될 것이라고 생각했습니다. 그러나 전화가 자동으로 연결될 때이 작업을 수행 할 수 있으면 가장 좋습니다.

어떤 생각이나 대안 솔루션도 대단히 감사하겠습니다. 미리 감사드립니다!


그것이 안드로이드 폰이라면 로컬 웹 사이트를 얻는 cron 작업이 가장 쉬울 것입니다. 네트워크 측에서이를 수행하려면 RADIUS 프로토콜을 사용해야하며 RADIUS 서버를 올바르게 설정해야합니다.
Huckle

라우터 로그를 검토하십시오. 이러한 로그는 텍스트 기반이므로 로그를 쉽게 쿼리하고 필요한 정보 만 얻을 수 있습니다. 분명히 누군가가 이것을하기 위해 코드를 작성했지만 그렇지 않은 경우 간단한 연습이 될 것입니다.

답변:


4

나는 이것이 쉽게 달성 할 수 있다고 생각한다 arp-scan.

설치 arp-scan: sudo apt-get install arp-scan
로컬 네트워크의 모든 호스트를 감지합니다.sudo arp-scan -l

aron-scan으로 네트워크를 스캔하고 출력을 구문 분석하여 활성 호스트를 발견하는 스크립트를 주기적으로 (2 분마다) 실행하도록 crontab을 설정할 수 있습니다.

때때로 나는 -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이라고 가정 해 봅시다.

따라서 브로드 캐스트 주소에서 UDP 브로드 캐스트를 수신하는 APP을 구현합니다 192.168.1.255. 이 앱은 완전히 수동적이므로 배터리를 소모하지 않습니다. (패킷이 수신 될 때만 활성화됩니다).

컴퓨터의 데몬은 브로드 캐스트 주소로 브로드 캐스트를 주기적으로 보냅니다 192.168.1.255. 전화는 이름, 아이디, IP 주소 등을 알려주는 신호에 응답합니다.

이제 컴퓨터는 전화가 네트워크에 존재한다는 것을 알고 있으며 제 경우에는 sshfs mount를 호출 할 수 있습니다.

분명히 이것은 프로그래밍 작업을 포함하여 많은 작업이 필요하며 쉽지 않습니다. 그러나 가장 신뢰할 수 있고 합리적인 솔루션이라고 생각합니다.


1
와우, 기본적으로 커스텀 프로토콜은 ... 이미 이와 같은 것이 존재한다고 생각할 것입니다.
Michael

1

내가 생각할 수있는 가장 좋은 방법은 해당 장치에 고정 IP 주소를 부여하고 간단한 스크립트를 사용하여 X 초마다 장치를 핑하고 프로그램 / 알림을 트리거하는 것입니다.

참고 사항 : 대부분의 전화기는 절전 모드가 해제 될 때까지 Wi-Fi 네트워크에 연결되지 않습니다. 스크립트는 가능 시간과 시간을 고려하여 잠자기 전화와 집을 떠나는 전화의 차이점을 알려줄 수 있어야합니다. 그 후, 스크립트를 실행하여 프로그램을 실행하거나 알림을 표시하는 것은 쉽지 않습니다.


0

아이폰에서 arp-scan과 정적 IP 주소를 사용하여 비슷한 작업을 수행하는 스크립트를 작성했습니다.

https://github.com/blackairplane/pydetect 에서 코드를 찾을 수 있습니다.

파이썬을 처음 접했을 때 정리해야하지만 개념을 설명한다고 생각합니다.


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 서버를 실행했습니다. 방금 포트 80에서 아무것도 HTTP HEAD 요청을 보냈습니다. 장치가 응답하고 서버 헤더의 이름이 올바르게 지정되면 이것이 내 장치입니다.

그러나 먼저 핑을하지 않고는 빨리 갈 수 없었습니다. HTTP는 TCP이고 요청이 크므로 WiFi의 시간 초과는 4 초 여야합니다. 253 개의 주소에서이 작업을 수행하는 것은 지옥만큼 느립니다. 그러나 HTTP 서버가 더 적은 253 개의 장치가 없을 것입니다. (또는 귀하의 경우 전화)

라우터 로그를 고려하는 것은 매우 좋은 생각이며 쉽습니다. 그리고 모든 것을 핑하는 것보다 훨씬 빠릅니다. 일부 라우터는 로그인을 할 필요조차 없습니다.

또한 장치가 UPNP를 지원하는지 확인하는 것이 좋습니다. 그렇다면 UPNP를 사용하여 존재를 감지 할 수 있습니다. 이것은 공식 솔루션입니다 (UPNP의 UDP에 대한 방송 청취). 그러나 모든 장치가이를 지원하지는 않습니다. 그러나 모든 장치는 ICMP도 지원하지 않습니다. (그들은 불필요하게 폭격되기를 원하지 않는다).

또 다른 흥미로운 가능성이 있습니다. DHCP 패킷을 피싱하고 라우터가 새 장치에 IP 주소를 제공하는시기를 확인할 수 있습니다. 그러나 고정 IP를 사용하는 장치에서는 작동하지 않습니다. 그들은 무언가가 필요할 때까지 네트워크를 건드리지 않을 것입니다. WiFi 자체에 연결하는 것은 다른 계층에 있으며 스니퍼로 작동하지 않으면 쉽게 감지 할 수 없습니다. 무차별 모드에서 네트워크 어댑터로 수행 할 수 있는지 확실하지 않습니다. 추가 하드웨어가 필요하다고 생각합니다.

파이썬에서 핑을 달성하려면 핑 프로그램에 대한 서브 프로세싱없이 속도를 잃지 않으면 서 원시 소켓을 작성하고 수동으로 ICMP 패킷을 구성해야합니다. 어렵지 않습니다. 웹 어딘가에 그 예가 있습니다. 물론, 그것을 보내려면 핑과 마찬가지로 루트 권한이 필요합니다. 이것은 단점입니다. 소프트웨어를 배포 할 경우 사용자가 루트로 소프트웨어를 실행하기를 기대할 수 없습니다.


0

나는 두 가지 솔루션을 사용했다. (파이썬)

해결책 1

먼저 추적하려는 알려진 ipnumber를 제거했습니다. 나는 세 단계로 이것을했다. 1 # "-c1"을 사용하여 하나의 핑만 보내십시오. 장치가 활성화되어 있으면 응답하고 응답합니다. 함수는 성공 2 # 종료 "-c3"과 함께 종료됩니다 이제 세 가지 중 하나에 대한 답변을 더 많은 시간을 제공합니다. 이것은 Wi-Fi 신호가 좋지 않을 때 충분합니다. 3 # "-c10"사용 이것은 실제로 와이파이 신호가 좋지 않을 때 필요할 수 있습니다. (이전의 iPad는 약 10 번의 답변이 필요합니다) 속도를 높이기 위해 추적하려는 각 IP 번호에 대해 별도의 프로세스를 만들었습니다.

또한 성공 여부에 따라 핑 간격을 변경했습니다. 장치를 찾으면 다시 확인할 때까지 더 오래 기다립니다. 실패하면 60 초 후에 다시 시도합니다. (집에 들어올 때 불을 밝히고 싶습니다) 그래서 60 년대는 거리에서 나를 찾을 수있을만큼 충분합니다.

이것은 완벽하게 작동했습니다! 집에 도착했을 때 그것은 나를 감지하고 빛을 끄고 떠났을 때 꺼졌습니다.

해결책 2

Arping은 네트워크에서 무겁지 않을 수도 있지만 모든 ping을 건너 뛰도록 솔루션을 변경하고 내 raspberry pi에서 자체 DHCP 서버를 만들었습니다.

그런 다음 "on commit"을 추가하여 장치가 ipnumber를받는 즉시 스크립트를 트리거합니다. 이 스크립트는 장치가 IP 번호를 얻거나 갱신하자마자 'curl http API 호출'을 사용하여 www 서버 (Flask)에 알립니다.

내 안드로이드에서 화면이 꺼져있을 때 Wi-Fi를 절대로 끄지 않도록 설정을 변경했습니다. iPhone에서 가능한지 확실하지 않습니다. 배터리에 큰 차이가 없습니다 (OnePlus 5)

첫 번째 솔루션에는 특정 Mac에 대한 Bluetooth 스캔도 포함되었습니다. 따라서 WiFi가 휴대 전화에서 꺼져 있어도 여전히 블루투스를 감지합니다. Mac 주소를 사용한다고해서 페어링하거나 모든 사람이 볼 수 있도록 할 필요는 없습니다.

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