Gestión de llamadas síncronas MQTT mediante el IDE de Arduino y Snap! v8 (2023)

De binefa.com
Salta a la navegació Salta a la cerca

Introducción[modifica]

Para que funcione este código de Snap! hace falta reprogramar la placa IoT-02 con este firmware: firmware para gestionar, también, el uso de MQTT síncrono en la placa IoT-02. Firmware IoT-02_mqtt_sync_upcSchool_broker2 en GitHub

08iot02withMqttSync

Bloque (función) getValue(param):

08iot02withMqttSync

Acceso directo a 08_IoT-02_sync_json_Broker2.xmlCódigo en Snap! incorporando el uso de JSON y firmware para gestionar, también, el uso de MQTT síncrono en la placa IoT-02. Firmware IoT-02_mqtt_sync_upcSchool_broker2 en GitHub

Gemelo digital de petición de MQTT síncrono[modifica]

Gemelo digital de un ESP32 respondiendo a peticiones MQTT síncronas

Consultas con un bloque del tipo “MQTT Request”, que implementa la llamada request/response síncrono con MQTT3.

Modificación del firmware del ESP32 para responder de forma síncrona[modifica]

Definición de temas (topics) síncronos[modifica]

En las líneas 34 a 37 del archivo de cabecera (header) IoT-02_mqttTopics.h se han añadido los temas TOPIC_SYNC_LDR, TOPIC_SYNC_JSONIN, TOPIC_SYNC_LDR_NO_SHARP y TOPIC_SYNC_JSONIN_NO_SHARP.

#define TOPIC_SYNC_LDR "/sync/ldr/#"
#define TOPIC_SYNC_JSONIN "/sync/jsonIn/#"
#define TOPIC_SYNC_LDR_NO_SHARP "/sync/ldr/"
#define TOPIC_SYNC_JSONIN_NO_SHARP "/sync/jsonIn/"

En los temas TOPIC_SYNC_LDR, TOPIC_SYNC_JSONIN se utiliza el comodín (wildcard): # para subscribirse a todos los temas que tengan como raíz /sync/ldr/ y /sync/jsonIn/, respectivamente.

Los temas TOPIC_SYNC_LDR_NO_SHARP y TOPIC_SYNC_JSONIN_NO_SHARP se usan para la respuesta a la petición síncrona.

Función void mqttconnect()[modifica]

En la línea 299 del código 02_mqtt_sync_upcSchool_broker2.ino se define la función void mqttconnect().

las líneas 330 y 331 del código 02_mqtt_sync_upcSchool_broker2.ino se ha añadido la subscripción a los temas TOPIC_SYNC_LDR y TOPIC_SYNC_JSONIN:

client.subscribe(String("/" + String(sMac) + TOPIC_SYNC_LDR).c_str());
client.subscribe(String("/" + String(sMac) + TOPIC_SYNC_JSONIN).c_str());

Función void receivedCallback()[modifica]

En la línea 100 del código 02_mqtt_sync_upcSchool_broker2.ino se define la función void receivedCallback(char* topic, byte* payload, unsigned int length).

Al principio se añade la declaración de dos cadenas de carácteres (líneas 103 y 105).

 char topicBuf[50];
 char payloadBuf[20];

Entre las línias 268 y 295 se ha añadido la gestión de la respuesta síncrona:

 int nLastPos = szTopic.lastIndexOf("@");
 if (nLastPos > 0) {
   String topic = szTopic.substring(0, nLastPos - 1)+"/";   // cback example:  idCall-1032.3
   String cback = szTopic.substring(nLastPos + 1);   // cback example:  idCall-1032.3
   Serial.print("cack: ");
   Serial.println(cback);
   int len = cback.length() + 1;
   cback.toCharArray(topicBuf, len);
   Serial.print("String(\"/\" + String(sMac) + TOPIC_SYNC_LDR_NO_SHARP).c_str(): ");
   Serial.println(String("/" + String(sMac) + TOPIC_SYNC_LDR_NO_SHARP).c_str());
   Serial.print("szTopic:"); Serial.println(szTopic);
   Serial.print("topic:"); Serial.println(topic);
   if (topic == String("/" + String(sMac) + TOPIC_SYNC_LDR_NO_SHARP).c_str()) {
     String szLdr = String(analogRead(LDR));
     Serial.print("LDR: "); Serial.println(szLdr);
     // String("/" + String(sMac) + TOPIC_ALT).c_str()
     client.publish( topicBuf, szLdr.c_str());
     Serial.print("topicBuf: ");Serial.println(topicBuf);
     Serial.print("szLdr.c_str(): ");Serial.println(szLdr.c_str());
   }
   if (topic == String("/" + String(sMac) + TOPIC_SYNC_JSONIN_NO_SHARP).c_str()) {
     String szJson = JSON.stringify(json_IoT);
     Serial.print("JSON: "); Serial.println(szJson);
     client.publish( topicBuf, szJson.c_str());
     Serial.print("topicBuf: ");Serial.println(topicBuf);
     Serial.print("szJson.c_str(): ");Serial.println(szJson.c_str());
   }
 }

Bloques de Snap! v8 para hacer peticiones MQTT síncronas[modifica]

Petición y respuesta desde Snap!:

09iot02withMqttSync

Salida del monitor serie del IDE de Arduino:

19:39:35.924 -> Topic: /7C9EBDE9F950/sync/ldr/@9505.4
19:39:35.924 -> payload: 
19:39:35.924 -> cack: 9505.4
19:39:35.924 -> String("/" + String(sMac) + TOPIC_SYNC_LDR_NO_SHARP).c_str(): /7C9EBDE9F950/sync/ldr/
19:39:35.924 -> szTopic:/7C9EBDE9F950/sync/ldr/@9505.4
19:39:35.924 -> topic:/7C9EBDE9F950/sync/ldr/
19:39:35.924 -> LDR: 3071
19:39:35.924 -> topicBuf: 9505.4
19:39:35.924 -> szLdr.c_str(): 3071

Petición y respuesta desde Snap!:

10iot02withMqttSync

Salida del monitor serie del IDE de Arduino:

19:43:42.168 -> Topic: /7C9EBDE9F950/sync/jsonIn/@9751.8
19:43:42.201 -> payload: 
19:43:42.201 -> cack: 9751.8
19:43:42.201 -> String("/" + String(sMac) + TOPIC_SYNC_LDR_NO_SHARP).c_str(): /7C9EBDE9F950/sync/ldr/
19:43:42.201 -> szTopic:/7C9EBDE9F950/sync/jsonIn/@9751.8
19:43:42.201 -> topic:/7C9EBDE9F950/sync/jsonIn/
19:43:42.201 -> JSON: {"Tx100":2450,"RHx100":3932,"Px100":101189,"Ax100":1125,"bIO0":"0","bI34":"0","bI35":"0","LDR":3053}
19:43:42.201 -> topicBuf: 9751.8
19:43:42.201 -> szJson.c_str(): {"Tx100":2450,"RHx100":3932,"Px100":101189,"Ax100":1125,"bIO0":"0","bI34":"0","bI35":"0","LDR":3053}

Petición y respuesta desde Snap!:

11iot02withMqttSync

Petición y respuesta desde Snap!:

12iot02withMqttSync

Código del bloque getValue:

16iot02withMqttSync

Petición y respuesta desde Snap!:

13iot02withMqttSync

Petición y respuesta desde Snap!:

14iot02withMqttSync

Petición y respuesta desde Snap!:

15iot02withMqttSync