蓝牙定位那点事!

    过完年来公司,公司接了个项目,跟公司定位相结合的蓝牙定位的实现。本来小牧不负责这块的,但由于当时做这块的同事用的小程序开发的。无法做到息屏处理。故而这事就落到小牧这点了。大致就这麽个需求吧。好了,话不多时,直接上码。

    实现部分就先说下蓝牙定位吧,毕竟得贴题啊,虽然主要想分享的是息屏处理(主要蓝牙定位的文章太多了)。

iBeacon iBeacon = new iBeacon();
iBeacon.major = (scanData[startByte + 20] & 0xff) * 0x100 + (scanData[startByte + 21] & 0xff);
iBeacon.minor = (scanData[startByte + 22] & 0xff) * 0x100 + (scanData[startByte + 23] & 0xff);
iBeacon.txPower = (int) scanData[startByte + 24]; // this one is signed

iBeacon.rssi = rssi;

以上得到iBeacon实例。然后根据rssi得到Dis。

private static final double A_Value = 59;
/** A - 发射端和接收端相隔1米时的信号强度 */
private static final double n_Value = 2.0;

/** n - 环境衰减因子 */

public double getDistance(int rssi) {
int iRssi = Math.abs(rssi);
double power = (iRssi - A_Value) / (10 * n_Value);
return Math.pow(10, power);

}

    以上基本蓝牙的那一套都得到了,做个listview显示出来就成了。

    接下来就说下息屏处理。主要是WakeLock,实现的功能是当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能得不到正常执行,比如网络下载中断,后台播放音乐暂停等。WakeLock正是为了解决这类问题,应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。

PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock pl = pm.newWakeLock(
        PowerManager.PARTIAL_WAKE_LOCK
        | PowerManager.ON_AFTER_RELEASE,
        TAG);
pl.acquire();//为了保证任务不被系统休眠打断,申请WakeLock
//开始任务

pl.release();//结束后释放

权限配置:   

然后还有个小需求就是根据得到的iBeacon信号统一做一个处理,进行一个排序,并上传最近的一个iBeacon信号。

for (int index = 0; index < mLeDevices.size(); index++) {
map.put(mLeDevices.get(index), mLeDevices.get(index).rssi);
list.add(mLeDevices.get(index).rssi);
}
Collections.sort(list);
for (Map.Entry entry : map.entrySet()) {
if (list.get(list.size() - 1).equals(entry.getValue())) {
firstiBeacon = entry.getKey();
}
}
list.clear();

map.clear();

    最后就是网络请求了,诚然,RxJva+Retrofit的大火,现在各种大项目也都在使用,然而小牧因为项目,人事配合原因最终选择httpconnection。这段就简单了也就不上大段代码了,朋友们可以在这里下载相应源码观看。





你可能感兴趣的:(蓝牙定位那点事!)