Deteksi keberadaan Raspberry Pi menggunakan Wi-Fi

12

Bagaimana saya bisa membuat Raspberry Pi saya terus memindai alamat MAC di jaringan saya kemudian melakukan tugas ketika mendeteksi alamat MAC tertentu?

Saya menggunakan Pi saya untuk menjalankan berbagai tugas otomasi rumah. Saya ingin melakukan tugas ketika merasakan bahwa ponsel saya terhubung ke Wi-Fi, (artinya saya baru saja pulang). Apa cara terbaik untuk melakukan pemindaian Pi untuk Alamat MAC ponsel saya secara terus menerus? Saya tahu saya dapat menggunakannya arp-scanuntuk memindai Alamat MAC, tetapi saya perlu ini untuk terus memindai. Saya yakin ada metode yang lebih baik kemudian arp-scandijalankan dalam satu lingkaran, atau menggunakan cron untuk menjalankannya setiap menit.

Gsears
sumber
2
Jika Anda tidak membutuhkan respons waktu nyata, cron adalah cara terbaik. Pertama Anda menulis skrip yang mengembalikan sesuatu seperti benar atau salah di sh (kode status adalah pilihan terbaik untuk memberikan tanggapan), kemudian skrip yang akan menyimpan nilai sebelumnya di suatu tempat ke / tmp dan memeriksa perubahan. Jika perubahan happend itu akan mencatatnya.
Misaz

Jawaban:

3

Telepon rumah

Ponsel saya bertindak berbeda, karena semua ponsel memiliki beberapa perbedaan. Respons ping hanya terjadi jika ponsel terjaga. Jika Pi di-boot ulang dan telepon dalam mode tidur, banyak ping akan menempatkan alamat ip dan mac-nya di tabel arp, dengan paket loss 100%. Saya baru tahu bahwa arpperintahnya sudah usang, ip neighbordigunakan sekarang.

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

Setelah pengujian, solusi saya adalah memiliki dua loop di dalam loop selamanya. loop dalam pertama adalah melakukan ping pada berbagai alamat ip, beberapa kali, yang mungkin untuk ponsel saya. Router saya telah mencadangkan 19 alamat ip pertama dan saya mungkin memiliki sekitar setengah lusin alamat yang akan ditetapkan DHCP, termasuk telepon saya, mulai dari alamat 192.168.0.20. Saya akan ping selusin alamat ip sekali, dalam mode latar belakang, tunggu satu detik untuk respon, dan membuang hasilnya sebagai sampah. Saya akan menunggu delapan detik di tabel arp, dan menjalankan ip neighborperintah, ambil alamat mac untuk alamat ip. Router dan telepon akan menyimpan alamat ip yang sama ini kecuali terjadi sesuatu yang tidak biasa. Tabel arp akan tetap di Pi, tetapi akan berubah negara dari REACHABLE, STALE, dan FAILEDdari ping dan waktu.

Loop kedua di dalam akan melakukan ping dan memeriksa tabel arp setiap lima menit untuk menentukan apakah ponsel di rumah. Dengan tiga ping 'GAGAL' berturut-turut, telepon tidak di rumah. Satu 'REACHABLE', ketika telepon tidak di rumah, akan membuat telepon kembali ke rumah (melakukan sesuatu). Ada pemeriksaan untuk memvalidasi alamat ip dan kembali ke loop dalam pertama jika diperlukan koreksi.

#!/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
bstipe
sumber
3

Mengapa tidak menambahkan reservasi ke alamat ip ponsel Anda dan lakukan saja ping melalui tugas cron setiap beberapa menit.

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

Saya melakukan ini pada rpi saya menggunakan fhem , ia memiliki modul deteksi kehadiran yang memungkinkan saya mengatur status penduduk yang dapat diminta untuk mempengaruhi tugas otomatisasi rumah.

paj
sumber