首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用rfcomm检查是否成功连接

使用rfcomm检查是否成功连接
EN

Stack Overflow用户
提问于 2013-10-01 00:05:28
回答 1查看 12.2K关注 0票数 3

我正试图用蓝牙线将我的手机连接到我的RaspberryPi上(不想做任何破坏地球的事情,只要确定我的手机什么时候在这个区域)。如果我在上打开手机的蓝牙并发出以下命令,我将得到以下输出(在任何人开始向我讲述这是如何破坏安全之前,让我提醒您,这是而不是的实际电话蓝牙id):

命令:

代码语言:javascript
复制
sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10
echo $?

输出:

代码语言:javascript
复制
Connected /dev/rfcomm0 to AA:BB:CC:DD:EE:FF on channel 10
Press CTRL-C for hangup
0

现在,如果我将手机的蓝牙关闭,并发出相同的命令,我将得到以下输出(同样,所有id都已被更改以保护无辜)。

命令:

代码语言:javascript
复制
sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10
echo $?

输出:

代码语言:javascript
复制
Can't connect RFCOMM socket: Host is down
0

由于我试图确定手机何时在房间里,何时离开,我需要一些方法(其他方式)来检测何时可以和不能连接到它。我怎样才能做到这一点呢?(注意:我试着把电话从大楼里移开,甚至把它完全关掉)

编辑:--我已经考虑过捕获stderr消息并进行如下测试

代码语言:javascript
复制
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必须在后台运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-01 01:00:04

我还没弄清楚该怎么做,但我就是这么做的。我只需在sudo rfcomm connect 0 AA:BB:CC:DD:EE:FF 10命令之后等待5秒,然后检查是否存在连接。我怀疑这实际上是完美的,因为下一次迭代将捕捉到所犯的任何错误,但不要引用我的话。也许更有经验。我已经包含了最小工作示例(MWE),这样您就可以遵循它。

MWE:

代码语言:javascript
复制
#!/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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19105870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档