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 farol transmitir -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 |
repositórios { jcentro() } |
Em seguida, adicione a biblioteca real:
1 2 3 4 5 6 |
dependências { ... compilar '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 |
Gerenciador de beacon gerenciador de beacon = org.altbeacon.farol.Gerenciador de beacon.getInstanceForApplication(este); Registro.d(TAG, "Configuração do monitoramento em segundo plano para beacons e economia de energia"); // ativar o aplicativo quando um beacon for visto Região região = novo Região("backgroundRegion" (região de fundo), nulo, nulo, nulo); regionBootstrap = novo RegionBootstrap(este, região); backgroundPowerSaver = novo Plano de fundoPowerSaver(este); gerenciador de beacon.setBackgroundScanPeriod(1000); gerenciador de beacon.setBackgroundBetweenScanPeriod(1000); gerenciador de beacon.setForegroundBetweenScanPeriod(1000); gerenciador de beacon.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 |
@Substituir público vazio didEnterRegion(Região região) { // Nesse exemplo, essa classe envia uma notificação ao usuário sempre que um Beacon // que correspondem a uma Região (definida acima) são vistos pela primeira vez. Registro.d(TAG, "entrou na região".); se (!haveDetectedBeaconsSinceBoot) { Registro.d(TAG, "lançamento automático de MainActivity"); // Na primeira vez desde a inicialização em que detectamos um beacon, lançamos o // MainActivity Intenção intenção = novo Intenção(este, BeaconListActivity.classe); intenção.setFlags(Intenção.FLAG_ACTIVITY_NEW_TASK); // Importante: certifique-se de adicionar android:launchMode="singleInstance" no manifesto // para evitar que várias cópias dessa atividade sejam criadas se o usuário tiver // já iniciou o aplicativo manualmente. este.startActivity(intenção); haveDetectedBeaconsSinceBoot = verdadeiro; } mais { se (beaconListActivity != nulo) { // Se a atividade de monitoramento estiver visível, registraremos informações sobre os beacons que temos // visto em sua tela Registro.i(TAG, "Estou vendo um farol novamente"); } mais { // Se já tivermos visto beacons antes, mas a atividade de monitoramento não estiver em // o primeiro plano, enviamos uma notificação ao usuário sobre as detecções subsequentes. Registro.d(TAG, "Enviando notificação".); 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 |
@Substituir público vazio onBeaconServiceConnect() { gerenciador de beacon.setRangeNotifier(novo RangeNotifier() { @Substituir público vazio didRangeBeaconsInRegion(Coleção sinalizadores, Região região) { se (sinalizadores.tamanho() > 0) { Farol primeiroBeacon = sinalizadores.iterador().próxima(); Documento beaconVisit = banco de dados.createDocument(); Mapa<string, objeto=""> propriedades = novo HashMap<string, objeto="">(); propriedades.colocar("tipo", "beacon-visit"); propriedades.colocar("channel" (canal), primeiroBeacon.getId1().toString() + primeiroBeacon.getId2().toString() + primeiroBeacon.getId3().toString()); propriedades.colocar("visitDate", Sistema.currentTimeMillis()); tentar { beaconVisit.putProperties(propriedades); beaconApp.doSync(); } captura (CouchbaseLiteException e) { lançar novo Exceção de tempo de execução(e); } } } }); tentar { gerenciador de beacon.startRangingBeaconsInRegion(novo Região("myRangingUniqueId", nulo, nulo, nulo)); } captura (RemoteException e) { lançar novo Exceção de tempo de execução(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!