Iniciando com a plataforma Android Things

plataforma Android Things

O que é Android Things?

 

Com a alta demanda do mercado de Internet das Coisas, em 2015 a empresa Google anunciou seu novo sistema direcionado para este mercado, o Brillo, que seria uma versão mais simples do Android para aparelhos com menos recursos que os smartphones.

 

Segundo o gigante do Vale do Silício, durante seu curto período de utilização a empresa reuniu feedbacks acerca do sistema e os incorporou no Android Things, que foi anunciado oficialmente em maio de 2016.

 

Anunciado como uma plataforma para desenvolvimento rápido e de baixo custo de desenvolvimento, permite a utilização de diversas APIs dos serviços Google, como a Google Cloud Platform, Google Play Services, Firebase e o Android Studio para desenvolvimento de suas aplicações.

 

Lançada com o intuito de alavancar o desenvolvimento de sistemas de IoT, permite que qualquer desenvolvedor de software (sem conhecimento em desenvolvimento de hardware) se aventure a ciar novos projetos de hardware, com a promessa de uma fácil conversão de seus projetos em um produto final.

 

Utiliza de conceitos conhecidos por desenvolvedores Android, como ciclos de vida de software, linguagem de programação Java (ou nos dias atuais Kotlin), entre outros. Isso tudo torna o engajamento no mercado algo mais rápido e com um custo baixo de desenvolvimento.

 

 

Arquitetura

 

Hardware

 

Segundo Google, o Android Things oferece uma plataforma de hardware pronta para uso. Com suas placas baseadas na arquitetura System on Module (SoM), oferece uma estrutura para iniciar rapidamente, com os seguintes benefícios:

  • Suas SoMs integram o SoC (System on chip), RAM, armazenamento flash, WiFi, Bluetooth e outros componentes em uma única placa. Esta placa vem com todas certificações necessárias da FCC. Para produção em massa você pode remover os componentes desnecessários para seu produto e incluir seus novos, criando uma nova PCB para economizar espaço.
  • Google BSP - O BSP (Board Support Package) é gerenciado pela Google, isto significa que você não terá que desenvolver o kernel ou o firmware. A google disponibiliza uma plataforma confiável com atualizações e correções.
  • Hardware diferenciado - Seus parceiros fornecem placas de desenvolvimento com diferentes SoMs e formatos para atender suas necessidades, oferecendo a você a escolha e flexibilidade. E quando estiver pronto, você pode transformar seu protótipo em um produto, personalizando-os para um formato adequado, tudo isso com o mesmo software.

 

Em outras palavras, utilizando das SoMs certificadas pela Google, você não precisará se preocupar com algumas certificações, desenvolvimento do BSP, ou atualizações de Kernel. Irá se preocupar mais com layout e componentes que serão necessários para você.

 

 

SDK

 

Segundo Google, o Android Things é uma extensão do núcleo do Android Tradicional, porém, com algumas APIs adicionais que permitem com que o desenvolvedor possa inserir novos tipos de hardware não encontrados em smartphones.

 

Abaixo podemos ver uma imagem retirada do site oficial do google, percebe-se que a arquitetura do sistema operacional continua muito parecida com a do tradicional Android.

 

Abaixo pode-se ver uma imagem onde se compara os dois sistemas:

 

Comparação entre Android tradicional e Android Things.

A imagem acima representa as principais diferenças entre eles, dentre elas estão a inclusão da biblioteca para IoT (Things Support Library), a remoção de aplicações desnecessárias como: launchers, mensageiros, calculadora, etc. Deixando o mínimo para um bom funcionamento em hardwares de baixo desempenho. O que torna possível a inclusão do sistema nesse mundo de internet das coisas.

 

 

O Projeto

 

A fim de testar as funcionalidades do Android Things, foi desenvolvido um projeto simples, seguindo os seguintes passos:

  • Design do Hardware;
  • Desenvolvimento do Software;
  • Integração com Firebase e seu serviço Realtime Database;
  • Criação de imagem de sistema utilizando a plaforma do Android Things;
  • Atualização via OTA (Over the air).

 

Seguindo este passo a passo foi possível verificar o quão simples é a sua utilização para prototipagem de um produto e observar suas principais vantagens e desvantagens.

 

Neste projeto foi desenvolvido um sistema que permite o controle de um motor remotamente, utilizando um Rele Shield conectado à Raspberry Pi 3 e o motor ligado ao Shield. Utilizamos também a IDE Android Studio para desenvolvimento, com a nova linguagem principal para desenvolvimento de aplicações Android, o Kotlin.

 

