Skip to content

Instantly share code, notes, and snippets.

@farribeiro
Last active September 28, 2017 13:25
Show Gist options
  • Save farribeiro/0766983579082ffc882a91ff8dc203bc to your computer and use it in GitHub Desktop.
Save farribeiro/0766983579082ffc882a91ff8dc203bc to your computer and use it in GitHub Desktop.
Android-things
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<h1>Android Things - Aplicativos IoT padronizado para Ind&uacute;stria 4.0</h1>
Autor: Alessandro de Oliveira Faria (A.K.A. CABELO) &lt;cabelo at opensuse.org&gt;
Data: 23/09/2017
<h1>Introdução</h1>
<p>Primeiramente, agradeço o trabalho em conjunto a Mackenzie no LabSec
(Laboratório de Pesquisas em Segurança Cibernética, cuja orientadora é minha
mentora Prof. Dra Inês Brosso). Pois todo trabalho de pesquisa e inovação,
somente avança quando o espírito colaborativo lidera os ideais de todo o
projeto.</p>
<a href="//img.vivaolinux.com.br/imagens/artigos/comunidade/cabelo_edison.jpg" target="_blank"><img src="//img.vivaolinux.com.br/imagens/artigos/comunidade/thumb_cabelo_edison.jpg" width=200 height=112 border=0 alt="Linux: Android Things : Aplicativos IoT padronizado para Ind&uacute;stria 4.0" /></a>
<p>Com a evolução da internet das coisas, inúmeros <a
href="//www.vivaolinux.com.br/linux/">Linux</a> embarcados surgem a todo
momento. Entretanto com um elevado números de devices com seus respectivos
drivers, aplicativos e outros, torna-se complexo gerenciar as correções de
vulnerabilidades. Isto é muito grave, pois estes equipamentos destinados para o
mercado de IoT tendem gerenciar nossos eletrodomésticos, armazenar dados
sensíveis e administrar uma gama de informações sem precedentes na história da
tecnologia.</p>
<p>A tecnologia da <em>Internet das Coisas</em> surgiu para revolucionar o
nosso dia a dia, pois nasceu para conectar tudo e todos na rede mundial de
computadores. Ou seja, geladeiras, televisão, micro-ondas, relógios, alarmes,
ar condicionado, termostatos, máquinas de lavar, carros, enfim TUDO! O conceito
vai além de conectar todos os devices e sim torná-los mais eficientes em função
da comunicação.</p>
<p>Com o lançamento de um suposto sistema operacional <q>universal</q>, na teoria,
os equipamentos estão menos vulneráveis. Pois quando uma determinada correção
surge, todos dos dispositivos deveriam se beneficiar deste patch. Ou seja
minimiza-se ao máximo o retrabalho e permite uma evolução da indústria 4.0 mais
segura e padronizada. Pois se um determinador hardware for substituído por
questões estratégica, o código legado seria no mínimo 100% compatível com a
nova plataforma de hardware.</p>
<p>Então em 2016 surge o <em>Android Things</em>, um sistema operacional
baseado no Brillo, uma versão minimalista do <a
href="//www.vivaoandroid.com.br/android/" target="_blank">Android</a> para
executar em hardware simples e/ou modesto voltado para a Internet das Coisas.
Mas a real diferença é que o Android Things utiliza o legado de ferramentas
Android (como Android Studio, Google Play Services e outros), o que torna muito
acelerado a adoção da plataforma.</p>
Atualmente o Android Things é compatível com as plataformas a seguir:
<ul>
<li> Intel Edison (descontinuado) </li>
<li> Intel Joule (descontinuado) </li>
<li> NXP i.MX7D Pico </li>
<li> NXP i.MX6UL Argon </li>
<li> NXP i.MX6UL Pico </li>
<li> Raspberry Pi 3 </li>
</ul>
<p>Eu penso que um dos maiores problemas das câmeras, roteadores e outros
dispositivos modestos, é a falta de atualização. Assim tornando vulneráveis os
sistemas Linux, e por consequência, tornam-se alvo de ataques DDOS, que
atualmente ultrapassa a 1 terabit por segundo.</p>
<a href="//img.vivaolinux.com.br/imagens/artigos/comunidade/arquitetura-plataforma-android-things.png" target="_blank"><img src="//img.vivaolinux.com.br/imagens/artigos/comunidade/thumb_arquitetura-plataforma-android-things.png" width=500 height=233 border=0 alt="Linux: Android Things : Aplicativos IoT padronizado para Ind&uacute;stria 4.0" /></a>
<p>A arquitetura conforme a figura acima é muito semelhante a plataforma
convencional. Percebe-se a presença da API Things Support Library. Cuja função
permite integrar os aplicativos com uma nova gama de hardware denominados
dispositivos não móveis.</p>
<h1>Diferenças entre o Intel Edsion e RaspberryPi</h1>
<dl>
<dt>RaspberryPi</dt>
<dd>basta gravar a imagem com qualquer ferramenta e utilizá-lo, o Android
Things para esta versão possui interface gráfica.</dd>
<dt>Intel Edson</dt>
<dd>necessário o uso de ferramenta flash tools para gravação de firmware, não
possui interface gráfica.</dd>
</dl>
<h1>Instalação no Intel Edison</h1>
<p><strong>ATENÇÃO:</strong> antes de iniciar deixo claro que o leitor deste
post é responsável por qualquer problema que venha a acontecer com o seu
aparelho, sendo de sua inteira responsabilidade e risco a utilização das
instruções a seguir.</p>
<h1>Download dos requisitos</h1>
<p>Os requisitos para este artigo são as ferramentas:</p>
<ul>
<li><a href="https://developer.android.com/studio/releases/platform-tools.html"
rel="nofollow" target="_blank">Android SDK Platform Tools</a>: é necessária a
versão 25.0.3 ou superior, mas acredito estar presente em quase todas
distribuições Linux</li>
<li><a
href="https://01.org/android-ia/downloads/intel-platform-flash-tool-lite"
rel="nofollow" target="_blank">Platform Flash Tool Lite da Intel</a> para o
seu sistema operacional</li>
<li>Imagem <a href="http://tinyurl.com/android-things-edison" rel="nofollow"
target="_blank" rel="nofollow" target="_blank">Android Things</a> para o Intel
Edison</li>
</ul>
<div class="figura"><img src="//img.vivaolinux.com.br/imagens/artigos/comunidade/edison-arduino-connections.png" width=396 height=248 alt="Linux: Android Things : Aplicativos IoT padronizado para Ind&uacute;stria 4.0" /></div>
<p>Conforme a imagem acima, no lado esquerdo da placa, utilize a porta
micro-USB superior (3), ou seja, a mais próxima do Swith.</p>
<p><strong>ATENÇÃO:</strong> apenas e somente se desejar monitorar todo
processo ligue também a segunda porta micro-USB. Não precisaremos conectar a
fonte de energia, a posição do Swith (1) deve estar na posição virado PARA
BAIXO e próximo das portas micro-USB. Para ativar o modo de upload do firmware,
devemos manter o botão FW (2) durante a inicialização do equipamento.</p>
<p>Agora no modo UPLOAD, se optou conectar o cabo a segunda porta micro-USB
utilize o comando a seguir para monitorar o console e boot do Intel Edison:</p>
<pre><samp>
$ sudo screen /dev/ttyUSB0 115200
</samp></pre>
<p>Instale a ferramenta Platform Flash Tool Lite da Intel:</p>
<pre><samp>
# rpm -ivh platformflashtoollite_5.8.3.0_linux_x86_64.rpm
</samp></pre>
<p>Para efetuar a instalação, lembre-se de colocar a placa do Intel Edison no
modo UPLOAD FIRMWARE conforme mencionado anteriormente. E digite
<samp>platformflashtoollite</samp> para utilizar o modo gráfico bastando apenas selecionar
a imagem recentemente baixada:</p>
<pre><samp>
# /usr/bin/platformflashtoollite
</samp></pre>
<div class="figura"><a href="//img.vivaolinux.com.br/imagens/artigos/comunidade/Install_Graphic.png" target="_blank"><img src="//img.vivaolinux.com.br/imagens/artigos/comunidade/thumb_Install_Graphic.png" width=500 height=306 border=0 alt="Linux: Android Things : Aplicativos IoT padronizado para Ind&uacute;stria 4.0" /></a></div>
<p>Ou o comando no modo console conforme o exemplo a seguir:</p>
<pre><samp>
# platformflashtoollitecli -c non_os -f androidthings_edison_devpreview_3.zip -l 3
05/06/17 21:37:45.039 INFO : Intel(R) Platform Flash Tool Lite V 5.8.3.0 x64 (build on Friday February 24th 2017, 05:21:16 UTC)
05/06/17 21:37:45.040 INFO : Using xFSTK Downloader version: 2.0.0
05/06/17 21:37:45.044 INFO : Using DFU Downloader version: 0.8.4
05/06/17 21:37:45.044 INFO : Using DnX Firmware Downloader version: 1.0.0.0 (API: 3.0.0.1108(DBG))
" " " " " " " "
" " " " " " " "
" " " " " " " "
" " " " " " " "
" " " " " " " "
05/06/17 21:38:19.630 INFO : [Port 3] Command `Notify Run 'flash-all.sh' to flash and boot the device.` succeed
05/06/17 21:38:19.630 INFO : [Port 3] Flash success (duration=00:00:34.440)
05/06/17 21:38:19.642 INFO : Platform Flash Tool Lite exited with samp 0
</samp></pre>
<p>Se habilitou com o comando screen o monitoramento do console anteriormente,
teremos as seguintes informações durante a atualização do firmware/bootloader:
</p>
<pre>
<samp>
******* PSH loader *******
PCM page cache size = 192 KB
Cache Constraint = 0 Pages
Arming IPC driver ..
Adding page store pool ..
PagestoreAddr(IMR Start Address) = 0x04899000
pageStoreSize(IMR Size) = 0x00080000
*** Ready to receive application ***
Edison IA32 CPU Firmware
Copyright (C) 1999-2016, Intel Corporation. All rights reserved.
IA32 FW: CPU 3.1 (INTELFDK) [2016.02.24:15.14]
Other FW: OEM 3.1 (OEMHOOKS); SCU BS 00B0.0003, RT 00B0.0049; C 0000.0045
PSH B018.2B2B; IFWI 00ED.1D0E; PL 824
Hardware: SOC B0 800; 406A8; 50504:292929:505:4E4E
Starting OS recovery
OS recovery complete
Resetting platform
</samp></pre>
Após gravar o bootloader (ou firmware), o sistema reiniciará, para verificar se tudo esta funcionando corretamente, execute o comando a seguir:
<pre><samp>
# fastboot devices
1b2f21d4e1fe0129 fastboot
</samp></pre>
<p>Agora descompacte o arquivo <a href="//www.vivaoandroid.com.br/android/"
target="_blank">Android</a>things_edison_devpreview_3.zip, entre na pasta recém
criada e execute o comando flash-all para gravar a imagem do Android.</p>
<pre><samp>
# ./flash-all.sh
target reported max download size of 117440512 bytes
sending 'gpt' (33 KB)...
OKAY [ 0.010s]
writing 'gpt'...
OKAY [ 0.148s]
" " " " " " " "
" " " " " " " "
" " " " " " " "
" " " " " " " "
OKAY [ 0.195s]
writing 'oem_b'...
OKAY [ 0.864s]
finished. total time: 2.122s
Successfully flashed your Edison.
rebooting...
finished. total time: 0.101s
</samp></pre>
<p>Se habilitou com o comando screen o monitoramento do console, novamente
teremos as seguintes informações durante a atualização do
firmware/bootloader:</p>
<pre><samp>
******************************
PSH KERNEL VERSION: b0182b2b
WR: 20104000
******************************
SCU IPC: 0x800000d0 0xfffce92c
PSH miaHOB version: TNG.B0.VVBD.0000000c
microkernel built 11:24:08 Feb 5 2015
******* PSH loader *******
PCM page cache size = 192 KB
Cache Constraint = 0 Pages
Arming IPC driver ..
Adding page store pool ..
PagestoreAddr(IMR Start Address) = 0x04899000Starting download of 34304 bytes
downloading of 34304 bytes finished
fb_mmc_flash_write: updating MBR, Primary and Backup GPT(s)
........ success
Erasing blocks 1024 to 9216 due to alignment
........ erased 4194304 bytes from 'u-boot'
Starting download of 384180 bytes
..
downloading of 384180 bytes finished
Flashing Raw Image
........ wrote 384512 bytes to 'u-boot'
Starting download of 10625024 bytes
..........................................................................
" " " " " " " "
" " " " " " " "
" " " " " " " "
" " " " " " " "
downloading of 61493312 bytes finished
Flashing Sparse Image
........ wrote 61493248 bytes to 'gapps_b'
Starting download of 4788468 bytes
....................................
downloading of 4788468 bytes finished
Flashing Sparse Image
........ wrote 4788224 bytes to 'oem_a'
Starting download of 4788468 bytes
....................................
downloading of 4788468 bytes finished
Flashing Sparse Image
........ wrote 4788224 bytes to 'oem_b'
resetting ...
</samp></pre>
<p>Se tudo foi atualizado com sucesso a ferramenta ADB apresentara o seguinte
resultado:</p>
<pre><samp>
# adb devices
List of devices attached
Edisonb74661ad device
</samp></pre>
<p>@Pronto! Vamos para a configuração do Android Things!</p>
<h1>Configurações do Android Things</h1>
<p>Configurando a rede WIFI:</p>
<pre><samp>
# adb shell am startservice &#92;
-n com.google.wifisetup/.WifiSetupService &#92;
-a WifiSetupService.Connect &#92;
-e ssid [NOME-DA-SUA-REDE] &#92;
-e passphrase [senha-sua-rede]
</samp></pre>
<p>Testando a conexão com Internet:</p>
<pre><samp>
# adb shell
edison:/ $ ping www.uol.com.br
PING homeuol-ib.uol.com.br (200.221.2.45) 56(84) bytes of data.
64 bytes from home.uol.com.br (200.221.2.45): icmp_seq=1 ttl=51 time=20.9 ms
64 bytes from home.uol.com.br (200.221.2.45): icmp_seq=2 ttl=51 time=21.2 ms
64 bytes from home.uol.com.br (200.221.2.45): icmp_seq=3 ttl=51 time=25.3 ms
^C
--- homeuol-ib.uol.com.br ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 20.993/22.551/25.386/2.011 ms
</samp></pre>
<p>Configurando o ADB para rede sem fio:</p>
<p>No <a href="//www.vivaoandroid.com.br/android/" target="_blank">Android</a>
Things:</p>
<pre><samp>
edison:/ # setprop service.adb.tcp.port 5555
edison:/ # stop adbd
[ 97.923317] init: Service 'adbd' is being killed...
[ 97.929712] dwc3-device dwc3-device.1: request f54bf900 was not queued to ep0out
[ 97.938557] init: Service 'adbd' (pid 149) killed by signal 9
[ 97.938688] init: Service 'adbd' (pid 149) killing any children in process group
edison:/ # start adbd
[ 103.799226] init: Starting service 'adbd'...
[ 103.809732] read descriptors
[ 103.809802] read descriptors
edison:/ #
</samp></pre>
<p>Na sua estação:</p>
<pre><samp>
# adb kill-server
# adb tcpip 5555
# adb connect [IP-DO-ANDROID-THINGS]
# adb kill-server
# adb connect [IP-DO-ANDROID-THINGS]
</samp></pre>
<p>Pronto, agora basta efetuar os comandos adb shell, ou adb install...</p>
<pre><samp>
# adb shell
edison:/ $
</samp></pre>
<h1>Desenvolvendo aplicativo para o Android Things</h1>
<p>No arquivo <em>AndroidManifest.xml</em> insira as seguintes linhas:</p>
<pre>
<code>
&lt;uses-library android:name="com.google.android.things"/&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MAIN"/&gt;
&lt;category android:name="android.intent.category.IOT_LAUNCHER"/&gt;
&lt;category android:name="android.intent.category.DEFAULT"/&gt;
&lt;/intent-filter&gt;
</code>
</pre>
<p>No arquivo <em>build.gradle</em> insira a linha a seguir em
dependencies:</p>
<pre>
<code>
dependencies {
provided 'com.google.android.things:androidthings:0.3-devpreview'
</code>
</pre>
<p>Na aplicação importe as seguintes classes:</p>
<pre><code>
import com.google.android.things.pio.Gpio;
import com.google.android.things.pio.PeripheralManagerService;
</code></pre>
<p>Achei mais produtivo produzir um vídeo sobre o desenvolvimento para prova
de conceito de como pisca um led. O exemplo foi baseado no projeto
sample-simplepio cujo código fonte encontra-se no link a seguir.</p>
<ul>
<li><a href="https://github.com/androidthings/sample-simplepio" rel="nofollow" target="_blank">https://github.com/androidthings/sample-simplepio</a>
</ul>
<p>A seguir um video demonstrativo PASSO A PASSO de como desenvolver um
simples aplicativo para o Android Things.</p>
<!--
<div class="figura"><div class="figura"><iframe width="560" height="315" src="//www.youtube.com/embed/pWWwAb-AHDE" frameborder="0" allowfullscreen></iframe></div></iframe></div>
-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment