Linkit Smart 7688 com MQTT e MediaTek Cloud Sandbox 2

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:

*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:

  1. Faça login na MCS
  2. 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): Linkit Smart 7688 com MQTT
  3. Uma vez aberto o prototype do seu projeto, clique em “Add” para adicionar um Data Channel
  4. Na tela de seleção de Data Channel, selecione o Data Channel do tipo Display
  5. 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

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:

NodeMCU e 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.

Faça seu comentário

Acesse sua conta e participe

2 Comentários

  1. Ó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.

    1. 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