Android连续的获取蓝牙的RSSI

 基于蓝牙的RSSI可以有很多应用,要获得蓝牙的RSSI无外乎两种方法,一种就是基于扫瞄的方法,优点是Android本身支持,缺点是scan的时间比较长,并且中间过程不受控制,为了连续的测量,需要不断的scan;第二种就是,基于连接的方法,前提是要建立两个蓝牙设备的连接后,再测量RSSI,优点是后期测量比较方便,间隔时间也较短。

连续测量Android设备(Java)的蓝牙RSSI教程

在撰写本文时,即使存在用于获取WiFi RSSI的API,也没有可用于连续检索现有蓝牙连接的RSSI的API。当前API将只在初始连接建立过程中获得蓝牙RSSI。在本文中,我们将了解如何从运行Linux的计算机上连续获取Android设备和诺基亚移动电话的蓝牙RSSI。

连接到计算机的任何设备的RSSI可以通过在Linux中使用HCIOOL来确定。但是,对于商业化的Android设备,这可能是不可能的,因为要使用Android NDK从蓝牙HCI层调用任何函数,需要根访问。出于实验目的,为了开发商用手持设备上的蓝牙设备,我们将通过将这些设备连接到计算机或膝上型计算机来测量这些设备的RSSI。

在这个实验中,RSSI从安卓设备(Nexus 7平板)和诺基亚手机(Xpress Music)上连续地从基于Ubuntu的计算机上进行测量。源代码使用BlueClub蓝牙库从这些连接的设备中提取RSSI信息。Android设备和诺基亚设备就像服务器一样,计算机就像客户机一样。

在计算机上,我们需要编写客户端代码,它将不断地从我们已知的设备中轮询RSSI。为了做到这一点,我们需要首先从这里检查bluecove蓝牙库(http://bluecove.org/source-repository.html)。然后我们可以利用BLUTEOTROSRIPSION CIENT.java来获取RSSI读数。我们可以利用我们已知设备的蓝牙MAC地址过滤掉其他发现的设备。在将设备与计算机连接之后,我们可以从Ubuntu中的蓝牙菜单的偏好选项卡获得设备的蓝牙MAC地址。

客户端:

public void PollRSSI()
{
try { 
while(true)
                 {
          try {
          System.out.println();
          if(Android_Device != null)
          System.out.println("Android RSSI = " + RemoteDeviceHelper.readRSSI(Android_Device));
     } catch (Exception e) { System.out.println("Android RSSI = Connection Error"); }
          try {
          if(Nokia != null)
          System.out.println("Nokia RSSI = " + RemoteDeviceHelper.readRSSI(Nokia));
      } catch (Exception e) { System.out.println("Nokia RSSI = Connection Error"); }   
          Thread.sleep(2000);
                }
     } catch (Exception e){ e.printStackTrace(); }
}
对于Android设备,我们需要编写自己的服务器代码,以克服[13 ]权限拒绝错误。我们可能需要在Android设备上运行多个服务器线程(Access Tox.java),这样一来,传入的连接请求将在初始权限拒绝错误之后最终被接受。我们还将指定客户端可以搜索和连接的RfCOMM UUID和服务名称。整个服务器必须在Android(BrutoToSursService,Java)中实现为服务,这样,如果显示屏幕超时,连接不会丢失。

服务端:

public AcceptThread()
{
                   BluetoothServerSocket tmp = null;
                   mBluetooth = BluetoothAdapter.getDefaultAdapter();
                   mUuid = UUID.fromString("00000003-0000-1000-8000-00805F9B34FB");
        try {
                tmp = mBluetooth.listenUsingInsecureRfcommWithServiceRecord("BluetoothCustomService",      mUuid);          
             } catch (IOException e) { }
                myServerSocket = tmp;
         }

public void onCreate()
{
super.onCreate();

thread1 = new Thread(new AcceptThread());
thread1.start(); //First thread will often be denied
thread2 = new Thread(new AcceptThread());
thread2.start(); //Most probably be accepted

}

对于诺基亚设备,不需要显式的服务器,我们可以简单地使用蓝牙串行端口配置文件连接url进行连接。一旦建立连接,我们就可以周期性地轮询来自两个设备的RSSI。

注意:蓝牙的RSSI可能不是室内定位等应用的有效和可靠的参数。

源代码:

蓝牙

参考文献:

“基于蓝牙的超级市场导航系统”-珍珠马诺哈兰,维格纳什·斯巴拉曼尼亚和阿努沙·武图库里-课程项目-移动系统16:332:559:02F12(罗格斯秋季2012)->

HTTP://ExcRe.ANDROID.COM/GUID/TopICS/CaluleVisty/BuLotoTo.HTML

HTTP://StAccOfFult.COM/DISSMS/1225178/ANDROID-BLUTITOT-RES-RSSI-信号强度

HTTP://BueleCovi.Org/BeLeCoo-Expuls/BraveCooTeSt/Dex.HTML

有TX问到,为什么RSSI=0,解释如下文,简单点就是这个值是设备相关的。

http://www.robomotic.com/android/bluetooth-rssi/

RSSI是一个8位有符号整数,表示Re-(RX)功率电平在金的内部或上方或下方接收机功率范围(GRPR),被认为是理想的

RX功率范围。图1说明了两者之间的关系。GRPR和RSSI在蓝牙技术中的应用。POS—固定或负RSSI(dB)表示RX功率电平为

GRPR的上方或下方,而零点意味着这是理想的(也就是说,在GRPR内)。上下阈值GRPR的幼体是松散结合的,留下它们是设备。这反过来又影响RSSI,因为它仅仅是一个相关参数。事实上,它的绝对准确性不是人。在特定的情况下,唯一的要求是能够指示它是否在GRPR的内部、上方或下方。这个蓝牙的RSSI状态参数特别适用于用于电力控制目的〔6〕。接收器发送“in -“发送”或“减少”TPL请求到发送端,DE悬而未决的RSSI是否被认为是负面的或阳性。

猜你喜欢

转载自blog.csdn.net/huangliniqng/article/details/82427102