Push Agent¶
Push agent consente di inviare i dati del Data logger sul Cloud. Questo script periodicamente preleva i dati dal Data logger e li invia sul Cloud incapsulati in un JSON. Il Push agent implementa il meccanismo Store&Forward che preleva i dati dal Data logger e li salva in uno Store di appoggio dal quale i dati vengono estratti ed inviati sul cloud attraverso un Broker MQTT.
Lo script supporta due modalità di trasferimento:
Per riga: invia una riga del Data logger per pacchetto
Per variabile: invia una o più variabili con le relative informazioni. Se la modalità del Data logger selezionata è Cambiamento valore (i valori vengono campionati solo se almeno una delle variabili monitorate cambia) il Push agent invia il valore di una determinata variabile se e solo se il suo valore è cambiato rispetto all’ultimo valore inviato.
Inoltre, è possibile impostare la modalità in cui i dati, oltre ad essere inviati sul cloud, vengono storicizzati nel Data logger. Se non si vuole la storicizzazione i dati inviati vengono rimossi dal Data logger una volta prelevati.
Impostazione
Questo script utilizza le seguenti librerie:
M2MQTT
NewtonSoft.Json
Una volta installate le librerie da NuGet, per importare le librerie all’interno del progetto bisogna:
Aprire il NetLogic
Click sul progetto e modificare file
.csproj
Aggiungere
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
dopo la seguente proprietà<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
Compilare il progetto
Se si vuole la comunicazione sicura sono necessari:
Il certificato della CA in formato
.pem
. Il seguente comando genera il certificato nel formato desiderato:$ openssl x509 -inform DER -outform PEM -in certificate.crt -out certificate.pem
Il certificato del client generato utilizzando la CA. Il formato è
.pfx
e può essere generato con il seguente comando:$ openssl pkcs12 -export -out YOURPFXFILE.pfx -inkey *****-private.pem.key -in *****-certificate.pem.crt
Parametri di configurazione
DataLogger: riferimento all’istanza del Data logger
PushFullSample: se il valore è True allora si attiva la modalità di trasferimento per riga altrimenti la modalità di trasferimento per variabile
PreserveData loggerHistory: se il valore è True allora oltre all’invio dei dati è attiva anche la storicizzazione altrimenti ogni volta che i dati vengono trasferiti allo Store di appoggio questi vengono eliminati dal Data logger
MaximumStoreCapacity: indica la capacità massima dello Store di appoggio utilizzato dal PushAgent
MaximumRecordsPerPacket: il numero di record incapsulati in un pacchetto. Nel caso di modalità di trasferimento per riga, attualmente, si invia solo una riga per pacchetto
MaximumPublishTime: intervallo di tempo massimo dopo il quale si prelevano i dati dallo Store di appoggio e si inviano al Cloud. Questo intervallo viene utilizzato quando nello Store di appoggio ci sono al più MaximumRecordsPerPacket record
MinimumPublishTime: intervallo di tempo minimo dopo il quale si prelevano i dati dallo Store di appoggio e si inviano al Cloud. Questo intervallo viene utilizzato quando nello Store di appoggio ci sono almeno MaximumRecordsPerPacket record e di conseguenza si vuole aumentare la frequenza d’invio per scaricare la coda della Store
ClientId: l’Id del client che deve inviare i dati
BrokerIPAddress: contiene l’indirizzo del BrokerIPAddress
BrokerPort: porta del Broker (8883 se si vuole al comunicazione tramite SSL)
BrokerTopic: nome del topic sul quale si vuole pubblicare
QoS: Quality Of Service utilizzata per l’invio delle informazioni. I valori ammessi sono:
0: AT_MOST_ONCE
1: AT_LEAST_ONCE
2: EXACTLY_ONCE
UseSSL: attiva/disattiva la comunicazione sicura
CACert: il percorso del file che contiente la CA (deve essere in formato
.pem
)ClientCert: il percorso che contiene il certificato del Client (deve essere in formato
.pfx)
ClientCertPassword: la password del certificato del Client
Username: contiene username per una comunicazione autenticata con il Broker
Password: contiene la password per la comunicazione autenticata con il Broker
Una volta configurato il Data logger e il Push agent è possibile testare l’invio dei dati sul Cloud tramite MQTT.
Esempio configurazione Eclipse Mosquitto
Alcune configurazioni valide per comunicare con il Broker utilizzando le differenti modalità supportate:
Anonima:
ClientId: testId
BrokerIPAddress: 127.0.0.1
BrokerPort: 1883
BrokerTopic: my_custom_topic
QoS: 2
UseSSL: false
Username:
Password:
Autenticata:
ClientId: testId
BrokerIPAddress: 127.0.0.1
BrokerPort: 1883
BrokerTopic: my_custom_topic
QoS: 2
UseSSL: false
Username: pippo
Password: pluto
Sicura:
ClientId: testId
BrokerIPAddress: 127.0.0.1
BrokerPort: 8883
BrokerTopic:
my_custom_topic
QoS: 2
UseSSL: true
CACert:
percorso/al/certificato/CA
ClientCert: percorso/al/certificato/del/client
ClientCertPassword: passwordCertificatoClient
Username:
pippo
Password:
pluto
Esempio configurazione Azure IoT Hub
Una configurazione valida per l’invio e ricezione dati con IoT Hub è la seguente:
ClientId: MyDevice01
BrokerIPAddress: contoso.azure-devices.net
BrokerPort: 8883
BrokerTopic:
devices/MyDevice01/messages/event/
QoS:1
Iot Hub non supporta il QoS di livello 2. Nel caso in cui venisse utilizzato IoT Hub chiude la connesione ad ogni invio di messaggio.
UseSSL: true
CACert:
ClientCert:
ClientCertPassword:
Username:
contoso.azure-devices.net/MyDevice01/?api-version=2018-06-30
Password:
SharedAccessSignaturesig={signature-string}&se={expiry}&sr={URL-encoded-resourceURI}
Esempio configurazione Subscriber
Il Push agent include tutta la parte relativa all’invio dei dati sul cloud; tuttavia, c’è anche la possibilità di ricevere i dati dal cloud configurando correttamente la parte di Subscribe.
La ricezione viene gestita da una funzione custom che viene richiamata ad ogni ricezione del messaggio. La funzione riceve il messaggio e lo elabora in base alla logica definita nella funzione. Un esempio di funzione che elabora un messaggio ricevuto aggiornando il valore di una variable Message
è illustrato di seguito:
private void SubscribeClientMqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
var messageVariable = Project.Current.GetVariable("Model/Message");
messageVariable.Value = "Message received: " + System.Text.Encoding.UTF8.GetString(e.Message);
}
Questa funzione viene passata come parametro di configurazione per il Subscriber. La configurazione del Subscriber avviene nel metodo Start()
, nel quale, oltre alla configurazione base del Publisher, si specifica anche la configurazione del Subscriber:
public void Start()
{
// PushAgent Default configuration
// Add subscriber
mqttClientConnector.AddSubscriber("my_custom_subscriber_topic", 1, SubscribeClientMqttMsgPublishReceived);
}
Esempio Push agent
L’esempio mostra le principali funzionalità del Push agent. L’interfaccia grafica contiene una griglia di dati che illustra i campioni rilevati dal Data logger in base alla modalità selezionata, che può essere cambiata nel menù a tendina.
In prosimità alla griglia dati troviamo il pulsante Refresh
che aggiorna la griglia e il pulsante Log
che inserisce nel Data logger una riga con i valori delle variabili campionate. In questo esempio le variabili monitorate sono 5 ed ognuna di queste è stata configurata per mostrare le varie modalità supportate dal Data logger.
Nella parte inferiore dell’interfaccia è possibile modificare i parametri di configurazione delle variabili monitorate e del Data logger. Per inviare i dati sul cloud è necessario configurare tutti i parametri relativi al broker.
A titolo di esempio è stata inserita un configurazione che si collega ad un broker Mosquitto in locale. I dati inviati possono essere visualizzati da un qualsiasi Subscriber, ad esempio utilizzando il programma MQTT.fx.
Scarica il progetto di esempio da qui
.