MQTT e .Net Micro Framework con la board Netduino Plus : un semplice sistema di allarme !

Da quando ho caricato il mio piccolo client MQTT per .Net Framework (Desktop, Compact e Micro) su CodePlex, non ho mai postato un semplice esempio di utilizzo per questioni di tempo.

In questo post, vedremo come sia possibile realizzare un “semplicissimo” sistema di allarme costituito da due board Netduino Plus collegate entrambe in rete; attraverso la prima scheda siamo in grado di rilevare un movimento mediante l’utilizzo di un sensore PIR (Passive InfraRed) mentre la seconda è in grado di ricevere la notifica del rilevamento (in questo caso non fa altro che scriverlo sulla console di Debug). Ovviamente, la seconda scheda potrebbe essere banalmente sostituita da uno smartphone attraverso il quale potremmo essere avvisati dell’intrusione in tempo reale.

Per quanto riguarda il broker, viene utilizzato il semplice RSMB (Really Small Message Broker) della IBM che può essere utilizzato in maniera totalmente gratuita per scopi non commerciali e scaricato qui. Non è necessario installarlo ma, nel caso di Windows, è un semplice eseguibile da lanciare per avere un broker in regola ed in ascolto sulla porta di default MQTT (porta 1883). Nel nostro esempio, quest’ultimo è in esecuzione sul mio PC che funge in un certo senso da server.

La banalissima applicazione in esecuzione sulla board che funge da parte rilevatrice è la seguente :

public class Program
{
   private const string MQTT_PIR_TOPIC = "alarm";
   private const string MQTT_BROKER_ADDRESS = "192.168.1.5";
   private const int MQTT_BROKER_PORT = 1883;

   private static MqttClient mqttClient;

   public static void Main()
   {
       Pir pir = new Pir(Pins.GPIO_PIN_D0);
       pir.Motion += new Pir.MotionEventHandler(pir_Motion);

       mqttClient = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS));
       mqttClient.MqttMsgPublished += new MqttClient.MqttMsgPublishedEventHandler(mqttClient_MqttMsgPublished);
       mqttClient.Connect("MQTTNetduinoPir");

       Thread.Sleep(Timeout.Infinite);
   }

   static void mqttClient_MqttMsgPublished(object sender, MqttMsgPublishedEventArgs e)
   {
       Debug.Print("Message published [" + e.MessageId + "]");
   }

   static void pir_Motion(object sender, PirEventArgs e)
   {
       Debug.Print("Motion " + e.Motion + " Time " + e.Time);
       if (e.Motion)
           mqttClient.Publish(MQTT_PIR_TOPIC, new byte[] { 0x01 }, MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE);
   }

}

Viene utilizzata la classe Pir per il sensore (vedi uPLibrary su CodePlex), il quale solleva un evento in corrispondenza della rilevazione di un movimento. Attraverso la classe MqttClientviene effettuato il collegamento al broker e viene pubblicato un messaggio sul topic “alarm” per segnalare la rilevazione del sensore.

L’applicazione che riceve le segnalazioni è la seguente :

public class Program
{
    private const string MQTT_PIR_TOPIC = "alarm";
    private const string MQTT_BROKER_ADDRESS = "192.168.1.5";
    private const int MQTT_BROKER_PORT = 1883;

    private static MqttClient mqttClient;

    public static void Main()
    {
        mqttClient = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS), MQTT_BROKER_PORT);
        mqttClient.MqttMsgPublishReceived += new MqttClient.MqttMsgPublishEventHandler(mqttClient_MqttMsgPublishReceived);

        mqttClient.Connect("MQTTNetduinoReceiver");
        mqttClient.Subscribe(new string[] { MQTT_PIR_TOPIC }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });

        Thread.Sleep(Timeout.Infinite);
    }

    static void mqttClient_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
    {
        if (e.Message[0] == 0x01)
            Debug.Print("Alarm !!");
    }

}

Essa, attraverso l’MqttClient, non fa nient’altro che registrarsi al topic “alarm” attraverso il quale riceve le notifiche tramite un messaggio girato dal mittente attraverso il broker.

Fondamentalmente, abbiamo realizzato un semplicissimo sistema di Push Notification che senza alcun problema potrebbe essere sfruttato attraverso Internet, utilizzando magari un Worker Role di Windows Azure per eseguire il broker, in quanto ad oggi non esiste alcun broker scritto interamente in C#.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s