Android

28 jun, 2016

Desenvolva um aplicativo PHP que use dados de GPS de um dispositivo IoT

Publicidade

Atualmente, tem havido muita discussão sobre Internet of Things (IoT). Todos estão falando sobre como as casas, os carros ou quaisquer outras coisas desenvolvidas com energia solar, em breve, estarão enviando fluxos de dados em tempo real sobre como está a operação atual, o que abre uma nova amplitude de aplicativos de tecnologia e de oportunidades de negócios.

Se você é um desenvolvedor PHP interessado em desenvolver aplicativos de IoT, embora sempre seja difícil superar o alvoroço e realmente entender como os dispositivos e os aplicativos de IoT operarão em um nível técnico ou de implementação, vai achar as informações descritas aqui úteis. Pelo menos, foi assim comigo. E até que eu adquirisse um entendimento básico, eu achava difícil começar a imaginar e desenvolver aplicativos que usufruíssem do universo criado por IoT.

Custou-me algum tempo e vários experimentos até que eu começasse a entender o mundo de IoT (e eu ainda estou aprendendo). Neste artigo para iniciantes, espero poupar-lhes esse tempo e esforço, percorrendo o processo de construção de aplicativos de IoT que usam a minha linguagem de programação preferida, PHP.

Vou mostrar como usar o IoT Starter Application for Android para transformar seu telefone Android em um sensor de GPS que publique constantemente a sua localização na nuvem do Bluemix. Em seguida, vou mostrar como conectar um aplicativo PHP com esse fluxo de dados e usá-lo para controlar a localização do telefone Android, em tempo real, no navegador da web.

Parece interessante, certo? Continue lendo.

O que será necessário

Qualquer aplicativo que use a Google Maps API deve estar em conformidade com os Termos de serviço das Google Maps APIs, Termos de Serviço de APIs do Google e o valor Políticas de Privacidade do Google. Antes de começar, reserve alguns minutos para ler esses requisitos e assegurar que o aplicativo esteja em conformidade com eles.

Etapa 1: desenvolver um aplicativo no Bluemix e ligar o serviço Internet of Things Foundation a ele

Uma das maneiras mais rápidas de começar com IoT é usando o serviço Internet of Things Foundation (IoT Foundation) da IBM. Esse é um serviço hospedado em nuvem que oferece um ponto de contato central para todos os dispositivos e aplicativos ativados para IoT. Em poucas palavras, os dispositivos publicam seus dados no serviço IoT Foundation na nuvem e os aplicativos da web ou móveis consomem esses dados.

Como o serviço IoT Foundation é um componente crítico do aplicativo que estamos desenvolvendo, vamos configurá-lo primeiro. A maneira mais fácil de começar com o IoT Foundation é criar um novo aplicativo no Bluemix e, em seguida, ligar uma instância do serviço IoT Foundation a ele.

1 – Efetue login na conta do Bluemix.

2 – No painel de conta do Bluemix, clique em CREATE APP.

php-1

3 – Clique em WEB como o tipo de aplicativo que você está criando.

4 – Selecione Procurar padrões indicando como deseja começar com o aplicativo. Em seguida, clique em PROCURAR PADRÕES .

php-2

5 – Selecione o padrão Internet of Things Foundation Starter.

php-3

6 – Na área Criar um aplicativo, especifique um nome para o aplicativo Bluemix e clique em CRIAR.

php-4

7 – Após um tempo, o aplicativo estará preparado e ativado. Clique em Visão geral para visualizar o status do aplicativo e veja o serviço IoT Foundation ligado ao aplicativo na lista de serviços disponíveis.

php-5

Etapa 2: registrar os dispositivos no serviço Internet of Things Foundation

Depois de configurar o serviço corretamente, a próxima etapa será informá-lo sobre os dispositivos que serão conectados a ele.

Por motivo de segurança, cada instância do serviço IoT Foundation isola os dispositivos e seus dados em uma conta separada, também chamada de organização. Cada organização tem um identificador exclusivo de 6 caracteres que é criado automaticamente com o serviço IoT Foundation. Os dispositivos e aplicativos em uma organização do IoT Foundation são invisíveis para qualquer outra organização do IoT Foundation.

1 – Na página de detalhes do aplicativo, selecione o serviço Internet of Things Foundation. A página de boas-vindas do Internet of Things Foundation é aberta.

php-6

2 – Clique no botão Ativar painel . O painel do Internet of Things Foundation da organização é aberto com o identificador na parte superior.

php-7

3 – Ao iniciar uma organização pela primeira vez, nenhum dispositivo está registrado. A primeira etapa deve ser criar um tipo de dispositivo, que funcione como um modelo para registrar dispositivos de um tipo específico. A segunda etapa será usar esse modelo para registrar dispositivos no serviço IoT Foundation.

