Android iBeacon集成开发,距离判断 全指南...

emmm…
最近项目组老大让研究一下iBeacon,写一个iBeacon相关的Demo提供给别人…

感觉网上的资料好少啊,最后弄完我还是写一份吧,说不定能帮助到别人呢…

各种百度,Google…

1.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个参数.

2.iBeacon集成

因为iBeacon是apple公司13年搞出来的…
Android端如果需要集成的话,需要手动进行蓝牙扫描,然后进行数据解析…
喜闻乐见的是…github上面已经有很成熟的封装解决方案了.

https://github.com/AltBeacon/android-beacon-library
http://altbeacon.github.io/android-beacon-library/

我都贴出github和文档官网了…动手能力强的,也许都自己按照上面的教程进行集成了吧,我这篇已经可以结束了.

还是简单说下吧.

1.compile,权限,仓库

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" />

2.代码集成处理.

看这里 ==>

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

都弄好了以后,其实就快差不多了.

3.代码解释

启动模式和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个地方:

为什么要使用runOnUiThread,因为这玩意是在子线程,不加就crash了.

为什么不使用TxPower来判断距离,TxPower不是信号强度么,而是使用rssi来进行距离判断.(看Beacon源码,rssi转换为distance)哪是因为TxPower他喵的他根本就不会变啊…

3.最后工作

最后在加上

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信号进行处理了.

3.踩坑及其他

1.我买了2个iBeacon设备,但是只能同时接收到1个.

看了下collection明明size是2.原因是…因为他们是同一家的,UUID,major,minor都一样的锅.

找店家客服,要个设置app,然后打开那个app连接上iBeacon设备,修改一下major和minor就妥了…

2.扫描和接收iBeacon 时间和间隔设置

集成好以后,默认接收iBeacon的时间是1100毫秒,间隔为0.
设置方法是

beaconManager.setForegroundScanPeriod(2000);
beaconManager.setBackgroundScanPeriod(3000);

很简单,方法名也通俗易懂,具体可以看BeaconManager源码.
里面有前台扫描时间,间隔.后台扫描时间,间隔以及背景模式的扫描间隔变化等等…

3.我要的uuid,major,minor哪呢?

是不是发现beacon对象直接.getXXX并没有,23333
用下面这些方法来获得吧.
getId1() ==> UUID
getId2() ==> Major
getId3() ==> minor

4. …

1. tyr/catch部分

try {
            beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
        } catch (RemoteException e) {
        }

try/catch部分是否是beacon信号过滤,我想他应该是,我没试过…

2.Eddystone

如果要弄Google Eddystone相关的看这个吧.

http://altbeacon.github.io/android-beacon-library/eddystone-how-to.html

关于Eddystone我并没有测试,我就不说了…

你可能感兴趣的:(Android)