0

尽管我有一些经验,但我对 bash 脚本还是很陌生。

我正在寻找我的 Raspberry Pi 来检测我的手机,当它在网络上可用时,当它这样做来播放音频剪辑时,我已经通过下面的脚本做到了这一点。

但是,我有一个问题,当我的手机在网络上可用时,我不希望音频继续循环;我需要它播放一次,然后在它已经播放后停止播放音频剪辑。但是,我确实希望脚本继续运行,以便它可以检测到我的手机下次在网络上可用的时间。

也许有更好的方法,如果有的话,我很想听听你的建议。

#!/bin/sh

if ping -c 10 192.168.1.4 &> /dev/null
then
    kodi-send --action="PlayMedia(/storage/music/welcome.mp3)"
    ping 192.168.1.4 &> /dev/null
else
    ./checkforerikphone.sh
fi
4

2 回答 2

3

尝试这个

#!/bin/bash

while : ; do
    if ping -c 10 192.168.1.4 &> /dev/null ; then
       kodi-send --action="PlayMedia(/storage/music/welcome.mp3)"
    fi
    sleep 600  
done

这个解决方案永远运行while :。每 10 分钟检查一次您的手机是否处于活动状态。因此,这显着降低了您生活中的噪音,但它也让您知道您的手机仍处于连接状态。

您可以更改sleep 600sleep 300每 5 分钟检查一次,当然,您也可以更改600为任何您喜欢的秒数。

根据您的规范,这不是一个完美的解决方案,但管理锁定文件可能很复杂。对这个解决方案感到满意,然后考虑添加类似的东西

 if ping ... ; then
   if ! [[ -e /tmp/phoneOnLine ]] ; then
     kodi-send ...
     echo "Found phone at $(date)" > /tmp/phoneOnLine
   fi
else
    echo "no phone found"
    /bin/rm -f /tmp/phoneOnLine
fi

您肯定会发现这不起作用的极端情况,因此请准备好调试代码。我会echo在每个逻辑路径(if/else/...)中添加一个 msg。了解代码是如何工作的。

另外为了防止脚本被伪造,我会在启动时删除该文件。

所以一个可能的完整解决方案是

#!/bin/bash

#file may not exist, ignore error msg with "2> /dev/null"
/bin/rm -f /tmp/phoneOnLine 2> /dev/null

#loop forever   
while : ; do
    # check for phone
    if ping -c 10 192.168.1.4 &> /dev/null ; then
        # check for "lock" file
        if ! [[ -e /tmp/phoneOnLine ]] ; then
           kodi-send --action="PlayMedia(/storage/music/welcome.mp3)"                              
           echo "Found phone at $(date)" > /tmp/phoneOnLine
        else
           echo "Phone already found" 
        fi   # !! -e /tmp/ph
    else     # no ping
         echo "no phone found"
         /bin/rm -f /tmp/phoneOnLine 2>/dev/null
    fi       # ping
    sleep 600  
done
于 2015-12-18T19:14:19.843 回答
2

尝试以下操作:

#!/bin/bash

#when result of ping $? is 0, the phone is detected
ACTIVE=0

#default startup as NOT ACTIVE(not detected) => !0
pre_available=1

# loop forever
while :
do
    #ping and store outcome in "available"
    ping -c 10 192.168.0.8 > /dev/null
    available=$?    
    #if phone was not active and just got active (detected)
    if [[ "$pre_available" != "$ACTIVE"  && "$available" == "$ACTIVE" ]]
    then
        #do your stuff
        kodi-send --action="PlayMedia(/storage/music/welcome.mp3)"              
    fi
    #store availability for next iteration
    pre_available=$available
done
于 2015-12-18T19:31:13.733 回答