2013-10-01 6 views
1

파란 치형 동글을 사용하여 내 전화를 내 RaspberryPi에 연결하려고합니다 (지구가 산산이 찢어 지려고하지 않고 내 전화기가 해당 지역에있을 때 결정). 내 전화기의 청색 털 으로 돌리고 다음 명령을 실행하면 누구나 보안 위반에 대한 설교를 시작하기 전에 이 아니라 내 실제 전화임을 상기시켜줍니다. 블루투스 ID) :rfcomm을 사용하여 연결 확인

명령을

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 

에서 끈 다음 동일한 명령을 실행하면 다음과 같은 결과가 나타납니다 (다시 말하면 모든 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은 백그라운드에서 실행되어야합니다.

답변

2

이 작업을 수행하는 방법을 알지 못했지만이 방법을 사용하고 있습니다. sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10 명령을 보낸 후 5 초 동안 기다린 다음 연결이 있는지 확인합니다. 나는 이것이 실제로 완벽하게 작동한다는 것을 의심한다. 다음 반복은 어떤 실수라도 저지를 것이지만, 나를 인용하지는 않는다. 아마 더 많은 경험. 최소한의 작업 예제 (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