a. Clique em Incluir um dispositivo. Na página Criar tipo de dispositivo, especifique o tipo de dispositivo e uma breve descrição. É possível escolher qualquer sequência para o tipo de dispositivo, mas os nossos dispositivos precisarão usar a mesma sequência ao se autenticarem no serviço IoT Foundation. Para este artigo, especifique Android para o tipo de dispositivo porque o IoT Starter Application que será usado na próxima etapa é compatível com esse tipo de dispositivo.

php-8

Embora seja possível selecionar atributos adicionais que os usuários deverão especificar ao registrarem um novo dispositivo, como seu número de série ou uma versão de hardware, nosso aplicativo simples não requer nenhum atributo adicional. Salve o tipo de dispositivo.

php-9

b. Clique em Incluir um novo dispositivo e selecione Android como o tipo de dispositivo.

php-10

Insira um identificador exclusivo para o dispositivo. Pode ser uma sequência aleatória ou descritiva – por exemplo, neste artigo, use A111. Lembre-se desse identificador de dispositivo porque ele formará parte do identificador de cliente que o dispositivo usará para se autenticar com o serviço IoT Foundation.

php-11

4 – Agora será solicitado que você forneça ou gere um token de autenticação para o dispositivo. Deixe que o sistema o gere. A tela de resumo lista os detalhes do dispositivo recém-registrado, incluindo o token gerado automaticamente. Copie o token na Área de transferência para usá-lo mais adiante no artigo, pois ele não será exibido novamente.

php-12

Agora, o dispositivo “A111” está registrado na nuvem do IoT Foundation, e o serviço IoT Foundation poderá começar a aceitar dados dele, sujeito a um token de autenticação válido.

Etapa 3: compilar e instalar o IoT Starter for Android Application

O IoT Starter for Android é um aplicativo Android simples que reside no smartphone ou tablet Android e publica um fluxo de dados e eventos a partir do acelerômetro do dispositivo e de outros sensores, no serviço IoT Foundation. Ele também pode receber comandos do serviço IoT Foundation. Portanto, ele oferece uma ótima maneira de começar a experimentar o IoT Foundation e desenvolver aplicativos para interagirem com fluxos de dados em tempo real.

Se você tiver experiência com desenvolvimento Android, poderá fazer download do código a partir do GitHub, importá-lo no ambiente de desenvolvimento Android e, em seguida, criar o arquivo apk. Caso contrário, para instalar e configurar o aplicativo rapidamente, siga estas etapas.

1 – Clone o repositório de código-fonte do projeto.

a. Ative o Android Studio.

b. Clique em Iniciação rápida > Verifique o projeto no Controle de versões > Git.

c. Na caixa de diálogo Clonar repositório, especifique o seguinte repositório GitHub: https://github.com/ibm-messaging/iot-starter-for-android

php-13

d. Clique em Clonar.

2 – Compile o aplicativo clicando no menu Desenvolver > Fazer. Um pacote de aplicativos Android (um arquivo .apk) será produzido no diretório externo do projeto, por exemplo: out/production/iot-android-for-starter

php-14

3 – Copie esse arquivo .apk no dispositivo Android e instale-o usando um gerenciador de arquivos como ES File Explorer.

Etapa 4: publicar dados do aplicativo iniciador do Android no serviço Internet of Things Foundation

1 – No dispositivo Android, inicie o aplicativo recém-instalado.

2 – Na tela de boas-vindas, insira o identificador da organização, o identificador do dispositivo e o token de autenticação da Etapa 2.

3 – Clique no botão Ativar sensor.

php-15

O aplicativo tentará conectar-se com a organização e autenticar-se. Caso seja bem-sucedido, será emitida uma notificação como “Conectado ao IoT: sim” na tela de boas-vindas do aplicativo, e o dispositivo começará a enviar dados automaticamente a partir de seu acelerômetro para o serviço IoT Foundation.

php-16

Os dados enviados por um dispositivo IoT são publicados em tópicos, que são os equivalentes a “canais no rádio”. Diferentes tipos de eventos podem ser publicados em diferentes tópicos. Por exemplo, para esse dispositivo, os eventos do acelerômetro são publicados no tópico iot-2/evt/accel/fmt/json, e os eventos de toque são publicados no tópico iot-2/evt/touchmove/fmt/json.

Retorne ao painel do serviço IoT Foundation, e o fluxo de dados recebidos do dispositivo deverá aparecer como documentos JSON. Aqui está um exemplo:

php-17

