MQTTClient, client for a MQTT server

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Questo blocco funzione da eseguire in task Back, permette di gestire la connessione ad un server utilizzando il protocollo MQTT (Message Queuing Telemetry Transport) di IBM che l’Organization for the Advancement of Structured Information Standards (OASIS) ha dichiarato come lo standard di riferimento per la comunicazione per l’Internet delle Cose. Il protocollo adotta un meccanismo di pubblicazione e sottoscrizione per scambiare messaggi tramite un appostivo “message broker” che fa da server. Il FB permette sia di pubblicare che di sottoscrivere topics sul broker. Collegando direttamente all’ingresso File l’uscita del FB SysTCPClient si gestirà una connessione non crittografata, inserendo il FB SysTLSClient verrà gestita la crittografia.

Questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi protezione funzioni e blocchi funzione. E’ comunque possibile utilizzarlo liberamente su tutti i broker che non richiedono autenticazione (Username e Password non definiti). Sui broker autenticati il FB funziona in modo test per 30 Min.

Con il comando Enable si forza la connessione al Server (Message broker), se la connessione và a buon fine si attiva l’uscita Connected. A connessione avvenuta ogni 50% del tempo definito in KeepAlive viene inviato un comando di ping per mantenere la connessione. Se il broker non riceve il ping nel tempo definito in KeepAlive ritiene la connessione terminata.

Il comando di Publish permette di pubblicare sul broker il TxTopic indicato con relative TxValue, TxFlags e TxQoS. Se la pubblicazione và a buon fine si attiva per un loop l’uscita Published.

Il comando di Subscribe permette di sottoscrivere sul broker il TxTopic indicato. Se la sottoscrizione và a buon fine si attiva per un loop l’uscita Subscribed. Ad ogni sottoscrizione del valore di un topic sul broker, il broker ne invia il valore a tutti i client che lo hanno sottoscritto.

Alla ricezione di un topic si attiva per un loop l’uscita Received ed in uscita avremo in RxTopic, RxTLength, RxValue ed RxVLength gli indirizzi e la dimensione del nome e del valore del topic ricevuto (Sono validi solo nel loop in cui è attivo Received). Se si setta TRxLock è possibile congelare i dati ricevuti che resteranno validi sino al reset del bit.

In CTime è ritornato il tempo di comunicazione con broker, rilevato alla connessione ed a ogni esecuzione di ping. O sulla pubblicazione di topic solo se TxQoS è 1. In caso di errore viene eseguita una disconnessione e riconnessione al broker e si attiva per un loop l’uscita Fault.

Upgrade list

MQTTClient_v1

Per poter gestire la connessione in TLS è stata eliminata la gestione della connessione TCP, ora deve essere gestita esternamente ed occorre passare al FB lo stream di comunicazione nel parametro File.

MQTTClient_v2

Gestita allocazione automatica memoria in base a dimensione messaggio, ora il limite della dimensione è dato solo dalla memoria rilocabile a disposizione. Ritornati in uscita anzichè passati in ingresso, indirizzo di allocazione e dimensione del nome e valore del topic, i valori devono essere acquisiti su attivazione di Received.

MQTTClient_v3

Eliminati i parametri Publish, Subscribe, TxFlags, TxQoS, TxTopic, TxValue, TxVLength, Published, Subscribed, ora per la pubblicazione dei topics si utilizza il metodo Publish che si appoggia ad un registro FIFO. Parametro KeepAlive ora è di tipo TIME, inserito parametro Delay per impostazione tempo attesa invio dati al broker.

Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabMQTTLib

Descrizione

