Professional Documents
Culture Documents
05/Dez/2014
Este tutorial (a segunda parte de uma srie de quatro partes) apresenta o MQTT
(anteriormente Message Queueing Telemetry Transport), o protocolo para o Internet of
Things (IoT), e mostra como possvel implementar o MQTT no Arduino. Aprenda sobre as
ferramentas e tcnicas para testar e depurar problemas com o MQTT de forma local e escreva
um sketch do Arduino que se conecta ao Quickstart do IBM Internet of Things Foundation para
representar graficamente dados customizados.
Visualizar mais contedo nesta srie
Inscreva-se no IBM Bluemix
Esta plataforma em nuvem fornece muitos servios grtis, tempos de execuo e
infraestrutura para ajudar a desenvolver e implementar rapidamente o seu prximo aplicativo
mvel ou da web.
Na Parte 1 dessa srie de tutoriais de quatro partes, discuti o design de um projeto para monitorar
as temperaturas no meu gabinete de fiao, desenvolvido usando o Arduino Uno e o sensor
de temperatura DHT11 da Virtuabotix. Mostrei a construo de um circuito para o projeto e o
guiei pela instalao do Arduino IDE e por como testar cada um dos componentes individuais do
projeto com diferentes sketches de amostra do Arduino. Agora voc est pronto para ver o design
do sketch que vincula o projeto do IoT na nuvem e as etapas para ativar o monitoramento dos
dados de temperatura e umidade em tempo real remotamente. Porm, primeiro preciso discutir o
protocolo que ser usado para se comunicar com o IBM IoT Foundation: o MQTT.
O que o MQTT?
O MQTT (anteriormente Message Queueing Telemetry Transport) um protocolo de comunicao
rpido e leve projetado para o Internet of Things. Ele tem suas origens na IBM (onde foi
Copyright IBM Corporation 2014. Todos os direitos reservados.
Desenvolva um sensor de temperatura pronto para nuvem com o
Arduino Uno e o IBM IoT Foundation, Parte 2: Escreva o sketch e
conecte ao Quickstart do IBM IoT Foundation
Marcas Registradas
Pgina 1 de 14
developerWorks
ibm.com/developerWorks/br/
desenvolvido originalmente por Andy Stanford-Clark) e desde ento tem sido enviado para
a Organization for the Advancement of Structured Information Standards (OASIS) para
padronizao, onde a verso atual do padro do protocolo a 3.1. O terminal especificao
MQTT V3.1 Protocol Specification declara que seu propsito ser um "protocolo de sistema de
mensagens para publicar/assinar baseado em broker leve projetado para ser aberto, simples,
leve e fcil de implementar". No perodo desde sua apresentao, a parte "fcil de implementar"
certamente se provou verdadeira, uma vez que vrias bibliotecas diferentes implementando
clientes do MQTT foram desenvolvidas. possvel encontrar links para praticamente todas elas
na pgina do projeto Eclipse Paho.
O MQTT perfeito para o uso em dispositivos integrados porque ele:
assncrono, com vrios nveis diferentes de qualidade de servio, o que importante nos
casos em que as conexes de Internet no so confiveis.
Envia mensagens curtas e precisas que o tornam til para situaes de largura de banda
baixa.
No requer muito software para implementar um cliente, o que o torna excelente para
dispositivos como o Arduino com memria limitada.
O MQTT o protocolo do qual o QuickStart do IBM IoT Foundation foi desenvolvido para aceitar
entradas.
Pgina 2 de 14
ibm.com/developerWorks/br/
developerWorks
Mosquitto
possvel fazer o download do Mosquitto no website do Mosquitto. Ele est disponvel para
Windows, Mac e a maioria das variantes do Linux . A instalao dele simples: para Linux,
ela simplesmente equivale instalao de um novo pacote; para Windows, possvel instalar o
sistema como um servio do Windows ou um executvel separado. Se estiver usando Windows,
certifique-se de desmarcar a caixa de seleo para instalar como um servio. mais fcil
execut-lo da linha de comando, pois possvel visualizar com mais facilidade as informaes
sobre depurao conforme elas so registradas.
Aps instalar o Mosquitto, inicie-o pela linha de comando (em qualquer plataforma) executando o
comando:
mosquitto -v
O terminal -v (sinalizao) para a criao de log "detalhada", o que significa que possvel ver
informaes sobre as conexes sendo feitas e as mensagens sendo recebidas ou enviadas. Voc
ver o resultado disso em um minuto conforme comear a enviar mensagens para o broker local.
Desenvolva um sensor de temperatura pronto para nuvem com o
Arduino Uno e o IBM IoT Foundation, Parte 2: Escreva o sketch e
conecte ao Quickstart do IBM IoT Foundation
Pgina 3 de 14
developerWorks
ibm.com/developerWorks/br/
O sketch de amostra um programa simples. A partir das outras amostras do Arduino que eu
apontei na Parte 1, possvel ver que todos os programas do Arduino tm a mesma estrutura.
Eles incluem um conjunto padro de funes chamadas setup() e as variveis do loop(),
juntamente com algumas declaraes de varivel opcionais e declaraes de quaisquer funes
de utilitrio usadas nas suas funes setup() ou loop() . Primeiro, voc se voltar para o incio
do cdigo para fazer alteraes em algumas dessas declaraes de varivel para que seja
possvel testar o programa de forma local.
<SPI.h>
<Ethernet.h>
<PubSubClient.h>
<dht11.h>
Como possvel ver, o sketch usa as bibliotecas Ethernet para orientar o escudo Ethernet e as
bibliotecas do DHT11 para o acesso s leituras do DHT11 como nos exemplos analisados na
Parte 1. Porm, voc tambm est usando as bibliotecas PubSubClient pela primeira vez. Para
aproveit-las, necessrio fazer algumas alteraes no cdigo para test-la com relao ao
servidor local:
// Update this to either the MAC address found on the sticker on your Ethernet shield (newer shields)
// or a different random hexadecimal value (change at least the last four bytes)
byte mac[]
= {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
char macstr[] = "deedbafefeed";
// Note this next value is only used if you intend to test against a local MQTT server
byte localserver[] = {192, 168, 1, 98 };
// Update this value to an appropriate open IP on your local network
byte ip[]
= {192, 168, 1, 20 };
Pgina 4 de 14
ibm.com/developerWorks/br/
developerWorks
Como o primeiro comentrio diz, a primeira alterao que precisa ser feita a atualizao das
variveis mac e as variveis do macstr para corresponder ao endereo MAC do seu escudo
Ethernet. Os escudos Ethernet mais novos tm essa informao impressa em um adesivo na
placa. Se estiver usando uma placa mais antiga, apenas altere aleatoriamente os ltimos quatro
caracteres hexadecimais para outros valores hexadecimais vlidos e no ter problemas. Em
seguida, altere o elemento ip (varivel) para ser um endereo IP aberto na sua rede local.
As bibliotecas Ethernet podem usar DHCP e possvel consultar como fazer isso se estiver
interessado, mas mais simples usar endereos IP fixos sempre que possvel. Em seguida,
atualize a varivel localserver para o endereo IP do computador no qual voc est usando o
servidor Mosquitto. Por fim, voc atualizar o sketch para se conectar ao seu servidor MQTT local
em vez de ao servidor do QuickStart do IBM IoT Foundation.
Localize essa seo do cdigo:
// Uncomment this next line and comment out the line after it to test against a local MQTT server
//PubSubClient client(localserver, 1883, 0, ethClient);
PubSubClient client(servername, 1883, callback, ethClient);
Como possvel ver, h variveis para a temperatura em Fahrenheit e Celsius e para a umidade.
H tambm uma varivel que conter a instncia do cliente Ethernet que ser usado pelo cliente
PubSub.
Em seguida, vem a definio da funo setup() :
void setup()
{
// Start the Ethernet client, open up serial port for debugging, and attach the DHT11 sensor
Ethernet.begin(mac, ip);
Serial.begin(9600);
DHT11.attach(3);
}
Essa funo bastante simples, ela inicializa o cliente Ethernet com o endereo MAC fornecido
e o endereo IP esttico em que o cliente ser executado. Depois, inicializa a porta serial (para
Pgina 5 de 14
developerWorks
ibm.com/developerWorks/br/
comunicao com o Serial Monitor para fins de depurao) e, por fim, abre a comunicao com o
DHT11 no pino 3.
A prxima funo a ser examinada a loop(), que chamada continuamente contanto que o
Arduino esteja em operao:
void loop()
{
char clientStr[34];
clientName.toCharArray(clientStr,34);
char topicStr[26];
topicName.toCharArray(topicStr,26);
getData();
if (!client.connected()) {
Serial.print("Trying to connect to: ");
Serial.println(clientStr);
client.connect(clientStr);
}
if (client.connected() ) {
String json = buildJson();
char jsonStr[200];
json.toCharArray(jsonStr,200);
boolean pubresult = client.publish(topicStr,jsonStr);
Serial.print("attempt to send ");
Serial.println(jsonStr);
Serial.print("to ");
Serial.println(topicStr);
if (pubresult)
Serial.println("successfully sent");
else
Serial.println("unsuccessfully sent");
}
delay(5000);
}
Como possvel ver, a maior parte dessa funo dedicada produo da sada de depurao.
No entanto, h alguns elementos centrais a serem observados. Prximo parte superior da
funo, h uma chamada para a funo getData() (que voc examinar a seguir) que obtm os
dados de sensor do DHT11. O terminal loop() (funo) realiza uma verificao para ver se o
cliente PubSubClient est conectado. Se ele no estiver conectado, a funo loop() tenta se
conectar ao broker MQTT. Se ele estiver conectado, a funo loop() formata uma cadeia de
caracteres JSON usando buildJson() e a publica no broker MQTT usando o mtodo publish()
do PubSubClient. Por fim, loop() espera por 5.000 ms na parte inferior da funo antes do
tempo de execuo do Arduino voltar ao ponto inicial e chamar a funo novamente.
Em seguida, analise a funo getData() :
void getData() {
int chk = DHT11.read();
switch (chk)
{
case 0:
Serial.println("Read OK");
humidity = (float)DHT11.humidity;
tempF = DHT11.fahrenheit();
tempC = DHT11.temperature;
break;
case -1:
Pgina 6 de 14
ibm.com/developerWorks/br/
developerWorks
Serial.println("Checksum error");
break;
case -2:
Serial.println("Time out error");
break;
default:
Serial.println("Unknown error");
break;
}
}
Essa funo simplesmente verifica o status dos dados da biblioteca do DHT11 e faz a leitura
dos valores dos dados do sensor se eles estiverem prontos, caso contrrio, ela imprime uma
mensagem informativa no console.
Por fim, analise a funo que formata a sada JSON:
String buildJson() {
String data = "{";
data+="\n";
data+= "\"d\": {";
data+="\n";
data+="\"myName\": \"Arduino DHT11\",";
data+="\n";
data+="\"temperature (F)\": ";
data+=(int)tempF;
data+= ",";
data+="\n";
data+="\"temperature (C)\": ";
data+=(int)tempC;
data+= ",";
data+="\n";
data+="\"humidity\": ";
data+=(int)humidity;
data+="\n";
data+="}";
data+="\n";
data+="}";
return data;
}
Um dos pontos fracos do Processing como implementado no Arduino a falta de boas instalaes
para o processamento de cadeias de caracteres. Voc deve ter notado algumas das converses
peculiares que precisaram ser feitas entre instncias da classe String e o tipo cadeia de
caracteres para chamar funes esperando uma ou outra. De forma semelhante, formatar at
mesmo uma simples cadeia de caracteres JSON como essa pode ser desafiador em virtude
da falta de uma boa biblioteca de formatao de cadeia de caracteres embora existam tais
funes para formatar a sada para o console.
Pgina 7 de 14
developerWorks
ibm.com/developerWorks/br/
A chave para saber que as coisas esto ocorrendo corretamente que voc ver as ltimas
linhas sobre Received PUBLISH from.... Isso significa que o sketch do Arduino est se
conectando com sucesso ao broker Mosquitto. Agora examine no Serial Monitor; ele deve conter
mensagens como a seguir:
Read OK
Trying to connect to d:quickstart:arduino:deedbafefeed
attempt to send {
"d": {
"myName": "Arduino DHT11",
"temperature (F)": 71,
"temperature (C)": 22,
"humidity": 43
}
}
to iot-2/evt/status/fmt/json
successfully sent
Pgina 8 de 14
ibm.com/developerWorks/br/
developerWorks
Clique no boto que diz Try it out with our Quickstart. Voc ver a pgina mostrada na Figura 3.
Pgina 9 de 14
developerWorks
ibm.com/developerWorks/br/
Nesse tutorial, voc usar os recursos integrados do Quickstart do IoT Foundation para
representar graficamente os dados em tempo real do sensor do Arduino. Na Parte 3 e as variveis
do Parte 4, voc escrever um aplicativo para fazer algo mais interessante com os dados
recebidos.
O IoT Foundation tem vrias receitas existentes para outros dispositivos. Se voc tem um
dispositivo mais sofisticado, como um Intel Galileo ou um Raspberry Pi, desejar testar essas
receitas. Por enquanto, apenas digite o endereo MAC do seu Arduino. Mas antes de clicar em
Go, h mais uma alterao a ser feita no sketch.
Alterando o sketch
Voc se lembra de algumas instrues atrs quando alterou o sketch para apontar para o servidor
MQTT local em vez do servidor MQTT no IoT Foundation? Agora voc est pronto para alter-lo
de volta. Comente e remova os comentrios das linhas que voc alterou de volta para o cdigo
original:
// Uncomment this next line and comment out the line after it to test against a local MQTT server
//PubSubClient client(localserver, 1883, 0, ethClient);
PubSubClient client(servername, 1883, callback, ethClient);
Aps fazer essa alterao, salve o sketch e faa o upload dele no Arduino. Se desejar reiniciar
o Serial Monitor, possvel, mas a prova real ser o que voc visualizar ao olhar no IoT
Desenvolva um sensor de temperatura pronto para nuvem com o
Arduino Uno e o IBM IoT Foundation, Parte 2: Escreva o sketch e
conecte ao Quickstart do IBM IoT Foundation
Pgina 10 de 14
ibm.com/developerWorks/br/
developerWorks
Foundation. Volte para seu navegador, clique no boto Go na pgina do endereo MAC e espere
alguns minutos.
Voc conseguiu! Agora voc tem um dispositivo desenvolvido por voc e que parte do IoT
global. Para meu caso simples especfico, isso tudo que eu precisava: um grfico que eu
pudesse acompanhar por algumas horas para verificar a temperatura dentro do meu gabinete
de fiao. A m notcia que mesmo ao meio dia em um dia quente, a temperatura nunca ficou
acima de 73 F, portanto, estou de volta prancheta para descobrir qual o meu problema. Mas
sua jornada no aprendizado sobre como aproveitar o IoT est apenas comeando.
Pgina 11 de 14
developerWorks
ibm.com/developerWorks/br/
Downloads
Descrio
Nome
Tamanho
Sample sketch
MQTT_IOT_SENSORS.ino
4KB
Pgina 12 de 14
ibm.com/developerWorks/br/
developerWorks
Recursos
MQTT V3.1 Protocol Specification: leia a verso mais recente da especificao do MQTT.
IBM Internet of Things Foundation: experimente o IBM IoT Foundation e inscreva-se para o
programa beta.
Arduino: visite o website do Arduino.
"Bluemix and the Internet of Things" (Ryan Baxter, developerWorks, julho de 2014): descubra
como o IBM Bluemix e o IBM IoT Foundation podem trabalhar juntos.
Cliente do MQTT para Arduino: clique no link do GutHub para fazer o download do cliente.
Mosquitto: faa o download do broker Mosquitto.
Projeto Eclipse Paho: faa o download dos clientes do MQTT.
Pgina 13 de 14
developerWorks
ibm.com/developerWorks/br/
Sobre o autor
Kyle Brown
Kyle Brown Distinguished Engineer na IBM Software Services para WebSphere,
especializado em SOA e Tecnologias Emergentes. Kyle fornece servios de
consultoria, educao e mentorizao em SOA, tpicos orientados a objetos e
tecnologias J2EE para clientes da Fortune 500. Ele coautor de Enterprise Java
Programming with IBM WebSphere e as variveis do Persistence in the Enterprise.
Tambm um palestrante frequente em conferncias sobre os tpicos de SOA,
Enterprise Java, design em OO e padres de design.
Copyright IBM Corporation 2014. Todos os direitos reservados.
(www.ibm.com/legal/copytrade.shtml)
Marcas Registradas
(www.ibm.com/developerworks/br/ibm/trademarks/)
Pgina 14 de 14