bluetooth - 使用 rfcomm 检查连接是否成功

标签 bluetooth raspberry-pi wireless rfcomm dongle

我正在尝试使用蓝牙适配器将我的手机连接到我的 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 必须在后台运行。

最佳答案

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

关于bluetooth - 使用 rfcomm 检查连接是否成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19105870/

相关文章:

Android:AirDroid 应用程序如何工作?

linux - 有没有办法在兼容蓝牙 2.0 的情况下运行 iBeacon。设备?

c - 如何使用蓝牙(RFCOMM)和树莓派获取 Rssi 值?

android - 如何在android中建立蓝牙连接?

使用 express-ws 的 "app.ws" typescript 错误

c - 无法让 2 个 LED 工作。 [树莓派,裸机]

用于获取系统上所有可用网络接口(interface)名称的 C++ 代码

c++ - 蓝牙设备本地名称

embedded - 树莓派上的 ARM 时钟速度

c# - 以编程方式创建无线自组织网络