Rilasciato FB MQTTClient per gestione protocollo MQTT
Home › Forum › Programmazione IEC 61131 (LogicLab) › Rilasciato FB MQTTClient per gestione protocollo MQTT
- Questo topic ha 13 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 4 anni, 8 mesi fa da
Sergio Bertana.
-
AutorePost
-
Dicembre 28, 2016 alle 9:54 am #36087
Sergio Bertana
Amministratore del forumCome 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.
Dicembre 28, 2016 alle 2:32 pm #39798Sergio Bertana
Amministratore del forumProprio 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.
Luglio 3, 2017 alle 1:43 pm #37067Anonimo
InattivoSbaglio o la comunicazione con i broker MQTT è fatta in chiaro? Se si, sarebbe possibile inserire un qualche livello di sicurezza (tipo SSL/TSL)?
Luglio 4, 2017 alle 4:15 pm #39378Sergio Bertana
Amministratore del forumAttualmente la comunicazione è solo in chiaro, livelli di crittografia sono in previsione ma non ho date di rilascio.
Luglio 21, 2018 alle 7:44 am #45129Anonimo
InattivoSalve, 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)
Luglio 21, 2018 alle 7:52 am #45143Sergio Bertana
Amministratore del forumSi 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?
Luglio 21, 2018 alle 7:54 am #45144Anonimo
InattivoIn 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:51E’ una cosa voluta?
Luglio 21, 2018 alle 7:59 am #45146Sergio Bertana
Amministratore del forumSi 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.
Luglio 21, 2018 alle 9:56 am #45147Anonimo
InattivoBuongiorno, 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.Luglio 23, 2018 alle 7:26 am #45153Sergio Bertana
Amministratore del forumVisto 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.
Luglio 23, 2018 alle 3:47 pm #45160Anonimo
InattivoHo 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 endEsempio 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:104Luglio 23, 2018 alle 3:50 pm #45164Sergio Bertana
Amministratore del forumIl 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 .
Agosto 10, 2020 alle 10:49 am #56689d.marcodini
PartecipanteMi 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?
Agosto 10, 2020 alle 10:53 am #57254Sergio Bertana
Amministratore del forumPer 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.