Wi-Fi를 사용한 라즈베리 파이 존재 감지


12

Raspberry Pi가 네트워크에서 지속적으로 MAC 주소를 검색 한 다음 특정 MAC 주소를 감지하면 작업을 수행하도록하려면 어떻게해야합니까?

Pi를 사용하여 다양한 홈 오토메이션 작업을 수행합니다. 전화기가 Wi-Fi에 연결되어 있다는 것을 감지하면 작업을 수행하고 싶습니다. Pi가 내 휴대폰의 MAC 주소를 지속적으로 스캔하도록하는 가장 좋은 방법은 무엇입니까? arp-scanMAC 주소를 검색 하는 데 사용할 수 있지만 지속적으로 검색하려면이 기능이 필요합니다. arp-scan루프에서 실행하거나 cron을 사용하여 매분마다 실행 하는 더 좋은 방법이 있다고 확신 합니다.


2
실시간 응답이 필요하지 않은 경우 cron이 가장 좋습니다. 먼저 sh에서 true 또는 false와 같은 것을 반환하는 스크립트를 작성하고 (상태 코드는 응답을 private하는 가장 좋은 옵션입니다) 스크립트는 이전 값을 / tmp에 저장하고 변경을 확인합니다. 변경이 발생하면 기록됩니다.
Misaz

답변:


3

폰홈

모든 전화기에는 약간의 차이가 있으므로 내 전화기는 다르게 작동합니다. 핑 응답은 전화가 깨어있는 경우에만 발생합니다. Pi가 재부팅되고 전화기가 절전 모드 인 경우 여러 Ping은 IP 및 Mac 주소를 arp 테이블에 100 % 패킷 손실로 배치합니다. 방금 arp명령이 더 이상 사용되지 않는다는 것을 알게 ip neighbor되었습니다.

pi@RPi0:~ $ ip neighbor
169.254.65.43 dev eth0 lladdr 64:31:00:00:00:00 REACHABLE
192.168.0.1 dev wlan0 lladdr ac:b3:00:00:00:00 STALE
fe80::aeb3:13ff:fe00:000 dev wlan0 lladdr ac:b3:00:00:00:00 router STALE

pi@RPi0:~ $ ping 192.168.0.22
PING 192.168.0.22 (192.168.0.22) 56(84) bytes of data.
From 192.168.0.10 icmp_seq=1 Destination Host Unreachable
From 192.168.0.10 icmp_seq=2 Destination Host Unreachable
From 192.168.0.10 icmp_seq=3 Destination Host Unreachable
--- 192.168.0.22 ping statistics ---
34 packets transmitted, 0 received, +3 errors, 100% packet loss, time 34303ms

pi@RPi0:~ $ ip neighbor
192.168.0.1 dev wlan0 lladdr ac:b3:00:00:00:00 REACHABLE
169.254.65.43 dev eth0 lladdr 64:31:00:00:00:00 REACHABLE
192.168.0.22 dev wlan0 lladdr ac:37:00:00:00:00 REACHABLE
fe80::aeb3:13ff:fe00:000 dev wlan0 lladdr ac:b3:00:00:00:00 router STALE

테스트 후 내 솔루션은 영구 루프 안에 두 개의 루프가있는 것입니다. 첫 번째 내부 루프는 내 전화에서 가능할 수있는 IP 주소 범위에서 여러 번 핑을 수행하는 것입니다. 내 라우터는 첫 19 IP 주소를 예약했으며 주소 192.168.0.20에서 시작하여 내 전화를 포함하여 DHCP가 할당 할 주소가 약 6 십 개입니다. 백그라운드 모드에서 12 개의 IP 주소를 한 번 핑하고 응답을 1 초 동안 기다린 다음 결과를 정크로 버립니다. arp 테이블에서 8 초 동안 기다렸다가 ip neighbor명령을 실행 하고 IP 주소에 대해 mac 주소를 grep합니다. 이상한 일이 발생하지 않는 한 라우터와 전화는 동일한 IP 주소를 유지합니다. ARP 테이블은 파이에 남아 있지만에서 상태를 변경됩니다 REACHABLE, STALE그리고 FAILED핑과 시간에서.

두 번째 내부 루프는 5 분마다 arp 테이블을 핑하고 점검하여 전화가 집에 있는지 확인합니다. 3 개의 핑 'FAILED'가 연속으로있어 전화가 집에 없습니다. 전화가 집에 없을 때 하나의 'REACHABLE'은 전화를 집으로 돌려 보냅니다 (무언가). 수정이 필요한 경우 IP 주소를 확인하고 첫 번째 내부 루프로 돌아가는 검사가 있습니다.

#!/bin/bash
# A script to do something when Phone returns Home.

mac="ac:37:00:00:00:00"    # Your phone mac address
ip_addr=""                 # Leave blank or ip for test
network="192.168.0.0"      # Your network (Class C only)
range="20 32"              # ip address possible range
pgm='echo "do something"'  # program to exec when Phone returns Home

start=$(echo "$range" | cut -d " " -f1)
stop=$(echo "$range" | cut -d " " -f2)
network=$(echo "$network" | cut -d. -f1-3)

echo "Start  $(date)"
while [ 1 ]; do
    cnt=0
    fail=0
    [ "$ip_addr" ] || while [ ! "$ip_addr" ]; do
        for x in $(seq "$start" "$stop"); do
            (junk=$(ping -c1 -W1 "$network"."$x") & )
            wait
        done
        sleep 8
        ip_addr=$(ip neighbor | grep "$mac" | cut -d " " -f1)
        ((cnt++))
        if (( $cnt > 15 )); then
            cnt=0
            echo "--- Phone not Home  $(date)"
            sleep 300      # 5 minutes
        fi
        if [ "$ip_addr" ]; then
            echo "--- Phone is Home, Count = $cnt, Date = $(date)"
            echo "Phone ip = $ip_addr  mac = $mac"
        fi
    done

    while [ "$ip_addr" ]; do
        junk="$(ping -c1 -W1 $ip_addr)"
        sleep 8
        home_nw="$(ip neighbor | grep $ip_addr | cut -d ' ' -f 1,5,6)"
        echo "$home_nw - $(date)"
        is_home=$(echo "$home_nw" | cut -d " " -f3)
        if [ "$is_home" == "REACHABLE" ] && (( "$fail" >= 3 )); then
            echo "--- Phone returned Home - $(date)"
            $pgm
        fi
        [ "$is_home" == "REACHABLE" ] && fail=0
        mac_stat=$(echo "$home_nw" | cut -d " " -f2)
        if [ "$mac_stat" == "FAILED" ]; then
            (( "$fail" < 10 )) && ((fail++))
            ip_test="$(ip neighbor | grep $mac | cut -d ' ' -f1)"
            if [ "$ip_test" ]; then
                [ "$ip_test" == "$ip_addr" ] || ip_addr=""
            fi
            if (( "$fail" == 3 )); then
                echo "--- Phone not at Home  $(date)"
            fi
        else
            if [ "$mac_stat" != "$mac" ]; then
                ip_addr=""
            fi
        fi
        sleep 300          # 5 minutes
    done
done

3

휴대 전화의 IP 주소에 예약을 추가하고 몇 분마다 cron 작업을 통해 핑을 수행하십시오.

    #!/bin/bash
    HOSTS="x.x.x.1 x.x.x.2"
    COUNT=10
    for myHost in $HOSTS
    do
      count=$(ping -c $COUNT $myHost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
      if [ $count -eq 10 ]; then
        # 100% response
        # let the cat out
      fi
    done

fhem을 사용하여 rpi 에서이 작업을 수행 하며 , 현재 상태 감지 모듈 이 내장되어 있어 홈 오토메이션 작업에 영향 을 주도록 쿼리 할 수있는 상주 상태를 설정할 수 있습니다.

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