Enable (BOOL) Comando abilitazione connessione al broker, tutte le sottoscrizioni definite in TSData vengono sottoscritte.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
TRxLock (BOOL) Comando blocco topic ricevuto.
FIFOFile (@FIFOFile_v1) Indirizzo allocazione FB FIFOFile di supporto.
File (eFILEP) Stream di comunicazione con broker.
CFlags (BYTE) Flags trasmesse su connessione.
ClientID (@STRING) Puntatore stringa definizione identificativo client (1). Se eNULL viene generata una stringa univoca di 8 caratteri ricavata dall’UniqueID del sistema.
Username (@STRING) Puntatore stringa definizione nome utente (2). Può essere eNULL.
Password (@STRING) Puntatore stringa definizione password accesso (2). Può essere eNULL.
KeepAlive (TIME) Tempo vita connessione, viene inviato al broker. Se tempo impostato diverso da 0 ogni metà tempo impostato viene inviato automaticamente un messaggio di ping (3).
Delay (TIME) tempo attesa invio pacchetti al broker.
TSData (@MQTT_TS_DATA) Occorre indicare l’indirizzo dell’array strutture MQTT_TS_DATA di definizione sottoscrizioni. eNULL se non è prevista alcuna sottoscrizione.
TSNumber (UDINT) Occorre indicare il numero di elementi dell’array strutture MQTT_TS_DATA. 0 se non è prevista alcuna sottoscrizione.
Connect (BOOL) Forza la connessione al server MQTT.
Connected (BOOL) Si attiva se connessione al server MQTT avvenuta.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Received (BOOL) Attivo per un loop su ricezione di un topic dal server.
RxQoS (USINT) Quality of Service topic ricevuto da broker.
RxTopic (@STRING) Puntatore nome topic ricevuto da broker.
RxTLength (UDINT) Dimensione nome topic ricevuto da broker.
RxValue (PVOID) Puntatore buffer valore topic ricevuto da broker.
RxVLength (UDINT) Dimensione valore topic ricevuto da broker.
CTime (REAL) Tempo di comunicazione con il broker (S).
TxPkts (UDINT) Contatore frames inviati al server MQTT.
RxPkts (UDINT) Contatore frames ricevuti dal server MQTT.
Errors (UDINT) Contatore errori di gestione.
Enable (BOOL) Comando abilitazione connessione al broker, tutte le sottoscrizioni definite in TSData vengono sottoscritte.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
FIFOFile (@FIFOFile_v1) Indirizzo allocazione FB FIFOFile di supporto.
File (eFILEP) Stream di comunicazione con broker.
CFlags (BYTE) Flags trasmesse su connessione.
ClientID (@STRING) Puntatore stringa definizione identificativo client (1). Se eNULL viene generata una stringa univoca di 8 caratteri ricavata dall’UniqueID del sistema.
Username (@STRING) Puntatore stringa definizione nome utente (2). Può essere eNULL.
Password (@STRING) Puntatore stringa definizione password accesso (2). Può essere eNULL.
KeepAlive (TIME) Tempo vita connessione, viene inviato al broker. Se tempo impostato diverso da 0 ogni metà tempo impostato viene inviato automaticamente un messaggio di ping (3).
Delay (TIME) tempo attesa invio pacchetti al broker.
TSData (@MQTT_TS_DATA) Occorre indicare l’indirizzo dell’array strutture MQTT_TS_DATA di definizione sottoscrizioni. eNULL se non è prevista alcuna sottoscrizione.
TSNumber (UDINT) Occorre indicare il numero di elementi dell’array strutture MQTT_TS_DATA. 0 se non è prevista alcuna sottoscrizione.
Connect (BOOL) Forza la connessione al server MQTT.
Connected (BOOL) Si attiva se connessione al server MQTT avvenuta.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Received (BOOL) Attivo per un loop su ricezione di un topic dal server.
RxQoS (USINT) Quality of Service topic ricevuto da broker.
RxTopic (@STRING) Puntatore nome topic ricevuto da broker.
RxTLength (UDINT) Dimensione nome topic ricevuto da broker.
RxValue (PVOID) Puntatore buffer valore topic ricevuto da broker.
RxVLength (UDINT) Dimensione valore topic ricevuto da broker.
CTime (REAL) Tempo di comunicazione con il broker (S).
TxPkts (UDINT) Contatore frames inviati al server MQTT.
RxPkts (UDINT) Contatore frames ricevuti dal server MQTT.
PJunked (UDINT) Contatore records da pubblicare scartati.
Errors (UDINT) Contatore errori di gestione.

