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. arp
Komutun artık ip neighbor
kullanı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 neighbor
komutu ç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
, STALE
ve FAILED
ping'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