Nel post precedente ho descritto alcune caratteristiche del protocollo MQTT che consente di gestire le comunicazioni tra dispositivi IOT. Lo stesso protocollo può essere utilizzato anche all’interno della comunicazione M2M (machine to machine).
A questo punto siamo pronti per la creazione di un progetto .NET Core 7 per la gestione del protocollo.
Per prima cosa dovremo utilizzare una delle tante librerie già pronte e che consentono di interagire con il protocollo. Nel mio caso la scelta è ricaduta sulla libreria MQTTnet, i cui sorgenti sono presenti in GitHub a questo indirizzo.
Procediamo quindi con l’installazione del pacchetto con il comando:
dotnet add package MQTTnet
Ricordiamo che il protocollo è composto dal server (broker) e da una serie di client che interagiscono con il server. Utilizzando la libreria appena installata possiamo implementare il nostro client (consumer) all’interno di una semplice console application:
using System;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Client.Subscribing;
using MQTTnet.Protocol;
class Program {
static async Task Main(string[] args) {
var factory = new MqttFactory();
var client = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("localhost", 1883)
.WithClientId("mqtt_consumer").Build();
client.UseConnectedHandler(async e => {
Console.WriteLine("Connected to MQTT broker.");
var topicFilter = new MqttTopicFilterBuilder().WithTopic("test/topic").Build();
await client.SubscribeAsync(new MqttClientSubscribeOptionsBuilder().WithTopicFilter(topicFilter).Build());
});
client.UseDisconnectedHandler(async e => {
Console.WriteLine("Disconnected from MQTT broker.");
await Task.Delay(TimeSpan.FromSeconds(5));
try {
await client.ConnectAsync(options, CancellationToken.None);
} catch {
Console.WriteLine("Reconnecting to MQTT broker failed.");
}
});
client.UseApplicationMessageReceivedHandler(e => {
Console.WriteLine($ "Received message on topic '{e.ApplicationMessage.Topic}': {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
});
try {
await client.ConnectAsync(options, CancellationToken.None);
} catch {
Console.WriteLine("Connecting to MQTT broker failed.");
}
Console.ReadLine();
}
}Alle righe 11 e 12 viene creato il factory ed il client MQTT. Alla riga 14 vengono definite le options della connession che verranno utilizzate alla righa 37 al momento della connessione verso il broker. Il client utilizza due handler che consentono di specificare le azioni che dovranno essere eseguite in fase di connessione ed in fase di disconnesione al/dal broker.
Alla riga 18 viene definito l’handler utilizzato in fase di conessione, definendo il filtro che dovrà essere attivato in fase di sottoscrizione dei messaggi. In questo caso “test/topic”. Alla riga 21 viene effettuata la sottoscrizione.
In maniera del tutto analoga alla riga 24 viene definito l’handler in caso di deregistrazione: in questo caso viene rieffettuta la connessione dopo un delay di 5 secondi.
Ed eccoci finalmente alla riga 34 dove viene definito l’hanlder per la gestione dei messaggi in arrivo. Quando un messaggio viene ricevuto, viene visualizzato il suo contenuto direttamente nella console.
Alla riga 34 viene effettuata la connessione al server.
In un prossimo post vedremo come realizzare un broker mqtt (server).