iBeacon使用蓝牙连接范围精确到1-3米
程序员文章站
2024-02-07 09:23:22
最近再写一个项目,需要自动签到。用的就是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,这里就不贴布局文件的代码了。
希望对大家的学习有所帮助,也希望大家多多支持。