Проверьте успешное соединение с помощью rfcomm
Я пытаюсь подключить свой телефон к RaspberryPi с помощью ключа с синим зубом (не пытаясь сделать что-то потрясающее, просто определите, когда мой телефон находится в этом районе). Если я включу синий зуб своего телефона и введу следующую команду, я получу следующий вывод (прежде чем кто-либо начнет проповедовать мне о том, что это является нарушением безопасности, позвольте мне напомнить вам, что это не фактический идентификатор телефона Bluetooth):
команда:
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
Поскольку я пытаюсь определить, когда телефон находится в комнате, а когда он уходит, мне нужно каким-то образом (каким-то другим способом) определить, когда ключ может и не может подключиться к нему. Как я могу добиться этого? (ПРИМЕЧАНИЕ: я пытался вытащить телефон из здания и даже полностью его выключить)
РЕДАКТИРОВАТЬ: я рассмотрел ловить 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 должен работать в фоновом режиме.
1 ответ
Я не совсем понял, как это сделать, но вот как я обошел это. Я просто жду 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