Estou tentando o MQTT no meu Raspberry Pi executando o Raspbian. A configuração básica funciona, mas não consigo configurar a persistência.
Seguindo https://tutorials-raspberrypi.com/raspberry-pi-mqtt-broker-client-wireless-communication/
Eu instaleimosquitto mosquitto-clients
Instalei paho-mqtt
e estou executando o script a seguir em um processo em segundo plano para publicar leituras de temperatura e umidade de um sensor conectado.
#!/usr/bin/python3
import os
import time
import sys
import Adafruit_DHT as dht
import paho.mqtt.client as mqtt
import json
import datetime
#
# Sensor should be set to Adafruit_DHT.DHT11, Adafruit_DHT.DHT22, or Adafruit_DHT.AM2302.
sensor = dht.DHT11
pin = 4
BROKER = 'localhost'
# Data capture and upload interval in seconds.
INTERVAL=15
sensor_data = {'date': 0, 'temperature': 0, 'humidity': 0}
next_reading = time.time()
client = mqtt.Client()
# Connect to BROKER using default MQTT port and 60 seconds keepalive interval
client.connect(BROKER, 1883, 60)
client.loop_start()
try:
while True:
humidity,temperature = dht.read_retry(sensor, pin)
humidity = round(humidity, 2)
temperature = round(temperature, 2)
print(u"Temperature: {:g}\u00b0C, Humidity: {:g}%".format(temperature, humidity))
sensor_data['temperature'] = temperature
sensor_data['humidity'] = humidity
sensor_data['date'] = datetime.datetime.now().replace(microsecond=0).isoformat()
# client.publish('test_channel', json.dumps(sensor_data), 1)
client.publish('test_channel', json.dumps(sensor_data), 2)
next_reading += INTERVAL
sleep_time = next_reading-time.time()
if sleep_time > 0:
time.sleep(sleep_time)
except KeyboardInterrupt:
pass
client.loop_stop()
client.disconnect()
Isso funciona e posso ver as mensagens em outro Pi, mosquitto_sub -h IPaddress -v -t test_channel
mas isso só funciona enquanto o processo está em execução. Quero que o Broker salve as mensagens até que o assinante se conecte.
Eu adicionei "persistência verdadeira" a um arquivo /etc/mosquitto/conf.d/Milliways.conf
e o arquivo de log mostra mensagens como
1547597521: Saving in-memory database to /var/lib/mosquitto/mosquitto.db.
A base de dados não parece conter quaisquer dados relevantes.
Eu li a documentação em https://pypi.org/project/paho-mqtt/#publishing e o man
for mosquitto.
A persistência é configurada quando você envia a mensagem para o broker, por padrão as mensagens não são persistentes.
Adicione um quarto parâmetro a
client.publish()
, ou sejatrue
, , que define aretain
qualidade da mensagem, que se traduz em persistência.