Especificamente, observe as chaves “lat” e “lon” em cada mensagem JSON, que conterão as coordenadas do GPS do dispositivo. Caso essas chaves não apareçam, assegure-se de que o dispositivo Android esteja configurado como relatar sua localização e, em seguida, inicie novamente o aplicativo IOT Starter for Android.

Etapa 5: gerar uma chave de API para acesso ao aplicativo

Agora, há um fluxo de dados chegando na organização do IoT Foundation a partir de um dispositivo registrado. Para concluir o processo, é necessário um aplicativo que possa recuperar os dados a partir da organização do IoT Foundation e usá-los de forma útil.

Primeiro, é necessário assegurar-se de que o aplicativo possa acessar a organização do IoT Foundation. Assim como foi gerado um token de autenticação para o dispositivo na Etapa 2, agora é necessário gerar uma chave de API para o aplicativo.

1 – Abra o painel do IoT Foundation da sua organização.

2 – Selecione Acessar > Chaves de API.

3 – Clique no botão Gerar chave de API.

php-18

Anote a chave de API e o token de autenticação gerados. Esses dois valores serão usados na próxima etapa.

php-19

4 – Clique em Concluir.

Etapa 6: consumir dados do serviço Internet of Things Foundation em um aplicativo PHP

Agora vem a parte interessante. Os dispositivos e os aplicativos podem enviar e receber dados de um serviço IoT Foundation usando um protocolo de mensagem leve chamado Message Queue Telemetry Transport ou MQTT. O Android Starter Application publica seus dados do acelerômetro no serviço IoT Foundation usando o MQTT e, geralmente, qualquer aplicativo desenvolvido deve “entender o MQTT” para poder receber dados do serviço IoT Foundation.

Assim como um dispositivo publica dados em tópicos específicos, um aplicativo pode registrar-se nesses tópicos e consumir seus dados. O tipo e o nome do dispositivo devem ser especificados como parte do nome do tópico. Por exemplo, para registrar-se para eventos “accel” a partir do dispositivo “A111”, o nome do tópico é iot-2/type/Android/id/A111/evt/accel/fmt/json. O símbolo + pode ser usado como um caractere curinga para referir-se a todos os tipos de dispositivo ou a todos os dispositivos.

Se você estiver usando PHP para o aplicativo, uma das maneiras mais fáceis de incluir o suporte do MQTT será usando a biblioteca phpMQTT, uma classe PHP que permite trabalhar com mensagens e brokers MQTT. Para usá-la, clone ou faça download para o ambiente de desenvolvimento PHP. Os scripts PHP deste artigo chamam a biblioteca phpMQTT.

Dois aplicativos PHP são criados com dois scripts PHP:

  1. cli-app.php – Esse script é executado no console do servidor ou na linha de comandos.
  2. web-app.php – Esse script é acessado por meio de um navegador da web.

Faça download desses dois arquivos .php e abra-os em um editor de texto.

O script cli-app.php começa inicializando um novo objeto phpMQTT, que funcionará como o ponto de controle para toda a comunicação com o serviço IoT Foundation. Esse objeto precisa de vários parâmetros, e todos eles são armazenados na matriz $config na parte superior.

Atualize os itens temporários mostrados na seguinte listagem de código com os valores reais das etapas anteriores neste artigo:

// set configuration values
$config = array(
  'org_id' => 'IOTF-ORG-ID',
  'port' => '1883',
  'app_id' => 'phpmqtt',
  'iotf_api_key' => 'IOTF-API-KEY',
  'iotf_api_secret' => 'IOTF-API-TOKEN',
  'device_id' => 'DEVICE-ID'
);

$config['server'] = $config['org_id'] . '.messaging.internetofthings.ibmcloud.com';
$config['client_id'] = 'a:' . $config['org_id'] . ':' . $config['app_id'];
$location = array();

Os parâmetros que o phpMQTT precisa são:

  • O nome do servidor, que geralmente é nomeado segundo o identificador da organização no domínio “messaging.internetofthings.ibmcloud.com”.
  • O porta do servidor, que é 1883 para conexões não criptografadas e 8883 para conexões criptografadas.
  • O identificador de cliente. O aplicativo precisa autenticar-se usando um identificador de cliente no formato a:ORG_ID:APP_ID, em que APP_ID é um valor fornecido pelo usuário.
  • A chave de API do cliente e segredo, que são necessários para acessar o serviço.

Depois que o objeto tiver sido inicializado, seu método connect() poderá ser usado para conectar-se ao serviço do IoT Foundation, usando a chave de API e o token de autenticação da Etapa 5. O método subscribe() é usado para assinar o tópico accel e também especifica uma função definida pelo usuário a ser executada para cada mensagem recebida.