Immagine FB MQTTClient_v3
  • Nota (1): I caratteri consentiti sono “0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”. Il broker accetta ClientID di lunghezza compresa tra 1 e 23 caratteri. Può essere che alcuni accettino anche lunghezze superiori, se non accettato viene ritornato errore nel messaggio CONNACK. Il valore è univoco, non possono esserci più ClientID con la stessa definizione connessi al server.
  • Nota (2): Se nella stringa è presente il carattere $, và indicato come $$ (Esempio Us$er diventa Us$$er).
  • Nota (3): Per evitare che il client TCP di connessione al server chiuda la connessione si consiglia di settare con il tempo di LifeTime del client TCP o inferiore.
TxFlags

Con la connessione al broker (Comando CONNECT) è inviato anche il byte CFlags. I bits 7, 6 e 0 sono gestiti automaticamente dal FB.

+--------+--------+-----------+----+----+---------+-------------+--------+
|Username|Password|Will retain|Will QoS |Will flag|Clean session|Reserved|
+--------+--------+-----------+----+----+---------+-------------+--------+
  • [7] Username: Gestita utomaticamente.
  • [6] Password: Gestita utomaticamente.
  • [5] Will retain:
  • [4, 3] Will Qos:
  • [2] Will flag:
  • [1] Clean session: Se non attivo il broker riprende le comunicazioni con il client in base alla sessione identificata dal ClientID. Se non esiste alcuna sessione ne crea una nuova. Se attivo il broker elimina la sessione precedente e ne crea una nuova.
  • [0] Reserved: Sempre 0.
Sessione persistente e non

I client si connettono ai broker per pubblicare o sottoscrivere degli argomenti (Topics), un client può essere sia publisher che subscriber. I client non comunicano direttamente tra di loro, i messaggi sono pubblicati e consegnati ad un broker MQTT. Quando un client si connette ad un broker, la connessione può essere persistente o non persistente (sessione pulita).

  • Sessione non persistente: Può essere utilizzata dai i client che pubblicano solo messaggi e non si sottoscrivono ad alcun argomento. Il broker non immagazzina alcuna informazione dei messaggi non consegnati ai client. Alla disconnessione si perdono le sottoscrizioni e un client deve sottoscriversi nuovamente quando si riconnette al broker. I client informano il broker delle loro intenzioni utilizzando il flag di sessione pulita, che indica se è richiesta una sessione persistente.
  • Sessione persistente: Una sessione persistente viene identificata da un client ID e permette ai client che sono offline di ricevere i messaggi che vengono inviati mentre sono disconnessi.
Wildcards

