{"id":2228,"date":"2020-02-12T08:21:26","date_gmt":"2020-02-12T13:21:26","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/edelros\/?p=2228"},"modified":"2026-08-04T22:23:56","modified_gmt":"2026-08-05T03:23:56","slug":"lora-temperatura-humedad-gateway-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lora-temperatura-humedad-gateway-ino\/","title":{"rendered":"3. LoRa - Temperatura Humedad: Gateway Archivo.ino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">1. Instrucciones en Arduino IDE<\/h2>\n\n\n\n<p>Para el env\u00edo de los mensajes hacia el broker MQTT y Home Assistant se usa un dispositivo configurado como gateway.<\/p>\n\n\n\n<p>Se usa un dispositivo en lugar de un concentrador en la etapa de prototipo considerando los costos involucrados. La pr\u00f3xima tarea es desarrollar el gateway usando un concentrador, cuyo valor es&nbsp; m\u00e1s alto.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* Gateway LoRa\n \u00a0Lora\/Wifi\/MQTT\/Home-Assistant\n \u00a0Envia informaci\u00f3n por red Lora\/Gateway WiFi\n \u00a0hacia un broker MQTT y gestionar datos en Home-Assistant\n \u00a0edelros@espol.edu.ec\n \u00a0http:&amp;#047;&amp;#047;blog.espol.edu.ec\/edelros\/\n \u00a0\n \u00a0Referencia: Aaron.Lee www.heltec.cn\n \u00a0https:\/\/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\/\/ DISPOSITIVO LORA Banda ISM en Regi\u00f3n 915Mhz\n#define BAND \u00a0915E6 \/\/433E6,868E6,915E6\n\/\/ ranges from 6-12,default 7 see API docs\nbyte spread_factor = 8;\n\n\/\/ LoRa Mensaje a enviar por direcciones\nString paqueteEnv = &quot;&quot;;\nbyte dir_local \u00a0\u00a0= 0xC1; \/\/ Concentrador 1\nbyte dir_destino = 0xD1; \/\/ Dispositivo 1\nbyte msjContador = 0; \/\/ identificador de mensaje\n\/\/ tiempo entre lecturas\nlong t_anterior = 0;\nint \u00a0t_intervalo = 4000;\n\n\/\/ LoRa Mensaje Recibido\nbyte dir_envio = 0xC1; \/\/ Concentrador 1\nint dir_remite = 0xD0; \/\/ Inicia Remitente\nString paqueteRcb = &quot;&quot;;\nbyte \u00a0\u00a0paqrcbID = 0;\nbyte \u00a0\u00a0paqrcbEstado = 0;\n \u00a0\/\/ 0:vacio, 1: nuevo, 2:incompleto\n \u00a0\/\/ 3:otro destinatario, 4:Broadcast\n\n \/\/ Mensajes por Puerto Serial\nvolatile boolean serial_msj = true;\n\n\/\/ WIFI: conexi\u00f3n a Router\nchar* ssid = &quot;giotirni20&quot;;\nchar* password = &quot;Anera2020@&quot;;\n\n\/\/ MQTT: Servidor\nchar* MQTT_IP = &quot;192.168.10.50&quot;;\nuint16_t MQTT_puerto = 1883;\nchar* MQTT_usuario = &quot;usuarioprueba&quot;;\nchar* MQTT_contrasena = &quot;usuarioclave&quot;;\n\n\/\/ MQTT: Dispositivo Sensor\nchar* MQTT_ID = &quot;LoraGatewayC1&quot;;\nchar MQTT_TOPIC_T&#x5B;50] = &quot;invernadero\/loraD1\/temperatura&quot;;\nchar MQTT_TOPIC_H&#x5B;50] = &quot;invernadero\/loraD1\/humedad&quot;;\nchar MQTT_TOPIC_V&#x5B;50] = &quot;invernadero\/loraD1\/voltaje&quot;;\nchar MQTT_SensorEstado&#x5B;10] = &quot;OFF&quot;;\nvolatile boolean mqtt_desconectado = true;\n\/\/ MQTT: Dispositivo Actuador\nchar* MQTT_COMMAND = &quot;invernadero\/loraD1\/cambia&quot;;\nchar MQTT_ActuadorEstado&#x5B;10] = &quot;OFF&quot;;\nvolatile boolean actuador_estado = false;\nvolatile boolean actuador_bandera = false;\nchar temperatura&#x5B;10] \u00a0= &quot;00.00&quot;;\nchar humedad&#x5B;10] = &quot;00.00&quot;;\nchar voltaje&#x5B;10] = &quot;00.00&quot;;\n\n\/\/ Clientes WiFi y MQTT\nWiFiClient wificlient;\nPubSubClient mqttclient(wificlient);\n\nvoid setup(){\n \u00a0Heltec.begin(false \/*DisplayEnable Enable*\/,\n \u00a0\u00a0\u00a0true \/*Heltec.Heltec.Heltec.LoRa Disable*\/,\n \u00a0\u00a0\u00a0serial_msj \/*Serial Enable*\/,\n \u00a0\u00a0\u00a0true \/*PABOOST Enable*\/,\n \u00a0\u00a0\u00a0BAND \/*long BAND*\/);\n \u00a0\/\/ ranges from 6-12,default 7 see API docs\n \u00a0LoRa.setSpreadingFactor(spread_factor);\n \u00a0\n \u00a0\/\/LoRa.onReceive(cbk);\n \u00a0LoRa.receive();\n \u00a0\n \u00a0\/\/ conexi\u00f3n WIFI y MQTT\n \u00a0inicia_wifi();\n \u00a0if (WiFi.status() == WL_CONNECTED){\n \u00a0\u00a0\u00a0inicia_mqtt();\n \u00a0\u00a0\u00a0}\n}\n\nvoid loop(){\n \u00a0\/\/ parametros de recepci\u00f3n\n \u00a0int rssi_lora = 0;\n \u00a0int snr_lora = 0;\n \u00a0\n \u00a0\/\/ Revisa mensajes LoRa entrantes\n \u00a0int msjRcbLoRa = LoRa.parsePacket();\n \u00a0if (msjRcbLoRa !=0){\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0recibirlora(msjRcbLoRa);\n \u00a0\u00a0\u00a0rssi_lora = LoRa.packetRssi();\n \u00a0\u00a0\u00a0snr_lora = LoRa.packetSnr();\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0if (serial_msj==true){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(&quot;remite,msjID,mensaje,estado,Rssi,Snr&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(String(dir_remite, HEX)); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqrcbID); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqueteRcb); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(paqrcbEstado); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(rssi_lora); Serial.print(&quot;,&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(snr_lora);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0yield(); \/\/ procesa wifi\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\u00a0\u00a0yield(); \/\/ procesa wifi\n \u00a0\u00a0\u00a0delay(100);\n \u00a0}\n\n \u00a0\/\/ Procesa a MQTT mensaje completo\n \u00a0if (msjRcbLoRa !=0 &amp;&amp; paqrcbEstado == 1){\n \u00a0\u00a0\u00a0\/\/ Separa par\u00e1metros\n \u00a0\u00a0\u00a0String t = paqueteRcb.substring(1,6);\n \u00a0\u00a0\u00a0String h = paqueteRcb.substring(8,10);\n \u00a0\u00a0\u00a0String v = paqueteRcb.substring(12);\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ procesa t\u00f3pico MQTT\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ a\u00f1ade dispositivo\n \u00a0\u00a0\u00a0String topico = &quot;invernadero\/lora&quot;;\n \u00a0\u00a0\u00a0String remite = String(dir_remite, HEX);\n \u00a0\u00a0\u00a0remite.toUpperCase();\n \u00a0\u00a0\u00a0topico = topico + remite;\n \u00a0\u00a0\u00a0\n \u00a0\u00a0\u00a0\/\/ procesa topico\n \u00a0\u00a0\u00a0String topicot = topico + &quot;\/temperatura&quot;;\n \u00a0\u00a0\u00a0String topicoh = topico + &quot;\/humedad&quot;;\n \u00a0\u00a0\u00a0String topicov = topico + &quot;\/voltaje&quot;;\n \u00a0\u00a0\u00a0topicot.toCharArray(MQTT_TOPIC_T,topicot.length()+1);\n \u00a0\u00a0\u00a0topicoh.toCharArray(MQTT_TOPIC_H,topicoh.length()+1);\n \u00a0\u00a0\u00a0topicov.toCharArray(MQTT_TOPIC_V,topicov.length()+1);\n\n \u00a0\u00a0\u00a0t.toCharArray(temperatura,t.length()+1);\n \u00a0\u00a0\u00a0h.toCharArray(humedad,h.length()+1);\n \u00a0\u00a0\u00a0v.toCharArray(voltaje,v.length()+1);\n \u00a0\u00a0\u00a0Serial.println(topicov);\n\n \u00a0\u00a0\u00a0\n \u00a0\u00a0publica_estado();\n \u00a0}\n \u00a0yield(); \/\/ procesa wifi\n \u00a0delay(20);\n\n \u00a0\/\/ reenviar a dispositivo\n \u00a0if (actuador_bandera == true){\n \u00a0\u00a0\u00a0msjContador = msjContador +1;\n \u00a0\u00a0\u00a0enviarlora(dir_destino, dir_local, \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0msjContador, paqueteEnv);\n \u00a0\u00a0\u00a0actuador_bandera = false;\n \u00a0}\n \u00a0yield(); \/\/ procesa wifi\n \u00a0delay(20);\n \u00a0\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_estado();\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 \u00a0yield(); \/\/ procesa wifi\n}\n\n\nvoid enviarlora(byte destino, byte remite,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0byte paqueteID, String paquete){\n \u00a0\/\/ espera que el radio est\u00e9 listo\n \u00a0\/\/ 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\u00a0yield(); \/\/ procesa wifi\n \u00a0\u00a0\u00a0delay(100);\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\nvoid recibirlora(int tamano){\n \u00a0if (tamano == 0){ \n \u00a0\u00a0\u00a0paqrcbEstado = 0; \/\/vacio\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0\u00a0\u00a0\n \u00a0\/\/ lectura de paquete\n \u00a0paqueteRcb = &quot;&quot;;\n \u00a0dir_envio = LoRa.read();\n \u00a0dir_remite \u00a0= LoRa.read();\n \u00a0paqrcbID = LoRa.read();\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\u00a0paqrcbEstado = 2; \/\/ Tama\u00f1o incompleto\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio != dir_local){\n \u00a0\u00a0\u00a0paqrcbEstado = 3; \/\/ otro destino\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0if (dir_envio == 0xFF) {\n \u00a0\u00a0\u00a0paqrcbEstado = 4; \/\/ Broadcast\n \u00a0\u00a0\u00a0return;\n \u00a0}\n \u00a0paqrcbEstado = 1; \u00a0\/\/ mensaje Nuevo\n}\n\nvoid inicia_mqtt(void){\n \u00a0int intentosmqtt = 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(recibirmqtt);\n \u00a0\n \u00a0while (!mqttclient.connected() &amp;&amp; (cuentamqtt&lt;=intentosmqtt)){\n \u00a0\u00a0\u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0cuentamqtt = cuentamqtt + 1;\n \u00a0\u00a0\u00a0\/\/ LED Monitor parpadeo MQTT\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH); delay(200);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW); delay(200);\n \u00a0}\n \u00a0if (mqttclient.connected()){\n \u00a0\u00a0\u00a0\u00a0\u00a0publica_estado();\n \u00a0}\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\/\/Fin de &quot;....&quot;\n \u00a0\u00a0\u00a0Serial.println();\n \u00a0\u00a0\u00a0Serial.print(&quot; MQTT Conectado: &quot;);\n \u00a0\u00a0\u00a0Serial.print(mqttclient.connected());\n \u00a0\u00a0\u00a0Serial.print(&quot;\\t MQTT Estado: &quot;);\n \u00a0\u00a0\u00a0Serial.println(mqttclient.state());\n \u00a0}\n}\n\nvoid publica_estado() { \n\n \u00a0if (mqttclient.connected()==true){\n \u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_T,temperatura,true);\n \u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_H,humedad,true);\n \u00a0\u00a0\u00a0mqttclient.publish(MQTT_TOPIC_V,voltaje,true);\n \u00a0\u00a0\u00a0mqttclient.subscribe(MQTT_COMMAND);\n \u00a0}else{\n \u00a0\u00a0\u00a0mqtt_desconectado = true;\n \u00a0}\n}\n\n\/\/ llega mensaje MQTT, callback mqtt\nvoid recibirmqtt(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 \u00a0Serial.println(&quot;un mensaje mqtt&quot;);\n \u00a0Serial.println(p_topic);\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 \u00a0\/\/ String dispositivo = p_topic&#x5B;16] + String(p_topic&#x5B;17]);\n \u00a0char dispositivo&#x5B;3] = &quot;D0&quot;;\n \u00a0dispositivo&#x5B;1]=p_topic&#x5B;17];\n \u00a0dir_destino = (int) strtol(dispositivo,NULL,16);\n \u00a0paqueteEnv = payload;\n \u00a0actuador_bandera = true;\n\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\nvoid inicia_wifi(void) {\n \u00a0int intentoswifi = 10;\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 \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\u00a0cuentawifi &lt; intentoswifi){\n \u00a0\u00a0\u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\u00a0\u00a0Serial.print(&quot;.&quot;);\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0cuentawifi = cuentawifi + 1;\n \u00a0\u00a0\u00a0\/\/ Parpadeo de Monitor Wifi\n \u00a0\u00a0\u00a0digitalWrite(LED, HIGH);delay(300);\n \u00a0\u00a0\u00a0digitalWrite(LED, LOW);delay(200);\n \u00a0}\n \u00a0if (serial_msj){\n \u00a0\u00a0\u00a0\/\/ mensaje a serial\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>","protected":false},"excerpt":{"rendered":"<p>1. Instrucciones en Arduino IDE Para el env\u00edo de los mensajes hacia el broker MQTT y Home Assistant se usa un dispositivo configurado como gateway. Se usa un dispositivo en lugar de un concentrador en la etapa de prototipo considerando los costos involucrados. La pr\u00f3xima tarea es desarrollar el gateway usando un concentrador, cuyo valor [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1457942],"tags":[602214,1457738],"class_list":["post-2228","post","type-post","status-publish","format-standard","hentry","category-lora-temperatura-humedad","tag-iot","tag-lora"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2228","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=2228"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2228\/revisions"}],"predecessor-version":[{"id":4894,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2228\/revisions\/4894"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}