No nosso post anterior sobre a MediaTek Cloud Sandbox, mostramos o que é a MediaTek Cloud Sandbox (MCS), como se cadastrar lá e como utilizá-la, junto com a placa Linkit 7688, para seus projetos na área de IoT. Dando continuidade a este assunto, neste post será mostrado como comunicar a Linkit Smart 7688 com MQTT e MCS, permitindo envio e recepção de dados para a plataforma Cloud. No caso, será controlado um LED da placa Linkit 7688 e seu estado (on/off) poderá ser monitorado pela MCS.
Material necessário
Para reproduzir este projeto da Linkit Smart 7688 com MQTT e MCS, você precisará de:
- Uma placa Linkit Smart 7688 já com conectividade à Internet e acesso via SSH em rede local (para saber como conseguir isso, siga este nosso tutorial).
- Um cabo micro USB
- Fonte 5V com saída para cabo USB (carregador de celular, por exemplo)*
*Se preferir, pode ligá-la na USB do computador, poupando o uso de uma fonte.
Overview do projeto
Neste post, o projeto realizado consistirá de um controle e monitoramento de um LED da placa Linkit 7688 via plataforma Cloud MCS. O controle será do tipo on/off, e o monitoramento será do estado do LED (aceso / apagado) na MCS.
Assim como no projeto do post anterior, o desenvolvimento se dará em linguagem Python.
Data Channel Display – recepção do estado do LED
No artigo anterior, foi criado um Data Channel somente, o qual consistia em um Data Channel do tipo Controller (para acionamento On/Off do LED na placa). Para o projeto de hoje, será criado outro Data Channel, chamado Display. O Data Channel Display será responsável por exibir na MCS o estado atual do LED da placa presente na Linkit 7688 (o mesmo LED utilizado no artigo anterior). Desta forma, tudo o que foi feito no artigo anterior será aproveitado.
Portanto, siga o procedimento abaixo para criação do Data Channel Display:
- Faça login na MCS
- Ao ser feito o login, será exibida uma página com o overview de tudo que você criou. Nela, clique no prototype do projeto desenvolvido (em destaque na figura abaixo):
- Uma vez aberto o prototype do seu projeto, clique em “Add” para adicionar um Data Channel
- Na tela de seleção de Data Channel, selecione o Data Channel do tipo Display
- Será solicitado o preenchimento de algumas informações do Data Channel. Preencha-as conforme a imagem abaixo e clique em “Save”.
Importante: anote o Data Channel Id em local seguro. este será necessário no projeto.
Em termos de configurações / atividades na MCS, está concluído!
MQTT – uma breve explicação
O MQTT (Message Queue Telemetry Transport) é em um protocolo de rede com mensagens leves, criado para comunicação M2M (Machine to Machine). Por exigir pouquíssimo “poder de fogo” (pouca banda de Internet e poucos recursos computacionais dos nós que se comunicam), este é um dos protocolos mais utilizados em dispositivos embarcados inseridos no contexto de IoT.
Em resumo, uma comunicação MQTT é composta de três partes:
- Publishers: dispositivos que publicam / disponibilizam informações
- Subscribers: dispositivos que escutam / esperam por informações
- Broker: é o servidor MQTT. Dado o contexto de IoT, ele a priori deve ser acessível de qualquer lugar do planeta que contenha conexão com a Internet.
Uma informação muito interessante sobre MQTT é que em uma comunicação NÃO há limite especificado de subscribers e publishers. Isso abre possibilidades de aplicação em sistemas dos mais variados portes. Segue abaixo diagrama exemplificando uma comunicação MQTT:
Ou seja: publishers enviam informação para o Broker, subscribers recebem informação do Broker e, por fim, o Broker gerencia a troca de mensagens. A comunicação MQTT, portanto, configura-se como centralizada no Broker.
No caso do projeto aqui desenvolvido, a MCS contém um Broker / servidor MQTT. Desta maneira, os elementos da comunicação são:
- Broker: o próprio servidor / Broker contido na MCS.
- Subscribers: a Linkit 7688, para fins de recepção de comandos de acender / apagar o LED da placa.
- Publishers: também a Linkit 7688, para fins de envio do status do LED (aceso / apagado) para a MCS.
Instalação de bibliotecas
Para ser possível utilizar MQTT com Python na Linkit 7688, antes é preciso instalar as bibliotecas necessárias. Para isso, execute o comando abaixo:
pip install paho-mqtt
Detalhes da comunicação MQTT com a MCS
Os detalhes / informações da comunicação MQTT com a MCS são:
- Endereço do Broker: mqtt.mcs.mediatek.com
- Porta: 1883 ou 8883. Para fins de prototipação e testes, será usada a porta 1883.
- Tópico para subscribe: compor no formato mcs/deviceId/deviceKey/dataChnId
Onde deviceId, deviceKey e dataChnId devem ser substituídos pelos do seu projeto - Tópico para publish: compor no formato mcs/deviceId/deviceKey/dataChnId
Onde deviceId, deviceKey e dataChnId devem ser substituídos pelos do seu projeto
Código-fonte do projeto Linkit Smart 7688 com MQTT
Abaixo está o código-fonte do projeto. Salve-o como “ControleMonitoramentoMCS.py” na sua Linkit 7688.
IMPORTANTE: não se esqueça de substituir os deviceID e deviceKey de seu projeto nas strings dos tópicos!!
#Programa Linkit Smart 7688 com MQTT e MediaTek Cloud Sandbox import paho.mqtt.client as mqtt import sys import mraa #variaveis globais Broker = "mqtt.mcs.mediatek.com" PortaBroker = 1883 KeepAliveBroker = 60 TopicoSubscribe = "mcs/aaaaaaaa/bbbbbbbbbbbbbbbb/LED_On_Off" #No formato: "mcs/deviceId/deviceKey/dataChnId", onde dataChnId e referente ao data channel Controller TopicoPublish = "mcs/aaaaaaaa/bbbbbbbbbbbbbbbb/Display_On_Off" #No formato: "mcs/deviceId/deviceKey/dataChnId", onde dataChnId e referente ao Data Channel Display pin = None #Callback - conexao ao broker realizada def on_connect(client, userdata, flags, rc): print("[STATUS] Conectado ao Broker.") #faz subscribe automatico no topico client.subscribe(TopicoSubscribe,0) #Callback - mensagem recebida do broker def on_message(client, userdata, msg): MensagemRecebida = str(msg.payload) CamposCMD = MensagemRecebida.split(',') timeStamp, dataChannelId, AcaoLED = CamposCMD print("[MSG RECEBIDA] Topico: "+msg.topic+" / Mensagem: "+MensagemRecebida+" / Acao LED: "+AcaoLED) #Obs: O LED possui logica invertida, portanto a "adaptacao" ao estado desejada if (int(AcaoLED)): pin.write(0) EstadoLED = "0" else: pin.write(1) EstadoLED = "1" #re-envia ao MCS a mensagem recebida, para atualizacao do Data Channel Display client.publish(TopicoPublish,MensagemRecebida) #Funcao: configura GPIO do LED #Parametros: nenhum #Retorno: nenhum def setupLED(): global pin pin = mraa.Gpio(44) pin.dir(mraa.DIR_OUT) #programa principal: try: setupLED() pin.write(1) print("[STATUS] Inicializando MQTT...") #inicializa MQTT: client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect(Broker, PortaBroker, KeepAliveBroker) client.loop_forever() except KeyboardInterrupt: print "\nCtrl+C pressionado, encerrando aplicacao e saindo..." sys.exit(0)
Para rodar o projeto, basta executar o comando abaixo e utilizar a MCS para controlar e monitorar o estado do LED.
python ControleMonitoramentoMCS.py
Projeto em ação!
Veja abaixo o projeto em ação!
Gostou da Linkit Smart 7688 com MQTT e MediaTek Cloud Sandbox? Deixe seu comentário logo abaixo.
Ótimo artigo, parabéns. Existe alguma forma de colocar minhas credenciais (deviceId, deviceKey) sem ser hardcoded? Exemplo: criar um servidor web e acessá-lo para colocar minhas credenciais dinamicamente.
Renato, muito obrigado!
Sim, é possível (inclusive, esta pode ser uma etapa essencial em termos de segurança). A forma de implementar depende muito do tipo de servidor, comunicação com o mesmo e como as informações são guardadas e acessadas.
Atenciosamente,
Pedro Bertoleti