下一篇:蓝牙RSSI定位入门(2)指纹法
点击:室内定位主页目录一维实战二维实战安卓惯性导航基础蓝牙5.0发布,降低了功耗,大大提高了定位的精度和距离,但其定位物联网设备更热了室内定位。 BLE功能强大,无需连接,可以实现很多功能。 可以想象,旅行中走到景区旁边,手机会自动推送景区介绍。 上学的时候,要确认是否戴着物联网设备上班。 本文介绍手机设备基于伪信标的室内实时导航和人员实时定位。
实现原理
由于是手机的伪信标,所以使用传统蓝牙,通过以不需要连接的特性发送广播来获得信标的rssi用距离算法求出与信标的距离,用三点定位算法根据三个信标的距离和坐标求出手机的位置一,安卓蓝牙模块的使用1,您必须添加权限才能在Android上使用蓝牙模块。 将以下代码添加到AndroidManifest.xml中
uses-permission Android 3360 name=' Android.permission.bluetooth '/uses-permission Android 3360 name=' Android.peroid.peroid uses-permission Android 3360 name=' Android.permission.acecesion
activity compat.request permissions (this,new string [ ] { manifest.permission.access _ fine _ location },my _ per ine
private void init_ble () mbluetoothadapter=bluetooth adapter.getdefaultadapter ); if (! mBluetoothAdapter.isEnabled () { mBluetoothAdapter.enable ); } } 二,蓝牙注册和广播1,蓝牙广播
//注册广播搜索bluetoothprivatevoidregisterreceiver ((intentfilterfilter=newintentfilter ); //筛选广播filter.addaction (蓝牙设备. action _ bond _ state _ changed ); filter.addaction (蓝牙适配器. action _ state _ changed ); filter.addaction (蓝牙设备. action _ ACL _ connected ); filter.addaction (蓝牙设备. action _ found ); filter.addaction (蓝牙适配器. action _ discovery _ finished ); 注册接收器(mbluetoothreceiver,过滤器; //注册} 2,蓝牙广播和停止广播
公共语音开始(视图) ) mbluetoothadapter.start discovery ); Textview1.setText ('开始搜索'; }publicvoidend(viewview ) if (蓝牙. is discovering ) ) /蓝牙适配器. cancel discovery ) )进行过扫描} 3、蓝牙开始广播后,将创建线程,并进行广播回调。 重写onReceive以获得RSSI,并通过回调将处理尽可能放入线程
//bluetooth广播收件人的私有广播接收方私有广播接收方=newbroadcastreceiver (} { @ overridepublicvoidonreceive (内容
-"); Textview1.append("n获得广播:"+action); if(BluetoothDevice.ACTION_FOUND.equals(action))//发现广播 { new Thread() { @Override public void run() { super.run(); try { BluetoothDevice scanDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (scanDevice.getBondState() != BluetoothDevice.BOND_BONDED) //如果没有绑定 { short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE); Textview1.append("n 信标:" + scanDevice.getName() ); Textview1.append("n address: "+scanDevice.getAddress()); Textview1.append("n rssi:" + rssi); //获得RSSI } } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); 补充,用ble蓝牙BLE蓝牙使用BluetoothLeScanner来进行扫描
BluetoothLeScanner scanner=mBluetoothAdapter.getBluetoothLeScanner(); scanner.startScan(mScanCallback); private ScanCallback mScanCallback = new ScanCallback() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override // public void onScanResult( BluetoothAdapter device,int rssi,byte[]scan_record) // { // Textview1.append(String.valueOf(rssi)); // } public void onScanResult(int callbackType, final ScanResult result) { runOnUiThread(new Runnable() { @Override public void run() { final iBeacon ibeacon = iBeaconClass.fromScanData(result.getDevice(),result.getRssi(),result.getScanRecord().getBytes()); Textview1.append( "n蓝牙名称"+ibeacon.name); Textview1.append("n" +"蓝牙地址"+ibeacon.bluetoothAddress); Textview1.append( "n" +"uuid"+ibeacon.proximityUuid); Textview1.append( "n" +"major"+ibeacon.major); Textview1.append( "n" +"minor"+ibeacon.minor); Textview1.append( "n" +"rssi"+ibeacon.rssi); Textview1.append( "n" +"distance"+ibeacon.distance); Textview1.append( "n" +"power"+ibeacon.txPower); } }); } }; 三,距离算法和三点定位算法1,三点定位算法是最简单的测距方法,距离算法基于无线电衰减模型,rssi与距离的对数正比。即可得到公式
d = 10^((abs(RSSI) - A) / (10 * n))
d - 计算所得距离
RSSI - 接收信号强度(负值)
A - 发射端和接收端相隔1米时的信号强度
n - 环境衰减因子
2,三点定位算法,在基于无线电衰减模型中能获得固定的一个点坐标。
已知三个信标的坐标,已经通过三个信标的RSSI得到与信标的距离。即可得到定位的坐标。
1,获得的坐标有较大的偏移。在现实生活中,由于环境的不同,甚至在空旷地带也无法实现无线电衰减模型。有时还会发生超过10dbm的偏移。如下,为我购买的三个不同的信标测试图。
上面是RSSI的方差,下面是RSSI的强度。在一米内比较准确,一米后,就很难确定位置了。
(甚至有些差的信标,在1米的波动都很大,如绿色线)
2,附上效果图