Conectando “coisas” pelo AWS IoT

A Amazon disponibiliza deste a segunda metade de 2015 o serviço AWS IoT que permite conectar dispositivos à nuvem de forma segura e sem maiores complicações. O serviço provê comunicação indireta entre dispositivos e servidores por meio do padrão publish/subscribe utilizando o protocolo Message Queue Telemetry Transport (MQTT, veja nosso post anterior para mais informações sobre este e outros protocolos para IoT).

reinvent-2015-recap_iot

De forma simples, o serviço AWS IoT oferece um broker MQTT que pode ser utilizado pelos usuários. Contudo, além do broker o serviço integra com outros serviços AWS, permitindo a automação de diversas tarefas, bem como provê tolerância à falhas por meio do esquema de sombras de um dispositivo controlado.

Neste tutorial, apresentaremos um exemplo de uso do serviço Amazon AWS para o controle de uma possível lâmpada inteligente a partir de um dispositivo de comando. Nossa lâmpada e dispositivo de comando serão emulados por software simples, em terminal, já que queremos focar especificamente nos passos necessários para a comunicação com o AWS IoT.

Configurações iniciais

O AWS IoT está disponível em apenas algumas das regiões oferecidas pela Amazon, hoje (21/04/2016) temos apenas Irlanda, Alemanha, Tóquio, Virgínia e Oregon. Você deve escolher entre um destes para proceder com as demais configurações.

Para nosso exemplo deve-se criar três recursos no AWS IoT: uma coisa, uma política e um certificado. A coisa (Thing) representa um dispositivo e libera o uso do broker MQTT, bem como o serviço de sombra. Em outras palavras, este é o recurso básico do AWS IoT necessário para vincular os demais recursos. A política (policy) determina as formas de acesso ao AWS IoT. E o recurso certificado (certificate) apontam para as chaves e certificados necessários para o acesso seguro ao AWS IoT.

A Amazon já disponibiliza tutoriais para esta configuração via site, e por isso não detalharemos este processo aqui. Um ponto importante é que a Amazon também disponibiliza SDKs para algumas linguagens e plataformas (Embedded C, NodeJS e Arduino Yún), contudo isso não impede o uso de linguagens e plataformas diferentes, já que toda comunicação se dá por meio do protocolo MQTT. Em nosso exemplo, utilizamos a linguagem Python.

Estrutura do exemplo

Cada recurso do tipo coisa no AWS IoT possui um tópico MQTT associado com o seguinte o endereço $aws/things/thing/shadow/update, onde o termo thing destacado deve ser substituído pelo nome dado ao recurso coisa no momento da criação no AWS IoT.  Por meio deste tópico o dispositivo poderá publicar o seu estado informando os inscritos no tópico. Contudo, sendo um broker MQTT, o AWS IoT permite que outros tópicos sejam criados conforme necessidade do usuário. Estes tópicos não precisam ser previamente criados no broker, pois tão logo um dispositivo publique ou um se inscreva no tópico ele é automaticamente criado no broker.

aws-lamp (1)

Contando com esta funcionalidade, a arquitetura deste exemplo é formada por dois dispositivos diferentes que utilizam os mesmos recursos no AWS IoT. Emulados por códigos distintos, o  comando (commander.py) e a lâmpada (lamp.py) se comunicam por meio de dois tópicos diferentes: um para escrita da lâmpada ($aws/things/thing/shadow/lamp) e outro para escrita do dispositivo comando ($aws/things/thing/shadow/control).

Para o pleno funcionamento destes códigos são necessários um arquivo de configuração armazenado em conf/config.prop e, armazenados no diretório certs/, os arquivos com o certificado raiz, o certificado da coisa  para autenticação e o par de chaves criptográficas obtidos na configuração. O arquivo config.prop possui o seguinte formato

[General]
thingname = thing
rootcert = certs/root-CA.crt
certificate = certs/XXXXXXX-certificate.pem.crt
key = certs/XXXXXX-private.pem.key
endpoint = XXXXXX.iot.us-east-1.amazonaws.com
port = 8883

O parâmetro thingname é o nome dado ao recurso coisa no momento de sua criação enquanto que as chaves e certificados são aqueles gerados também no processo de configuração do AWS IoT. O endpoint é informado ao clicar sobre o recurso coisa criado.

A lâmpada

Agora veremos o código de cada um dos dispositivos, começando pela lâmpada. Veja o código aqui. O código requer python3 e utiliza o módulo paho.mqtt para conexão com o serviço AWS IoT por meio do protocolo MQTT.

Assumimos uma lâmpada cuja cor é controlada pelo controlador. A lâmpada inicia na cor “Red”. Esta informação é guardada na variável global devStatus, que é um dicionário que armazena as propriedades da lâmpada. Note-se que, desta forma, é possível estender o código para tratar outras propriedades que a lâmpada pudesse oferecer como intensidade do brilho, por exemplo.

A primeira etapa (das linhas 33 a 40) carrega os parâmetros de configuração descritos no arquivo config.prop. Após, cria-se um cliente MQTT e associa-se as funções on_connect e o on_message, bem como as opções de autenticação e criptografia. Finalmente, conecta-se ao serviço AWS IoT. A última linha, inicializa um laço bloqueante que automaticamente trata reconexões.

As funções principais on_connect e on_message tratam, respectivamente, da conexão do dispositivo ao serviço AWS IoT e das ações executadas após recepção de mensagem no tópico $aws/things/thing/shadow/control. A inscrição nesse tópico se dá no momento da conexão. Ao receber um JSON neste tópico (do tipo { “color”:”Red” }), a lâmpada verifica se a cor enviada é permitida dentro de rol de cores que ela pode assumir e informa no tópico $aws/things/thing/shadow/lamp a cor assumida. Note que se a cor não for permitida, a lâmpada permanece na cor atual.

O controlador

O código controlador pode ser encontrado aqui. Esse código requer python3, também utiliza o módulo paho.mqtt e utiliza o módulo cmd para a criar uma interface de linha de comando. Esta interface disponibiliza dois comandos um (status) para a consulta da cor atual da lâmpada e outro para mudança da cor (send <cor>).

Este código é similar ao anterior. A principal diferença é que este dispositivo inverte o uso dos tópicos MQTT. O controlador utiliza o tópico $aws/things/thing/shadow/control para publicar as mudanças de cor da lâmpada e se inscreve no tópico $aws/things/thing/shadow/lamp para receber as atualizações de mudança de estado da lâmpada. Este controlador oferece ainda uma interface de linha de comando codificada nas linhas 31 a 44 e, diferentemente, utiliza a função loop_start(). Essa função implementa um laço de rede não bloqueante que permite a execução de outras chamadas após o início do cliente MQTT.

Uso dos códigos

Os códigos devem ser preferencialmente instalado em máquinas diferentes. A execução de cada um dos códigos é feita da seguinte maneira

python lamp.py

e

python commander.py

Deixe seus comentários abaixo.

 

2 comentários em “Conectando “coisas” pelo AWS IoT

  1. Muito interessante seu artigo Glauco. Mas não entendi qual o hardware (“coisa”) você usou para rodar o código? Foi um computador normal ou algum hardware voltado a IoT como Arduino, Raspberry, etc?

    Curtir

Deixe uma resposta para Cesar Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s