No texto abaixo você poderá acompanhar o passo a passo para desenvolvimento dos testes, desde a instalação do sistema na Raspberry até a utilização das atualizações via OTA.

 

 

Instalando o sistema em uma Raspberry Pi

 

Primeiramente você deve realizar o download do "Setup Utility" para baixar e instalar a imagem do sistema operacional no cartão de memória, para isso você deve seguir os seguintes passos:

 

 

Download do Android Things.

 

Logo você deve utilizar a aplicação baixada para dar continuidade, é simples, basta executar e seguir os passos abaixo:

  1. Inserir o SD na máquina;
  2. Descompactar o arquivo baixado;
  3. Executar o android-things-setup-utility-{SO};
  4. Selecionar a opção 1 "Install Android Things and optionally set up Wi-Fi";
  5. Selecione o Hardware que irá utilizar;
  6. Espere o download completar;
  7. Selecione o tipo de imagem do SO que irá utilizar:
    1. "Default image": Utilizada normalmente para iniciar um projeto;
    2. "Custom image": Utilizado quando você precisa configurar algumas especifidades no seu hardware, como protocolos utilizados nas conexões. Isso deve ser configurado utilizando o Console do Android Things, após configurado você pode realizar o download da imagem gerada e utilizar esta opção. Neste caso utilizamos a primeira opção.
  8. Espere o download do SO completar;
  9. Pressione "Enter", ao final você terá executado os passos conforme o console abaixo.

 

 

Realizando os passos acima você já pode dar início ao desenvolvimento de seu produto utilizando as conexões e protocolos disponíveis. O Android Things conta com uma grande comunidade com diversos projetos abertos, que você pode acessar em hackster.io.

 

 

Criando um projeto

 

Hardware

 

Com o sistema instalado e funcionando pôde-se dar início ao desenvolvimento do nosso hardware. Não utilizamos nenhum dos projetos disponibilizados no hackster.io e sim algo mais simples, como o controle de um motor com inversão de corrente utilizando um shield de arduino com 2 RELES e um botão, como pode-se ver abaixo:

 

Projeto com Android Things.

 

A imagem abaixo demonstra exatamente como foram realizadas as conexões:

 

Conexões do projeto.

 

Com o layout do hardware montado, podemos dar início ao desenvolvimento da aplicação que irá rodar no Android Things, permitindo o controle do motor.

 

Software

 

Para dar início ao desenvolvimento da nossa aplicação é necessário conhecer um pouco a ferramenta Android Studio. Caso já tenha conhecimento sobre, você já poderá pular para página "Desenvolvendo o App", caso contrário você deve seguir os seguintes passos para continuar:

 

Requisitos

 

  • Android Studio 3.1.2
  • Conexão com a mesma rede da Raspberry com Android Thgins
  • Conta criada no Firebase

 

Criando um projeto no Android Studio

 

Obs.: Nesse projeto iremos utilizar o "Realtime Database", banco de dados de tempo real do Firebase, permitindo controlar o dispositivo à distância. Para que seja possível continuar o tutorial até o final será necessário que se crie uma conta na plataforma.

 

  1. Inicie um novo projeto:

 

Criando um projeto com Internet Things no Android Studio.

 

Neste projeto utilizamos a nova linguagem oficial para desenvolvimento de aplicações android (Kotlin), por isso foi marco o checkbox "Include Kotlin support".

 

2. Marque apenas o SDK do Android Things:

 

Instalação do SDK.

 

3. Na etapa a seguir você tem 3 opções:

 

Opções de criação do projeto.

 

* No Activity (Caso você queria desenvolver do zero sem nenhum tipo de activity criada);

* Android Things Empty Activity (Caso você utilize um display conectado ao seu módulo e deseje exibir ou controlar qualquer tipo de aplicação por lá);

* Android Things Peripheral Activity (Para desenvolvimento de aplicações sem a necessidade de um display).

 

Para nosso projeto selecionamos a 3ª Opção.

 

4. Na etapa a seguir não selecionamos nenhum tipo periférico, mas o Android Studio conta com diversos templates de como conectar um botão por exemplo.

 

Configurando uma Activity.

 

5. Selecione "Finish" (Finalizar) e aguarde até que o projeto seja criado.

 

Finalizando a criação do projeto.

Projeto criado.

 

6. Antes de começar precisamos adicionar a permissão para acessar as GPIOs do hardware. Para fazer isso é necessário alterar o arquivo AndroidManifest.xml e adicionar as seguintes linhas:

 

 

 

