【问题标题】:Check for successful connection using rfcomm使用 rfcomm 检查连接是否成功
【发布时间】:2013-10-07 00:05:45
【问题描述】:

我正在尝试使用蓝牙加密狗将我的手机连接到我的 RaspberryPi(不尝试做任何惊天动地的事情,只需确定我的手机何时在该区域内)。如果我打开手机的蓝牙打开并发出以下命令,我会得到以下输出(在有人开始向我宣扬这是如何违反安全性之前,让我提醒你这是 不是我实际的手机蓝牙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

现在,如果我关闭手机的蓝牙,并发出相同的命令,我会得到以下输出(同样,所有 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 必须在后台运行。

【问题讨论】:

    标签: bluetooth raspberry-pi wireless rfcomm dongle


    【解决方案1】:

    我还没有完全弄清楚如何做到这一点,但这就是我解决它的方法。我只是在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
    

    【讨论】:

      猜你喜欢
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      相关资源
      最近更新 更多