Apêndice III -MQTT usando Red
O MQTT se tornou protocolo mais popular para comunicação de IoT (Internet of Things). No Internet Protocol Stack, ela funciona na mesma camada que o HTTP, mas o MQTT é mais leve, usa menos banda e permite manter uma conexão fixa com dispositivos e comunicação quase em tempo real.
Ao contrário do suporte para porta serial ou CGI, o MQTT não é uma prioridade no desenvolvimento do Red, e dependerá da comunidade para criar bibliotecas nativas. No entanto, é possível publicar e subscrever tópicos (como cliente) usando Red e alguns executáveis e DLLs externos.
Não vou entrar em detalhes sobre o MQTT, presumo que você saiba o básico disso. Caso você não saiba , a melhor informação que encontrei está nos tutoriais tutoriais do Hivemq .
Para monitorar mensagens MQTT, você pode usar qualquer uma das ferramentas listadas aqui . Eu uso o MQTT-spy, mas qualquer utilitário do cliente serve, incluindo alguns aplicativos Android que você pode instalar no seu telefone (pesquise o Google-Play).
Eu usei uma conta gratuita "Cute cat" no CloudMQTT para meus testes.
O que você precisa:
Você precisa ter os seguintes arquivos dentro da pasta do seu script::
- mosquitto_pub.exe
- mosquitto_sub.exe
- mosquitto.dll
- libssl-1_1.dll
- libcrypto-1_1.dll
Eu obtive mosquitto_pub.exe, mosquitto_sub.exe e mosquitto.dll instalando o mosquitto obtido aqui. Eu usei a instalação 32 bits. Esses arquivos estão na pasta "mosquitto" criada na instalação.
Durante a instalação, você recebe o seguinte aviso:
Os arquivos libssl-1_1.dll e libcrypto-1_1.dll pertencem ao OpenSSL toolkit. Assim, conforme recomendado, eu baixei o OpenSSL de http://slproweb.com/products/Win32OpenSSL.html e instalei. Durante a instalação, você deve optar por colocar as DLLs na pasta do OpeSSL, vai ser mais fácil encontrá-las depois:
Então copiei libssl-1_1.dll e libcrypto-1_1.dll não apenas para o diretório do mosquitto, mas também para a pasta do meu script.
Para entender o uso do mosquitto_pub.exe olhe esta página, e para o mosquitto_sub.exe existe esta outra página. Uma boa página com exemplos é Using The Mosquitto_pub and Mosquitto_sub MQTT Client Tools- Examples, e o respectivo video.
Publicando:
O script a seguir é um simples "publicador" de MQTT. Não oferece muitas opções, mas é suficiente mostrar como criar uma linha de comando para o mosqutto_pub :
Red [needs view]
view [
text "broker:" 50 right broker: field "m12.cloudmqtt.com" 150
text "port:" 30 right port: field "13308" 50
text "user:" 30 right user: field "qenkXXX"
text "password:" 60 right password: field "CRfa8kuXXX" 120
return
text "topic:" 50 right topic: field 200 "/test"
text "message" 60 right message: field 300 "Hello World!"
return
button "Publish" [
call rejoin ["mosquitto_pub.exe -h " broker/text " -p " port/text " -u " user/text
" -P " password/text { -t "} topic/text {"} { -m "} message/text {"}
]
]
]
Você pode usar print no lugar de call no script acima para ver o comando completo enviado para mosquitto_pub.exe.
Subscrevendo:
Subscrever usando o mosquitto_sub.exe é um pouco mais complexo, porque as mensagens recebidas são escritas no console CLI do cmd. Eu não descobri como repassar isso constantemente para um script de Red. Minha solução até agora é redirecionar a saída do mosquitto_sub.exe para um arquivo de texto e verificar constantemente para detectar qualquer alteração no tamanho do arquivo. Se ele mudar, o script o lê para obter as novas mensagens.
Este script subscreve o tópico e redireciona as saídas para mqttlog.txt usando o comando de redirecionamento do cmd ">":
Red [needs view]
view [
text "broker:" 50 right broker: field "m12.cloudmqtt.com" 150
text "port:" 30 right port: field "13308" 50
text "user:" 30 right user: field "qenkXXXX"
text "password:" 60 right password: field "CRfa8kuXXXX" 120
return
text "topic:" 50 right topic: field 200 "/test"
return
button "Subscribe" [
call/shell rejoin ["mosquitto_sub.exe -h " broker/text " -p " port/text " -u " user/text
" -P " password/text { -t "} topic/text {" > mqttlog.txt}
]
]
]
E este script constantemente verifica se houve alteração no tamanho de mqttlog.txt e, se houver, copia o texto do arquivo para uma area:
Red [needs: view]
oldsize: 0
view [
mqttlog: area rate 2 ;verifica o arquivo texto duas vezes por segundo
on-time [
newsize: size? %"mqttlog.txt"
if newsize <> oldsize [
mqttlog/text: read %"mqttlog.txt"
oldsize: newsize
]
]
]