Si possono sottoscrivere uno o più topic, nella sottoscrizione si può specificare il nome esatto del topic al quale ci si vuole sottoscrivere o in alternativa è possibile utilizzare le wildcards, ovvero caratteri speciali per sottoscrivere un insieme di topics. Le wildcards non sono accettate nella pubblicazione.

  • Wildcard (+): Permette di sottoscrivere un singolo livello. Vediamo un esempio: sottoscrivendo il topic myhome/+/temperature si riceveranno tutti i topics che contengono una qualsiasi scritta al posto del wildcard, ad esempio myhome/bedroom/temperature, myhome/livingroom/temperature, myhome/kitchen/temperature, ecc.
  • Wildcard (#): Permette di sottoscrivere un multilivello. Il carattere deve occupare sempre la posizione finale del topic e deve essere preceduto dal carattere /. Ad esempio sottoscrivendo il topic myhome/bedroom/# si riceveranno tutti itopics che iniziano con la definizione che precede il wildcard, ad esempio myhome/bedroom/temperature, myhome/bedroom/humidity, myhome/bedroom/airquality, ecc.

Metodi disponibili

Subscribe

Questo metodo permette di compilare la struttura dati MQTT_TS_DATA di sottoscrizione topic sul broker. Quando il valore del topic sul broker cambia viene automaticamente aggiornata la variabile definita. E’ possibile gestire un array di strutture dati, una per ogni topic, nel campo IDx indicare l’indice della struttura da compilare. Nel caso si desideri eseguire la sola sottoscrizione delegando la ricezione dei dati dal broker al programma utente occorre definire DBuffer:=eNULL e DBSize:=0.

IDx (UDINT) Indice struttura dati.
Topic (@STRING) Definizione topic da sottoscrivere.
DBuffer (PVOID) Definizione indirizzo buffer valore topic da aggiornare su ricezione da broker.
DBSize (UDINT) Dimensione buffer valore.
QoS (USINT) Quality of service

Il metodo ritorna un (BOOL) FALSE se errore esecuzione, TRUE se esecuzione corretta.

Immagine metodo Subscribe FB MQTTClient
Publish

Permette di pubblicare un topic sul broker, il valore presente nel buffer PValue viene inserito nel registro FIFO di appoggio. Questo permette di pubblicare più topic contemporaneamente, il FB provvederà ad eseguire lo spool dei dati dal FIFO ed a eseguirne la pubblicazione in base alla disponibilità del broker. Se la pubblicazione di un record presente nel FIFO non và a buon fine dopo alcuni tentativi viene scartato continuando la pubblicazione dei records successivi. Le variabili sono pubblicate come array di bytes come sono presenti in memoria mantenendo l’endianness del sistema. Per pubblicare valori numerici occorre utilizzare variabili stringa.

Topic (@STRING) Definizione topic da sottoscrivere.
PValue (PVOID) Definizione indirizzo buffer valore topic da pubblicare sul broker.
PVLength (UDINT) Dimensione valore da pubblicare (Massimo 512-lunghezza nome topic).
TRetain (BOOL) Retain topic
QoS (USINT) Quality of service pubblicazione topic. Valori accettati 0 e 1.

Il metodo ritorna un (BOOL) FALSE se errore esecuzione, TRUE se esecuzione corretta.

Immagine metodo Publish FB MQTTClient
  • QoS:=0: Il topic viene pubblicato senza alcuna risposta da parte del broker.
  • QoS:=1: Alla pubblicazione del topic il broker risponde con un messaggio PUBACK di conferma. Se non ricevuto il FB esegue una nuova pubblicazione.

Trigger di spy

Se SpyOn attivo è possibile utilizzare utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.

Livelli di trigger
TriggerDescrizione
16#00000001Tx: Frame comando inviati al server.
16#00000002Rx: Frame dati ricevuti dal server.
16#10000000Lg: Log esecuzione.
16#40000000Er: Errore di esecuzione.

Esempi

Come utilizzare gli esempi.

ST_MQTTClient: Abilitando da debug Enable il FB si connette al broker broker.mqttdashboard.com, un broker gratuito e senza autenticazione (Quindi il FB può essere usato gratuitamente), se la connessione và a buon file si attiva l’uscita Connected, ed esegue la sottoscrizione dei 3 topics definiti. Agendo da debug sulla variabile Publish verrà eseguita la pubblicazione dei 3 topics definiti che essendo stati anche sottoscritti il valore pubblicato verrà ricevuto dalla sottoscrizione. In questo articolo informazioni su come interagire con l’esempio da Smartphone.

ST_TLSMQTTClient: Stesso funzionamento del programma precedente ma con connessione criptata.

LogicLab (Ptp208, ST_MQTTClient)
PROGRAM ST_MQTTClient
VAR
    i : UDINT; (* Auxiliary variable *)
    Publish : BOOL; (* Publish command *)
    BOOLValue : ARRAY[0..1] OF BOOL := [true, false]; (* BOOL value [Tx][Rx] *)
    REALValue : ARRAY[0..1] OF REAL := [10.0, 0.0]; (* REAL value [Tx][Rx] *)
    STRINGValue : ARRAY[0..1] OF STRING[ 16 ]; (* STRING value [Rx] *)
    TCPClient : SysTCPClient; (* TCP client management *)
    FIFO : FIFOFile_v1; (* FIFO on file *)
    MQTT : MQTTClient_v3; (* MQTT client FB *)
    SPData : ARRAY[0..2] OF MQTT_TS_DATA; (* MQTT topic subscribe data *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_MQTTClient"
// *****************************************************************************
// This program connects to a free broker, it shows how to subscribe and
// publish topics on it.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Initialize the FBs parameters.

    IF (SysFirstLoop) THEN

        // Set FIFO parameters.

        FIFO.FIFOFilename:=eNULL; //Path and name of FIFO file
        FIFO.FIFOSize:=2048; //FIFO file size
        FIFO.FIFOIDx:=eNULL; //FIFO indexes

        // Set TCPClient parameters.

        TCPClient.PeerAdd:=ADR('broker.mqttdashboard.com'); //Peer address
        TCPClient.PeerPort:=1883; //Peer port
        TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPClient.LocalPort:=0; //Local port
        TCPClient.FlushTm:=0; //Flush time (mS)
        TCPClient.LifeTm:=90; //Life time (S)
        TCPClient.RxSize:=512; //Rx buffer size
        TCPClient.TxSize:=512; //Tx buffer size

        // Set MQTTClient parameters.

        MQTT.SpyOn:=TRUE; //Spy active
        MQTT.FIFOFile:=ADR(FIFO); //FIFO on file
        MQTT.CFlags:=16#02; //Clean session
        MQTT.Username:=eNULL; //Broker username
        MQTT.Password:=eNULL; //Broker password
        MQTT.ClientID:=eNULL; //Client identifier
        MQTT.KeepAlive:=T#90s; //Keep alive time
        MQTT.Delay:=T#2s; //Send delay time
        MQTT.Timeout:=T#5s; //Execution timeout

        // Topic subscribe definitions.

        MQTT.TSData:=ADR(SPData); //Topic subscribe data
        MQTT.TSNumber:=SIZEOF(SPData)/SIZEOF(SPData[0]); //Topic subscribe number

        i:=MQTT.Subscribe(0, ADR('BOOLValue'), ADR(BOOLValue[1]), SIZEOF(BOOLValue[1]), 0);
        i:=MQTT.Subscribe(1, ADR('REALValue'), ADR(REALValue[1]), SIZEOF(REALValue[1]), 0);
        i:=MQTT.Subscribe(2, ADR('STRINGValue'), ADR(STRINGValue[1]), 16, 0);
    END_IF;

    // -------------------------------------------------------------------------
    // MQTT MANAGEMENT
    // -------------------------------------------------------------------------
    // FBs management.

    TCPClient(Connect:=MQTT.Connect); //TCPClient management
    MQTT(Enable:=TRUE, File:=TCPClient.File); //MQTTClient management

    // To publish topics set by debug the "Publish" variable.

    IF NOT(Publish) THEN RETURN; END_IF;
    Publish:=FALSE; //Publish command
    i:=MQTT.Publish(ADR('BOOLValue'), ADR(BOOLValue[0]), SIZEOF(BOOLValue[0]), FALSE, 1);
    i:=MQTT.Publish(ADR('REALValue'), ADR(REALValue[0]), SIZEOF(REALValue[0]), FALSE, 1);

    i:=SysVsnprintf(ADR(STRINGValue[0]), 16, ADR('%.3f'), REAL_TYPE, ADR(REALValue[0]));
    i:=MQTT.Publish(ADR('STRINGValue'), ADR(STRINGValue[0]), LEN(STRINGValue[0]), FALSE, 1);

// [End of file]
LogicLab (Ptp208, ST_TLSMQTTClient)
PROGRAM ST_TLSMQTTClient
VAR
    i : UDINT; (* Auxiliary variable *)
    Publish : BOOL; (* Publish command *)
    BOOLValue : ARRAY[0..1] OF BOOL := [true, false]; (* BOOL value [Tx][Rx] *)
    REALValue : ARRAY[0..1] OF REAL := [10.0, 0.0]; (* REAL value [Tx][Rx] *)
    STRINGValue : ARRAY[0..1] OF STRING[ 16 ]; (* STRING value [Rx] *)
    FIFO : FIFOFile_v1; (* FIFO on file *)
    TCPClient : SysTCPClient; (* TCP client management *)
    TLSClient : SysTLSClient; (* TLS client *)
    MQTT : MQTTClient_v3; (* MQTT client FB *)
    SPData : ARRAY[0..2] OF MQTT_TS_DATA; (* MQTT topic subscribe data *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_MQTTSpool"
// *****************************************************************************
// This program connects to a free broker, it shows how to subscribe and
// publish topics on it.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Initialize the FBs parameters.

    IF (SysFirstLoop) THEN

        // Set FIFO parameters.

        FIFO.FIFOFilename:=eNULL; //Path and name of FIFO file
        FIFO.FIFOSize:=2048; //FIFO file size
        FIFO.FIFOIDx:=eNULL; //FIFO indexes

        // Set TCPClient parameters.

        TCPClient.PeerAdd:=ADR('broker.mqttdashboard.com'); //Peer address
        TCPClient.PeerPort:=8883; //Peer port
        TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPClient.LocalPort:=0; //Local port
        TCPClient.FlushTm:=0; //Flush time (mS)
        TCPClient.LifeTm:=90; //Life time (S)
        TCPClient.RxSize:=512; //Rx buffer size
        TCPClient.TxSize:=512; //Tx buffer size

        // Set TLSClient parameters.

        TLSClient.SpyOn:=FALSE; //Spy On
        TLSClient.Mode:=TLS_MODE_TCP; //Connection mode
        TLSClient.Server:=TCPClient.PeerAdd; //Server name
        TLSClient.CipherSuites:=eNULL; //Cipher suites supported
        TLSClient.Psk:=eNULL; //Preshared key
        TLSClient.PskIdentity:=eNULL; //Preshared key identity

        // Without server certification.

        TLSClient.CAVerify:=TLS_CA_NONE; //Certificates verify type
        TLSClient.CAFile:=eNULL; //CA file

        // Set MQTTClient parameters.

        MQTT.SpyOn:=TRUE; //Spy active
        MQTT.FIFOFile:=ADR(FIFO); //FIFO on file
        MQTT.CFlags:=16#02; //Clean session
        MQTT.Username:=eNULL; //Broker username
        MQTT.Password:=eNULL; //Broker password
        MQTT.ClientID:=eNULL; //Client identifier
        MQTT.KeepAlive:=T#90s; //Keep alive time
        MQTT.Delay:=T#2s; //Send delay time
        MQTT.Timeout:=T#5s; //Execution timeout

        // Topic subscribe definitions.

        MQTT.TSData:=ADR(SPData); //Topic subscribe data
        MQTT.TSNumber:=SIZEOF(SPData)/SIZEOF(SPData[0]); //Topic subscribe number

        i:=MQTT.Subscribe(0, ADR('BOOLValue'), ADR(BOOLValue[1]), SIZEOF(BOOLValue[1]), 0);
        i:=MQTT.Subscribe(1, ADR('REALValue'), ADR(REALValue[1]), SIZEOF(REALValue[1]), 0);
        i:=MQTT.Subscribe(2, ADR('STRINGValue'), ADR(STRINGValue[1]), 16, 0);
    END_IF;

    // -------------------------------------------------------------------------
    // MQTT SPOOLING MANAGEMENT
    // -------------------------------------------------------------------------
    // FBs management.

    TCPClient(Connect:=MQTT.Connect); //TCPClient management
    TLSClient(IFile:=TCPClient.File); //TLS client management
    MQTT(Enable:=TRUE, File:=TLSClient.OFile); //MQTTClient management

    // To publish topics set by debug the "Publish" variable.

    IF NOT(Publish) THEN RETURN; END_IF;
    Publish:=FALSE; //Publish command
    i:=MQTT.Publish(ADR('BOOLValue'), ADR(BOOLValue[0]), SIZEOF(BOOLValue[0]), FALSE, 1);
    i:=MQTT.Publish(ADR('REALValue'), ADR(REALValue[0]), SIZEOF(REALValue[0]), FALSE, 1);

    i:=SysVsnprintf(ADR(STRINGValue[0]), 16, ADR('%.3f'), REAL_TYPE, ADR(REALValue[0]));
    i:=MQTT.Publish(ADR('STRINGValue'), ADR(STRINGValue[0]), LEN(STRINGValue[0]), FALSE, 1);

// [End of file]
Was this article helpful?