{"id":2168,"date":"2020-02-07T12:55:19","date_gmt":"2020-02-07T17:55:19","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=2168"},"modified":"2026-08-04T22:21:06","modified_gmt":"2026-08-05T03:21:06","slug":"lora-multipunto-gateway-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lora-multipunto-gateway-ino\/","title":{"rendered":"3. LoRa Multipunto - Gateway.ino LoRa-ESP32"},"content":{"rendered":"\n<p>El prototipo para un gateway simple se inicia con la funci\u00f3n de recepci\u00f3n de mensajes que hay que procesar para enviarlos aun servidor MQTT. A partir de donde se gestionan los datos de los sensores.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/Lora_Gateway02.png\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/Lora_Gateway02.png\" alt=\"Lora Gateway 02\" class=\"wp-image-2204\" \/><\/a><\/figure>\n\n\n\n<p>Para el prototipo se usa placa de desarrollo que contiene: un&nbsp; m\u00f3dulo LoRa y un SoC ESP32. Si se reutiliza algunos componentes de algoritmos usados para los dispositivos con WiFi, la versi\u00f3n inicial se conecta un router IP via WiFi de donde se envia el mensaje MQTT.<\/p>\n\n\n\n<p>El mensaje MQTT requiere la descripci\u00f3n de un t\u00f3pico, por lo que en la conformaci\u00f3n del t\u00f3pico se usa la direcci\u00f3n de env\u00edo.<\/p>\n\n\n\n<p>Los valores usados en el mensaje MQTT, son el estado del sensor u otro valor que se requiera. Para facilitar el seguimiento inicial de datos, se publica el identificador de mensaje, que es un contador ascendente que permite observar la secuencia del n\u00famero de mensaje.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Gateway Multipunto - Recepci\u00f3n Lora y env\u00edo MQTT<\/h2>\n\n\n\n<p>Para el ejercicio se habilitan dos dispositivos \"D1\" y \"D2\", comprobando los mensajes recibidos de varias formas:<\/p>\n\n\n\n<p>- mensajes por puerto serial<br>- mensajes MQTT en servidor<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><figure><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-3718 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08.png\" alt=\"LoRa Multipunto Gtw 08\" width=\"1246\" height=\"521\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08.png 1246w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08-300x125.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08-768x321.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_08-1024x428.png 1024w\" sizes=\"auto, (max-width: 1246px) 100vw, 1246px\" \/><\/a><\/figure><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Instrucciones en Arduino<\/h2>\n\n\n\n<p>Los bloques se crean a partir del ejemplo de LoRa Mutipunto para dispositivos, aprovechando que el m\u00f3dulo Heltec LoRa-ESP32 tiene incorporado WiFi. Aunque no se encuentran todos los canales disponibles al mismo tiempo para recibir todas las se\u00f1ales, se aprovecha que si el&nbsp; canal est\u00e1 libre se puede realizar la transmisi\u00f3n del estado del sensor desde LoRa hacia WiFi para llegar hasta el broker MQTT.<\/p>\n\n\n\n<p>El ejercicio es una prueba de concepto, pues un gateway completo debe estar atento a todos los canales de transmisi\u00f3n y tener la capacidad de atenci\u00f3n a cada uno de ellos simult\u00e1neamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bloque principal<\/h2>\n\n\n\n<p>En el bloque principal se adjuntan los par\u00e1metros de conexi\u00f3n por WiFi, as\u00ed como las instrucciones de inicio. Desde luego ser\u00e1 necesario a\u00f1adir los procedimientos de WiFi y MQTT.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"846\" height=\"129\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_01.png\" alt=\"LoRa Multipunto Gtw 01\" class=\"wp-image-3711\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_01.png 846w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_01-300x46.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_01-768x117.png 768w\" sizes=\"auto, (max-width: 846px) 100vw, 846px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* Dispositivo Gateway: LoRa\/WiFi\/MQTT\/Home-Assistant\n * http:\/\/blog.espol.edu.ec\/girni\/lora-multipunto-esquema\/\n * Referencia: Aaron.Lee www.heltec.cn, \n * https:\/\/github.com\/Heltec-Aaron-Lee\/WiFi_Kit_series\n*\/\n#include &quot;heltec.h&quot;\n#include &lt;WiFi.h&gt;\n#include &lt;PubSubClient.h&gt;\n\n\/\/ LoRa Banda ISM en Regi\u00f3n 915Mhz\n#define BAND 915E6 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/433E6,868E6,915E6\nbyte spread_factor = 8; \u00a0\/\/ rango 6-12,default 7\n\n\/\/ Mensaje LoRa a enviar por direcciones\nbyte dir_local \u00a0\u00a0= 0xC1; \/\/ Dispositivo 1\nbyte dir_destino = 0xD1; \/\/ Dispositivo 2\nbyte id_msjLoRa \u00a0= 0; \u00a0\u00a0\u00a0\/\/ cuenta mensaje\nString paqueteEnv = &quot;&quot;; \u00a0\/\/ mensaje\n\n\/\/ Mensaje LoRa recibido\nbyte dir_envio \u00a0= 0xC1; \/\/ receptor\nbyte dir_remite = 0xD1; \/\/ emisor\nString paqueteRcb = &quot;OFF&quot;; \/\/ mensaje LoRa\nbyte \u00a0\u00a0paqRcb_ID \u00a0= 0;\nbyte \u00a0\u00a0paqRcb_Estado = 0;\n \u00a0\/\/ 0:vacio, 1: nuevo, \u00a0\u00a02:incompleto\n \u00a0\/\/ 3:otro destinatario, 4:Broadcast\n\n\/\/ LED interno, ESP01-pin=1, ESP07-pin=2\nint LED_pin = LED; \/\/LED interno Heltec\n\n\/\/ Mensajes por Puerto Serial\nboolean serial_msj = true;\n\n\/\/ tiempo entre lecturas\nlong tiempo_antes \u00a0\u00a0\u00a0\u00a0= 0;\nint \u00a0tiempo_intervalo = 6000;\nlong tiempo_espera = tiempo_intervalo + random(3000);\n\n\/\/ WIFI: conexi\u00f3n a Router\nchar* ssid \u00a0\u00a0\u00a0\u00a0= &quot;miRouter&quot;;\nchar* password = &quot;miRouterclave&quot;;\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = &quot;192.168.10.50&quot;;\nuint16_t MQTT_puerto \u00a0= 1883;\nchar* MQTT_usuario \u00a0\u00a0\u00a0= &quot;usuarioprueba&quot;;\nchar* MQTT_contrasena = &quot;usuarioclave&quot;;\n\n\/\/ MQTT: Dispositivo Sensor\nchar* MQTT_ID = &quot;LoraGatewayC1&quot;;\nString topico_base \u00a0= &quot;invernadero\/lora&quot;;\nString topico_valor = &quot;\/valor&quot;;\nchar MQTT_TOPIC&#x5B;50] = &quot;&quot;; \/\/ construido en algoritmo\nchar MQTT_SensorEstado&#x5B;10] = &quot;OFF&quot;;\nboolean mqtt_desconectado = true;\n\n\/\/ MQTT: Dispositivo Actuador\nString topico_accion = &quot;\/cambia&quot;;\nchar MQTT_COMMAND&#x5B;50] = &quot;&quot;;\nchar MQTT_ActuadorEstado&#x5B;10] = &quot;OFF&quot;;\nboolean actuador_estado \u00a0= false;\nboolean actuador_bandera = false;\nchar* sensor_ON \u00a0= &quot;ON&quot;;\nchar* sensor_OFF = &quot;OFF&quot;;\n\n\/\/ Clientes WiFi y MQTT\nWiFiClient \u00a0\u00a0wificlient;\nPubSubClient mqttclient(wificlient);\n\nvoid setup(){\n \u00a0Heltec.begin(false \/*DisplayEnable Enable*\/,\n \u00a0\u00a0\u00a0true \/*Heltec.LoRa Disable*\/,\n \u00a0\u00a0\u00a0serial_msj \/*Serial Enable*\/,\n \u00a0\u00a0\u00a0true \/*PABOOST Enable*\/,\n \u00a0\u00a0\u00a0BAND \/*long BAND*\/);\n \u00a0LoRa.setSpreadingFactor(spread_factor);\n \u00a0\n \u00a0\/\/LoRa.onReceive(cbk);\n \u00a0LoRa.receive();\n \u00a0\n \u00a0inicia_wifi(); \/\/ conexi\u00f3n WIFI y MQTT\n \u00a0if (WiFi.status() == WL_CONNECTED){\n \u00a0\u00a0\u00a0inicia_mqtt();\n \u00a0\u00a0\u00a0}\n}\n\nvoid loop(){\n\n \u00a0\/\/ LoRa Revisa mensajes de dispositivos\n \u00a0int msjRcbLoRa = LoRa.parsePacket();\n \u00a0if (msjRcbLoRa !=0){\n \u00a0\u00a0\u00a0recibe_lora(msjRcbLoRa);\n \u00a0\u00a0\u00a0int rssi_lora = LoRa.packetRssi();\n \u00a0\u00a0\u00a0int snr_lora \u00a0= LoRa.packetSnr();\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0if (paqRcb_Estado == 1){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;Recibido: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(String(dir_remite,HEX));Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(String(dir_envio,HEX)); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqRcb_ID); \u00a0Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqueteRcb); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(rssi_lora); \u00a0Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(snr_lora); \u00a0\u00a0Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0\u00a0\u00a0}else{\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;Paquete recibido Estado: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(paqRcb_Estado);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ LED parpadea. Rebibido LoRa \n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW ); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(50);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW );\n \u00a0}\n\n \u00a0\n \u00a0\/\/ MQTT publica estado recibido desde LoRa\n \u00a0if (msjRcbLoRa !=0 &amp;&amp; paqRcb_Estado == 1){\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0publica_mqtt();\n \u00a0\u00a0\u00a0}\n \u00a0}\n\n \u00a0\/\/ LoRa Reenvia a dispositivo\n \u00a0if (actuador_bandera == true){\n \u00a0\u00a0\u00a0id_msjLoRa = id_msjLoRa +1;\n \u00a0\u00a0\u00a0envia_lora(dir_destino, dir_local, \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id_msjLoRa, paqueteEnv);\n \u00a0\u00a0\u00a0actuador_bandera = false;\n \u00a0}\n\n \u00a0\/\/ Revisa estado WiFi y MQTT\n \u00a0if (WiFi.status() != WL_CONNECTED){\n \u00a0\u00a0\u00a0inicia_wifi();\n \u00a0}else{\n \u00a0\u00a0\u00a0if (mqttclient.connected () == false){\n \u00a0\u00a0\u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0\u00a0\u00a0\u00a0\u00a0inicia_mqtt(); \/\/ reintento\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (mqttclient.connected() == true){\n \u00a0\u00a0\u00a0\u00a0\u00a0if (mqtt_desconectado==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0publica_mqtt();\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mqtt_desconectado=false;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0mqttclient.loop();\n \u00a0\u00a0\u00a0}\n \u00a0}\n \u00a0delay(100);\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">LoRa - env\u00edo de mensajes<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"845\" height=\"126\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_02.png\" alt=\"LoRa Multipunto Gtw 02\" class=\"wp-image-3712\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_02.png 845w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_02-300x45.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_02-768x115.png 768w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid envia_lora(byte destino, byte remite,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0byte paqueteID, String paquete){\n\n \u00a0\/\/ espera radio para enviar un paquete\n \u00a0while(LoRa.beginPacket() == 0){\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;Esperando radio disponible...&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0delay(100);\n \u00a0}\n \u00a0\n \u00a0\/\/ envio del mensaje LoRa\n \u00a0LoRa.beginPacket();\n \u00a0LoRa.write(destino);\n \u00a0LoRa.write(remite);\n \u00a0LoRa.write(paqueteID);\n \u00a0LoRa.write(paquete.length());\n \u00a0LoRa.print(paquete);\n \u00a0LoRa.endPacket();\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">LoRa - Recibe mensajes<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"847\" height=\"125\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_03.png\" alt=\"LoRa Multipunto Gtw 03\" class=\"wp-image-3713\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_03.png 847w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_03-300x44.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_03-768x113.png 768w\" sizes=\"auto, (max-width: 847px) 100vw, 847px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid recibe_lora(int tamano){\n \u00a0if (tamano == 0){ \n \u00a0\u00a0\u00a0paqRcb_Estado = 0; \/\/vacio\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0\u00a0\u00a0\n \u00a0\/\/ lectura de paquete\n \u00a0paqueteRcb = &quot;&quot;;\n \u00a0dir_envio \u00a0= LoRa.read();\n \u00a0dir_remite = LoRa.read();\n \u00a0paqRcb_ID \u00a0\u00a0= LoRa.read();\n \u00a0\n \u00a0byte paqrcbTamano = LoRa.read();\n \u00a0while(LoRa.available()){\n \u00a0\u00a0\u00a0paqueteRcb += (char)LoRa.read();\n \u00a0}\n \u00a0\n \u00a0if (paqrcbTamano != paqueteRcb.length()){\n \u00a0\u00a0\u00a0paqRcb_Estado = 2; \/\/ tama\u00f1o incompleto\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio != dir_local){\n \u00a0\u00a0\u00a0paqRcb_Estado = 3; \/\/ otro destino\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio == 0xFF) {\n \u00a0\u00a0\u00a0paqRcb_Estado = 4; \/\/ Broadcast, difusion\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0paqRcb_Estado = 1; \u00a0\u00a0\/\/ mensaje Nuevo\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">MQTT- inicia<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_04.png\"><img loading=\"lazy\" decoding=\"async\" width=\"843\" height=\"128\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_04.png\" alt=\"LoRa Multipunto Gtw 04\" class=\"wp-image-3714\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_04.png 843w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_04-300x46.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_04-768x117.png 768w\" sizes=\"auto, (max-width: 843px) 100vw, 843px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid inicia_mqtt(void){\n \u00a0int esperamqtt = 5;\n \u00a0int cuentamqtt = 0;\n \u00a0\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0Serial.print(&quot; MQTT Conectando a &quot;);\n \u00a0\u00a0\u00a0Serial.println(MQTT_IP);\n \u00a0\u00a0\u00a0}\n\n \u00a0mqttclient.setServer(MQTT_IP, MQTT_puerto);\n \u00a0mqttclient.connect(MQTT_ID, MQTT_usuario, MQTT_contrasena);\n \u00a0mqttclient.setCallback(recibe_mqtt);\n \u00a0\n \u00a0while (!mqttclient.connected() &amp;&amp; (cuentamqtt&lt;=esperamqtt)) {\n \u00a0\u00a0\u00a0cuentamqtt = cuentamqtt + 1;\n \u00a0\u00a0\u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\/\/ LED Monitor parpadeo MQTT\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, HIGH); delay(200);\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, LOW); \u00a0delay(200);\n \u00a0}\n \u00a0\n \u00a0if (mqttclient.connected()){\n \u00a0\u00a0\u00a0\/\/ publica_mqtt();\n \u00a0\u00a0\u00a0\/\/ suscribe a todos los topicos base\n \u00a0}\n \u00a0\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\/\/Fin de &quot;....&quot;\n \u00a0\u00a0\u00a0Serial.print(&quot;\\n MQTT Conectado: &quot;);\n \u00a0\u00a0\u00a0Serial.print(mqttclient.connected());\n \u00a0\u00a0\u00a0Serial.print(&quot;\\t Estado: &quot;);\n \u00a0\u00a0\u00a0Serial.println(mqttclient.state());\n \u00a0}\n}\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">MQTT- publica mensaje<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_05.png\"><img loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"125\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_05.png\" alt=\"LoRa Multipunto Gtw 05\" class=\"wp-image-3715\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_05.png 848w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_05-300x44.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_05-768x113.png 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid publica_mqtt() { \n \u00a0paqueteRcb.toCharArray(MQTT_SensorEstado,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0paqueteRcb.length()+1);\n\n \u00a0\/\/ MQTT Construye t\u00f3pico por remitente\n \u00a0String remite = String(dir_remite, HEX);\n \u00a0remite.toUpperCase();\n \u00a0String topico = topico_base + remite + topico_valor;\n \u00a0topico.toCharArray(MQTT_TOPIC,topico.length()+1);\n \u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0Serial.print(&quot; \u00a0&quot;);\n \u00a0\u00a0\u00a0Serial.print(topico); Serial.print(&quot;\/&quot;);\n \u00a0\u00a0\u00a0Serial.println(MQTT_SensorEstado);\n \u00a0}\n \u00a0\/\/ MQTT Construye t\u00f3pico por remitente\n \u00a0\u00a0\u00a0String topico_cmd = &quot;&quot;;\n \u00a0\u00a0\u00a0topico_cmd += topico_base + remite +&quot;\/cambia&quot;;\n \u00a0\u00a0\u00a0topico_cmd.toCharArray(MQTT_COMMAND,topico_cmd.length()+1);\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; \u00a0sucrito: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(MQTT_COMMAND);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\n \u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC,MQTT_SensorEstado,true);\n \u00a0\u00a0\u00a0mqttclient.subscribe(MQTT_COMMAND);\n \u00a0}else{\n \u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0}\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">MQTT- Recibe mensaje<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_06.png\"><img loading=\"lazy\" decoding=\"async\" width=\"847\" height=\"127\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_06.png\" alt=\"LoRa Multipunto Gtw 06\" class=\"wp-image-3716\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_06.png 847w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_06-300x45.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_06-768x115.png 768w\" sizes=\"auto, (max-width: 847px) 100vw, 847px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/\/ llega mensaje MQTT, callback mqtt sin confirmaci\u00f3n\nvoid recibe_mqtt(char* p_topic, byte* p_payload,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0unsigned int p_length) {\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0Serial.println(&quot;Recibe mensaje MQTT&quot;);\n \u00a0\u00a0\u00a0Serial.println(p_topic);\n \u00a0}\n \u00a0\/\/ convierte a texto\n \u00a0String payload;\n \u00a0for (uint8_t i = 0; i &lt; p_length; i++) {\n \u00a0\u00a0\u00a0payload.concat((char)p_payload&#x5B;i]);\n \u00a0\u00a0\u00a0}\n \u00a0paqueteEnv = payload;\n \u00a0\n \u00a0\/\/ direccion destino\n \u00a0char dispositivo&#x5B;3] = &quot;D0&quot;;\n \u00a0int desde = topico_base.length();\n \u00a0dispositivo&#x5B;0] = p_topic&#x5B;desde];\n \u00a0dispositivo&#x5B;1] = p_topic&#x5B;desde+1];\n \u00a0dir_destino = (int) strtol(dispositivo,NULL,16);\n\n \u00a0actuador_bandera = true;\n \u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0mqttclient.subscribe(MQTT_COMMAND);\n \u00a0}else{\n \u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0}\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">WiFi - inicio<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_07.png\"><img loading=\"lazy\" decoding=\"async\" width=\"849\" height=\"126\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_07.png\" alt=\"LoRa Multipunto Gtw 07\" class=\"wp-image-3717\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_07.png 849w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_07-300x45.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/01\/LoRaMultipuntoGtw_07-768x114.png 768w\" sizes=\"auto, (max-width: 849px) 100vw, 849px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid inicia_wifi(void) {\n \u00a0int esperawifi = 10; \u00a0\/\/ &gt;=10 para conectar\n \u00a0int cuentawifi = 0;\n \u00a0\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0Serial.print(&quot; WiFi Conectando a &quot;);\n \u00a0\u00a0\u00a0Serial.println(ssid);\n \u00a0\u00a0\u00a0}\n \u00a0\n \u00a0WiFi.disconnect(true);\n \u00a0delay(1000);\n \u00a0\n \u00a0WiFi.mode(WIFI_STA);\n \u00a0WiFi.setAutoConnect(true);\n \u00a0WiFi.begin(ssid,password);\n \u00a0delay(100);\n \u00a0\n \u00a0while(WiFi.status() != WL_CONNECTED &amp;&amp; \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(cuentawifi &lt; esperawifi)){\n \u00a0\u00a0\u00a0cuentawifi = cuentawifi + 1;\n \u00a0\u00a0\u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\/\/ Parpadeo de Monitor Wifi\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, HIGH); delay(300);\n \u00a0\u00a0\u00a0digitalWrite(LED_pin, LOW); \u00a0delay(200);\n \u00a0}\n \u00a0\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\/\/ mensaje a serial, Fin de &quot;...&quot;\n \u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0if (WiFi.status() == WL_CONNECTED){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; Estado: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.status());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; MAC: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.macAddress());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; IP: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.localIP());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot; RSSI: &quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(WiFi.RSSI());\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0if (WiFi.status() != WL_CONNECTED){\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0WiFi.printDiag(Serial);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0}\n \u00a0}\n}\n<\/pre><\/div>\n\n\n<p>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El prototipo para un gateway simple se inicia con la funci\u00f3n de recepci\u00f3n de mensajes que hay que procesar para enviarlos aun servidor MQTT. A partir de donde se gestionan los datos de los sensores. Para el prototipo se usa placa de desarrollo que contiene: un&nbsp; m\u00f3dulo LoRa y un SoC ESP32. Si se reutiliza [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1436897],"tags":[602214,1457738],"class_list":["post-2168","post","type-post","status-publish","format-standard","hentry","category-lora-multipunto","tag-iot","tag-lora"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=2168"}],"version-history":[{"count":14,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2168\/revisions"}],"predecessor-version":[{"id":4890,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2168\/revisions\/4890"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}