Skip to content

6. Anexos

Aqui explicamos como instalar as ferramentas utilizadas neste documento em máquinas com Windows 7 a 10. O leitor deve adaptar estas instruções ao seu próprio ambiente.

6.1. Instalação do IDE do Arduino

O site oficial do Arduino é [http://www.arduino.cc/]. É aqui que encontrará o IDE de desenvolvimento para Arduinos [http://arduino.cc/en/Main/Software]:

 

O ficheiro descarregado [1] é um ficheiro ZIP que, uma vez extraído, cria a estrutura de diretórios [2]. Pode iniciar o IDE clicando duas vezes no ficheiro executável [3].

6.2. Instalação do controlador do Arduino

Para que o IDE comunique com um Arduino, este deve ser reconhecido pelo PC anfitrião. Para tal, siga estes passos:

  • Ligue o Arduino a uma porta USB no computador anfitrião;
  • O sistema tentará então encontrar o controlador para o novo dispositivo USB. Não o encontrará. Deve então especificar que o controlador se encontra no disco em <arduino>/drivers, onde <arduino> é a pasta de instalação do IDE do Arduino.

6.3. Testar o IDE

Para testar o IDE, siga estes passos:

  • Inicie o IDE;
  • ligue o Arduino ao PC através do cabo USB. Por enquanto, não inclua a placa de rede;
  • em [1], selecione o tipo de placa Arduino ligada à porta USB;
  • em [2], especifique a porta USB à qual o Arduino está ligado. Para descobrir isso, desligue o Arduino e anote as portas. Volte a ligá-lo e verifique as portas novamente: a que foi adicionada é a porta do Arduino;

Execute alguns dos exemplos incluídos no IDE:

 

O exemplo é carregado e apresentado:

 

Os exemplos incluídos no IDE são muito didáticos e bem comentados. O código Arduino é escrito em C e consiste em duas partes distintas:

  • uma função [setup] que é executada uma vez quando a aplicação é iniciada, quer seja quando é «carregada» do PC anfitrião para o Arduino, quer seja quando a aplicação já se encontra no Arduino e o botão [Reset] é premido. É aqui que se coloca o código de inicialização da aplicação;
  • uma função [loop] que é executada continuamente (loop infinito). É aqui que se coloca o núcleo da aplicação.

Aqui,

  • a função [setup] configura o pino 13 como saída;
  • a função [loop] liga-o e desliga-o repetidamente: o LED acende e apaga a cada segundo.
 

O programa apresentado é carregado no Arduino através do botão [1]. Depois de carregado, o programa é executado e o LED 13 começa a piscar indefinidamente.

6.4. Ligação de rede do Arduino

O(s) Arduino(s) e o PC anfitrião devem estar na mesma rede privada:

Se houver apenas um Arduino, este pode ser ligado ao PC anfitrião utilizando um simples cabo RJ-45. Se houver mais do que um, o PC anfitrião e os Arduinos serão ligados à mesma rede através de um mini-hub.

O PC anfitrião e os Arduinos serão colocados na rede privada 192.168.2.x.

  • Os endereços IP dos Arduinos são definidos pelo código-fonte. Vamos ver como;
  • O endereço IP do computador anfitrião pode ser definido da seguinte forma:
  • Vá para [Painel de Controlo\Rede e Internet\Centro de Rede e Partilha]:
 
  • Em [1], clique no link [Conexão de rede local]
  • Em [2], visualize as propriedades da ligação;
  • Em [4], visualize as propriedades IPv4 [3] da ligação;
 
  • Em [5], atribua o endereço IP [192.168.2.1] ao computador anfitrião;
  • em [6], atribua a máscara de sub-rede [255.255.255.0] à rede;
  • confirme tudo em [7].

6.5. Testar uma aplicação de rede

Utilizando o IDE, carregue o exemplo [Exemplos / Ethernet / WebServer]:


/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */
 
#include <SPI.h>
#include <Ethernet.h>
 
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
 
// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);
 
void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
 
 
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}
 
 
void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("<br />");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