Desenvolvendo seu primeiro App

 

Antes de darmos início ao desenvolvimento é importante verificar se tudo esta funcionando corretamente. Você pode incluir as seguintes linhas de código:

 

 

E rodar a sua aplicação na RPi, mas antes de rodar você deve executar o comando adb connect {ip Rpi} para que seja possível encontrar o dispositivo e enviar a sua aplicação para rodar na RPi.

 

Ao executar esta etapa você poderá verificar todas as GPIOs disponíveis para utilização, como pode ver na imagem abaixo:

 

Listando GPIOS.

 

Como você pode perceber cada nome representa uma GPIO na RPi. Abaixo uma imagem demonstrando a configuração padrão de uma RPi3:

 

Configuração de uma Raspiberry Pi 3

 

Com nossa aplicação testada, podemos continuar o desenvolvimento. Utilizamos 3 GPIOs no nosso projeto, sendo:

  • BCM4 (Botão de controle);
  • BCM20 (Relê número 1);
  • BCM26 (Relê número 2).

 

Então precisamos definir suas variáveis e configurá-las, nesse caso para melhor legibilidade criamos um método responsável por configurar os relês e outro para configurar o botão, como no exemplo abaixo:

 

 

A configuração é simples, como pode-se ver no código acima, porém na linha firstRele.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW) você pode verificar uma particularidade com o parâmetro. É possível selecionar dois valores diferentes para GPIOS onde você irá ativar ou desativar alguma coisa:

  • DIRECTION_OUT_INITIALLY_LOW (Por padrão irá iniciar desativado);
  • DIRECTION_OUT_INITIALLY_HIGH (Por padrã irá iniciar ativado). Dependendo da sua lógica de utilização você pode utilizar um ou outro.

 

Já nas linhas onde configuramos o botão, precisamos incluir a dependência do driver de botão no build.gradle:

implementation 'com.google.android.things.contrib:driver-button:+'

 

Esta biblioteca já nos entrega uma classe para configurar de forma mais simples. Ao utilizar a função register() da classe, você deve implementar 2 métodos para que seja possível capturar os eventos do botão. Sendo eles:

 

 

Cada método é uma implementação para capturar um evento específico do botão, sendo quando ele é pressionado e quando é solto, é possível atribuir uma função em cada momento.

 

Enfim com essas funcionalidades configuradas, podemos desenvolver nossa lógica de funcionamento.

 

Com as ligações feitas, vamos precisar de um modelo para controlar quando o motor está ligado girando para esquerda ou para direita. No caso vamos criar um enum com essas possibilidades, em novo arquivo:

 

 

Com o modelo criado podemos utilizá-lo para criar a nossa lógica de funcionamento na Main Activity.

 

Para isso vamos definir uma nova variável do utilizando o tipo MotorStatus para que possamos gravar o estado atual do motor.

 

 

Com a variável definida criamos um método para alternar entre os status possíveis do motor.

 

 

E alteramos o evento onKeyDown para setar ao pressionar o botão:

 

 

Ao executar este código já podemos controlar o nosso motor.

 

Agora vamos conectar ao Firebase utilizando as ferramentas disponíveis para configuração, no próprio Android Studio. Siga os seguintes passos:

 

  1. Pressione o menu "Tools -> Firebase":

 

Configurando o Firebase.

 

2. Selecione no menu à direita "Realtime Database" -> "Save and retrieve data":

 

Configurando o Firebase com Realtime Database.

 

3. Clique em "connect to Firebase", você será redirecionado para página de login do Google:

 

Fazendo login no Google.

 

4. Faça o login e permita o acesso do Android Studio. Retorne ao Android Studio e crie um novo projeto Firebase:

 

Criando novo projeto Firebase.

 

5. Feito isso acesse novamente o menu "Tools -> Firebase -> Realtime Database -> Save and retrieve data", para conferir se foi configurado corretamente, nesta mesma aba você pode visualizar um pequeno tutorial de como utilizar o Realtime Database:

 

Como utilizar o Realtime Database.

 

Feito esta configuração podemos continuar o desenvolvimento do projeto, mas como precisamos rodar isso em uma outra thread, para não causarmos problemas de concorrência com os listeners do botão, vamos criar uma classe com 2 métodos. Um utilizando um padrão conhecido da linguagem Kotlin, o chamado "doAsync", e outro para que possamos chamar o método "sleep" para bloquearmos uma thread por um tempo determinado. Para isso vamos criar uma classe denominada Global utilizando o patern "Singleton":

 

 

Com nossos "helpers" criados podemos criar nosso modelo do motor para utilização no firebase:

 

 

Com o modelo criado, pode-se criar uma classe que ficará responsável por salvar dados no banco ou ler os dados nossa "entity":

 

 

Com a entidade criada podemos utilizá-la na activity para salvar o estado do motor. Para isso devemos alterar o método turnMotor da activity e incluir a seguinte linha:

 

 

Essa linha ficará responsável por chamar a entidade e salvar o estado atual do motor, o método completo ficará como no exemplo abaixo:

 

 

Para que tudo funcione corretamente e que seja possível verificar, você pode chamar o método na inicialização da activity incluindo a chamada dentro do método onCreate, deixando-o como o exemplo abaixo:

 

 

Após executar o tópico acima você poderá executar a aplicação para verificar se foi criado o objeto no banco de dados, acessando o console do firebase -> {nome do projeto} -> database:

 

Verificando se o objeto de banco de dados foi criado.

Verificando se o objeto de banco de dados foi criado.

 

Caso tudo tenha ocorrido bem, você poderá visualizar a estrutura criada no banco de dados.

 

Agora precisamos assinar o banco de dados no mesmo objeto, para que seja possível controlar o dispositivo à distância. Para isso devemos implementar um novo método na activity que será responsável por isso, e chamar este método na inicialização da aplicação:

 

 

Pronto! A aplicação já está pronta e você pode controlar o motor a distância, alterando o status no "Realtime Database".

 

 

Criando uma imagem

 

Com a aplicação pronta você pode gerar o apk para que possamos gerar uma imagem personalizada do S.O. com sua aplicação. Para isso acesse o menu "build -> Build APK(s)":

 

Build do apk.

 

Feito isso você poderá encontrar o apk no diretório do projeto em: "./app/build/outputs/apk/debug".

 

Para gerar a imagem você deve acessar o painel do Andrid Things, entrar e criar um novo produto:

 

Como gerar a imagem.

Como gerar a imagem.

Como gerar a imagem.

 

Com o produto criado acesse o menu "App Libary" e selecione "ADD AN APP":

 

Adicionando APP.

Adicionando APP.

 

Selecione o seu apk e envie. Volte na página do seu produto e selecione o modelo que foi criado automaticamente:

 

Adicionando APP.

Adicionando APP.

 

Crie uma nova build pressionando o botão "NEW -> Use Starter Kit":

 

Criando nova build.

 

Escreva um nome para a versão da build e selecione next.

 

Criando nova build.

 

Pressione "NEXT" novamente. Nesta etapa você deve selecionar o aplicativo que enviou.

 

Adicionando a nova app.

 

Pressione "APPLY" e irá aparecer uma nova tela para selecionar as permissões, selecione todas e clique em "SAVE".

 

Selecionando as permissões.

 

Feito isso pressione "NEXT", "NEXT", "NEXT" e "CREATE BUILD".

 

Criando build.

Criando build.

Criando build.

 

Agora você pode realizar o download da imagem do SO com sua aplicação. Pressione o botão download e aguarde o download finalizar.

 

Download da app.

 

Após finalizar o download da imagem, abra novamente o setup utility e siga o passo a passo. Agora selecionando "Custom image", passe o path do arquivo baixado, aguarde descompactar a imagem, insira seu cartão SD e pressione enter, selecione seu SD, confirme a mensagem de aviso, aguarde terminar. Finalize coloque o SD na RPi e pronto, você já estará com o sistema rodando com sua aplicação baseada no seu hardware. Abaixo o passo a passo executado no "Setup Utility":

 

 

Ao terminar e instalar o SD você irá perceber que sua aplicação não está rodando, ela não está iniciando no boot do Android Things. Para resolver isso você deve alterar o AndroidManifest.xml e alterar a intent-filter substituindo a category IOT por HOME, deixando-a como no exemplo abaixo:

 

 

Crie um novo apk, envie e para o console do android things. Acessando o menu "App libary", selecione o seu App e pressione o botão "UPLOAD a NEW VERSION". Feito isso podemos testar a atualização OTA.

 

 

Atualização via OTA

 

Enviada a nova versão do seu app, acesse o seu produto, selecione o modelo, e crie uma nova build seguindo os passos do tópico 19 ao 20. Se atente em alterar a versão do app durante a criação da nova build.

 

Feito isso, na mesma página acesse o menu "RELEASE":

 

Atualização via OTA.

 

Selecione o canal "stable-channel":

 

