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:
- Uma placa Raspberry Pi Zero W ou Raspberry Pi Zero 2 W com um cartão microSD de 16GB ou mais de capacidade (preferencialmente, de classe 10)
É necessário que a Raspberry esteja com pin headers soldados e também totalmente operacional (Raspbian instalado, conectividade à Internet operacional e acesso local e/ou via SSH a placa). - Uma Fonte DC Chaveada 5V 2A Micro USB
- Um display OLED I²C 0.96″ (da cor de sua preferência)
- Um conjunto de jumpers fêmea-fêmea
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:
- Por meio de um cliente MQTT comum, como o MQTTLens (para isso, atentar-se ao formato das informações enviadas, conforme tópico anterior)
- 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.
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.