ফোন হোম
আমার ফোনটি আলাদাভাবে কাজ করে, কারণ সমস্ত ফোনের কিছু আলাদা থাকে। ফোন জেগে থাকলে কেবল পিং প্রতিক্রিয়া ঘটে happens যদি পাইটি পুনরায় চালু হয় এবং ফোনটি স্লিপ মোডে থাকে তবে একাধিক পিংস 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
পরীক্ষার পরে, আমার সমাধানটি চিরকালের লুপের ভিতরে দুটি লুপ থাকবে। প্রথম অভ্যন্তরের লুপটি হবে একাধিক বার আইপি অ্যাড্রেসগুলিতে পিং করা, যা আমার ফোনের পক্ষে সম্ভব হবে। আমার রাউটারটি প্রথম 19 আইপি ঠিকানা সংরক্ষণ করেছে এবং আমার প্রায় দেড় ডজন ঠিকানা থাকতে পারে যা আমার ফোন সহ ডিএইচসিপি 192.168.0.20 ঠিকানায় শুরু করবে। আমি একবার ডজন আইপি ঠিকানা পিং করব, ব্যাকগ্রাউন্ড মোডে, প্রতিক্রিয়ার জন্য এক সেকেন্ড অপেক্ষা করব, এবং ফলাফলগুলি জাঙ্ক হিসাবে ফেলে দেব। আমি আরপ টেবিলে আট সেকেন্ড অপেক্ষা করব, এবং ip neighbor
কমান্ডটি চালাব , আইপি ঠিকানার জন্য ম্যাক ঠিকানাটি গ্রেপ করব । রাউটার এবং ফোনটি এই একই আইপি ঠিকানাটি রাখবে যদি না অস্বাভাবিক কিছু ঘটে থাকে। Arp টেবিল পাই থাকবে, কিন্তু থেকে রাজ্যের পরিবর্তন করতে হবে REACHABLE
, STALE
এবং FAILED
পিংস এবং সময় থেকে।
দ্বিতীয় অভ্যন্তরের লুপটি ফোনটি ঘরে রয়েছে কিনা তা নির্ধারণের জন্য প্রতি পাঁচ মিনিটে অর্প টেবিলটি পিন করে এবং পরীক্ষা করবে। একটানা তিনটি পিং 'FAILED' দিয়ে ফোনটি বাড়িতে নেই। একটি 'রিচাবল', যখন ফোন বাড়িতে নেই, ফোনটি ঘরে ফিরবে (কিছু করুন)। আইপি ঠিকানাটি যাচাই করতে এবং সংশোধনের প্রয়োজন হলে প্রথম অভ্যন্তরীণ লুপটিতে ফিরে আসার জন্য চেক রয়েছে।
#!/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