2013-10-01 8 views
1

Я пытаюсь подключить свой телефон к моей RaspberryPi с помощью голубого зубчатого ключа (не пытаясь сделать что-либо разрушающее землю, просто определите, когда мой телефон находится в этом районе). Если я закрою синий зуб телефона на и выдаст следующую команду, я получу следующий результат (прежде чем кто-нибудь начнет проповедовать мне о том, как это является нарушением безопасности, напомню, что это не мой фактический телефон Bluetooth 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 

Теперь, если я отключу bluetooth телефона с и выдаст ту же команду, я получаю следующий вывод (опять же, все идентификаторы были изменены для защиты невинных).

Команда:

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

выход:

Can't connect RFCOMM socket: Host is down 
0 

Поскольку я пытаюсь определить, когда телефон находится в комнате, и когда она уходит, мне нужно каким-то образом (некоторые другим способом) обнаружения, когда ключ может и не может подключиться к нему. Как я могу добиться этого? (Примечание: Я попытался удалить телефон из здания и даже отключить его полностью)

EDIT: Я рассмотрел поймать 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

Я не совсем понял, как это сделать, но так я и обошел его. Я просто жду 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