Bash脚本通过iPhone ping检测我是否在家

时间:2014-06-03 21:17:02

标签: bash

我在这个项目上工作,一旦进入公寓,就会播放音乐。我有一组USB扬声器连接到我的路由器USB端口。我使用OpenWRT通过我的路由器流式传输Radio。 现在我想尝试将ping请求用于分配给我的手机的静态IP。 想法:

电话在家 - > ping请求肯定 - > bash激活MPD播放音乐 电话不在家 - > ping请求超时 - > MPD停止播放

我的脚本问题是Iphone在一段时间后与WLAN断开连接。当我再次使用手机时,Wifi激活,音乐又开始播放,非常烦人:)

现在我想找到一种方法让脚本只在没有连续4个小时检测到电话的情况下才会激活。 这是我的剧本:

ping 192.168.1.233 -c 1 -W 5 > /tmp/devicelist
status=$(grep -i -c '1 packets received' /tmp/devicelist)
prevStatus=$(cat /tmp/ishome)

if [ $status = $prevStatus ]; then
    echo "No change"
else
    if [ $status = "1" ]; then
        echo "Phone detected"
    mpc load bondi && mpc play 1
    else
        echo "Phone lost"
    mpc stop
    fi
fi

echo $status > /tmp/ishome
echo  $status | while IFS= read -r line; do echo "$(date) $line"; done >> /tmp/ishome.log

最后一行是为了调试目的。该脚本每5分钟作为一个cron作业运行 我可以使用ishome.log这是一堆0作为输入吗? 让我们说我希望脚本仅在ishome.log有10x0时才执行?

2 个答案:

答案 0 :(得分:1)

例如,您可以计算最后10行中的零个数:

if [ "$(tail -n10 ishome.log | sort | uniq -c)" = "  10 0" ]; then echo 10 times 0; fi

只有满足该条件并且$status变为1才能播放音乐。

答案 1 :(得分:0)

谢谢你们,它现在正在工作,我想发布我的最终剧本

NOW=$(date +"%s")
dayBegin=$(date --date="07:00" +"%s")
dayEnd=$(date --date="22:00" +"%s")
if [ ${NOW} -gt ${dayBegin} ] && [ ${NOW} -lt ${dayEnd} ]; then

ping 192.168.1.233 -c 1 -W 5 > /tmp/devicelist
   status=$(grep -i -c '1 packets received' /tmp/devicelist)
     if [ $status = "1" ]; then
         echo "Phone detected"
        if [ "$(tail -n60 /tmp/ishome.log | sort | uniq -c)" = "     60 0" ]; then
     mpc clear && mpc load all && mpc play 1

      fi
       else
           echo "Phone lost"
    mpc stop
      fi
fi
echo  $status | while IFS= read -r line; do echo "$line"; done >> /tmp/ishome.log

cron标签:

* * * * * ~/musicphone.sh
* 2 * * * ~/logshorten.sh

因此,每分钟检查脚本可能看起来有点矫枉过正,但是当我回家时,音乐开始播放而不是5分钟后。我还有一个小脚本每天将日志缩短到500行

for file in /tmp/ishome.log; do
tail -500 "$file" > "$file.tmp"
mv -- "$file.tmp" "$file"
done

我确信有更聪明的方法可以解决这个问题,但这对我有用!