Beacons. Esses pequenos dispositivos podem se tornar onipresentes no futuro. Tudo começou com os iBeacons da Apple, AltBeacon, e o Google agora está criando sua própria plataforma chamada Eddystone. Isso vai ser interessante.
Se você não sabe o que é um beacon, ele é uma coisa idiota que só sabe emitir sua presença para o mundo. Esse é o único objetivo de um sinalizador. Dizer a quem estiver ouvindo ao alcance que ele está aqui e seu nome é e9ae6b9f-7238-4df6-8497-dec29ebf4184 (ou algo parecido). Ele faz isso usando Bluetooth LE (Ou Bluetooth Low Energy, BLE, Bluetooth Smart).
Isso significa que um beacon é útil quando você tem um aplicativo que sabe como reagir à presença do beacon. O aplicativo precisa saber o que fazer quando o usuário encontra o beacon. E talvez o que fazer mude com o tempo. Se você passar por um beacon em um supermercado, o aplicativo poderá mostrar o que está em promoção no momento. E, obviamente, isso mudará com o tempo. Portanto, uma coisa boa ao trabalhar com beacons é poder redirecioná-los. Isso é algo que o Couchbase Mobile pode lhe oferecer. Sincronize facilmente um novo comportamento para um determinado beacon.
E, é claro, como funciona off-line, ele sempre pode fazer o que se pretende, mesmo que o usuário não tenha conexão de rede. Você também pode salvar um documento localmente com informações sobre o alcance do sinalizador pelo usuário e sincronizá-lo posteriormente com o servidor. Isso pode fornecer alguns dados interessantes sobre o comportamento dos usuários em um local sem ou com pouca conectividade de rede. Pense em qualquer grande evento ao ar livre, por exemplo.
Comecei a brincar com essas ideias em várias conferências e encontros. Veja como começar a usar Beacons e Android.
Teste de beacons
Poder testar beacons é a primeira coisa que eu queria fazer. E a razão para isso é que não tenho beacons :). O que pode parecer estranho, eu sei. Mas um beacon é apenas um dispositivo bluetooth de baixa energia. Tenho bluetooth no meu Mac, também tenho alguns dongles BLE e um RaspberryPi, tudo deve estar bem.
As pessoas maravilhosas da Radius Networks criaram uma imagem de VM que pode simplesmente funcionar como um sinalizador. Tudo é explicado em seu site site. Se você tiver um Mac e quiser usar o hardware Bluetooth dele no VirtualBox, saiba que é necessário desativá-lo primeiro no host da VM. Se você tiver um dongle Bluetooth, é muito rápido, basta verificar se o VirtualBox está configurado para usá-lo.
Eles também criaram o PiBeacon. É praticamente um kit de desenvolvimento de Beacon baseado no RaspberryPI. E você pode baixar a imagem para o Raspberry aqui. Instruções completas também podem ser encontradas no site site.
Depois de ter o Raspberry em execução com a imagem, você pode fazer o SSH nele e executar algo como
|
1 2 |
sudo beacon transmit -A -f 5 -1 00000000-0000-0000-0000-000000000000 -2 0 -3 0 -r 0 |
Isso simulará um transmissor de beacon. Eles têm três identificadores. Um UUID, uma versão principal e uma versão secundária. Isso faz parte da camada comum entre todos os formatos de beacons, como AltBeacon (formato aberto), iBeacon (Apple) e EddyStone (Google). E é isso que os aplicativos usam para identificar beacons.
Eu queria ter certeza de que tudo estava funcionando corretamente, então instalei o BeaconScanner no meu Mac e outro aplicativo de escaneamento de Beacon no meu telefone. Ambos captaram o sinal e eu estava pronto para trabalhar em meu aplicativo.
Android e beacons
Eu queria manter tudo o mais simples possível, então optei pelo AltBeacon pilha. Tudo é código aberto e eles têm uma bela Biblioteca do Android. Eles também têm um design agradável e fácil de entender amostras de código que facilitou o início. Portanto, antes de mais nada, inclua a dependência correta em seu aplicativo. Comece adicionando o repositório maven do JCenter:
|
1 2 3 4 |
repositories { jcenter() } |
Em seguida, adicione a biblioteca real:
|
1 2 3 4 5 6 |
dependencies { ... compile 'org.altbeacon:android-beacon-library:${altbeacon.version}' ... } |
Outra coisa que você pode modificar corretamente é adicionar a permissão correta ao seu aplicativo AndroidManifest.xml:
|
1 2 3 |
Há basicamente duas coisas que você pode fazer com o Couchbase Mobile. Você pode atuar como cliente e reagir à presença de um beacon, ou pode atuar como backend e configurar os beacons.
Vamos começar pelo código que inicializa o serviço de beacon em segundo plano. Em seu aplicativo, ao criar, você pode executar o seguinte código:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); Log.d(TAG, "setting up background monitoring for beacons and power saving"); // wake up the app when a beacon is seen Region region = new Region("backgroundRegion", null, null, null); regionBootstrap = new RegionBootstrap(this, region); backgroundPowerSaver = new BackgroundPowerSaver(this); beaconManager.setBackgroundScanPeriod(1000); beaconManager.setBackgroundBetweenScanPeriod(1000); beaconManager.setForegroundBetweenScanPeriod(1000); beaconManager.setForegroundScanPeriod(1000); |
Configurei um tempo agressivo para fins de teste. Você usaria uma duração maior na produção. Minha classe de aplicativo também implementa a interface BootstrapNotifier. O método didEnterRegion permite que uma atividade específica seja iniciada ao entrar no alcance de um beacon.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
@Override public void didEnterRegion(Region region) { // In this example, this class sends a notification to the user whenever a Beacon // matching a Region (defined above) are first seen. Log.d(TAG, "did enter region."); if (!haveDetectedBeaconsSinceBoot) { Log.d(TAG, "auto launching MainActivity"); // The very first time since boot that we detect an beacon, we launch the // MainActivity Intent intent = new Intent(this, BeaconListActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Important: make sure to add android:launchMode="singleInstance" in the manifest // to keep multiple copies of this activity from getting created if the user has // already manually launched the app. this.startActivity(intent); haveDetectedBeaconsSinceBoot = true; } else { if (beaconListActivity != null) { // If the Monitoring Activity is visible, we log info about the beacons we have // seen on its display Log.i(TAG, "I see a beacon again"); } else { // If we have already seen beacons before, but the monitoring activity is not in // the foreground, we send a notification to the user on subsequent detections. Log.d(TAG, "Sending notification."); sendNotification(); } } } |
Essa atividade conterá o código que você deseja exibir, dependendo do ID do beacon, por exemplo. Ou talvez você queira apenas salvar um documento para registrar que o usuário atual esteve ao alcance de um determinado beacon. Essa é a primeira coisa que quero fazer. Portanto, preciso de uma atividade que implemente a função BeaconConsumidor interface.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
@Override public void onBeaconServiceConnect() { beaconManager.setRangeNotifier(new RangeNotifier() { @Override public void didRangeBeaconsInRegion(Collection beacons, Region region) { if (beacons.size() > 0) { Beacon firstBeacon = beacons.iterator().next(); Document beaconVisit = database.createDocument(); Map<string, object=""> properties = new HashMap<string, object="">(); properties.put("type", "beacon-visit"); properties.put("channel", firstBeacon.getId1().toString() + firstBeacon.getId2().toString() + firstBeacon.getId3().toString()); properties.put("visitDate", System.currentTimeMillis()); try { beaconVisit.putProperties(properties); beaconApp.doSync(); } catch (CouchbaseLiteException e) { throw new RuntimeException(e); } } } }); try { beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); } catch (RemoteException e) { throw new RuntimeException(e); } } </string,></string,> |
Esse é um código muito básico, mas você entendeu a ideia. Nesse momento, você também pode sincronizar um canal com o nome do identificador do Beacon. Dessa forma, você obtém todas as informações necessárias para exibir informações significativas para o usuário. E se essas informações mudarem com o tempo, tudo o que você precisa fazer é modificar o documento que contém o comportamento do beacon e sincronizá-lo novamente com todos os usuários. É muito fácil criar um backend de beacon com o API REST do gateway de sincronização :)
Então, o que você acha dos beacons? Já é um usuário? Gostaria que falássemos mais sobre o assunto? Diga-nos o que você pensa!