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

咳咳,今天遍寻各处都想不到写个啥。于是只能假装我没玩过这个“新鲜”的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

自管理的收纳箱

找那些零碎的东西是件很痛苦的事儿,尤其是那些又比较珍贵又不常用的东西。所以如果有一个可以自管理的收纳箱,箱子自己可以获得当前里面有哪些物品,并把信息传给家里的“信息中心”(无论是路由器还是什么东西)。这样下次我要找到我可爱的小熊的时候,只要搜索一下“小熊”,那个箱子自然就会亮一下,甚至叫一句“小熊在我这儿”。

技术上,选用RFID的原因的是成本低。箱子本身可以用iBeacon或者wifi来向外传输数据。这样一个箱子的成本也许能在200元以下。箱子周围有电磁隔离,防止旁边箱子的东西被这个箱子感知。

一个带有RFID发射器的箱子,可以获得箱子里面的所有RFID标签内容。RFID标签会把自己上面写的内容发射给箱子。箱子再把内容都发给移动设备。这样找起东西来就很方便啦。可以在自己的“家庭首页”搜索“小熊”,在手机上就能看到怎么找到小熊的指示。
一个带有RFID发射器的箱子,可以获得箱子里面的所有RFID标签内容。RFID标签会把自己上面写的内容发射给箱子。箱子再把内容都发给移动设备。这样找起东西来就很方便啦。可以在自己的“家庭首页”搜索“小熊”,在手机上就能看到怎么找到小熊的指示。

Estimote beacons 数字砖头 基本概念

Estimote Beacon其实就是一个小电脑,配置了

  • 最重要的BLE(Bluetooth low energy)
  • 32bit ARM
  • 256kB flash RAM
  • 加速传感器
  • 温度传感器

Beacon的信号范围为5cm到70m左右。支持BLE的设备(一般都是手机啦)可以**同时**接收多个beacon的信号,在同时收到3个以上信号的时候,手机就可以根据这些信号计算出距离beacon的**相对位置**
当然,每一个beacon都有的自己的唯一ID。要想看周围有哪些beacon,可以用这个软件BLExplr app

由于每一个beacon只会发送很小的信息,所以像之前演示视频中那样的图文内容,都需要用户手机使用beacon传输过来的内容ID,再从”云“中获取其对应的内容,这像极了一个保存了<a href>的盒子。而多个布置在不同位置的beacon,就像是把你的小店铺HTML化了一样——这里有个<img>那里有个<a href>。而对于IT圈的人,自然会想到爬虫,搜索,广告等,然后就会想到Google。当然Estimote不会放弃成为这个物联网时代的Google,他们承诺即将宣布用于存储beacon推送内容的云服务。除了内容托管,相比大家也已经想象出了很多其他的应用场景,比如把到店里闲逛的用户想象成spiders爬来爬去…

gettingstarted3

数字篱笆(Geofencing)
这个概念与beacon没啥关系,意思就是用户可以在自己的手机上订阅(subscribe)某个beacon,一旦以后进入这个beacon的区域就会收到提醒。即使手机处于锁定状态,甚至app没有运行(不清楚为什么,应该是OS做的,跟NFC似的)。

距离监控和提醒
这也是在手机上完成的。手机根据beacon的信号强度计算出距离以后,按照预设的两个值将这种距离分为三类:远,中,近。一旦这个分类出现变化——用户走进/原理了某个beacon,程序就能收到提醒。

App时代到了现在,大家都在踌躇怎么占领入口,抢Launcher,ROM,App store,锁屏页,浏览器。而那些并不垄断的,比较开放的入口,却没有被足够重视,如二维码,NFC,BLE。Beacon又打开了另一个入口,不知这次会怎样?

下面就要进入具体的code啦。由于这玩意儿几乎完全是为了移动设备做的,所以如果不会android或者iOS的话…就…就学吧:)

我的Daydream trello board

Estimote beacons 数字砖头 (1)

Estimote是做什么的?
App store部署iBeacon

好啦就是这玩意儿。preorder了几天以后就发货了,在海关带了一周,交了61块钱关税终于玩上啦!
开封照们。居然名字都是手写的,真可爱!现在iBeacons都是手工制作居然,还能日出货量上千!

IMG_20131226_204231 IMG_20131226_204310 IMG_20131226_213001 IMG_20131226_214501

下载App store上的Estimote应用(iPhone only)就可以看到它的基本功能展示:距离,临近,提醒。选中任何功能后都能看到个大概的意思。其中distance里看出来它的测距精度还是不错的,可以到厘米级别,而且有效距离很远!而且据说电量特别持久(号称两年)。

IMG_20131226_214501 IMG_20131226_215126 IMG_20131226_215301 IMG_20131226_215238

基本功能呢,用这几个就能描述:
向设备发送内容
对设备定位

所以,基本上用这玩意儿就能做成一个“智能”零售店—— http://v.youku.com/v_show/id_XNjA3OTcwMzI0.html
“智能”的推荐商品周边信息(其中相关SNS信息会很好玩)。
商店内的热度统计,物理版Google Analytics。
更快速的支付。想象一下以后进商店可以拿了东西就走…当然还是得付钱…
还有呢?嗯,我觉得把前三点做成商品就已经会有很大很大的市场了!

所以?嗯,接下来我会依次把“智能商品推荐”,“商店内热度统计”做成demo。
欢迎一起来玩儿哈!

我的Daydream trello board

在WordPress.com的博客.

向上 ↑