最近项目组老大让研究一下iBeacon显示,写一个iBeacon显示相关的演示提供给别人...
感觉网上的资料好少啊,最后弄完我还是写一份吧,说不定能帮助到别人呢?
各种百度,谷歌......
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是苹果公司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显示信号进行处理了。
看了下收集明明尺寸是2.原因是......因为他们是同一家的,UUID,主要,次要都一样的锅。
找店家客服,要个设置的应用程序,然后打开那个应用程序连接上iBeacon显示设备,修改一下主要的和次要的就妥了...
集成好以后,默认接收iBeacon显示的时间是1100毫秒,间隔为0.
设置方法是
beaconManager.setForegroundScanPeriod(2000);
beaconManager.setBackgroundScanPeriod(3000);
很简单,方法名也通俗易懂,具体可以看BeaconManager源码。
里面有前台扫描时间,间隔。后台扫描时间,间隔以及背景模式的扫描间隔变化等等...
是不是发现标对象直接.getXXX并没有,23333
用下面这些方法来获得吧。
getId1()==> UUID
getId2()==>主要
getId3()==>次要
try {
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
} catch (RemoteException e) {
}
try / catch语句部分是否是信标信号过滤,我想他应该是,我没试过...
如果要弄Google Eddystone相关的看这个吧。
http://altbeacon.github.io/android-beacon-library/eddystone-how-to.html
关于埃迪斯通我并没有测试,我就不说了......