Wi-Fi kullanarak Raspberry Pi varlık algılama


12

Raspberry Pi'min ağımda bir MAC adresini sürekli olarak taramasını ve ardından belirli bir MAC adresini algıladığında bir görevi nasıl gerçekleştirmesini sağlayabilirim?

Pi'mi çeşitli ev otomasyon görevlerini yürütmek için kullanıyorum. Telefonumun Wi-Fi'ye bağlandığını algıladığında bir görev gerçekleştirmesini istiyorum (yani, yeni eve döndüm). Pi'nin telefonumun MAC Adresini sürekli olarak taramasının en iyi yolu nedir? arp-scanMAC Adreslerini taramak için kullanabileceğimi biliyorum , ancak sürekli olarak taramak için buna ihtiyacım var. Eminim daha iyi bir yöntem var sonra arp-scanbir döngü içinde çalıştırmak veya her dakika çalıştırmak için cron kullanarak.


2
Eğer gerçek zamanlı tepki gerekmiyorsa cron en iyi yoldur. Önce sh'de doğru veya yanlış gibi bir şey döndüren komut dosyası (durum kodu yanıtı özelleştirmek için en iyi seçenektir), daha sonra / tmp için bir yerde önceki değeri depolayacak ve değişikliği kontrol edecek komut dosyası yazıyorsunuz. Değişiklik olursa kayıt yapar.
Misaz

Yanıtlar:


3

PhoneHome

Tüm telefonların bir farkı olduğu için telefonum farklı çalışıyor. Ping yanıtı yalnızca telefon uyanıksa olur. Pi yeniden başlatılırsa ve telefon uyku modundaysa, birden fazla ping ip ve mac adreslerini% 100 paket kaybıyla arp tablosuna yerleştirir. arpKomutun artık ip neighborkullanılmadığını öğrendim, şimdi kullanılıyor.

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

Testten sonra, çözümüm sonsuza kadar bir döngü içinde iki döngüye sahip olmak olacaktır. ilk iç döngü, bir dizi ip adresinde, birden çok kez, telefonum için mümkün olacak bir ping yapmak olacaktır. Yönlendiricim ilk 19 IP adresini ayırdı ve 192.168.0.20 adresinden başlayarak telefonum da dahil olmak üzere DHCP'nin atayacağı yaklaşık yarım düzine adresim olabilir. Arka plan modunda bir düzine ip adresine bir kez ping atacağım, yanıt için bir saniye bekleyeceğim ve sonuçları önemsiz olarak atacağım. Arp tablosunda sekiz saniye bekleyeceğim ve ip neighborkomutu çalıştıracağım , ip adresi için mac adresini grepleyeceğim. Yönlendirici ve telefon, olağandışı bir şey olmadıkça bu ip adresini aynı tutacaktır. Arp tablo Pi kalacak, ancak gelen devletleri değişecek REACHABLE, STALEve FAILEDping'lerimin ve zaman.

İkinci iç döngü, telefonun evde olup olmadığını belirlemek için arp tablosunu her beş dakikada bir pingleyecek ve kontrol edecektir. Arka arkaya üç ping 'FAILED' ile telefon evde değil. Telefon evde olmadığında bir 'ULAŞILABİLİR', telefonun eve dönmesini sağlayacaktır (bir şeyler yapın). Düzeltmeler gerekiyorsa ip adresini doğrulamak ve ilk iç döngüye dönmek için kontroller vardır.

#!/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

Neden telefonunuzun / ip adresinizin rezervasyonunu eklemiyorsunuz ve sadece birkaç dakikada bir cron işi ile ping işlemi yapmıyorsunuz.

    #!/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

Ben bunu benim rpi üzerinde fhem kullanarak başarmak , ev otomasyon görevlerini etkilemek için sorgulanabilir yerleşik durumları ayarlamak sağlayan yerleşik bir varlık algılama modülü vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.