वाई-फाई का उपयोग करके रास्पबेरी पाई उपस्थिति का पता लगाना


12

मैं अपने रास्पबेरी पाई को अपने नेटवर्क पर मैक पते के लिए लगातार स्कैन कैसे कर सकता हूं जब यह एक विशिष्ट मैक पते का पता लगाता है तो एक कार्य करता है?

मैं अपने पीआई का उपयोग विभिन्न घरेलू स्वचालन कार्यों को चलाने के लिए करता हूं। मुझे यह पसंद है कि जब मैं अपने फोन को वाई-फाई से कनेक्ट करता हूं, तो इसका मतलब यह है कि मैं एक काम कर रहा हूं। लगातार मेरे फोन के मैक एड्रेस के लिए पाई स्कैन करने का सबसे अच्छा तरीका क्या है? मुझे पता है कि मैं arp-scanमैक पते के लिए स्कैन करने के लिए उपयोग कर सकता हूं , लेकिन मुझे लगातार स्कैन करने की आवश्यकता है। मुझे यकीन है कि एक बेहतर तरीका है, फिर arp-scanएक लूप में चलना, या क्रोन का उपयोग करके इसे हर मिनट चलाना है।


2
यदि आपको वास्तविक समय की जरूरत नहीं है तो क्रोन सबसे अच्छा तरीका है। पहले आप स्क्रिप्ट लिखते हैं जो सही या गलत की तरह वापस आती है (स्थिति कोड वह प्रतिक्रिया को निजीकरण करने के लिए सबसे अच्छा विकल्प है) फिर स्क्रिप्ट जो पिछले मान को कहीं / tmp में संग्रहीत करेगी और परिवर्तन की जांच करेगी। यदि परिवर्तन खुश हो जाता है तो वह इसे लॉग करेगा।
मिसाज़

जवाबों:


3

फोन घर

मेरा फोन अलग तरह से काम करता है, क्योंकि सभी फोन में कुछ अंतर होता है। पिंग प्रतिक्रिया केवल तभी होती है जब फोन जगा हो। यदि पाई को रिबूट किया गया है और फोन स्लीप मोड में है, तो कई पिंग्स 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 से शुरू होगा। मैं एक बार में एक दर्जन आईपी पते को पिंग करूंगा, पृष्ठभूमि मोड में, प्रतिक्रिया के लिए एक सेकंड प्रतीक्षा करें और परिणामों को रद्दी के रूप में फेंक दें। मैं arp टेबल पर आठ सेकंड इंतज़ार करूँगा, और ip neighborकमांड चलाऊंगा, ip एड्रेस के लिए मैक एड्रेस को grep करूँगा । जब तक कुछ असामान्य नहीं होता है तब तक राउटर और फोन इसी आईपी पते को रखेंगे। एआरपी तालिका पाई में रहेगा, लेकिन से बदल जाएंगी REACHABLE, STALEऔर 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

3

अपने फ़ोन / आईपी पते में आरक्षण क्यों न जोड़ें और बस कुछ ही मिनटों में क्रॉन जॉब के माध्यम से एक पिंग करें।

    #!/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 , यह एक में बनाया गया है उपस्थिति का पता लगाने मॉड्यूल मुझे निवासी स्थितियां प्रभाव घर स्वचालन कार्यों के लिए पूछे जा सकती है निर्धारित करने देता हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.