Vai al contenuto

Rilasciato FB MQTTClient per gestione protocollo MQTT

Home Forum Programmazione IEC 61131 (LogicLab) Rilasciato FB MQTTClient per gestione protocollo MQTT

Stai visualizzando 14 post - dal 1 a 14 (di 14 totali)
  • Autore
    Post
  • #36087
    Sergio Bertana
    Amministratore del forum

    Come noto il cosiddetto Internet delle cose IoT non è una rete vera e propria, ma una definizione nata dal marketing che sintetizza il crescente utilizzo di microprocessori embedded collegati alla rete. In questo scenario, si rende necessaria la definizione di un protocollo di comunicazione standard sul quale basare le implementazioni IoT: L’Organization for the Advancement of Structured Information Standards (OASIS) ha dichiarato che il protocollo MQTT (Message Queuing Telemetry Transport) di IBM è lo standard di riferimento per la comunicazione per l’Internet delle Cose.

    Nella gamma di blocchi funzione offerti da Elsist esiste già una libreria dedicata all’IoT che utilizza il protocollo REST (Topic) basato su HTTP, ma a differenza del REST l’MQTT è un protocollo specificatamente studiato per le situazioni in cui è richiesto un basso consumo e dove la banda è limitata. Al posto del modello client/server di HTTP, il protocollo MQTT adotta un meccanismo di pubblicazione e sottoscrizione per scambiare messaggi tramite un appostivo “message broker”. Invece di inviare messaggi a un determinato set di destinatari, i mittenti pubblicano i messaggi su un certo argomento (detto topic) sul message broker. Ogni destinatario si iscrive agli argomenti che lo interessano e, ogni volta che un nuovo messaggio viene pubblicato su quel determinato argomento, il message broker lo distribuisce a tutti i destinatari.

    Il FB MQTTClient (Estratto manuale) permette sia la pubblicazione che la sottoscrizione di messaggi sul broker, in questo modo è possibile fare dialogare tra di loro sistemi SlimLine utilizzando un broker (Ne esistono molti gratuiti) e/o gestire visualizzazioni di stati e gestire comandi su sistemi SlimLine da una App per smartphone. Allego il programma di esempio MQTTTest che è il programma spiegato sull’estratto del manuale (Download progetto).

    Attenzione, per evitare di andare in conflitto con altri utenti che testano il programma conviene modificare il nome del topic e l’identificativo utente. Ci può solo essere un utente con lo stesso identificativo sullo stesso broker.

    #39798
    Sergio Bertana
    Amministratore del forum

    Proprio per dimostrare come sia possibile trasferire variabili tra diversi sistemi utilizzando il protocollo MQTT ho realizzato il programma MQTTExchange. Questo programmasi connette ad un broker gratuito broker.mqttdashboard.com ed esegue la pubblicazione dello stato di un ingresso logico sul topic IOCommand.

    Il programma si sottoscrive allo stesso topic così ne riceve dal broker lo stato ad ogni variazione, e lo stato ricevuto comanda una uscita logica. In questo modo lo stato dell’ingresso è riportato sull’uscita passando dal broker. E’ possibile trasferire lo stesso programma su diversi sistemi e gestendo opportunamente la pubblicazione e la sottoscrizione dei topic sui sistemi è possibile realizzare uno scambio dati.

    Eseguendo il programma su di un sistema attivando Di01CPU si comanda la connessione al broker, a connessione avvenuta si attiva Do01CPU. Attivando Di00CPU ne viene pubblicato lo stato che è ricevuto e trasferito su Do00CPU. Quindi lo stato dell’ingresso è copiato sulla uscita passando attraverso la pubblicazione sul broker (Stampa programma, Download programma).

    Attenzione, per evitare di andare in conflitto con altri utenti che testano il programma conviene modificare il nome del topic e l’identificativo utente. Ci può solo essere un utente con lo stesso identificativo sullo stesso broker.

    #37067
    Anonimo
    Inattivo

    Sbaglio o la comunicazione con i broker MQTT è fatta in chiaro? Se si, sarebbe possibile inserire un qualche livello di sicurezza (tipo SSL/TSL)?

    #39378
    Sergio Bertana
    Amministratore del forum

    Attualmente la comunicazione è solo in chiaro, livelli di crittografia sono in previsione ma non ho date di rilascio.

    #45129
    Anonimo
    Inattivo

    Salve, con il FB MQTTClient è possibile effetuare sottoscrizioni a più di un topic? In particolare, ho fatto un test provando la sottoscrizione per esempio ai due topic:

    1) “IOCommand”
    2) “cms/csk01/power”

    la sottoscrizione di per se non sembra dare errori, però nel momento in cui il client slimline riceve effettivamente le notifiche relative ai due topic sembrerebbe che il buffer TopicRxD non si resetti ogni volta, in particolare, nel caso di ricezione dal topic “cmd/csk01/power” il buffer TopicRxD vale “cmd/csk01/power ” (CORRETTO) mentre, se immediatamente dopo si riceve una notifica dal topic “IOCOmmand” il buffer il buffer TopicRxD vale “IOCommand/power ” (ERRATO)

    #45143
    Sergio Bertana
    Amministratore del forum

    Si certo è possibile sottoscriversi a tutti i topics che si desidera, ma venendo al tuo problema, se ho ben capito con TopicRxD tu intendi la variabile stringa il cui indirizzo è passato in:

    MQTT.VBufferRxD:=ADR(TopicRxD); (* Value buffer (Received) *)

    Quindi nella stringa tu vedi la ricezione del valore pubblicato da qualcuno su quel topic (Nel tuo caso la app sullo smartphone). Bene ho provato esattamente la tua situazione (Utilizzando il programma IOOnMQTT scaricabile da questa knowledge) e non noto alcun problema, io uso la app MyMQTT per i test.

    Non è che sia l’app ad inviare insieme al dato anche il nome del topic?

    #45144
    Anonimo
    Inattivo

    In merito al programma “MQTTExchange” da alcuni test effettuati usando MyMQTT su smartphone android sembrerebbe che il client mqtt sullo slimline vada in errore se si pubblica un messaggio con topic ‘IOCommand’ con payload null, in particolare dal terminale telnet in modalità spydata si rileva il seguente errore:

    17:39:00(.001)|Rx|30 0B 00 09 49 4F 43 6F 6D 6D 61 6E 64
    17:39:00(.001)|Er|Error:10067288, On Case:51, Back to:51

    E’ una cosa voluta?

    #45146
    Sergio Bertana
    Amministratore del forum

    Si se la dimensione del messaggio ricevuto da un topic ha lunghezza pari a 0 o superiore alla dimensione del buffer definito per contenerlo (Parametro VBLengthRxD) il messaggio viene scartato segnalando errore 10067288.

    #45147
    Anonimo
    Inattivo

    Buongiorno, in merito al problema rilevato con sottoscrizione multipla, allego uno screenshot con il log spydata. Come si vede nella immagine:

    – alle righe 4 e 5 il topic IOCommand viene correttamente rilevato sul buffer ‘TopicTxD’ mentre,
    – alle righe 8, 9, nonostante i messaggi pubblicati dal client android siano esattamente gli stessi delle righe 4, 5 (ho anche esaminato i messaggi TCP con wireshark) il topic mostrato nel buffer è erroneamente IOCommand/power.

    #45153
    Sergio Bertana
    Amministratore del forum

    Visto il problema, in effetti non veniva inizializzato il buffer che contiene il nome del topic. Ho provveduto a correggere il FB ed a rilasciare la nuova versione di libreria eLLabNetworkLib_B000 scaricabile dal sito.

    #45160
    Anonimo
    Inattivo

    Ho effettuato altri test in merito alla pubblicazione di topic. In particolare sembrerebbe che il blocco MQTTClient vada in errore se il payload per un qualsiasi topic da pubblicare supera i 42 caratteri… è normale ?

    Esempio di publish senza errore: Topic: ‘csk/test/pub’
    Payload: ‘1234567890123456789012345678901234567890123456’ [46 caratteri]

    11:56:25( 606)|Lg|Publish to server start
    11:56:25(.000)|Pt|Publish:csk/test/pub
    11:56:25(.000)|Sc|[000C] csk/test/pub
    11:56:25(.001)|Rl|Length:62, [3E], Size:1
    11:56:25(.050)|Tx|32 3E 00 0C 63 73 6B 2F 74 65 73 74 2F 70 75 62 FB A8 31 32
    11:56:26(.051)|Rx|40 02 FB A8
    11:56:26(.053)|Lg|Publish to server end

    Esempio di publish CON ERRORE: Topic: ‘csk/test/pub’
    Payload: ‘12345678901234567890123456789012345678901234567’ [47 caratteri]

    12:00:48(.001)|Lg|Publish to server start
    12:00:48(.000)|Pt|Publish:csk/test/pub
    12:00:48(.051)|Sc|[000C] csk/test/pub
    12:00:48(.051)|Rl|Length:63, [3F], Size:1
    12:00:48(.051)|Tx|32 3F 00 0C 63 73 6B 2F 74 65 73 74 2F 70 75 62 08 BE 31 32
    12:00:51(3.00)|Er|Error:10067321, On Case:105, Back to:104

    #45164
    Sergio Bertana
    Amministratore del forum

    Il problema capita solo se attivo lo spionaggio, c’è un bug nella gestione dello spionaggio del frame trasmesso. Ho corretto il bug e tra poco sarà disponibile una nuova versione della libreria eLLabNetworkLib_B100 .

    #56689
    d.marcodini
    Partecipante

    Mi allaccio a questo vecchio post per chiedere delucidazioni su come si faccia a sottoscriversi a più topic contemporaneamente. Si potrebbe avere una esempio di come sottoscriversi a più topic contemporaneamente?

    #57254
    Sergio Bertana
    Amministratore del forum

    Per risponderti mi rifaccio all’esempio riportato sul manuale on-line del FB MQTTClient, in pratica nel ciclo CASE di esecuzione basta aggiungere le varie  sottoscrizioni, ecco un esempio.

        CASE (CaseNr) OF
    
            // ---------------------------------------------------------------------
            // CONNECTION TO BROKER
            // ---------------------------------------------------------------------
            // Check if connected to broker.
    
            0:
            MQTT.Enable:=Enable; //Connection enable
            IF NOT(MQTT.Connected) THEN RETURN; END_IF;
    
            // Client connected to broker, manage the subscription
    
            MQTT.Topic:=ADR('TopicOne'); //Topic name
            MQTT.Subscribe:=TRUE; //Topic subscribe
            CaseNr:=CaseNr+1; //Program case
    
            // ---------------------------------------------------------------------
            // Waits for subscription.
    
            1:
            MQTT.Subscribe:=FALSE; //Topic subscribe
            IF NOT(MQTT.Subscribed) THEN RETURN; END_IF;
            CaseNr:=CaseNr+1; //Program case
    
            // ---------------------------------------------------------------------
            // Manage the subscription
    
            2:
            MQTT.Topic:=ADR('TopicTwo'); //Topic name
            MQTT.Subscribe:=TRUE; //Topic subscribe
            CaseNr:=CaseNr+1; //Program case
    
            // ---------------------------------------------------------------------
            // Waits for subscription.
    
            3:
            MQTT.Subscribe:=FALSE; //Topic subscribe
            IF NOT(MQTT.Subscribed) THEN RETURN; END_IF;
            CaseNr:=CaseNr+1; //Program case

    Puoi continuare con i cases aggiungendo tutte le sottoscrizioni che ti servono.

Stai visualizzando 14 post - dal 1 a 14 (di 14 totali)
  • Devi essere connesso per rispondere a questo topic.