Nesse script, a função definida pelo usuário é a função getLocation() e sua tarefa é usar a função PHP json_decode() para extrair os dados de GPS de cada mensagem e exibi-los na tela. O método proc() inspeciona e processa o fluxo de mensagens que chegam nesse tópico em um loop contínuo.

Aqui está um exemplo de saída do script:

php-20

Em vez de exibir ou ler os dados de GPS, é possível criar um aplicativo da web PHP que possa exibir os dados de GPS em um mapa.

Como você pode imaginar, é muito fácil usar esse fluxo de dados de GPS para fazer algo mais útil, como produzir um mapa da localização do dispositivo que será atualizado em tempo real. A Google Static Maps API tem tudo o que você precisa.

Para que seja possível usar a Google Static Maps API, é necessário registrar o aplicativo no Google. Efetue login no Google usando as credenciais de conta do Google e acesse o Google Developers Console. Crie um novo projeto, atribua um nome e, em seguida, ative o acesso à Google Static Maps API.

php-21

Familiarize-se com os limites de uso dessa API.

Em seguida, na tela de credenciais, anote a chave de API para o acesso do navegador. Essa chave de API será usada para autorizar todas as solicitações de API feitas pelo aplicativo.

php-22

Depois de concluir, será possível criar ou atualizar o script web-app.php, que exibe os dados de GPS em um mapa.

Diferentemente do script anterior, que foi criado para processar todas as mensagens recebidas no tópico e exibi-las na tela, os requisitos desse script são um pouco diferentes e são necessárias várias soluções alternativas para usá-lo em um contexto de navegador da web:

  • Primeiro, é necessário processar o fluxo de dados recebido e extrair as coordenadas de GPS para exibir o mapa em um navegador, não simplesmente emitir os valores ao console. Assim, os valores extraídos durante a execução do método getLocation() precisam ser expostos ao restante do script, o que significa que é preciso transformá-los em variáveis globais.
  • Segundo, para exibir o mapa, o aplicativo precisa interpolar as coordenadas de GPS no terminal do Google Maps API e, em seguida, solicitar a imagem do mapa usando a URL do terminal. No entanto, geralmente, leva algum tempo para que o navegador cliente execute esse solicitação e renderize a imagem. Para evitar uma situação em que cada nova mensagem resulte em uma nova solicitação à Google Maps API sem que a solicitação anterior seja concluída, o loop proc() é finalizado automaticamente quando a primeira mensagem é recebida.O problema com a implementação anterior, obviamente, é que somente a primeira mensagem recebida do dispositivo será processada e todas as mensagens seguintes serão ignoradas. Nesse cenário, o mapa somente refletirá a primeira localização do dispositivo. Isso é corrigido usando uma tag <meta http-equiv=”refresh”> que força uma página a ser recarregada a cada 10 segundos. Isso faz com que o script seja recarregado e produza um mapa atualizado a cada 10 segundos.
  • Terceiro, se o dispositivo for desconectado do serviço IoT Foundation, o loop proc() aguardará uma mensagem infinitamente (até que o script atinja o tempo limite), exibindo ao usuário uma página do navegador em branco, seguida por uma mensagem de erro de tempo limite. Essa implementação não é muito fácil e simples, portanto, para evitar essa situação, o método sleep() é usado para quebrar o loop de processamento do proc() após cinco segundos sem que uma mensagem seja exibida no tópico inscrito e a página exibe uma mensagem de erro apropriada.

Aqui está um exemplo do que o script exibe quando é acessado usando o navegador da web:

php-23

Conclusão

Os desenvolvedores acostumados com os aplicativos da web tradicionais podem precisar de um tempo para se acostumarem com os fluxos de dados em tempo real e os mecanismos de publicação e assinatura do universo de IoT. O IBM Bluemix e o serviço IBM Internet of Things Foundation ajudam a reduzir a curva de aprendizado, fornecendo toda a infraestrutura necessária para receber, gerenciar e transmitir dados a partir de sensores de IoT e para eles. Se você adicionar um pouco de PHP poderá desenvolver aplicativos de IoT com o Bluemix sem perder tempo.

Os conceitos discutidos neste artigo são apenas a ponta do iceberg. Por exemplo, este tutorial somente discutiu o recebimento e o processamento de dados de eventos a partir de sensores de IoT, uma comunicação apenas unidirecional. No entanto, é igualmente fácil (e ainda mais interessante) implementar loops de comunicação bidirecional para fazer os sensores de IoT reagirem às solicitações e executarem tarefas ou cálculos. Se estiver interessado em aprender mais, consulte as demos e os tutoriais da equipe m2m @ IBM:

Agradecimentos

As etapas de 1 a 5 neste artigo são baseadas no tutorial m2m @ IBM IoT Starter Application de Mark Halliday e Bryan Boyd.