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 分ごとに、電話がアクティブかどうかを確認します。したがって、これにより生活のノイズが大幅に減少しますが、電話がまだ接続されていることもわかります.

5 分ごとに変更sleep 600して確認することも、もちろん、快適な任意の秒数に変更することもできます。sleep 300600

仕様によると完璧な解決策ではありませんが、ロック ファイルの管理は複雑になる可能性があります。このソリューションに慣れてから、次のようなものを追加することを検討してください

 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 に答える