Atualização via OTA.

 

Pressione o botão "START A NEW UPDATE":

 

Atualização via OTA.

 

Selecione a nova build, pressione next e "PUSH BUILD".

 

Atualização via OTA.

 

Feito isso aguarde por até 5 horas e seu dispositivo será atualizado via OTA.

 

 

Conclusão

 

Desenvolver um produto utilizando esta nova plataforma da Google é uma tarefa descomplicada. Utilizando a plataforma, um desenvolvedor de Software pode-se aventurar a criar produtos de hardware.

 

Apesar de tudo parecer simples, a plataforma ainda está em desenvolvimento, até o momento dia 11/07/2018 só é possível utilizá-la para o desenvolvimento de uma POC (Prova de Conceito), apesar de no site oficial demonstrar que será possível utilizar para produção utilizando SOMs (System on Module) como:

  • NXP i.MX8M;
  • Qualcomm SD212;
  • Qualcomm SDA624;
  • MediaTek MT8516 (Específicação do hardware utilizando o chip).

 

No dia de hoje a empresa não disponibiliza a imagem do S.O. para utilização. Também pode-se dizer que quando for possível, você estará limitado a desenvolver produtos com um custo alto. Em minhas pesquisas a SOM compatível mais barata está saindo por US$ 40,00. Outro ponto que é importante nos atentarmos: a empresa não permite que possamos alterar/desenvolver o BSP (Board Support Package), limitando aos dispositivos de hardware que serão compatíveis com os protocolos disponíveis pelo sistema, dentre eles:

  • UART;
  • I2C;
  • SPI;
  • PWM;
  • GPIO.

 

Pontos positivos

 

Atualização OTA (Over the Air):

 

Um sistema complicado para desenvolver, já que o desenvolvedor precisa tratar de riscos, segurança e recuperação de falhas. A plataforma entrega isso de uma forma simplificada e intuitiva. Com poucos cliques você pode atualizar todos seus dispositivos de forma automática e segura.

 

Integração com os serviços Google Cloud/Firebase

 

A Google hoje apresenta inúmeros serviços que podemos integrar em nossas aplicações, dentre elas, sistemas de filas como Pub/Sub, BigQuery, Realtime database, etc... Utilizando dessas bibliotecas, juntamente com o Android Things, torna-se possível o desenvolvimento de produtos como "Google Home", onde você poderá controlar seus dispositivos utilizando a voz. A integração com esses serviços se torna muito simples, pois para um desenvolvedor que tenha experiência com Android, para ele não irá mudar em praticamente nada o que faz.

 

Desenvolvimento utilizando linguagens de Alto nível

 

  • Kotlin;
  • Java.

 

Pontos negativos

 

  • Sistema Fechado;
  • Impossibilidade de desenvolver o BSP;
  • Alto custo de produção.

 

 

Saiba mais

 

Estratégias de Desenvolvimento de Hardware para Sistemas Embarcados - Arquitetura Modular

Plataformas Home Hub da Qualcomm para Android Things

Conhecendo o Android Things e Actions SDK

NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Alison Rafael Marinho Gonçalves
Especialista em Sistemas no ICC (Inatel Competence Center), formado em Sistemas de Informação pela UNIVÁS(Universidade do Vale do Sapucaí), Desenvolvedor Full Stack, apaixonado por programação funcional (principalmente em EcmaScript), entusiasta no mundo IoT.

9
Deixe um comentário

avatar
 
5 Comment threads
4 Thread replies
5 Followers
 
Most reacted comment
Hottest comment thread
6 Comment authors
Roberto Rochagleyson SantosFernando O. de Avellar JrSamuel de Souza Lima MoreiraAlison Rafael Marinho Gonçalves Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Roberto Rocha
Visitante
Roberto Rocha

Parabéns pelo artigo, Alison.

Gostei da forma que você organizou a sequência dos passos, além da linguagem clara e do assunto bastante interessante.

gleyson Santos
Visitante
gleyson Santos

Muito bom este artigo!

Informações claras e com todos os passos necessários para quem quiser utilizar essa plataforma em seus projetos.

Parabéns.

Fernando O. de Avellar Jr
Visitante
Fernando O. de Avellar Jr

Excelente artigo! Meus parabéns ao autor!

Samuel de Souza Lima Moreira
Visitante
Samuel de Souza Lima Moreira

Parabéns Alison, excelente tutorial.

Claudio de Oliveira Lopes
Visitante
Claudio de Oliveira Lopes

Fantastico o artigo, parabens ao autor.