3

青歯のドングルを使用して電話を RaspberryPi に接続しようとしています (地球を破壊するようなことは何もしようとせず、電話がその地域にいつあるかを判断するだけです)。電話のブルートゥースをオンにて次のコマンドを発行すると、次の出力が得られます (これがセキュリティの侵害であると誰かが私に説教し始める前に、それが私の実際の電話の Bluetooth IDではないことを思い出させてください)。

指図:

sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10
echo $?

出力:

Connected /dev/rfcomm0 to AA:BB:CC:DD:EE:FF on channel 10
Press CTRL-C for hangup
0

ここで、携帯電話の bluetoothをオフにして同じコマンドを発行すると、次の出力が得られます (ここでも、罪のない人を保護するためにすべての ID が変更されています)。

指図:

sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10
echo $?

出力:

Can't connect RFCOMM socket: Host is down
0

電話が部屋にあるときと部屋から出たときを判断しようとしているので、ドングルが電話に接続できるときと接続できないときを検出する何らかの方法 (他の方法) が必要です。これを達成するにはどうすればよいですか?(注:電話を建物から取り外して、完全にオフにしてみました)

編集:メッセージをキャッチして、そのstderrようにテストすることを検討しました

error=$`sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10 >/dev/null` &
if [ $error=="Can't connect RFCOMM socket: Host is down" ]
then
    ...
fi;

しかし問題は、rfcomm がバックグラウンドで実行されなければならないことです。

4

1 に答える 1

5

私はこれを行う方法を完全には理解していませんが、これが私がそれを回避した方法です。コマンドを実行してから 5 秒待っsudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10てから、接続があるかどうかを確認します。次の反復で間違いが検出されるため、これは実際には完全に機能すると思いますが、引用しないでください。おそらく、より多くの経験。最小限の作業例 (MWE) を含めたので、それに従うことができます。

MWE:

#!/bin/bash

phone1="AA:BB:CC:DD:EE:FF" #Address of phone
inside=1  # Whether the phone is 'inside' the house (0) or 'outside (1)

phoneDetected ()
{
   # Search for phone
   hcitool rssi $phone1 &>/dev/null
   ret=$?

   # If search was unsuccessful,
   if [ $ret -ne 0 ]
   then
      # Add phone
      sudo rfcomm connect 0 $phone1 10 &>/dev/null &

      # Note: the return code of rfcomm will almost always be 0,
      # so don't rely on it if you are looking for failed connections,
      # instead wait 5 seconds for rfcomm to connect, then check
      # connection again. Note this is not fool proof as an rfcomm
      # command taking longer than 5 seconds could break this program,
      # however, it generally only takes 2 seconds.
      sleep 5
      hcitool rssi $phone1 &>/dev/null
      ret=$?
   fi;

   # Case 1) we are now connected (ret=0) and we were previously outside (inside=1)
   if [ $ret -eq 0 ] && [ $inside -eq 1 ]
   then
      # change state to inside and do something (I am playing a song)
      inside=0
      mplayer /home/pi/documents/rasbpi/raspi1/media/audio/1.mp3 &>/dev/null
   # Case 2) we are no longer connected (ret=1) but we were previously inside (inside=0)
   elif [ $ret -eq 1 ] && [ $inside -eq 0 ]
   then
      # change state to outside and do something (I am playing another song)
      inside=1
      mplayer /home/pi/documents/rasbpi/raspi1/media/audio/2.mp3 &>/dev/null
   fi;
}

# run an infinite loop
while :
do
   phoneDetected $phone1
done
于 2013-10-01T01:00:04.247 に答える