emmm…
最近项目组老大让研究一下iBeacon,写一个iBeacon相关的Demo提供给别人…
感觉网上的资料好少啊,最后弄完我还是写一份吧,说不定能帮助到别人呢…
各种百度,Google…
http://blog.csdn.net/jie1991liu/article/details/47403455
http://blog.csdn.net/eieihihi/article/details/45601075
看看关于科普部分.
关于iBeacon是什么,以及scanRecord得到的那一串数字的意义.看引用给的链接啊.
最后我们知道了…
02 01 06 1A FF 4C 00 02 15 (iBeacon的前缀,固定不变的)
E2 C5 6D B5 DF FB 48 D2 B0 60 D0 F5 A7 10 96 E0 (UUID的值)
00 03 (major值)
00 03 (minor值)
CD (tx值,表示距离1米是应该接收到的信号强度,可用于计算距离)
数据原来是这样的…
主要就是UUID + major + minor +txPower 这4个参数.
因为iBeacon是apple公司13年搞出来的…
Android端如果需要集成的话,需要手动进行蓝牙扫描,然后进行数据解析…
喜闻乐见的是…github上面已经有很成熟的封装解决方案了.
https://github.com/AltBeacon/android-beacon-library
http://altbeacon.github.io/android-beacon-library/
我都贴出github和文档官网了…动手能力强的,也许都自己按照上面的教程进行集成了吧,我这篇已经可以结束了.
还是简单说下吧.
compile 'org.altbeacon:android-beacon-library:2.12.3'
repositories {
jcenter()
}
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
看这里 ==>
http://altbeacon.github.io/android-beacon-library/samples.html
按照上面的,Monitoring Example Code加上去,
Ranging Example Code加上去,
还有这个Starting an App in the Background.
还可以加上Auto Battery Saving Example Code
都弄好了以后,其实就快差不多了.
启动模式和application里面就不解释了.
解释一下这些:
beaconManager.addMonitorNotifier(new MonitorNotifier() {
//方法省略
})
这个方法,也就是Monitoring Example Code部分的代码.
看toast里面的输出就知道是什么意思啊.
什么第一次接收到iBeacon信号
什么我没接收到啥啥啥的…
我打log发现他给的region根本就没卵用.
这个方法不是重点…
重点是这个==>
beaconManager.addRangeNotifier(new RangeNotifier() {
@Override
public void didRangeBeaconsInRegion( Collection beacons, Region region) {
}
});
这部分代码.即Ranging Example Code部分.这才是重点.
我说明一下…
可以在didRangeBeaconsInRegion方法内不断接收到iBeacon信号.
注意看,是Collection.当你能接收到多个iBeacon信号时,就得考虑选择哪一个进行相关业务处理
这是我的一些处理,主要是距离判断
list.clear();
list.addAll(beacons);
if (list.size() > 1) {
Collections.sort(list, new Comparator() {
@Override
public int compare(Beacon beacon, Beacon t1) {
return (beacon.getDistance() + "").compareTo(t1.getDistance() + "");
}
});
}
if (list.size() > 0) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//这里拿取list的第一个对象一定就是当前离你最近的.
}
});
}
代码很简单,根据这个库封装好的iBeacon信号的distance属性进行升序排列.
需要解释2个地方:
最后在加上
public static final String IBEACON_FORMAT = "m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24";
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout(IBEACON_FORMAT));
这个加在onCreat那一堆设置里面即可.
以上,弄完,就可以在didRangeBeaconsInRegion里一直接收到iBeacon信号进行处理了.
看了下collection明明size是2.原因是…因为他们是同一家的,UUID,major,minor都一样的锅.
找店家客服,要个设置app,然后打开那个app连接上iBeacon设备,修改一下major和minor就妥了…
集成好以后,默认接收iBeacon的时间是1100毫秒,间隔为0.
设置方法是
beaconManager.setForegroundScanPeriod(2000);
beaconManager.setBackgroundScanPeriod(3000);
很简单,方法名也通俗易懂,具体可以看BeaconManager源码.
里面有前台扫描时间,间隔.后台扫描时间,间隔以及背景模式的扫描间隔变化等等…
是不是发现beacon对象直接.getXXX并没有,23333
用下面这些方法来获得吧.
getId1() ==> UUID
getId2() ==> Major
getId3() ==> minor
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) {
}
try/catch部分是否是beacon信号过滤,我想他应该是,我没试过…
如果要弄Google Eddystone相关的看这个吧.
http://altbeacon.github.io/android-beacon-library/eddystone-how-to.html
关于Eddystone我并没有测试,我就不说了…