Vicinity:使用CoreBluetooth实现iBeacon功能

Vicinity

Vicinity复制实现iBeacon功能并且支持后台广播(将iOS作为iBeacon设备)以及BLE蓝牙设备检测。

Vicinity使用的是CoreBluetooth来实现iBeacon功能,并不是CoreLocation。这一尝试的缘由是CoreBluetooth支持后台模式,CoreLocation并不能。

iBeacon

iBeacon指的是,配备有低功耗蓝牙(BLE)通信功能的设备使用BLE技术向周围发送广播,同时接收广播的设备可以通过分析接收到的无线蓝牙信号强度来估算与发送设备距离的一项技术。

在官方提供的SDK中,iBeacon需要通过CoreLocation来实现,这同时也带来了后台模式上的限制。

相对地,使用CoreBluetooth后台模式下依然可以发送广播,检测蓝牙设备,以及少量代码的实现。

在使用CoreBluetooth复制实现CoreLocation的iBeacon部分时,所需仅是RSSI值(接收到的信号强度值,received signal strength indication)。

INBeaconService

Vicinity的核心部分就是INBeaconService,这个类通过分析BLE蓝牙设备广播的RSSI实现了iBeacons的过程。其中大部分的工作是由CoreBluetooth中的CBPeripheralManager和CBCentralManager完成的。

其中的两个关键步骤:

1.过滤RSSI值(需要考虑到传感器噪音以及信号峰值的影响)

2.将RSSI换算成距离

信号噪音

直接从手机传感器读取到的信息(比如,加速计或者RSSI)包含许多噪音和信号峰值。一开始我尝试使用加权平均值但是效果并不好,后来改用了一个滤波公式来过滤输入值,这个效果不错。

RSSI转换为距离

将RSSI值换算成距离这个过程我尝试了很多种方法,在我发现iBeacons使用”Far”, “Near”, 和”Immediate”这些模糊的方式来表示距离的时候心都碎了。我们通过分析实际数据不难发现这种表达的缘由,距离超过5英尺(1.5m)时RSSI值波动非常大,同时在小于1英尺(0.3m)时更加准确。

据说不同蓝牙设备间信号不尽相同,但是我们测试使用的iOS设备输出值是相同的。

开源地址:https://github.com/Instrument/Vicinity

1 1 收藏

资源整理者简介:西西里的仔仔

简介还没来得及写 :) 个人主页 · 贡献了12个资源 · 13 ·   


直接登录

推荐关注

按分类快速查找

关于资源导航
  • 伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1439 项工具资源。
    推送伯乐头条热点内容微信号:jobbole 分享干货的技术类微信号:iProgrammer