Esta aplicação cria um servidor web na porta 80 (linha 30) no endereço IP especificado na linha 25. O endereço MAC na linha 23 é o endereço MAC especificado na placa de rede do Arduino.

A função [setup] inicializa o servidor web:

  • linha 34: inicializa a porta serial na qual a aplicação irá registar dados. Iremos monitorizar estes registos;
  • linha 41: o nó TCP/IP (IP, porta) é inicializado;
  • linha 42: o servidor da linha 30 é iniciado neste nó de rede;
  • linhas 43–44: regista o endereço IP do servidor web;

A função [loop] implementa o servidor web:

  • linha 50: se um cliente se ligar ao servidor web, [server].available devolve esse cliente; caso contrário, devolve null;
  • linha 51: se o cliente não for nulo;
  • linha 55: enquanto o cliente estiver ligado;
  • linha 56: [client].available é verdadeiro se o cliente tiver enviado caracteres. Estes são armazenados num buffer. [client].available retorna verdadeiro enquanto este buffer não estiver vazio;
  • linha 57: um caractere enviado pelo cliente é lido;
  • linha 58: este caractere é exibido na consola de registo;
  • linha 62: No protocolo HTTP, o cliente e o servidor trocam linhas de texto.
    • O cliente envia um pedido HTTP ao servidor web, enviando uma série de linhas de texto que terminam com uma linha vazia;
    • o servidor responde então ao cliente enviando uma resposta e encerrando a ligação;

Linha 62: O servidor não faz nada com os cabeçalhos HTTP que recebe do cliente. Ele simplesmente aguarda a linha vazia: uma linha contendo apenas o caractere \n;

  • Linhas 64–67: O servidor envia ao cliente as linhas de texto padrão do protocolo HTTP. Estas terminam com uma linha em branco (linha 67);
  • A partir da linha 68, o servidor envia um documento ao seu cliente. Este documento é gerado dinamicamente pelo servidor e está no formato HTML (linhas 68–69);
  • linha 71: uma linha HTML especial que instrui o navegador do cliente a atualizar a página a cada 5 segundos. Assim, o navegador irá solicitar a mesma página a cada 5 segundos;
  • Linhas 73–80: O servidor envia os valores das 6 entradas analógicas do Arduino para o navegador do cliente;
  • linha 81: o documento HTML é fechado;
  • linha 82: saímos do ciclo while da linha 55;
  • linha 97: a ligação com o cliente é encerrada;
  • linha 98: o evento é registado na consola de registo;
  • linha 100: voltamos ao início da função de loop: o servidor retomará a escuta de clientes. Mencionámos que o navegador do cliente solicitaria a mesma página a cada 5 segundos. O servidor estará lá para responder novamente.

Modifique o código na linha 25 para incluir o endereço IP do seu Arduino, por exemplo:

IPAddress ip(192,168,2,2);

