Teste de conexão via MQTT com Raspberry Pi Zero W Deixe um comentário

Anteriormente, vimos no post “Como testar as taxas de upload e download de sua conexão à Internet com a Raspberry Pi Zero W” uma maneira de medir as taxas de upload e download de sua conexão à Internet e as exibir em um display OLED. Agora, iremos fazer um upgrade no projeto, permitindo além da exibição das informações no display OLED o envio das mesmas via MQTT, de modo que você possa monitorar as taxas de upload e download de sua conexão à Internet de qualquer lugar do mundo. Então, veja neste post como fazer um teste de conexão via MQTT.

Material necessário

Para fazer este projeto, você precisará de:

Assegure-se também de estar com o projeto do post “Como testar as taxas de upload e download de sua conexão à Internet com a Raspberry Pi Zero W” funcionando antes de prosseguir neste novo projeto/expansão.

Instalando bibliotecas necessárias

Para a Raspberry Pi Zero W se comunicar com um broker MQTT a partir de um script Python, será necessária a instalação da biblioteca paho-mqtt. Para tal, utilize o seguinte comando:

git clone https://github.com/eclipse/paho.mqtt.python
cd paho.mqtt.python
python setup.py install

Código-fonte do projeto teste de conexão via MQTT

Abaixo segue o código-fonte do projeto. Copie-o e salve-o na sua Raspberry Pi Zero W como speedtest_oled_mqtt.py.

import time
import Adafruit_SSD1306
import Image
import ImageDraw
import ImageFont
import subprocess
import re
import paho.mqtt.client as mqtt
from threading import Thread

#Variaveis globais
# Raspberry Pi - configuracao dos pinos:
RST = 24 #embora nao utilizado de fato, eh preciso defini-lo para a biblioteca funcionar

# Configura uso do display OLED de 128x64 (comunicacao I2C)
disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

#variaveis globais para armazenar taxas de upload e download
taxa_download = "" 
taxa_upload = "" 

#definicoes e variaveis globais do MQTT: 
client = mqtt.Client()
Broker = "iot.eclipse.org"
PortaBroker = 1883
KeepAliveBroker = 60
TimeoutConexao = 5 #em segundos
TopicoPublish = "MQTTFFSpeedtestRaspPi"  #substitua este topico por algum de sua escolha / algo "unico" pra voce
 
#Funcao: escreve uma informacao (e seu titulo / classificacao) no display OLED
#Parametros: Informacao e seu titulo e informacoes do display
#Retorno: nenhum
def EscreveInformacaoDisplayOLED(TituloInformacao,Informacao,draw,width,height):
    global image
 
    #desenha um retangulo preto em todo o display (garante que o display sera apagado)
    draw.rectangle((0,0,width,height), outline=0, fill=0)
 
    #Fonte do titulo: fonte ttf que simula display 7 segmentos, com tamanho 8
    font_titulo = ImageFont.truetype('advanced_pixel_lcd-7.ttf', 8)
 
    #Fonte da informacao: fonte ttf que simula display 7 segmentos, com tamanho 12
    font_info = ImageFont.truetype('advanced_pixel_lcd-7.ttf', 12)
 
     
    #escreve titulo da informacao e informacao
    top = 10
    draw.text((0, top), TituloInformacao, font=font_titulo, fill=255)
    draw.text((0, top+20), Informacao, font=font_info, fill=255)
 
    #atualiza buffer do display com informacoes a serem escritas
    disp.image(image)
    disp.display()
    return

#Funcao: faz a medicao das taxas de download e upload
#Parametros: nenhum
#Retorno: nenhum (as medicoes sao armazenadas em variaveis globais)
def MedeTaxaDownloadUpload():
    global taxa_download 
    global taxa_upload
    global client

    response_speedtest = subprocess.Popen('speedtest-cli --simple', shell=True, stdout=subprocess.PIPE).stdout.read()    
    taxa_download = str(re.findall('Download:\s(.*?)\s', response_speedtest, re.MULTILINE)[0])+"\n\nMbits/s"
    taxa_upload = str(re.findall('Upload:\s(.*?)\s', response_speedtest, re.MULTILINE)[0])+"\n\nMbits/s"

    #envia taxas de upload e download via MQTT
    str_mqtt = taxa_upload+";"+taxa_download
    client.publish(TopicoPublish,str_mqtt)
    return

#Callback - conexao ao broker MQTT realizada
def on_connect(client, userdata, flags, rc):
    print("[MQTT] Conectado ao Broker. Resultado de conexao: "+str(rc))
    return
 
#Callback - mensagem recebida do broker MQTT
def on_message(client, userdata, msg):
    MensagemRecebida = str(msg.payload)
    print("[MQTT] Mensagem recebida. Topico: "+msg.topic+" / Mensagem: "+MensagemRecebida)
    return

#------------------------------------------------------
#   PROGRAMA PRINCIPAL Display Oled com Raspberry Pi
#------------------------------------------------------

#Inicializa MQTT
print("[MQTT] Inicializando MQTT...")
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, PortaBroker, KeepAliveBroker)

#inicializa thread de MQTT (keep alive)
ThMQTT = Thread(target=client.loop_forever)
ThMQTT.start()

#Inicializa biblioteca de comunicacao com display e o limpa
disp.begin()
disp.clear()
disp.display()
 
#obtem altura e largura totais do display
width = disp.width
height = disp.height
 
#Preparacoes necessarias para apagar e desenhar na tela
image = Image.new('1', (width, height)) #imagem binaria (somente 1's e 0's)
draw = ImageDraw.Draw(image)

#laco principal
while True:
    #Faz medicoes das taxas de upload e download
    EscreveInformacaoDisplayOLED("Aguarde","Medindo..",draw,width,height)
    MedeTaxaDownloadUpload()

    #Mostra a taxa de upload por 10 segundos
    EscreveInformacaoDisplayOLED("Upload",taxa_upload,draw,width,height)
    time.sleep(10)

    #Mostra a taxa de upload por 10 segundos
    EscreveInformacaoDisplayOLED("Download",taxa_download,draw,width,height)
    time.sleep(10)

 

Para rodar o projeto, utilize o comando abaixo:

speedtest_oled_mqtt.py

As informações são enviadas para o broker MQTT no formato TAXA_UPLOAD;TAXA_DOWNLOAD (por exemplo: 22.15;5.31)

Como receber as informações por MQTT?

Em resumo, há duas formas de se receber as taxas de upload e download por MQTT para fazer teste de conexão via MQTT:

  1. Por meio de um cliente MQTT comum, como o MQTTLens (para isso, atentar-se ao formato das informações enviadas, conforme tópico anterior)
  2. Por meio de uma interface na forma de página web (com websocket MQTT)

A forma número 1 foi utilizada neste projeto aqui do blog. Já no caso da forma número 2, iremos utilizar uma página web/interface criada justamente para este fim. Esta interface pode ser baixada do github oficial do MakerHero.

Segue na figura 1 uma foto da interface. Para faze-la funcionar, basta colocar o tópico MQTT desejado (idêntico ao colocado no seu código-fonte) e clicar no botão “Conectar”. Desta forma, assim que forem recebidas as taxas de upload e download, estas serão escritas na interface / página web.

 

Interface Web teste de conexão via MQTT
Figura 1 – interface web para monitoramento das taxas de upload e download

 

Gostou do projeto usando a Raspberry Pi Zero W para receber via MQTT as taxas de upload e download de sua conexão à Internet? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe