Gestión de llamadas síncronas MQTT mediante el IDE de Arduino y Snap! v8 (2023)
Contingut
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
Bloque (función) getValue(param):
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!:
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!:
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!:
Petición y respuesta desde Snap!:
Código del bloque getValue:
Petición y respuesta desde Snap!:
Petición y respuesta desde Snap!:
Petición y respuesta desde Snap!: