欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iBeacon使用蓝牙连接范围精确到1-3米

程序员文章站 2022-06-04 12:14:31
最近再写一个项目,需要自动签到。用的就是ibeacon,刚开始的时候比较懵比,不知道ibeacon是用来干啥的。因为ibeacon就是一个小盒盒,还是密封好的,就感觉自己懵...

最近再写一个项目,需要自动签到。用的就是ibeacon,刚开始的时候比较懵比,不知道ibeacon是用来干啥的。因为ibeacon就是一个小盒盒,还是密封好的,就感觉自己懵了。然后上网查资料,才知道ibeacon就是一个小型的基站,手机打开蓝牙之后,如果你在这个基站的范围之内,会自动匹配上。你对ibeacon不需要做任何的操作,因为里面有电池,说是可以使用5年左右。

以上就是大概的情况,接下来介绍的是代码展示部分。

首先,在你的主清单中androidmanifest.xml中添加权限:

<uses-permission android:name="android.permission.vibrate" />
<uses-permission android:name="android.permission.bluetooth" />
<uses-permission android:name="android.permission.bluetooth_admin" />

权限添加完毕之后,接下来就是代码部分了

public class mainactivity extends activity {

  private bluetoothadapter bluetoothadapter;
  private textview textview;

  @override
  protected void oncreate(bundle savedinstancestate) {
   super.oncreate(savedinstancestate);
   setcontentview(r.layout.activity_main);
   textview = (textview) findviewbyid(r.id.textview1);
   bluetoothmanager manager = (bluetoothmanager) getsystemservice(context.bluetooth_service);


   bluetoothadapter = manager.getadapter();
   if (bluetoothadapter == null || !bluetoothadapter.isenabled()) {
     intent intent = new intent(bluetoothadapter.action_request_enable);
     startactivityforresult(intent, 1);
   }
   bluetoothadapter.startlescan(mlescancallback);

  }


  public void playvibator(context context, long timelong) {
   vibrator vib = (vibrator) context
      .getsystemservice(service.vibrator_service);

   vib.vibrate(timelong);
  }

  private bluetoothadapter.lescancallback mlescancallback = new bluetoothadapter.lescancallback() {

   public void onlescan(final bluetoothdevice device, final int rssi,
           final byte[] scanrecord) {
     int startbyte = 2;
     boolean patternfound = false;
     // 寻找ibeacon
     while (startbyte <= 5) {
      if (((int) scanrecord[startbyte + 2] & 0xff) == 0x02
         && ((int) scanrecord[startbyte + 3] & 0xff) == 0x15) {
        patternfound = true;
        break;
      }
      startbyte++;
     }
     // 如果找到了的话
     if (patternfound) {
      string ibeaconname = device.getname();
      int txpower = (scanrecord[startbyte + 24]);
      if (ibeaconname.equals("e-beacon_ce6d94")) {
        system.out.println(calculateaccuracy(txpower, rssi));
        if (calculateaccuracy(txpower, rssi) > 1) {//这里是指ibeacon超过1米之后,textview字体变化
         textview.settext("设备有危险!");
         playvibator(mainactivity.this, 1000);
        } else {
         textview.settext("设备正常!");//在1米范围内
        }
      }
     }
   }
  };

  protected static double calculateaccuracy(int txpower, double rssi) {
   if (rssi == 0) {
     return -1.0; // if we cannot determine accuracy, return -1.
   }
   double ratio = rssi * 1.0 / txpower;
   if (ratio < 1.0) {
     return math.pow(ratio, 10);
   } else {
     double accuracy = (0.89976) * math.pow(ratio, 7.7095) + 0.111;
     return accuracy;
   }
  }
}

以上就是全部代码展示,布局文件里面就是一个textview,这里就不贴布局文件的代码了。

希望对大家的学习有所帮助,也希望大家多多支持。