Carregue o programa para o Arduino. Inicie a consola de registo (Ctrl-M) (M maiúsculo):

  • em [1], a consola de registo. O servidor foi iniciado;
  • em [2], utilizando um navegador, solicitamos o endereço IP do Arduino. Aqui, [192.168.2.2] é traduzido por predefinição para [http://198.162.2.2:80];
  • em [3], a informação enviada pelo servidor web. Se visualizar o código-fonte da página do navegador, obtém:
<!DOCTYPE HTML>
<html>
<meta http-equiv="refresh" content="5">
analog input 0 is 1023<br />
analog input 1 is 1023<br />
analog input 2 is 727<br />
analog input 3 is 543<br />
analog input 4 is 395<br />
analog input 5 is 310<br />
</html>

Aqui, podemos ver as linhas de texto enviadas pelo servidor. No lado do Arduino, a consola de registo exibe o que o cliente lhe envia:

new client
GET /favicon.ico HTTP/1.1
Host: 192.168.2.2
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

client disconnected
  • linhas 2–9: cabeçalhos HTTP padrão;
  • linha 10: a linha vazia que as encerra.

Estude este exemplo com atenção. Ele irá ajudá-lo a compreender a programação do Arduino utilizada no laboratório.

6.6. A biblioteca aJson

Na tarefa de laboratório que irá realizar, os Arduinos trocam linhas de texto no formato JSON com os seus clientes. Por predefinição, o IDE do Arduino não inclui uma biblioteca para lidar com JSON. Iremos instalar a biblioteca aJson disponível em [https://github.com/interactive-matter/aJson].

  • Em [1], descarregue a versão compactada do repositório GitHub;
  • descompacte a pasta e copie a pasta [aJson-master] [2] para a pasta [<arduino>/libraries] [3], onde <arduino> é a pasta de instalação do IDE do Arduino;
  • em [4], renomeie esta pasta para [aJson];
  • em [5], o seu conteúdo.

Agora, inicie o Arduino IDE:

 

Verifique se, nos exemplos, já tem exemplos para a biblioteca aJson. Execute e estude esses exemplos.

6.7. O tablet Android

Os exemplos foram testados com o Samsung Galaxy Tab 2.

Para testar os exemplos num tablet, deve primeiro instalar o controlador do tablet na sua máquina de desenvolvimento. O controlador para o Samsung Galaxy Tab 2 pode ser encontrado no URL [http://www.samsung.com/fr/support/usefulsoftware/KIES/]:

 

Para testar os exemplos, terá de ligar o tablet a uma rede (provavelmente Wi-Fi) e saber o seu endereço IP nessa rede. Eis como proceder (Samsung Galaxy Tab 2):

  • Ligue o seu tablet;
  • Procure entre as aplicações disponíveis no tablet (canto superior direito) pela que se chama [Definições], com um ícone de engrenagem;
  • na secção à esquerda, ative o Wi-Fi;
  • na secção à direita, selecione uma rede Wi-Fi;
  • Assim que estiver ligado à rede, toque brevemente na rede selecionada. O endereço IP do tablet será apresentado. Anote-o. Vai precisar dele;

Ainda no aplicativo [Configurações],

  • selecione a opção [Opções do programador] à esquerda (na parte inferior das opções);
  • Certifique-se de que a opção [Depuração USB] à direita está marcada.

Para voltar ao menu, toque no ícone do meio na barra de estado na parte inferior — aquele que se parece com uma casa. Ainda na barra de estado na parte inferior,

  • o ícone na extrema esquerda é o botão Voltar: leva-o de volta ao ecrã anterior;
  • o ícone na extrema direita é o gestor de tarefas. Pode visualizar e gerir todas as tarefas atualmente em execução no seu tablet;

Ligue o seu tablet ao PC utilizando o cabo USB incluído.

Ligue o adaptador Wi-Fi a uma das portas USB do PC e, em seguida, ligue-se à mesma rede Wi-Fi que o tablet. Depois de fazer isso, numa janela do DOS, digite o comando [ipconfig]:

dos>ipconfig

Configuration IP de Windows

Carte Ethernet Connexion au réseau local :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::698b:455a:925:6b13%4
   Adresse IPv4. . . . . . . . . . . . . .: 192.168.2.1
   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
   Passerelle par défaut. . . . . . . . . :

Carte réseau sans fil Wi-Fi :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::39aa:47f6:7537:f8e1%2
   Adresse IPv4. . . . . . . . . . . . . .: 192.168.1.25
   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . : 192.168.1.1

O seu PC tem duas placas de rede e, por isso, dois endereços IP:

  • o da linha 9, que é o endereço do PC na rede com fios;
  • o da linha 17, que é o endereço do PC na rede Wi-Fi;

Anote estas duas informações. Vai precisar delas. Encontra-se agora na seguinte configuração:

O tablet terá de se ligar ao seu PC. Normalmente, o seu PC está protegido por uma firewall que impede que qualquer dispositivo externo estabeleça uma ligação com ele. Por isso, terá de desativar a firewall. Faça-o através da opção [Painel de Controlo\Sistema e Segurança\Firewall do Windows]. Por vezes, também é necessário desativar a firewall configurada pelo seu software antivírus. Isto depende do seu programa antivírus.

Agora, no seu PC, verifique a ligação de rede com o tablet utilizando o comando [ping 192.168.1.y], em que [192.168.1.y] é o endereço IP do tablet. Deverá ver algo semelhante a isto:

dos>ping 192.168.1.26

Envoi d'une requête 'Ping'  192.168.1.26 avec 32 octets de données :
Réponse de 192.168.1.26 : octets=32 temps=244 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=199 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=28 ms TTL=64
Réponse de 192.168.1.26 : octets=32 temps=88 ms TTL=64

Statistiques Ping pour 192.168.1.26:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 28ms, Maximum = 244ms, Moyenne = 139ms

As linhas 4–7 indicam que o endereço IP [192.168.1.y] respondeu ao comando [ping].

6.8. Instalação de um JDK

O JDK mais recente pode ser encontrado no URL [http://www.oracle.com/technetwork/java/javase/downloads/index.html] (junho de 2016). A partir daqui, referir-nos-emos à pasta de instalação do JDK como <jdk-install>.

 

6.9. Instalação do gestor do emulador Genymotion

A empresa [Genymotion] oferece um emulador Android de alto desempenho. Está disponível no URL [https://cloud.genymotion.com/page/launchpad/download/] (junho de 2016).

Terá de se registar para obter uma versão para uso pessoal. Descarregue o produto [Genymotion] com a máquina virtual VirtualBox:

Image

A partir de agora, referir-nos-emos à pasta de instalação do [Genymotion] como <genymotion-install>. Inicie o [Genymotion]. Em seguida, descarregue uma imagem para um tablet:

 
  • em [1], adicione o terminal virtual descrito em [2];
 
  • em [3], configure o terminal;
  • em [4-5], personalize o terminal para o seu ambiente;
  • em [6], inicie o terminal virtual;

Se tudo correr bem, verá a janela do emulador Android:

Image

Por vezes, o emulador Android não inicia. Num computador com Windows, pode verificar os dois pontos seguintes:

  • Verifique se a máquina virtual [Hyper-V] não está instalada. Se necessário, desinstale-a [1-2];
  • depois, no assistente de configuração [Centro de Rede e Partilha] [1]:
 
  • em [3], selecione o(s) adaptador(es) de rede associado(s) à máquina virtual do VirtualBox;
 
  • verifique se, em [6], o controlador do VirtualBox está marcado. Repita este passo para todos os adaptadores de rede associados à máquina virtual do VirtualBox;

6.10. Instalação do Maven

O Maven é uma ferramenta para gerir dependências num projeto Java e muito mais. Está disponível no URL [http://maven.apache.org/download.cgi].

 

Descarregue e descompacte o arquivo. Iremos referir-nos à pasta de instalação do Maven como <maven-install>.

  
  • Em [1], o ficheiro [conf/settings.xml] configura o Maven;

Contém as seguintes linhas:


  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
-->

O valor padrão na linha 4, se — como no meu caso — o seu caminho {user.home} contiver um espaço (por exemplo, [C:\Users\Serge Tahé]), pode causar problemas com determinado software. Nesse caso, deve escrever algo como:


  <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ${user.home}/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
<localRepository>D:\Programs\devjava\maven\.m2\repository</localRepository>

e na linha 7, evitaremos um caminho que contenha espaços.

6.11. Instalação do IDE Android Studio

O IDE Android Studio Community Edition está disponível em [https://developer.android.com/studio/index.html] (junho de 2016):

 

Instale o IDE e, em seguida, inicie-o. Siga os passos [1-8] para instalar os componentes do SDK Manager utilizados pelos exemplos que se seguem. Se decidir instalar componentes mais recentes, provavelmente receberá avisos do Android Studio a indicar que a configuração do exemplo faz referência a componentes do SDK que não existem no seu ambiente. Pode então seguir as sugestões fornecidas pelo IDE.

 
 
  • Em [9], consulte os detalhes do pacote:
  • No [11] acima, os exemplos utilizaram o SDK Build-Tools 23.0.3;
  • nos [9-12] abaixo, especifique a pasta onde instalou o gestor do emulador [Genymotion];
  • Em [13-18], configure o tipo de projeto padrão;
  • em [17], o valor padrão geralmente está correto;
  • em [18], certifique-se de que tem o JDK 1.8;

Abaixo, em [19-26], desative a verificação ortográfica, que está definida para inglês por predefinição;

 
  • abaixo, em [27-28], escolha o tipo de atalhos de teclado que deseja. Pode manter as configurações predefinidas do IntelliJ ou escolher as de outro IDE com o qual esteja mais habituado;
 
  • Abaixo, em [29-30], ative os números de linha no código;
 
  • abaixo, em [31-34], especifique como pretende lidar com o primeiro projeto ao iniciar o IDE e com os projetos subsequentes;
 

Com o Android 2.1 (maio de 2016), a funcionalidade [Instant Run] causa, por vezes, problemas. Neste documento, desativámo-la:

  • em [3-4], tudo foi desativado;

6.12. Utilizando os exemplos

Os projetos do Android Studio para os exemplos estão disponíveis AQUI|. Faça o download.

  

Os exemplos foram criados utilizando os componentes definidos anteriormente:

  • JDK 1.8;
  • Android SDK Platform 23 para tempo de execução;

As seguintes ferramentas SDK:

 

Se o seu ambiente não corresponder ao descrito acima, terá de alterar a configuração do projeto. Isto pode ser bastante moroso. Inicialmente, é provavelmente mais fácil configurar um ambiente de trabalho semelhante ao descrito acima.

Inicie o Android Studio e, em seguida, abra o projeto [example-07], por exemplo:

 
  • Em [1-3], abra o projeto [Example-07];
  • Em [4], verifique o ficheiro [local.properties];
  • na linha 11 acima, introduza a localização do Android SDK Manager <sdk-manager-install>. Pode encontrá-la seguindo os passos [1-4]:
 

Todos os exemplos neste documento são projetos Gradle configurados por um ficheiro [build.gradle] [1-2]:

 

O ficheiro [build.gradle] para o Exemplo 07 é o seguinte:


buildscript {
  repositories {
    mavenCentral()
    mavenLocal()
  }
  dependencies {
    // replace with the current version of the Android plugin
    classpath 'com.android.tools.build:gradle:2.1.0'
    // Since Android's Gradle plugin 0.11, you have to use android-apt >= 1.3
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  }
}
 
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = '4.0.0'
 
dependencies {
  apt "org.androidannotations:androidannotations:$AAVersion"
  compile "org.androidannotations:androidannotations-api:$AAVersion"
  compile 'com.android.support:appcompat-v7:23.4.0'
  compile 'com.android.support:design:23.4.0'
  compile fileTree(dir: 'libs', include: ['*.jar'])
}
 
repositories {
  jcenter()
}
 
apt {
  arguments {
    androidManifestFile variant.outputs[0].processResources.manifestFile
    resourcePackageName android.defaultConfig.applicationId
  }
}
 
android {
  compileSdkVersion 23
  buildToolsVersion "23.0.3"
  defaultConfig {
    applicationId "android.exemples"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
  }
 
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }
 
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
  }
}

Dependendo do ambiente Android (SDK e ferramentas) que tiver configurado, poderá ser necessário alterar as versões nas linhas 8, 21, 22, 38 e 39. O Android Studio ajuda, apresentando sugestões. A abordagem mais fácil é seguir essas sugestões.

Os elementos do ficheiro [build.gradle] podem ser acedidos de outra forma:

  • as várias separadores em [3] refletem os diferentes valores no ficheiro [build.gradle]. Pode, portanto, configurá-lo desta forma, o que lhe permite evitar problemas de sintaxe no ficheiro [build.gradle];

Outro ponto a verificar é o JDK utilizado pelo IDE [5]:

 

Em [6], verifique o JDK.

Todos os exemplos são projetos Gradle com dependências que precisam de ser descarregadas. Para tal, proceda da seguinte forma:

  • Em [5], compile o projeto;

Assim que o projeto estiver sem erros, deve criar uma configuração de execução [1-8]:

  • Em [8], pode especificar que pretende utilizar sempre o mesmo terminal para a execução. Geralmente, esta opção é marcada para evitar ter de especificar o terminal a utilizar em cada nova execução. Aqui, deixamos esta opção desmarcada porque vamos testar diferentes dispositivos Android;
  • Depois de criada a configuração de execução, inicie o Gestor do Emulador Android [1-3];
  • se o emulador Android não iniciar, verifique os pontos mencionados na secção 6.11;

Para iniciar a aplicação no emulador, proceda da seguinte forma [1-4]:

  • em [2], deverá ver o emulador que iniciou anteriormente;
  • em [5], a vista exibida pelo emulador;

Agora, ligue um tablet Android a uma porta USB do PC e execute a aplicação nele:

 
  • Em [6], selecione o tablet Android e teste a aplicação.

Em [7], temos terminais virtuais predefinidos. Vamos aprender a adicioná-los e removê-los.

  

Na captura de ecrã acima, todos os dispositivos listados estão a utilizar a API 22. Vamos removê-los todos porque queremos utilizar a API 23. Seguimos o procedimento [2-3] para remover os dispositivos.

Image

 
  • Em [4-5], adicionamos um tablet;
 
  • em [6], selecionamos uma API. Acima, selecionamos a API 23 para o Windows de 64 bits;
 
  • Em [7], é apresentado o resumo da configuração;
  • Em [8], é possível realizar uma configuração mais avançada do terminal virtual;

Assim que o assistente estiver concluído, o terminal criado aparece em [9].

Depois de fazer isto, se voltar a executar [Exemplo-07], verá agora a seguinte janela:

 
  • em [1], o novo terminal virtual aparece;
  • em [2], pode criar novos;

Experimente para determinar o terminal virtual mais adequado ao seu sistema. Neste documento, os exemplos foram testados principalmente com o emulador Genymotion.

Independentemente do terminal virtual escolhido, os registos são apresentados na janela denominada [Logcat] [1-2]:

Image

Verifique estes registos regularmente. É aqui que serão relatadas as exceções que causaram a falha do seu programa.

Também pode depurar o seu programa utilizando ferramentas de depuração padrão:

  • em [2], defina um ponto de interrupção clicando uma vez na coluna à esquerda da linha de destino. Clicar novamente remove o ponto de interrupção;
 
  • em [3], no ponto de interrupção, prima:
  • [F6] para executar a linha sem entrar nos métodos, se a linha contiver chamadas de método,
  • [F5], para executar a linha entrando nos métodos, se a linha contiver chamadas de método,
  • [F8] para avançar para o ponto de interrupção seguinte;
  • [Ctrl-F2] para parar a depuração;

6.13. Instalação do plugin do Chrome [Advanced Rest Client]

Neste documento, utilizamos o navegador Chrome da Google (http://www.google.fr/intl/fr/chrome/browser/). Iremos adicionar-lhe a extensão [ Advanced Rest Client]. Eis como o fazer:

 
  • A aplicação fica então disponível para download:
  • Para o obter, terá de criar uma conta Google. A [Google Web Store] irá então solicitar uma confirmação [1]:
  • em [2], a extensão adicionada está disponível na opção [Aplicações] [3]. Esta opção aparece em cada nova guia que criar (CTRL-T) no navegador.

6.14. Gestão de j os JSON em Java

De forma transparente para o programador, a estrutura [Spring MVC] utiliza a biblioteca JSON [Jackson]. Para ilustrar o que é JSON (JavaScript Object Notation), apresentamos aqui um programa que serializa objetos em JSON e faz o inverso, deserializando as cadeias de caracteres JSON geradas para recriar os objetos originais.

A biblioteca «Jackson» permite-lhe construir:

  • a cadeia JSON de um objeto: new ObjectMapper().writeValueAsString(object);
  • um objeto a partir de uma string JSON: new ObjectMapper().readValue(jsonString, Object.class).

Ambos os métodos podem lançar uma IOException. Aqui está um exemplo.

  

O projeto acima é um projeto Maven com o seguinte ficheiro [pom.xml];


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
 
  <groupId>istia.st.pam</groupId>
  <artifactId>json</artifactId>
  <version>1.0-SNAPSHOT</version>
 
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.3.3</version>
    </dependency>
  </dependencies>
</project>
  • linhas 12–16: a dependência que inclui a biblioteca «Jackson»;

A classe [Person] é a seguinte:


package istia.st.json;
 
public class Personne {
    // data
    private String nom;
    private String prenom;
    private int age;
 
    // manufacturers
    public Personne() {
 
    }
 
    public Personne(String nom, String prénom, int âge) {
        this.nom = nom;
        this.prenom = prénom;
        this.age = âge;
    }
 
    // signature
    public String toString() {
        return String.format("Personne[%s, %s, %d]", nom, prenom, age);
    }
 
    // getters and setters
...
}

A classe [Main] é a seguinte:


package istia.st.json;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
public class Main {
  // the serialization / deserialization tool
  static ObjectMapper mapper = new ObjectMapper();
 
  public static void main(String[] args) throws IOException {
    // creation of a person
    Personne paul = new Personne("Denis", "Paul", 40);
    // json display
    String json = mapper.writeValueAsString(paul);
    System.out.println("Json=" + json);
    // person instantiation from Json
    Personne p = mapper.readValue(json, Personne.class);
    // person display
    System.out.println("Personne=" + p);
    // a picture
    Personne virginie = new Personne("Radot", "Virginie", 20);
    Personne[] personnes = new Personne[]{paul, virginie};
    // json display
    json = mapper.writeValueAsString(personnes);
    System.out.println("Json personnes=" + json);
    // dictionary
    Map<String, Personne> hpersonnes = new HashMap<String, Personne>();
    hpersonnes.put("1", paul);
    hpersonnes.put("2", virginie);
    // json display
    json = mapper.writeValueAsString(hpersonnes);
    System.out.println("Json hpersonnes=" + json);
  }
}

A execução desta classe produz a seguinte saída no ecrã:

1
2
3
4
Json={"nom":"Denis","prenom":"Paul","age":40}
Personne=Personne[Denis, Paul, 40]
Json personnes=[{"nom":"Denis","prenom":"Paul","age":40},{"nom":"Radot","prenom":"Virginie","age":20}]
Json hpersonnes={"2":{"nom":"Radot","prenom":"Virginie","age":20},"1":{"nom":"Denis","prenom":"Paul","age":40}}

Pontos-chave do exemplo:

  • o objeto [ObjectMapper] necessário para as transformações JSON/Object: linha 11;
  • a transformação [Person] --> JSON: linha 17;
  • a transformação de JSON para [Person]: linha 20;
  • a [IOException] lançada por ambos os métodos: linha 13.

6.15. Instalação do [ WampServer]

O [WampServer] é um pacote de software para desenvolvimento em PHP / MySQL / Apache numa máquina Windows. Iremos utilizá-lo exclusivamente para o SGBD MySQL.

  • No site do [WampServer] [1], escolha a versão adequada [2],
  • O executável descarregado é um instalador. Ser-lhe-ão solicitadas várias informações durante a instalação. Estas não dizem respeito ao MySQL, pelo que pode ignorá-las. A janela [3] aparece no final da instalação. Inicie o [WampServer],
 
  • em [4], o ícone [WampServer] aparece na barra de tarefas, no canto inferior direito do ecrã [4],
  • ao clicar nele, aparece o menu [5]. Este permite-lhe gerir o servidor Apache e o SGBD MySQL. Para gerir este último, utilize a opção [PhpMyAdmin],
  • que abre a janela apresentada abaixo,

Image

Forneceremos alguns detalhes sobre a utilização do [PhpMyAdmin]. Demonstramos como utilizá-lo no documento.