mqtt — Client MQTT semplice#

Il modulo mqtt fornisce un’implementazione minimale di un client MQTT v3.1.1 adatta all’uso su dispositivi con memoria limitata. Supporta la connessione a un broker (con TLS opzionale), la pubblicazione di messaggi, la sottoscrizione a topic, la configurazione del last-will e i ping di keep-alive.

Esempio:

from mqtt import MQTTClient

def callback(topic, msg):
    print(topic, msg)

client = MQTTClient("openmv", "broker.example.com", 1883)
client.set_callback(callback)
client.connect()
client.subscribe(b"openmv/in")
client.publish(b"openmv/out", b"hello")
while True:
    client.check_msg()

Eccezioni#

exception mqtt.MQTTException#

Sollevata quando il broker rifiuta la richiesta CONNECT o quando una richiesta SUBSCRIBE viene rifiutata. L’unico argomento è il codice di ritorno numerico fornito dal broker.

Classi#

class mqtt.MQTTClient(client_id: bytes | str, server: str, port: int, ssl_params: dict | None = None, user: bytes | str | None = None, password: bytes | str | None = None, keepalive: int = 0, callback: callable | None = None)#

Costruisce un client MQTT.

Argomenti:

  • client_id – identificatore univoco del client inviato al broker.

  • server – hostname o indirizzo IP del broker (risolto con socket.getaddrinfo()).

  • port – porta TCP del broker (tipicamente 1883 in chiaro o 8883 per TLS).

  • ssl_params – se non None, il socket viene incapsulato con ssl.wrap_socket() e ssl_params viene inoltrato come argomenti keyword. Passa {} per abilitare il TLS con le impostazioni predefinite.

  • user – nome utente opzionale per l’autenticazione al broker. Se fornito, deve essere fornita anche la password.

  • password – password opzionale usata insieme a user.

  • keepalive – intervallo di keep-alive in secondi (0 lo disabilita). Deve essere inferiore a 65536.

  • callback – callable invocato come callback(topic, msg) per ogni PUBLISH consegnato dal broker. Può anche essere impostato in seguito con set_callback().

Metodi#

set_callback(f: callable) None#

Imposta il callback invocato da wait_msg() e check_msg() quando viene ricevuto un messaggio PUBLISH. Il callback viene chiamato come f(topic, msg) con entrambi gli argomenti di tipo bytes.

set_last_will(topic: bytes | str, msg: bytes | str, retain: bool = False, qos: int = 0) None#

Configura il Last Will and Testament di MQTT. Il broker pubblica msg su topic se il client si disconnette in modo non corretto. Deve essere chiamato prima di connect().

Argomenti:

  • topic – topic del last-will (deve essere non vuoto).

  • msg – payload del last-will.

  • retain – se True, il broker memorizza il messaggio di will come messaggio retained.

  • qos – livello QoS del last-will. Deve essere 0, 1 o 2.

connect(clean_session: bool = True, timeout: float = 5.0) int#

Apre una connessione TCP (e opzionalmente TLS) al broker e invia un pacchetto CONNECT.

Argomenti:

  • clean_session – se True, richiede una sessione pulita; altrimenti il broker riprende qualsiasi stato di sessione precedente.

  • timeout – timeout del socket in secondi applicato al socket sottostante.

Restituisce il flag session present del broker (0 o 1). Solleva MQTTException se il broker restituisce un codice di ritorno CONNACK diverso da zero.

disconnect() None#

Invia un pacchetto DISCONNECT e chiude il socket sottostante.

ping() None#

Invia un pacchetto PINGREQ al broker. Dovrebbe essere chiamato periodicamente se keepalive è diverso da zero, in modo che il broker non interrompa la connessione.

publish(topic: bytes | str, msg: bytes | str, retain: bool = False, qos: int = 0) None#

Pubblica msg su topic.

Argomenti:

  • topic – nome del topic su cui pubblicare.

  • msg – byte del payload.

  • retain – se True, istruisce il broker a conservare il messaggio per i nuovi subscriber.

  • qos – livello di quality-of-service. Sono supportati 0 (fire and forget) e 1 (con conferma). 2 non è implementato e solleverà AssertionError.

Per qos 1, la chiamata si blocca finché non viene ricevuto il PUBACK corrispondente. La dimensione totale del pacchetto deve essere inferiore a 2097152 byte.

subscribe(topic: bytes | str, qos: int = 0) None#

Si sottoscrive a topic al livello qos indicato. Deve essere stato registrato un callback tramite set_callback() o fornito al costruttore; altrimenti viene sollevata AssertionError.

Si blocca finché non viene ricevuto il SUBACK corrispondente. Solleva MQTTException se il broker rifiuta la sottoscrizione (codice di ritorno 0x80).

wait_msg() int | None#

Si blocca in attesa di un singolo pacchetto MQTT in arrivo e lo elabora. I pacchetti PUBLISH vengono consegnati al callback registrato. I pacchetti PINGRESP vengono consumati silenziosamente. Per gli altri pacchetti di controllo viene restituito il primo byte grezzo. Restituisce None se non ci sono dati disponibili o se è stato elaborato un PINGRESP.

check_msg() int | None#

Variante non bloccante di wait_msg(). Interroga il socket per al massimo ~50 ms usando select.select(); se ci sono dati in attesa esegue la stessa elaborazione di wait_msg(), altrimenti restituisce None.