咳咳,今天遍寻各处都想不到写个啥。于是只能假装我没玩过这个“新鲜”的gadget啦——iBeacon!

问候

办公室人少,每次去的时候都略显孤单。于是决定写一个跟自己打招呼的玩意儿,让我每次进门的时候都能收到一个“亲切的问候”,比如。

图片描述

iBeacon with Web

据说微信的JS SDK要开放iBeacon的部分了。所以嘛,先prototype一下咋用js来玩ibeacon。我先猜测下哈,微信的SDK是估计是把native的ibeacon数据通过微信转换以后bridge进H5应用里,也就是假设某个ibeacon对应的是吉野家某个门店的大门口,然后用户无论通过何种入口(摇一摇,扫二维码等),进入了一个开发者设定的H5页面里。在这个页面通过类似wx.beacons接口拿到了周围的ibeacon数据。这种数据应该是某个url,某个商家,某个门店,某个位置这样的,而不是类似UUID,major,minor这样的标准ibeacon id。

我想做的更简单一点。native app拿ibeacon数据,把数据同步给服务器,服务器确定是否要触发事件,如果需要则发给H5应用。这样的问题就是,要总连着网。so what,嗯。

iBeacon检测

家里的Estimote iBeacon都没了,只能用不熟悉的Kontakt的啦!他们长这样。

图片描述

去官网看文档,跳到Android的GetStart,直接搜“download”,果断看到“Go to the Kontakt.io Android SDK 1.0.5 on GitHub”,看到两个jar,直觉都当下来,回来看文档,都拷进去就好。

然后肯定就是加Permission啦,文档搜一搜,发现相比Estimote,Kontakt对权限分的更细一些,如果你不用他的云服务就不用加Internet权限。还有不大明白为啥针对萝莉炮要再加个Service,这都不能检测下么。

<service android:name="com.kontakt.sdk.android.manager.BeaconService" android:exported="false"/>
<service android:name="com.kontakt.sdk.android.manager.BeaconServiceL" android:exported="false"/>

然后就是看具体怎么用啦。无非也就是创建个BeaconManager,收各种回调哈。

        beaconManager = BeaconManager.newInstance(this);
        beaconManager.setMonitorPeriod(MonitorPeriod.MINIMAL);
        beaconManager.setForceScanConfiguration(ForceScanConfiguration.DEFAULT);
        beaconManager.registerMonitoringListener(new BeaconManager.MonitoringListener() {
            @Override
            public void onMonitorStart() {}

            @Override
            public void onMonitorStop() {}

            @Override
            public void onBeaconsUpdated(final Region region, final List<Beacon> beacons) {}

            @Override
            public void onBeaconAppeared(final Region region, final Beacon beacon) {}

这里文档有点问题,新的1.0.5的SDK里已经不是Beacon这个类而变成BeaconDevice了。connect函数里也有不一致的地方。startMonitoring的参数要清空就好了。不然就自己弄个Set,找个Everywhere的Region装进去。

    private void connect() {
        try {
            beaconManager.connect(new OnServiceBoundListener() {
                @Override
                public void onServiceBound() {
                    try {
                        beaconManager.startMonitoring();
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (RemoteException e) {
            throw new IllegalStateException(e);
        }
    }

数据中心

我一直希望把自己的各种数据尽量实时的扔到云里去,这样几十年以后就能知道现在的我是怎么活的啦。这里我也不希望搞个啥local server之类的,直接上云服务吧。以前介绍过PubNub就是个和Firebase类似的实时数据库。客户端和服务器端可以用超高抽象的handler来操纵数据。

这次我用PubNub来实现。GetStart就跳过了。看名字就知道这玩意儿是在做PubSub类似的技术。所以程序也很简单,一端Pub一端Sub。既然是手机端发现iBeacon那肯定是手机端来Pub喽。服务端就把事先知道的iBeacon都Sub上就好了。channel就用每个beacon的uuid:major:minor合起来hash一下哈。

Pubnub pubnub = new Pubnub("xxyyzz", "status");

try {
  pubnub.subscribe("hello_world", new Callback() {
...
// 也可以直接抄一下昨天hue的api body,挺像的
pubnub.publish("xxyyzz", "{\"status\":\"on\"}" , callback);

我来啦~

前端页面引入PubNub的库,每个设备都显示自己对应的页面,然后就Sub着就好啦。一旦有消息进来,就根据status选择性display那张图哈。

困死了困死了>.<

另外,求各种带API的硬件Gadget...库存快枯竭了...

EOF


fxp
462 声望59 粉丝

coder in action


引用和评论

0 条评论