转载

(30 gadget day 6) 主人,早上好 - iBeacon

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

问候

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

(30 gadget day 6) 主人,早上好 - 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的啦!他们长这样。

(30 gadget day 6) 主人,早上好 - iBeacon

去官网看 文档 ,跳到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

正文到此结束
Loading...