diff --git a/other_resources/baseReadme.md b/other_resources/baseReadme.md
index 4505673..768bed2 100644
--- a/other_resources/baseReadme.md
+++ b/other_resources/baseReadme.md
@@ -3,7 +3,7 @@
Este proyecto es el resultado del desarrollo del Trabajo de Fin de Grado para el Grado de Ingeniería Informática de la
en Talavera de la Reina. Realizado en julio de 2024 por Rubén Gomez Villegas, con la supervisión de los tutores Rubén Cantarero Navarro y Ana Rubio Ruiz, el proyecto se centra en el desarrollo de un protocolo de mensajería ligera para placas ESP32 basado en MQTT y utilizando ESP-NOW, culminando en una librería publicada en el registro de PlatformIO.
Recursos de interés:
-- Memoria oficial:
+- [Memoria oficial](/tfg_report/TFG_GomezRuben_ProtocoloESPNOWMQTT.pdf)
- Tablero Trello utilizado para gestionar el proyecto:
- Librería:
- Manual web:
diff --git a/tfg_report/TFG_GomezRuben_ProtocoloESPNOWMQTT.pdf b/tfg_report/TFG_GomezRuben_ProtocoloESPNOWMQTT.pdf
new file mode 100644
index 0000000..e71dc43
Binary files /dev/null and b/tfg_report/TFG_GomezRuben_ProtocoloESPNOWMQTT.pdf differ
diff --git a/tfg_report/example.pdf b/tfg_report/example.pdf
deleted file mode 100644
index 482f719..0000000
Binary files a/tfg_report/example.pdf and /dev/null differ
diff --git a/tfg_report/templateAPP/input/abstract.md b/tfg_report/templateAPP/input/abstract.md
index f6276be..4bbda7f 100644
--- a/tfg_report/templateAPP/input/abstract.md
+++ b/tfg_report/templateAPP/input/abstract.md
@@ -1 +1,2 @@
-\lipsum[1]
+The Internet of Things is very relevant in today's society, as it allows the creation of systems to collect and process data, as well as to transmit commands to different devices. However, the implementation of these systems presents problems in certain environments due to various difficulties and costs. These difficulties may arise from the impossibility of installing an Internet network, the high power consumption of the devices or the need to use a wireless network without an adequate infrastructure to process and transmit messages.
+To solve this problem, the LoboMQ protocol is proposed, which allows to manage messages transmitted between several low-power microcontrollers using message queues inspired by the MQTT publish-subscribe pattern, and takes advantage of ESP-NOW to perform the transmissions without the need of an Internet network. The aim of the protocol development and its implementation in a C++ library is to offer a simple-to-use solution to the Internet of Things community.
diff --git a/tfg_report/templateAPP/input/acknowledgements.md b/tfg_report/templateAPP/input/acknowledgements.md
index d2d94d2..28f01d5 100644
--- a/tfg_report/templateAPP/input/acknowledgements.md
+++ b/tfg_report/templateAPP/input/acknowledgements.md
@@ -1 +1,5 @@
-\lipsum[2]
+Agradezco a todo aquel que me ha acompañado durante este camino con baches y flores que ha sido el grado, a mis amigos, a mi pareja con quien he podido compartir cientos de momentos y depositar total confianza, y a mi familia, como a mi padre y a mi abuela, que pese a no entender ni un pijo de lo que hago, están ahí y me preguntan de vez en cuando que de qué va lo que estudio.
+
+Quiero también agradecer a todos los profesores con los que me he cruzado durante esta formación académica. En especial, a mis tutores Rubén y Ana, por ayudarme y apoyarme en esta última etapa, por haber sido demasiado pacientes conmigo y por haber confiado en mí hasta el último momento (o eso quiero pensar).
+
+Por último y no menos importante, estoy agradecido con mi yo del pasado, por todo el esfuerzo que ha hecho y todas esas malas decisiones que han hecho llegar a un ámbito en el que me considero cómodo, y con mi yo del futuro, que espero que eche la vista hacia atrás y diga "las noches en vela merecieron la pena".
diff --git a/tfg_report/templateAPP/input/appendices/01_pruebas.md b/tfg_report/templateAPP/input/appendices/01_pruebas.md
new file mode 100644
index 0000000..3669fa7
--- /dev/null
+++ b/tfg_report/templateAPP/input/appendices/01_pruebas.md
@@ -0,0 +1,81 @@
+# Pruebas
+
+Se han desarrollado pruebas para comprobar la correcta ejecución del código en la librería. Debido a que PlatformIO no proporciona una manera sencilla de verificar la correcta comunicación entre dos placas, en este capítulo solo se abordan pruebas que evalúan funciones de la librería que no están relacionadas directamente con el envío de datos.
+
+En el caso de los ficheros `PubSub`, estas pruebas unitarias de caja negra tienen como objetivo probar la correcta identificación de los mensajes y los temas restringidos para publicar o suscribirse.
+
+La primera prueba consiste en crear un mensaje con un número y almacenarlo como bytes, tal como lo haría un publicador. Luego, se llama a la función `isLMQMessage()` para comprobar que se trata de un mensaje compatible con LoboMQ, y posteriormente se extraen los datos creando los correspondientes objetos, llamando a la función `getLMQPayload()` para obtener el contenido de los bytes, al igual que lo haría un suscriptor. Finalmente, se verifica si el número empaquetado sigue siendo el mismo. Este código se detalla en el Listado \ref{anexoPruebas:testCreateGetMessage}
+
+```{.cpp #anexoPruebas:testCreateGetMessage .numberLines caption="Código para probar la creación de mensajes y la obtención de su contenido" frame=single}
+//Payload structure
+typedef struct {
+ int number;
+} CustomPayloadStruct;
+
+TEST_CASE("Create Message And Check And Get Content") {
+ int number = 666;
+
+ //Create and fill publish message
+ CustomPayloadStruct payloadSend;
+ payloadSend.number = number;
+ PublishContent pubMsg;
+ pubMsg.type = MSGTYPE_PUBLISH;
+ strcpy(pubMsg.topic, "test");
+ pubMsg.contentSize = sizeof(payloadSend);
+ memcpy(&pubMsg.content, &payloadSend, sizeof(payloadSend));
+
+ //Transform to bytes
+ const uint8_t *data = (const uint8_t *) &pubMsg;
+
+ CHECK(isLMQMessage(data) == true);
+
+ //Extract payload from bytes
+ PayloadContent contentRecv = getLMQPayload(data);
+ CustomPayloadStruct payloadRecv;
+ memcpy(&payloadRecv, &contentRecv.content, contentRecv.contentSize);
+
+ CHECK(payloadRecv.number == number);
+}
+```
+
+El resto de los tests de estos ficheros prueban la compatibilidad de los temas con la publicación y la suscripción. A partir de las verificaciones que se realizan al publicar o suscribirse, se han identificado una serie de casos de prueba, mostrados en la Tabla \ref{anexoPruebas:casosTopics} junto al parámetro que recibe la función y el resultado esperado. Estos buscan cubrir todas las condiciones y decisiones posibles. Se prueba la comprobación de temas nulos o vacíos, la presencia de caracteres ASCII, el tamaño excesivo de los temas y el uso de caracteres comodín en posiciones prohibidas.
+
+| Función | Parámetros | Resultado |
+| --------------- | -------------------------------------- | --------------------- |
+| `pubTopicCheck` | `topic = "/aaa/"` | `LMQ_ERR_SUCCESS` |
+| `pubTopicCheck` | `topic = "aaa"` | `LMQ_ERR_SUCCESS` |
+| `pubTopicCheck` | `topic = "aaa/+` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "aaa/+/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "+/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "+"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "aaa/#"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "aaa/#/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "#/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "#"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "/"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = ""` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = null` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "ááá"` | `LMQ_ERR_INVAL_TOPIC` |
+| `pubTopicCheck` | `topic = "aaaaaaaaaaaaaaaaaaaaaaaaaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| --------------- | -------------------------------------- | --------------------- |
+| `subTopicCheck` | `topic = "/aaa/"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "aaa"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "aaa/+` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "aaa/+/aaa"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "+/aaa"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "+"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "aaa/#"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "aaa/#/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = "#/aaa"` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = "#"` | `LMQ_ERR_SUCCESS` |
+| `subTopicCheck` | `topic = "/"` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = ""` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = null` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = "ááá"` | `LMQ_ERR_INVAL_TOPIC` |
+| `subTopicCheck` | `topic = "aaaaaaaaaaaaaaaaaaaaaaaaaa"` | `LMQ_ERR_INVAL_TOPIC` |
+
+: Casos de prueba en la comprobación de topics\label{anexoPruebas:casosTopics}
+
+Estas pruebas se encuentran en la carpeta `test` de la librería. Han sido desarrolladas con el framework de pruebas Doctest[^anexoPruebas:doctest], y para su ejecución se requiere de placas compatibles con el modo de depuración y pruebas, conectadas al ordenador encargado de compilar y subir el código del test desde PlatformIO.
+
+[^anexoPruebas:doctest]:
diff --git a/tfg_report/templateAPP/input/appendices/02_diagrama_clases.md b/tfg_report/templateAPP/input/appendices/02_diagrama_clases.md
new file mode 100644
index 0000000..932d044
--- /dev/null
+++ b/tfg_report/templateAPP/input/appendices/02_diagrama_clases.md
@@ -0,0 +1,5 @@
+# Diagrama de clases
+
+![Diagrama de clases de LoboMQ[^anexoDiagramaClases:enlace]\label{anexoDiagramaClases:clases}](clases.png){width=69%}
+
+[^anexoDiagramaClases:enlace]: Disponible con mayor resolución en
diff --git a/tfg_report/templateAPP/input/appendices/03_manual.md b/tfg_report/templateAPP/input/appendices/03_manual.md
new file mode 100644
index 0000000..ee1f6cc
--- /dev/null
+++ b/tfg_report/templateAPP/input/appendices/03_manual.md
@@ -0,0 +1,231 @@
+# Manual de uso y ejemplo simple
+
+Este anexo demuestra el correcto uso de la librería LoboMQ por parte del usuario final, explicando sus componentes y proporcionando ejemplos.
+
+Tras la correcta instalación de la dependencia de la librería, la cual está fuera del alcance de este anexo, es posible comenzar a integrar la librería en el código de cualquier proyecto. Dependiendo de las funciones a utilizar, será necesario incluir los ficheros de cabecera correspondientes, listados a continuación.
+
+- `#include `:
+ - Función `initBroker`: configurar las tareas y colas adecuadas para gestionar los mensajes recibidos y otorgar a la placa/nodo el rol de broker.
+ - Parámetro `whitelist`: lista con las direcciones MAC permitidas.
+ - Parámetro `logger`: objeto de tipo `Elog` para la salida de mensajes de registro.
+ - Parámetro `persistence`: indica si se desea activar la persistencia.
+ - Parámetro `csSdPin`: pin *Chip Select* del lector de tarjeta SD.
+ - Retorna un código de error.
+ - Clase `MACAddrList`: lista de direcciones MAC. Hereda de `std::vector`, añadiendo nuevas funciones:
+ - `isInList`: comprobar si una dirección MAC se encuentra en la lista.
+ - Parámetro `mac`: dirección MAC a comprobar.
+ - Retorna `true` o `false`.
+ - `addToList`: añadir una dirección MAC a la lista. No inserta duplicados.
+ - Parámetro `mac`: dirección MAC a añadir.
+ - `addArrayToList`: añadir múltiples direcciones MAC de un array a la lista. No inserta duplicados.
+ - Parámetro `macArray`: array de direcciones MAC.
+ - `removeFromList`: eliminar una dirección MAC de la lista.
+ - Parámetro `mac`: dirección MAC a eliminar.
+ - Retorna `true` si se eliminó correctamente, o `false`.
+ - `clearList`: vaciar la lista.
+ - `getAddressListAsString`: obtener un string con todas las direcciones MAC de la lista.
+
+- `#include `. Funciones incluidas:
+ - `publish`: tomar el payload, construir un mensaje y publicarlo en el tema especificado en el broker.
+ - Parámetro `mac`: dirección MAC del broker.
+ - Parámetro `topic`: tema al que se publicará el mensaje.
+ - Parámetro `payload`: contenido del mensaje.
+ - Parámetro `payloadSize`: tamaño del payload en bytes.
+ - Parámetro `logger`: objeto de tipo `Elog` para la salida de mensajes de registro.
+ - Retorna un código de error.
+ - `subscribe`: enviar un mensaje al broker anunciando interés en recibir todos los mensajes compatibles con el tema especificado.
+ - Parámetro `mac`: dirección MAC del broker.
+ - Parámetro `topic`: tema al que se suscribe el emisor.
+ - Parámetro `logger`: objeto de tipo `Elog` para la salida de mensajes de registro.
+ - Retorna un código de error.
+ - `unsubscribe`: enviar un mensaje al broker anunciando desinterés en recibir todos los mensajes compatibles con el tema especificado.
+ - Parámetro `mac`: dirección MAC del broker.
+ - Parámetro `topic`: tema del cual se desuscribe el emisor.
+ - Parámetro `logger`: objeto de tipo `Elog` para la salida de mensajes de registro.
+ - Retorna un código de error.
+ - `isLMQMessage`: comprobar si los bytes representan un mensaje de publicación LoboMQ.
+ - Parámetro `incomingData`: bytes a comprobar.
+ - Retorna `true` o `false`.
+ - `getLMQPayload`: extraer el payload de los bytes de un mensaje de publicación LoboMQ.
+ - Parámetro `incomingData`: bytes del mensaje.
+ - Retorna un objeto `PayloadContent`.
+- `#include `. Incluye todas las funciones mencionadas anteriormente.
+
+Estas cabeceras comparten el objeto `Elog logger`, el cual hereda características relevantes, como la función `log` para mostrar mensajes de registro y el listado de niveles de registro: `ALERT`, `CRITICAL`, `ERROR`, `WARNING`, `NOTICE`, `INFO` y `DEBUG`. Esta librería incluye funciones para crear este objeto fácilmente:
+
+- `initializeSerialLogger`: crear un objeto `Elog` que imprime mensajes en el monitor serial.
+ - Parámetro `className`: clase de registro.
+ - Parámetro `level`: nivel más crítico de registro interesado.
+ - Retorna un objeto `Elog`.
+- `initializeSDLogger`: crear un objeto `Elog` que imprime mensajes en la tarjeta SD.
+ - Parámetro `className`: clase de registro.
+ - Parámetros `cs`, `sck`, `miso` y `mosi`: pines del módulo lector de la tarjeta SD.
+ - Parámetro `level`: nivel más crítico de registro interesado.
+ - Retorna un objeto `Elog`.
+- `disableLogger`: crear un objeto `Elog` sin la habilidad para mostrar mensajes de registro.
+ - Retorna un objeto `Elog`.
+
+El valor de `className` debe ser `BROKER`, `PUBLISHER`, `SUBSCRIBER` o `UNKNOWN`, dependiendo del rol del nodo que cree el objeto. Esto es importante, ya que al ver el registro, permite conocer quién lo está emitiendo.
+
+Cabe aclarar que cada vez que se mencionan los códigos de error en las funciones principales de LoboMQ, se refiere a los mostrados en la Sección [4.10](#iteracion-9). Por otro lado, el uso de temas o topics está restringido de la siguiente manera:
+
+- Existe un límite de 24 caracteres.
+- Solo se admiten caracteres ASCII.
+- El uso de caracteres comodín es similar al del protocolo MQTT, explicado en la Subsección [2.2.1](##message-queue-telemetry-transport-mqtt).
+- No se puede publicar en temas con caracteres comodín.
+- No se puede utilizar el carácter comodín `#` en un nivel intermedio. Por ejemplo, `sensor/#/temp`.
+
+Además, resulta ideal conocer las estructuras de los mensajes de publicación, ya que de esta manera el desarrollador puede extraer otros campos que esta librería no aporta con facilidad. Los mensajes publicados y los que reciben los suscriptores utilizan la estructura `PublishContent`, formada por el topic, el contenido en bytes y el tamaño del contenido. Por otro lado, este mensaje es filtrado y extraído en una estructura `PayloadContent` al utilizar la función `getLMQPayload`. Ambas estructuras mencionadas se muestran en el Listado \ref{anexoManual:structs}.
+
+```{.cpp #anexoManual:structs .numberLines caption="Estructuras de PublishContent y PayloadContent" frame=single}
+typedef struct : public MessageBase {
+ char topic[MAXTOPICLENGTH];
+ size_t contentSize;
+ void* content[MAXCONTENTSIZE];
+} PublishContent;
+
+typedef struct {
+ size_t contentSize;
+ void* content[MAXCONTENTSIZE];
+} PayloadContent;
+```
+
+Una vez puesta a disposición del usuario final la funcionalidad de la librería, se procede a ver cómo se utiliza para los distintos tipos de nodos: broker y cliente, teniendo este último la capacidad de publicar y suscribirse o desuscribirse.
+
+## Broker
+
+El despliegue de este nodo es el más sencillo, ya que `initBroker` es la única función que se necesita llamar para realizarlo. Si es necesario aprovechar las funcionalidades disponibles, se debe seguir la siguiente secuencia de ejecución:
+
+1. Crear la whitelist de direcciones MAC. Si no es necesario, se debe utilizar su valor por defecto, el cual indica que no se usa este método de control de acceso.
+2. Crear el logger. Su valor por defecto imprime los mensajes por el monitor serial.
+3. Llamar a la función `initBroker`. Si es necesario, se debe indicar la persistencia.
+
+El siguiente ejemplo muestra un broker con persistencia y control de acceso activado. Para ello, primero se han realizado las conexiones adecuadas entre la placa ESP32 y el lector de tarjetas SD, como se muestra en la Figura \ref{anexoManual:broker}. Luego, se presenta el desarrollo del código de este ejemplo, representado en el Listado \ref{anexoManual:brokerCode}.
+
+{width=80%}
+
+```{.cpp #anexoManual:brokerCode .numberLines caption="Código del broker de ejemplo" frame=single}
+#include
+
+void setup() {
+ Serial.begin(9600);
+ MACAddrList *whitelist = new MACAddrList();
+ whitelist->addArrayToList((std::vector){
+ "08:B6:1F:BA:04:F8",
+ "C0:49:EF:CB:99:10"
+ });
+
+ //Choose logger
+ Elog *logger = initializeSDLogger(BROKER, 5, 18, 19, 23, DEBUG);
+
+ //Initialize broker
+ initBroker(whitelist, logger, true, 5);
+}
+
+void loop() { }
+```
+
+Este ejemplo se encuentra en la carpeta `examples` de la librería.
+
+## Publicador
+
+En el caso de un nodo que publique contenido, la secuencia de ejecución es la siguiente:
+
+1. Crear el logger. Su valor por defecto imprime los mensajes por el monitor serial.
+2. Crear la estructura del contenido a publicar. Debe ser la misma estructura en el suscriptor.
+3. Crear el contenido a publicar.
+4. Llamar a la función `publish`. Uno de los parámetros es la dirección del broker, que debe de obtenerse previamente. Una manera de hacerlo es revisando los logs al iniciar el broker.
+
+El siguiente código de ejemplo, mostrado en el Listado \ref{anexoManual:pubCode}, contiene un publicador que genera un número aleatorio y lo publica cada dos segundos en el tema "topic1".
+
+```{.cpp #anexoManual:pubCode .numberLines caption="Código del publicador de ejemplo" frame=single}
+#include
+
+uint8_t brokerAddr[] = {0x24, 0xDC, 0xC3, 0x9C, 0x7E, 0x40}; //Broker MAC destination
+
+Elog *_logger;
+
+void setup() {
+ Serial.begin(9600);
+ randomSeed(analogRead(0)); //to generate random numbers
+
+ //Choose logger:
+ _logger = initializeSerialLogger(PUBLISHER, DEBUG);
+
+ _logger->log(INFO, "Started publisher board on %s!", WiFi.macAddress().c_str());
+}
+
+void loop() {
+ int numberExample = random(101); //generates random number
+ publish(brokerAddr, "topic1", &numberExample, sizeof(numberExample), _logger);
+ sleep(2);
+}
+```
+
+Este ejemplo se encuentra en la carpeta `examples` de la librería.
+
+## Suscriptor y desuscriptor
+
+A diferencia de los ejemplos previos, el suscriptor requiere aplicar más lógica, ya que estos nodos procesan los mensajes recibidos. La secuencia de ejecución es la siguiente:
+
+1. Crear el logger. Su valor por defecto imprime los mensajes por el monitor serial.
+2. Crear la estructura del contenido a publicar. Debe ser la misma estructura en el publicador.
+3. Configurar ESP-NOW junto a la función que procesa los mensajes.
+4. Llamar a la función `subscribe`. Uno de los parámetros es la dirección del broker, que debe de obtenerse previamente. Una manera de hacerlo es revisando los logs al iniciar el broker.
+
+Junto a esta secuencia, en la función utilizada para procesar los mensajes, resulta esencial llamar a las funciones de LoboMQ `isLMQMessage` y `getLMQPayload` para comprobar que el mensaje recibido forma parte de LoboMQ y obtener sus bytes de contenido. Estos bytes luego pueden ser copiados a un objeto de la estructura definida en el paso 2.
+
+En cambio, la secuencia de ejecución de la desuscripción es más simple:
+
+1. Crear el logger. Su valor por defecto imprime los mensajes por el monitor serial.
+2. Configurar ESP-NOW.
+3. Llamar a la función `unsubscribe`. Uno de los parámetros es la dirección del broker, que debe de obtenerse previamente. Una manera de hacerlo es revisando los logs al iniciar el broker.
+
+El siguiente código de ejemplo muestra el uso de estas características, suscribiéndose a cualquier tema y, 20 segundos más tarde, desuscribiéndose. Además, muestra una forma de procesar los mensajes recibidos, en este caso un entero. Todo ello es observable en el Listado \ref{anexoManual:subCode}.
+
+```{.cpp #anexoManual:subCode .numberLines caption="Código del suscriptor y desuscriptor de ejemplo" frame=single}
+#include
+
+uint8_t brokerAddr[] = {0x24, 0xDC, 0xC3, 0x9C, 0x7E, 0x40}; //Broker MAC destination
+
+Elog *_logger;
+
+//Function called on every ESP-NOW message reception
+void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) {
+ if (isLMQMessage(incomingData)) {
+ PayloadContent content = getLMQPayload(incomingData);
+
+ int numberExample;
+ memcpy(&numberExample, &content.content, content.contentSize);
+
+ _logger->log(INFO, "Received LMQ message of %dB", content.contentSize);
+ _logger->log(INFO, "Number: %d", numberExample);
+ } else {
+ _logger->log(ERROR, "Invalid message type received");
+ }
+}
+
+void setup() {
+ Serial.begin(9600);
+
+ //Choose logger:
+ _logger = initializeSerialLogger(SUBSCRIBER, DEBUG);
+
+ WiFi.mode(WIFI_STA);
+
+ //Initialize ESP-NOW and set up receive callback
+ if (esp_now_init() != ESP_OK || esp_now_register_recv_cb(OnDataRecv) != ESP_OK) {
+ _logger->log(ERROR, "Couldn't initialize ESP-NOW");
+ exit(1);
+ }
+
+ _logger->log(INFO, "Started subscriber board on %s!", WiFi.macAddress().c_str());
+ subscribe(brokerAddr, "#", _logger);
+ sleep(20);
+ unsubscribe(brokerAddr, "#", _logger);
+}
+
+void loop() { }
+```
+
+Este ejemplo se encuentra en la carpeta `examples` de la librería.
diff --git a/tfg_report/templateAPP/input/authorship.md b/tfg_report/templateAPP/input/authorship.md
index 3ecad30..5339e58 100644
--- a/tfg_report/templateAPP/input/authorship.md
+++ b/tfg_report/templateAPP/input/authorship.md
@@ -1,5 +1,5 @@
Yo, Rubén Gómez Villegas con DNI 02318379W declaro que soy el único autor del trabajo fin de grado titulado "Protocolo de mensajería ligero inspirado en MQTT para redes ESP-NOW" y que el citado trabajo no infringe las leyes en vigor sobre propiedad intelectual y que todo el material no original contenido en dicho trabajo está apropiadamente atribuido a sus legítimos autores.
-Talavera de la Reina, a.....
+Talavera de la Reina, a 15 de julio de 2024.
Fdo: ......
diff --git a/tfg_report/templateAPP/input/chapters/01_intro.md b/tfg_report/templateAPP/input/chapters/01_intro.md
index 7992b26..3143d08 100644
--- a/tfg_report/templateAPP/input/chapters/01_intro.md
+++ b/tfg_report/templateAPP/input/chapters/01_intro.md
@@ -12,7 +12,13 @@ Uno de los dispositivos más populares en el ámbito del [IoT](#IoT) son los mic
Las placas de Espressif integran, junto con Wi-Fi, un protocolo de comunicación inalámbrica denominado ESP-NOW cuyo uso no requiere redes de Internet. Hasta donde alcanza el conocimiento del autor y los tutores de este [TFG](#TFG), el uso de ESP-NOW se ha limitado a que el desarrollador diseñe una manera propia de transmitir datos para cada proyecto, y no existe de forma pública ninguna solución que permita implementar un sistema publicación-suscripción aprovechando esta forma de comunicación. Esta es la oportunidad que el proyecto pretende explotar. Se busca aportar a la comunidad del Internet de las Cosas un protocolo utilizable en entornos restringidos por la red y el consumo energético, que combine tanto los beneficios de [MQTT](#MQTT) como los de ESP-NOW en placas ESP32.
-## Desafíos durante la Realización
+Con el objetivo de ilustrar el estado actual de un sistema [IoT](#IoT) con [MQTT](#MQTT), se muestra el siguiente ejemplo en la Figura \ref{intro:ejemploRiegoIoT}. Este ejemplo muestra, de manera abstracta, un sistema de riego por aspersión inteligente en un jardín. El jardín está dividido en zonas, cada una con un dispositivo compuesto por sensores de temperatura y humedad y actuadores que activan y desactivan los aspersores que riegan la vegetación. Estos dispositivos están conectados y se comunican con un único gateway o puerta de enlace, encargado de recibir la información de los dispositivos y mandarles órdenes. El gateway está comunicado a través de Internet con un servidor compuesto por una base de datos, donde se almacenan los datos históricos y registros, y un servicio que le permite ser controlado desde otro dispositivo conectado a Internet en cualquier sitio y momento. Este último dispositivo, denominado cliente, puede ser un teléfono móvil o un ordenador, y se utiliza para ver el estado del jardín y controlar los dispositivos manualmente desde una interfaz. Este sistema puede permitir, por ejemplo, comprobar el estado del jardín y activar los aspersores, enviando los mensajes desde el cliente hasta los sensores y actuadores y viceversa.
+
+Actualmente, en el caso de querer implementar un sistema parecido, los dispositivos del jardín pueden ser placas de bajo consumo, como las ESP32, mientras que el gateway deberá ser un componente de mayor de potencia capaz de desplegar el broker [MQTT](#MQTT), como puede ser un ordenador portátil o un single board computer como una placa Raspberry Pi. Además, se necesita el despliegue de una red de Internet que alcance a los dispositivos y al gateway. Gracias a la solución propuesta, que se centra en la conexión entre los dispositivos y el gateway, se espera añadir la posibilidad de implementar este sistema utilizando placas ESP32 en ambos roles, sin necesidad de redes de Internet ni dispositivos de gran consumo.
+
+\label{intro:ejemploRiegoIoT}](iot_example.png){width=75%}
+
+## Desafíos durante la realización
El desarrollo de la solución implica abordar una serie de desafíos, descritos a continuación.
@@ -26,11 +32,11 @@ Finalmente, PlatformIO, a parte de permitir el desarrollo en las mencionadas pla
En este apartado se detallan el objetivo general y los subobjetivos específicos del proyecto, utilizados para guiar su desarrollo y evaluar la adecuación de los resultados obtenidos.
-### Objetivo General
+### Objetivo general
El objetivo general del proyecto es el diseño y la implementación en forma de librerías de un protocolo de mensajería publicador-subscriptor inspirado en [MQTT](#MQTT) y que haga uso del protocolo de comunicación inalámbrica ESP-NOW.
-### Objetivos Específicos
+### Objetivos específicos
La consecución del objetivo general se descompone en una serie de objetivos específicos esenciales descritos a continuación.
@@ -40,7 +46,7 @@ b. **Implementar librerías de software que permitan a los desarrolladores integ
c. **Presentar demostraciones o casos de uso que ilustren la utilidad y aplicabilidad del protocolo en contextos reales del Internet de las Cosas**. Como parte final del proyecto, demostrar su funcionamiento y relevancia a través de ejemplos prácticos y proveer instrucciones detalladas para utilizar la librería resultante es esencial.
-## Estructura del Documento
+## Estructura del documento
El resto del contenido de esta memoria se estructura de la siguiente manera:
diff --git a/tfg_report/templateAPP/input/chapters/02_estado_arte.md b/tfg_report/templateAPP/input/chapters/02_estado_arte.md
index 065cd81..5dbe11a 100644
--- a/tfg_report/templateAPP/input/chapters/02_estado_arte.md
+++ b/tfg_report/templateAPP/input/chapters/02_estado_arte.md
@@ -4,315 +4,162 @@ En este capítulo se aborda el concepto de Internet de las Cosas, incluyendo su
## Internet de las Cosas
-El siglo XX dio lugar al desarrollo de numerosos inventos que impulsaron una revolución y un avance ágil en la sociedad, que en la actualidad son frecuentemente usados y facilitan la vida humana. Este es el caso del Internet, que desde 1969 ha permitido la comunicación entre personas y el acceso a información. Hoy en día, también millones de objetos están conectados a la red, cuyas funcionalidades dependen de esta.
+El siglo XX dio lugar al desarrollo de numerosos inventos que impulsaron una revolución y un avance ágil en la sociedad, que en la actualidad son frecuentemente usados y facilitan la vida humana. Este es el caso del Internet, que desde 1969 ha permitido la comunicación entre personas y el acceso a información. Hoy en día, también millones de objetos están conectados a la red, cuyas funcionalidades dependen de esta @Linkedin_OrigenIoT.
-Internet de las Cosas o Internet of Things ([IoT](#IoT)) es un término utilizado por primera vez en un discurso realizado en septiembre de 1985, cuando Peter T. Lewis predijo que "no sólo los humanos, sino también las máquinas y otras cosas se comunicarán interactivamente a través de Internet" /**TODO: mencionar al podcast**/; también empleado por Kevin Ashton en 1999 al realizar una presentación del uso de etiquetas de identificación por radiofrecuencia, o radio frequency identification ([RFID](#RFID)) en inglés, y otros sensores en los productos de la cadena de suministro. Sin embargo, es esencial tener una clara comprensión del significado del [IoT](#IoT), en mayor parte por la confusión inherente al término en sí y por las aplicaciones cotidianas de esta tecnología.
+Internet de las Cosas o Internet of Things ([IoT](#IoT)) es un término utilizado por primera vez en un discurso realizado en septiembre de 1985 @IoT_Swifttalk, cuando Peter T. Lewis predijo que "no sólo los humanos, sino también las máquinas y otras cosas se comunicarán interactivamente a través de Internet"(@Podcast_Lewis); también empleado por Kevin Ashton en 1999 al realizar una presentación del uso de etiquetas de identificación por radiofrecuencia, o radio frequency identification ([RFID](#RFID)) en inglés, y otros sensores en los productos de la cadena de suministro @IoT_Ashton_Avast @IoT_Swifttalk @Linkedin_OrigenIoT @Itop_IoT @IoT_at3w @KevinAshton_Eexcellence @IoT_Wiki. Sin embargo, es esencial tener una clara comprensión del significado del [IoT](#IoT), en mayor parte por la confusión inherente al término en sí y por las aplicaciones cotidianas de esta tecnología.
-A primera vista, "Internet de las Cosas" podría dar la impresión de ser un término moderno para referirse a "conectar a Internet algo para controlarlo", una definición bastante simple para alguien que por ejemplo controla las luces de su hogar desde su teléfono móvil. Es tanta la confusión que no existe una definición formal única, sino que se pueden encontrar una disparidad de definiciones que no todos los sistemas [IoT](#IoT) cumplen. En 2012, la Unión Internacional de Telecomunicaciones ([ITU](#ITU)) recomendó definir el [IoT](#IoT) como una infraestructura global que permite ofrecer servicios avanzados a todo tipo de aplicaciones conectando objetos entre sí e interoperando tecnologías de la información y comunicación, aprovechando capacidades de identificación, obtención de datos, procesamiento y comunicación y cumpliendo con requisitos de seguridad y privacidad. Sin embargo, por lo general, podemos entender que el [IoT](#IoT) trata de dotar de capacidades de comunicación además de procesamiento, captura y/o análisis de datos a distintos tipos de entes, como dispositivos físicos, objetos, edificaciones, terrenos, sistemas, hardware, software, e incluso contextos y situaciones, ya sea añadiéndoles dispositivos o integrando ciertas capacidades en los propios objetos. Estos entes pueden estar compuestos de sensores, que recopilan datos, o actuadores, que controlan otros objetos, y a través de redes, privadas o públicas, pueden intercambiar información con otros dispositivos, recopilar la información en un mismo dispositivo y transferir órdenes.
-
-Con el objetivo de ilustrar cómo funciona un sistema [IoT](#IoT), la Figura \ref{iot:ejemploRiegoIoT} muestra un sistema de riego por aspersión inteligente en un jardín. El jardín está dividido en zonas, cada una con un dispositivo compuesto por sensores de temperatura y humedad y actuadores que activan y desactivan los aspersores que riegan la vegetación. Estos dispositivos están conectados y se comunican con un único gateway o puerta de enlace, teniendo la capacidad de recibir información de los dispositivos y mandar órdenes a estos. El gateway está comunicado a través de Internet con un servidor compuesto por una base de datos, donde se almacenan los datos históricos y registros, y un servicio que le permite ser controlado desde otro dispositivo conectado a Internet en cualquier sitio y momento. Este último dispositivo, denominado cliente, puede ser un teléfono móvil o un ordenador, y puede utilizarse para ver el estado del jardín y controlar los dispositivos manualmente desde una interfaz. La siguiente arquitectura, abstraída completamente de las limitaciones y los problemas que puede ofrecer su implementación, podrá dar lugar a dos casos de uso:
-
-- El usuario quiere activar los aspersores. El usuario, desde la interfaz el dispositivo cliente (como puede ser un botón, por ejemplo), enviará la orden de activar los aspersores al servicio, que a su vez se lo enviará al gateway. El gateway enviará una orden compatible a los dispositivos instalados en el jardín, haciendo que los aspersores comiencen a funcionar.
-- Los aspersores funcionan cuando la temperatura es muy elevada y la humedad es baja. El usuario previamente, desde la interfaz del cliente, ha establecido que los aspersores funcionen de manera automática cuando, por ejemplo, el ambiente supere una temperatura de 32 [ºC](#ºC) y la humedad sea considerada baja. Estos parámetros los recibe el servidor y se los pasa al gateway, el cual los recordará. A partir de ese momento, el gateway irá recibiendo de los sensores de cada zona lecturas de temperatura y humedad, y las comparará con los parámetros establecidos. En el caso de que se superen la temperatura y humedad, se activarán los aspersores de la zona. Una vez activados, se mantendrá la lectura de temperatura y humedad, y cuando las lecturas sean inferiores, se desactivarán los aspersores. Además, con cada activación de los aspersores, el gateway notificará al servicio, que a su vez notifica al usuario, especificando la zona activada.
-
-\label{iot:ejemploRiegoIoT}](iot_example.png){width=75%}
-
-Cabe recalcar que el mencionado ejemplo puede volverse más complejo, por ejemplo añadiendo comprobaciones de previsión meteorológica en los próximos días, sensores de luz, control del caudal del agua, pero igualmente cumple con los requisitos para ser un sistema que implementa el [IoT](#IoT), ya que dota a un jardín de capacidad de comunicación, captura y análisis de datos, y se comunica con otros dispositivos y con personas para informar del estado y recibir órdenes.
+A primera vista, "Internet de las Cosas" podría dar la impresión de ser un término moderno para referirse a "conectar a Internet algo para controlarlo", una definición bastante simple para alguien que por ejemplo controla las luces de su hogar desde su teléfono móvil. Es tanta la confusión que no existe una definición formal única, sino que se pueden encontrar una disparidad de definiciones que no todos los sistemas [IoT](#IoT) cumplen @IoTDefs_InfoMatters. En 2012, la Unión Internacional de Telecomunicaciones ([ITU](#ITU)) recomendó definir el [IoT](#IoT) como una infraestructura global que permite ofrecer servicios avanzados a todo tipo de aplicaciones conectando objetos entre sí e interoperando tecnologías de la información y comunicación, aprovechando capacidades de identificación, obtención de datos, procesamiento y comunicación y cumpliendo con requisitos de seguridad y privacidad @IoTDef_ITU. Sin embargo, por lo general, podemos entender que el [IoT](#IoT) trata de dotar de capacidades de comunicación además de procesamiento, captura y/o análisis de datos a distintos tipos de entes, como dispositivos físicos, objetos, edificaciones, terrenos, sistemas, hardware, software, e incluso contextos y situaciones, ya sea añadiéndoles dispositivos o integrando ciertas capacidades en los propios objetos. Estos entes pueden estar compuestos de sensores, que recopilan datos, o actuadores, que controlan otros objetos, y a través de redes, privadas o públicas, pueden intercambiar información con otros dispositivos, recopilar la información en un mismo dispositivo y transferir órdenes @IoTDef_Nougir @IoTDefs_InfoMatters @IoTDef_ITU @IoT_IHS @IoT_VideoClase @IoT_Rama @IoT_Bankinter @IoT_Swifttalk @Itop_IoT @IoT_at3w @IoT_RH @IoT_Wiki @IoT_Survey.
### Ventajas y usos
-Hoy en día vivimos en un mundo conectado, en el cual estamos rodeados de numerosos dispositivos, gran parte de ellos interconectados como sistemas, ya que la información es crucial para la sociedad. Por ejemplo, a nivel empresarial es la que permite crear nuevas posibilidades, modelos, interacciones y soluciones únicas, entender y anticiparse a tendencias e identificar nuevas oportunidades. Esta información se obtiene a partir del procesamiento y análisis de colecciones de datos, recopilados de diversas fuentes potenciales, como es el caso de los sistemas [IoT](#IoT).
+Hoy en día vivimos en un mundo conectado, en el cual estamos rodeados de numerosos dispositivos, gran parte de ellos interconectados como sistemas, ya que la información es crucial para la sociedad. Por ejemplo, a nivel empresarial es la que permite crear nuevas posibilidades, modelos, interacciones y soluciones únicas, entender y anticiparse a tendencias e identificar nuevas oportunidades. Esta información se obtiene a partir del procesamiento y análisis de colecciones de datos, recopilados de diversas fuentes potenciales, como es el caso de los sistemas [IoT](#IoT) @IoT_VentDesv_Tokio @IoT_VentDesv_Krypton @IoTDef_Nougir @IoT_Survey.
-Gracias al [IoT](#IoT) es posible monitorear los procesos que ocurren en un negocio para controlar y optimizar los recursos utilizados, ya sean energéticos o de personal humano; además de encontrar tareas manuales o repetitivas que pueden ser automatizadas mediante el propio [IoT](#IoT), mejorando así la eficiencia, el tiempo y la productividad. Asimismo, permite la toma de decisiones informadas a partir de datos de negocio, tanto internos como externos, que permitan agregar valor al negocio de manera más rápida, y la mejora de experiencia y de calidad de vida de los usuarios o clientes basándose en los datos recibidos sobre estos.
+Gracias al [IoT](#IoT) es posible monitorear los procesos que ocurren en un negocio para controlar y optimizar los recursos utilizados, ya sean energéticos o de personal humano; además de encontrar tareas manuales o repetitivas que pueden ser automatizadas mediante el propio [IoT](#IoT), mejorando así la eficiencia, el tiempo y la productividad. Asimismo, permite la toma de decisiones informadas a partir de datos de negocio, tanto internos como externos, que permitan agregar valor al negocio de manera más rápida, y la mejora de experiencia y de calidad de vida de los usuarios o clientes basándose en los datos recibidos sobre estos @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoT_VentDesv_Tokio @IoT_VentDesv_Krypton @IoTDef_Nougir @IoT_Survey.
En adición, tiene la capacidad de implementarse de diferentes maneras en una gran variedad de entornos y sectores, tales como:
-- Sanidad: monitorizar signos vitales, hacer recomendaciones de salud adecuadas, comprobar autenticidad y dosis recomendadas en medicamentos.
-- Agricultura y ganadería: controlar las condiciones del suelo y el crecimiento de los cultivos, localizar el ganado, controlar la calidad de la leche recolectada en un tanque.
-- Transporte, conducción y logística: frenado automático de emergencia, cálculo de rutas óptimas, búsqueda de aparcamiento, mantener condiciones óptimas de remolques que transporten productos perecederos.
-- Fabricación: controlar temperatura y humedad de centros de fabricación, identificar áreas con necesidad de personal, crear controles de calidad a productos.
-- Comercio: identificar posición óptima de los productos en las estanterías, guiar a clientes hasta determinados productos, trazabilidad en el producto desde la llegada en el almacén hasta su venta.
-- Ciudades y edificios inteligentes: mejor vigilancia y actuación por los equipos de emergencia, localizar áreas de contaminación, automatizar iluminación y calefacción.
-
-El [IoT](#IoT) no solo se reduce a estos sectores, es prácticamente aplicable a todos, como la educación, la construcción o el turismo, y a cualquier fase, desde el diseño hasta ofrecer y consumir el servicio o producto, gracias a la popularización de esta tecnología y al aumento de dispositivos que aparecen a nuestro alrededor.
-
-{
-https://es.wikipedia.org/wiki/Internet_de_las_cosas
-https://www.ibm.com/es-es/topics/internet-of-things
-https://blog.ubisolutions.net/es/iot-tecnologias-casos-de-uso-ventajas-y-limitaciones-guia-completa
-https://www.tokioschool.com/noticias/ventajas-desventajas-internet-cosas/
-https://kryptonsolid.com/principales-ventajas-y-desventajas-de-iot-en-los-negocios/
- https://www.campusbigdata.com/big-data-blog/item/101-relacion-iot-con-big-data
- https://www.ibm.com/es-es/topics/internet-of-things
- https://www.nougir.com/index.php/blog-3/item/13-que-es-iot-o-internet-de-las-cosas-y-sus-aplicaciones
- https://innovayaccion.com/blog/aplicando-el-internet-de-las-cosas-a-las-empresas-2
- https://cdn.ihs.com/www/pdf/IoT_ebook.pdf
- https://www2.deloitte.com/content/dam/Deloitte/nl/Documents/real-estate/deloitte-nl-fsi-real-estate-smart-buildings-how-iot-technology-aims-to-add-value-for-real-estate-companies.pdf
- https://www.researchgate.net/publication/325373920_Internet_of_things_IoT_a_survey_on_architecture_enabling_technologies_applications_and_challenges
-}
+- Sanidad: monitorizar signos vitales, hacer recomendaciones de salud adecuadas, comprobar autenticidad y dosis recomendadas en medicamentos @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoTDef_Nougir @IoT_VideoClase @IoT_Survey.
+- Agricultura y ganadería: controlar las condiciones del suelo y el crecimiento de los cultivos, localizar el ganado, controlar la calidad de la leche recolectada en un tanque @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoT_VideoClase @IoT_Survey.
+- Transporte, conducción y logística: frenado automático de emergencia, cálculo de rutas óptimas, búsqueda de aparcamiento, mantener condiciones óptimas de remolques que transporten productos perecederos @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoTDef_Nougir @IoT_VideoClase @IoT_Survey.
+- Fabricación: controlar temperatura y humedad de centros de fabricación, identificar áreas con necesidad de personal, crear controles de calidad a productos @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoT_VideoClase @IoT_Survey.
+- Comercio: identificar posición óptima de los productos en las estanterías, guiar a clientes hasta determinados productos, trazabilidad en el producto desde la llegada en el almacén hasta su venta @IoT_IBM @IoT_VentDesv_Krypton @IoT_VideoClase @IoT_Survey.
+- Ciudades y edificios inteligentes: mejor vigilancia y actuación por los equipos de emergencia, localizar áreas de contaminación, automatizar iluminación y calefacción @IoT_CdU_Ubi @IoT_VentDesv_Tokio @IoTDef_Nougir @IoT_VideoClase @IoT_Survey.
+El [IoT](#IoT) no solo se reduce a estos sectores, es prácticamente aplicable a todos, como la educación, la construcción o el turismo, y a cualquier fase, desde el diseño hasta ofrecer y consumir el servicio o producto, gracias a la popularización de esta tecnología y al aumento de dispositivos que aparecen a nuestro alrededor @IoT_VideoClase @IoT_Survey.
### Factores, limitaciones y desafíos a tener en cuenta
Al desarrollar una arquitectura del [IoT](#IoT), es necesario tener en cuenta una serie de factores que afectan tanto a los dispositivos como a la comunicación entre ellos.
-La primera consideración se refiere a los datos, el artefacto más importante en estos sistemas. Deben ser adecuados y el personal debe estar preparado para tratarlos y analizarlos. Sin embargo, debido a la gran cantidad de datos producidos, se presenta un reto significativo al analizarlos y extraer información, especialmente en casos de falta de herramientas o experiencia en análisis.
-
-Dependiendo del dispositivo, el uso que se le da y el entorno donde se instala, puede verse limitado por varios factores energéticos y físicos interdependientes, tales como la manera de alimentarlo, el consumo (coste de la energía y tiempo de uso), el rango de movilidad, el peso y el tamaño. Dar preferencia a un factor puede perjudicar a otro, por lo que es necesario buscar un equilibrio que satisfaga todas las necesidades o priorizar algunas sobre otras y aplicar cambios en las propias necesidades.
+La primera consideración se refiere a los datos, el artefacto más importante en estos sistemas. Deben ser adecuados y el personal debe estar preparado para tratarlos y analizarlos. Sin embargo, debido a la gran cantidad de datos producidos, se presenta un reto significativo al analizarlos y extraer información, especialmente en casos de falta de herramientas o experiencia en análisis @IoT_IBM @IoT_VideoClase @Neurona_IoT @IoTDesf_Deing @Incibe_IoT.
-Las condiciones ambientales (como la lluvia, la humedad, las vibraciones y la temperatura), la disponibilidad de conexión en una zona (cobertura de red o electrificación), las interferencias electromagnéticas y otros factores del área donde se despliega el sistema pueden provocar un replanteamiento de ciertas partes. Por ejemplo, éstas pueden implicar la fiabilidad en el transporte de los datos mediante mecanismos de acuses de recibo y verificación de mensajes, o la frecuencia de transmisión y tamaño de los datos.
+Dependiendo del dispositivo, el uso que se le da y el entorno donde se instala, puede verse limitado por varios factores energéticos y físicos interdependientes, tales como la manera de alimentarlo, el consumo (coste de la energía y tiempo de uso), el rango de movilidad, el peso y el tamaño. Dar preferencia a un factor puede perjudicar a otro, por lo que es necesario buscar un equilibrio que satisfaga todas las necesidades o priorizar algunas sobre otras y aplicar cambios en las propias necesidades @IoT_VentDesv_Krypton @IoT_VideoClase @Redeweb_IoT @Neurona_IoT.
-Debido a la heterogeneidad de los dispositivos en cuanto a fabricantes, características y capacidades, y a la falta de un estándar internacional de compatibilidad para dispositivos en [IoT](#IoT), es necesario dedicar un esfuerzo a identificar las tecnologías de comunicación compatibles (y que cumplan las necesidades de velocidad y alcance), configurar los dispositivos y usar dispositivos adicionales si es necesario.
+Las condiciones ambientales (como la lluvia, la humedad, las vibraciones y la temperatura), la disponibilidad de conexión en una zona (cobertura de red o electrificación), las interferencias electromagnéticas y otros factores del área donde se despliega el sistema pueden provocar un replanteamiento de ciertas partes. Por ejemplo, éstas pueden implicar la fiabilidad en el transporte de los datos mediante mecanismos de acuses de recibo y verificación de mensajes, o la frecuencia de transmisión y tamaño de los datos @IoT_CdU_Ubi @IoT_VentDesv_Tokio @Neurona_IoT @IoTDesf_Deing.
-Es importante además adaptar el despliegue al uso que se le vaya a dar, como puede ser tener una topología de conexión y comunicación adecuada según los dispositivos que interactúen, prepararlo para una futura escalabilidad, habilitar la gestión remota de los dispositivos para actualizarlos, reconfigurarlos, localizarlos o desconectarlos, y realizar una correcta recolección de los datos.
+Debido a la heterogeneidad de los dispositivos en cuanto a fabricantes, características y capacidades, y a la falta de un estándar internacional de compatibilidad para dispositivos en [IoT](#IoT), es necesario dedicar un esfuerzo a identificar las tecnologías de comunicación compatibles (y que cumplan las necesidades de velocidad y alcance), configurar los dispositivos y usar dispositivos adicionales si es necesario @IoT_IBM @IoT_Wiki @IoT_CdU_Ubi @IoT_VentDesv_Krypton @IoT_VideoClase @IoTDesf_Deing.
-Como consideración final, los datos transmitidos pueden contener cierto grado de sensibilidad, por lo que es preferible mantener una buena ciberseguridad y respetar la privacidad de los datos implementando medidas que aseguren la confidencialidad, la integridad y la disponibilidad, siendo importante conocer las regulaciones de la zona en la que opera el sistema [IoT](#IoT) para poder cumplirlas.
+Es importante además adaptar el despliegue al uso que se le vaya a dar, como puede ser tener una topología de conexión y comunicación adecuada según los dispositivos que interactúen, prepararlo para una futura escalabilidad, habilitar la gestión remota de los dispositivos para actualizarlos, reconfigurarlos, localizarlos o desconectarlos, y realizar una correcta recolección de los datos @IoT_CdU_Ubi @IoT_VentDesv_Krypton @Neurona_IoT @IoTDesf_Deing @Chakray_IoTArq.
-{
- “IoT fundamentals: Networking technologies, protocols, and use cases for the internet of things”. David Hanes, Gonzalo Salgueiro, Patrick Grossetete, Jerome Henry, Robert Barton
- https://www.redeweb.com/articulos/sensores/los-sensores-inalambricos-iot-y-el-problema-de-la-corta-duracion-de-las-baterias
- https://neurona-ba.com/iot-a-tu-alcance/
- https://www.ittrends.es/infraestructura/2021/12/los-problemas-de-conectividad-estan-dificultando-los-despliegues-de-iot
- https://deingenierias.com/curso/iot/1-4-desafios-y-limitaciones-de-iot/
- https://www.chakray.com/es/5-requesitos-de-una-arquitectura-iot/
- https://www.incibe.es/incibe-cert/blog/riesgos-y-retos-ciberseguridad-y-privacidad-iot
- https://es.wikipedia.org/wiki/Internet_de_las_cosas
-https://www.ibm.com/es-es/topics/internet-of-things
-https://blog.ubisolutions.net/es/iot-tecnologias-casos-de-uso-ventajas-y-limitaciones-guia-completa
-https://www.tokioschool.com/noticias/ventajas-desventajas-internet-cosas/
-https://kryptonsolid.com/principales-ventajas-y-desventajas-de-iot-en-los-negocios/
-}
+Como consideración final, los datos transmitidos pueden contener cierto grado de sensibilidad, por lo que es preferible mantener una buena ciberseguridad y respetar la privacidad de los datos implementando medidas que aseguren la confidencialidad, la integridad y la disponibilidad, siendo importante conocer las regulaciones de la zona en la que opera el sistema [IoT](#IoT) para poder cumplirlas @IoT_IBM @IoT_CdU_Ubi @IoT_VentDesv_Tokio @IoT_VentDesv_Krypton @IoT_VideoClase @IoT_IHS @IoTDesf_Deing @Incibe_IoT.
### Primeros ejemplos de IoT
-El primer dispositivo [IoT](#IoT) conocido fue una máquina de Coca-Cola conectada a [ARPANET](#ARPANET) a principios de la década de los 80 en la Universidad Carnegie Mellon de Pittsburgh, Pensilvania. Esta máquina era mantenida por los usuarios de la universidad y tenía cierta popularidad que hacía que normalmente estuviera vacía o recién cargada con botellas calientes, lo que molestaba al departamento de Ciencias de la Computación. Para resolver este problema, instalaron microinterruptores en la máquina para detectar las botellas que había en cada ranura, los conectaron al ordenador Programmed Data Processor model 10 (PDP-10) del departamento y diseñaron un programa para registrar la hora cada vez que ocurría una transacción en cada ranura, así como otro programa para recibir información de la máquina. Utilizando el último programa desde la red del departamento, se podía consultar si había botellas en las ranuras, cuánto tiempo había transcurrido desde que se recargó con una nueva botella o si estaba fría.
-
-Más tarde, hicieron público el acceso a esta información, haciendo que cualquier persona conectada a [ARPANET](#ARPANET) en cualquier parte del mundo podía consultar el estado de la máquina de Coca-Cola durante más de una década utilizando el comando `finger coke@cmua`, hasta que la máquina fue reemplazada por ser incompatible con el nuevo diseño de las botellas de Coca-Cola.
-
-Incluir imágenes:
-- Xerox Alto, ordenador fabricado en 1973, usado en la CMU para ver el estado de la maquina
-- Máquina de cocacola https://engineercom.wpenginepowered.com/wp-content/uploads/2016/02/IIot1.png
-- PDP-10
-
-Posteriormente, conectado a un Internet más similar al actual, apareció XCoffee o la cafetera de la Sala Trojan. En noviembre de 1991, Quentin Stafford-Fraser y Paul Jardetzky trabajaban junto a sus compañeros investigadores agrupados en el antiguo laboratorio de informática, también llamado Sala Trojan, de la Universidad de Cambridge, mientras que el resto de compañeros estaban dispersos por la universidad. Todos compartían un problema en común: una única máquina de café de goteo-filtro a la salida del laboratorio, cuya jarra estaba vacía o contenía café con un sabor horrible a excepción de cuando estaba recién hecho, siendo esta última opción solo para aquellos que se sentaban cerca. Para solucionar este problema, Stafford-Fraser y Jardetzky idearon el sistema XCoffee, y el Dr. Martyn Johnson y Daniel Gordon lo mejoraron. Fijaron una cámara apuntando a la jarra de la cafetera, la conectaron a una capturadora de fotogramas del ordenador Acorn Archimedes del rack de la sala y crearon un software para que cada vez que el servidor recibía una solicitud HTTP a través de la World Wide Web devolvía una página web con la imagen de la cafetera capturada más reciente. Desde el navegador se podía comprobar si valía la pena ir a por café (en el caso de estar en el mismo edificio que la cafetera), y esto convertía al sistema en la primera webcam de la historia, otorgándole una fama internacional. Estuvo operativa su última versión desde el 22 de noviembre de 1993 hasta el 22 de agosto de 2001 a las 09:54 UTC, cuando mostró su última imagen pocos segundos antes de su apagado debido a su difícil mantenimiento y al traslado de las instalaciones del laboratorio.
-
-Actualmente, la máquina de café se encuentra restaurada y expuesta en el museo de informática Heinz Nixdorf MuseumsForum de Paderborn, Alemania.
-
-
-https://www.nougir.com/index.php/blog-3/item/13-que-es-iot-o-internet-de-las-cosas-y-sus-aplicaciones
-https://informationmatters.net/internet-of-things-definitions/
-(DOCUMENTO) https://www.itu.int/ITU-T/recommendations/rec.aspx?rec=11559&lang=es
-(LIBRO) https://www.taylorfrancis.com/chapters/oa-edit/10.1201/9781003337584-3/internet-things-cognitive-transformation-technology-research-trends-applications-ovidiu-vermesan-markus-eisenhauer-harald-sundmaeker-patrick-guillemin-martin-serrano-elias-tragos-javier-vali%C3%B1o-arthur-van-derwees-alex-gluhak-roy-bahr
-(LIBRO) https://books.google.es/books/about/La_Red_de_Todo.html?id=wUydnQAACAAJ&redir_esc=y
-(DOCUMENTO) https://cdn.ihs.com/www/pdf/IoT_ebook.pdf
-(DOCUMENTO) https://www.researchgate.net/publication/352541626_Analysis_of_IoT_Concept_Applications_Smart_Home_Perspective
-https://www.microsoft.com/insidetrack/blog/transforming-microsoft-buildings-with-iot-technology-and-indoor-mapping/
-(LIBRO) https://www.se.com/us/en/download/document/998-20233517/
-(DOCUMENTO) https://www.researchgate.net/publication/320135661_Efficient_IoT-based_Sensor_BIG_Data_Collection-Processing_and_Analysis_in_Smart_Buildings
-(DOCUMENTO) https://www2.deloitte.com/content/dam/Deloitte/nl/Documents/real-estate/deloitte-nl-fsi-real-estate-smart-buildings-how-iot-technology-aims-to-add-value-for-real-estate-companies.pdf
-https://innovayaccion.com/blog/aplicando-el-internet-de-las-cosas-a-las-empresas-2
-(DOCUMENTO) https://ieeexplore.ieee.org/document/7879243
-https://www.intel.com/content/www/us/en/internet-of-things/overview.html
-https://www.fundacionbankinter.org/ftf-informes/internet-de-las-cosas/
-https://www.statista.com/statistics/471264/iot-number-of-connected-devices-worldwide/
-(VIDEO) https://www.youtube.com/watch?v=RnasX1bFBh8
-(LIBRO) https://www.amazon.com/IoT-Fundamentals-Networking-Technologies-Protocols/dp/1587144565
-(LIBRO) https://www.ra-ma.es/libro/internet-de-las-cosas_93304/
-https://es.wikipedia.org/wiki/Internet_de_las_cosas
-https://www.eexcellence.es/expertos/kevin-ashton-un-tecnologo-visionario
-https://www.redhat.com/es/topics/internet-of-things/what-is-iot
-https://at3w.com/blog/iot-internet-of-things-tecnologia-proteccion-contra-rayo-tomas-tierra/
-https://www.itop.es/blog/item/iot-origen-importancia-en-el-presente-y-perspectiva-de-futuro.html
-https://www.linkedin.com/pulse/el-origen-del-internet-de-las-cosas-iot-comnet-s-a-/
-https://www.ui1.es/blog-ui1/historia-y-origen-del-iot
-https://blog.avast.com/es/kevin-ashton-named-the-internet-of-things
-https://www.datacenterdynamics.com/en/podcasts/zero-downtime/episode-18-the-origin-of-the-internet-of-things-with-peter-lewis/
-https://swifttalk.net/2021/10/06/the-concept-of-iot-internet-of-things/
-https://www.cs.cmu.edu/~coke/
-https://www.cs.cmu.edu/~coke/history_long.txt
-https://www.ibm.com/docs/es/aix/7.1?topic=protocols-namefinger-protocol
-https://en.wikipedia.org/wiki/John_Romkey
-https://romkey.com/about/
-https://blog.avast.com/the-internets-first-smart-device
-https://en.wikipedia.org/wiki/Trojan_Room_coffee_pot
-https://www.cl.cam.ac.uk/coffee/qsf/coffee.html
-https://www.cl.cam.ac.uk/coffee/coffee.html
-https://www.youtube.com/watch?v=uF982_aRKrI
-https://www.bbc.com/news/technology-20439301
-https://www.historyofinformation.com/detail.php?id=1507
-https://quentinsf.com/coffeepot/metcalfe/
-https://www.cl.cam.ac.uk/coffee/qsf/switchoff.html
-https://owl.museum-digital.de/object/3761
+El primer dispositivo [IoT](#IoT) conocido fue una máquina de Coca-Cola conectada a [ARPANET](#ARPANET) a principios de la década de los 80 en la Universidad Carnegie Mellon de Pittsburgh, Pensilvania @IoT_VideoClase @IoT_Wiki. Esta máquina era mantenida por los usuarios de la universidad y tenía cierta popularidad que hacía que normalmente estuviera vacía o recién cargada con botellas calientes, lo que molestaba al departamento de Ciencias de la Computación. Para resolver este problema, instalaron microinterruptores en la máquina para detectar las botellas que había en cada ranura, los conectaron al ordenador Programmed Data Processor model 10 (PDP-10) del departamento y diseñaron un programa para registrar la hora cada vez que ocurría una transacción en cada ranura, así como otro programa para recibir información de la máquina. Utilizando el último programa desde la red del departamento, se podía consultar si había botellas en las ranuras, cuánto tiempo había transcurrido desde que se recargó con una nueva botella o si estaba fría @IoT_at3w @Coke_Home @Coke_History.
+Más tarde, hicieron público el acceso a esta información, haciendo que cualquier persona conectada a [ARPANET](#ARPANET) en cualquier parte del mundo podía consultar el estado de la máquina de Coca-Cola durante más de una década utilizando el comando `finger coke@cmua`, hasta que la máquina fue reemplazada por ser incompatible con el nuevo diseño de las botellas de Coca-Cola @Coke_History.
+
+Posteriormente, conectado a un Internet más similar al actual, apareció XCoffee o la cafetera de la Sala Trojan. En noviembre de 1991, Quentin Stafford-Fraser y Paul Jardetzky trabajaban junto a sus compañeros investigadores agrupados en el antiguo laboratorio de informática, también llamado Sala Trojan, de la Universidad de Cambridge, mientras que el resto de compañeros estaban dispersos por la universidad. Todos compartían un problema en común: una única máquina de café de goteo-filtro a la salida del laboratorio, cuya jarra estaba vacía o contenía café con un sabor horrible a excepción de cuando estaba recién hecho, siendo esta última opción solo para aquellos que se sentaban cerca. Para solucionar este problema, Stafford-Fraser y Jardetzky idearon el sistema XCoffee, y el Dr. Martyn Johnson y Daniel Gordon lo mejoraron. Fijaron una cámara apuntando a la jarra de la cafetera, la conectaron a una capturadora de fotogramas del ordenador Acorn Archimedes del rack de la sala y crearon un software para que cada vez que el servidor recibía una solicitud HTTP a través de la World Wide Web devolvía una página web con la imagen de la cafetera capturada más reciente. Desde el navegador se podía comprobar si valía la pena ir a por café (en el caso de estar en el mismo edificio que la cafetera), y esto convertía al sistema en la primera webcam de la historia, otorgándole una fama internacional. Estuvo operativa su última versión desde el 22 de noviembre de 1993 hasta el 22 de agosto de 2001 a las 09:54 UTC, cuando mostró su última imagen pocos segundos antes de su apagado debido a su difícil mantenimiento y al traslado de las instalaciones del laboratorio @Info_Trojan @Bio_Trojan @Switchoff_Trojan @Coffee_Video @BBC_Trojan @Coffee_Museum @HoI_Trojan @Trojan_Wiki @Quentin_Trojan.
+
+Actualmente, la máquina de café se encuentra restaurada y expuesta en el museo de informática Heinz Nixdorf MuseumsForum de Paderborn, Alemania @Coffee_Museum @Trojan_Wiki.
### Tipos de dispositivos y redes
-Como se ha mencionado anteriormente, el [IoT](#IoT) se basa en la transmisión de datos entre dispositivos. Estos datos pueden ser información recibida del entorno u órdenes de actuación, que salen o llegan a un dispositivo ubicado en un extremo de la red de conexión y que tiene conectado uno o ambos de los siguientes tipos de objetos:
+Como se ha mencionado anteriormente, el [IoT](#IoT) se basa en la transmisión de datos entre dispositivos. Estos datos pueden ser información recibida del entorno u órdenes de actuación, que salen o llegan a un dispositivo ubicado en un extremo de la red de conexión y que tiene conectado uno o ambos de los siguientes tipos de objetos @IoTBook @IoT_IBM:
- Sensores: miden una propiedad física y la representan digitalmente, siendo útiles para detectar cambios en el entorno.
- Actuadores: dispositivos que interpretan una señal eléctrica y desencadenan un efecto físico tras interpretarla, siendo útiles para producir cambios en el entorno.
-Todos estos dispositivos suelen ser heterogéneos y están interconectados en una red que permite detectar, medir y actuar en relación con el entorno. Esta red, con el fin de ser efectiva y tolerante a fallos, debe pasar por un análisis de criterios como la topología de conexión entre los dispositivos, la distancia entre estos y cómo se procesan los datos.
+Todos estos dispositivos suelen ser heterogéneos y están interconectados en una red que permite detectar, medir y actuar en relación con el entorno. Esta red, con el fin de ser efectiva y tolerante a fallos, debe pasar por un análisis de criterios como la topología de conexión entre los dispositivos, la distancia entre estos y cómo se procesan los datos @IoTBook @IoT_IBM.
-Una red [IoT](#IoT), puede dividirse en capas según cómo se procesen los datos @EdgeCloudFog_ISA @EdgeCloudFog_Industria40:
+Una red [IoT](#IoT), puede dividirse en capas según cómo se procesen los datos @IoTBook @EdgeCloudFog_ISA @EdgeCloudFog_Industria40:
- Computación en la nube o *cloud*: los datos se procesan en un servidor central remoto, lejos de su origen. Requiere una conexión a Internet para su acceso, lo cual implica lidiar con la latencia de la red y el uso del ancho de banda. Ofrece una gran capacidad de procesamiento, almacenamiento y análisis, adecuada para aquellas aplicaciones que no requieren respuestas rápidas. Puede agrupar y procesar los datos de todo un sistema.
-- Computación en la niebla o *fog*: los datos se procesan cerca de donde se originan, en nodos *fog* de la red local. Estos nodos evitan el uso de Internet para enviar datos a la nube, mejorando la eficiencia y ofreciendo una respuesta más rápida que la computación *cloud*. Se pueden distribuir varios nodos *fog* para jerarquizar la red, agrupandos y procesando datos de ciertos nodos.
+- Computación en la niebla o *fog*: los datos se procesan cerca de donde se originan, en nodos *fog* de la red local. Estos nodos evitan el uso de Internet para enviar datos a la nube, mejorando la eficiencia y ofreciendo una respuesta más rápida que la computación *cloud*. Se pueden distribuir varios nodos *fog* para jerarquizar la red, agrupando y procesando datos de ciertos nodos.
- Computación en el borde o *edge*: los datos se procesan en los nodos donde se originan. Ofrece un procesamiento en tiempo real sin necesidad de comunicarse con otros dispositivos, liberando el uso de ancho de banda.
-{
- https://www.ibm.com/es-es/topics/internet-of-things
- (LIBRO, el de los apuntes) “IoT fundamentals: Networking technologies, protocols, and use cases for the internet of things”. David Hanes, Gonzalo Salgueiro, Patrick Grossetete,
-Jerome Henry, Robert Barton.
-https://www.cloudflare.com/es-es/learning/network-layer/what-is-a-personal-area-network/
-https://www.cloudflare.com/es-es/learning/network-layer/what-is-a-lan/
-https://www.cloudflare.com/learning/network-layer/what-is-a-metropolitan-area-network/
-https://www.cloudflare.com/learning/network-layer/what-is-a-wan/
-https://www.gadae.com/blog/tipos-de-redes-informaticas-segun-su-alcance/
-}
-
-
## Middleware y protocolos de mensajería usados en [IoT](#IoT)
El uso más común de [IoT](#IoT) es desplegar una arquitectura compuesta por varios dispositivos [IoT](#IoT). En mayor parte, estos dispositivos se designarán simplemente como dispositivos [IoT](#IoT), ya sean sensores o actuadores, que emiten o reciben datos. Adicionalmente, habrá unos pocos dispositivos (al menos uno) con el rol de centro de mensajería, que actuarán como intermediarios encargados de retransmitir los datos a los dispositivos correspondientes.
-Tras escoger una tecnología para conectar los dispositivos entre sí, en el desarrollo de aplicaciones [IoT](#IoT) se requiere un protocolo de mensajería para intercambiar esos grandes volúmenes de datos que tratan. Un protocolo de comunicación permite que los dispositivos se comuniquen y transmitan mensajes entre los dispositivos [IoT](#IoT) y el centro de mensajería. Además, proporciona cierta fiabilidad a la comunicación, ya que permite que los mensajes lleguen y sus datos sean entendidos y procesados correctamente.
+Tras escoger una tecnología para conectar los dispositivos entre sí, en el desarrollo de aplicaciones [IoT](#IoT) se requiere un protocolo de mensajería para intercambiar esos grandes volúmenes de datos que tratan. Un protocolo de comunicación permite que los dispositivos se comuniquen y transmitan mensajes entre los dispositivos [IoT](#IoT) y el centro de mensajería. Además, proporciona cierta fiabilidad a la comunicación, ya que permite que los mensajes lleguen y sus datos sean entendidos y procesados correctamente @Webby_IoTProts @A3logics_IoTProts.
-La elección del protocolo se basa en cómo se adecua al escenario en el que se quiere implementar, considerando requisitos a tener en cuenta como la ubicación, las limitaciones físicas, el consumo y el coste. Por lo general, no cualquier protocolo de comunicación es apropiado. Los protocolos que se mencionan en este apartado se adecuan a la mayoría de escenarios IoT debido a su rapidez y su fácil implementación, y es posible escoger aquel que se adapte mejor a los requisitos.
+La elección del protocolo se basa en cómo se adecua al escenario en el que se quiere implementar, considerando requisitos a tener en cuenta como la ubicación, las limitaciones físicas, el consumo y el coste. Por lo general, no cualquier protocolo de comunicación es apropiado @TechTarget_IoTProts. Los protocolos que se mencionan en este apartado se adecuan a la mayoría de escenarios [IoT](#IoT) debido a su rapidez y su fácil implementación, y es posible escoger aquel que se adapte mejor a los requisitos @Build_IoTProts @A3logics_IoTProts.
### Message Queue Telemetry Transport ([MQTT](#MQTT))
-El protocolo [MQTT](#MQTT) es uno de los más populares en el ámbito del [IoT](#IoT). Diseñado para ser ligero y adecuado para redes con ancho de banda limitado y dispositivos con pocos recursos, este estándar del comité técnico [OASIS](#OASIS) permite el transporte bidireccional de mensajes con datos entre múltiples dispositivos.
+El protocolo [MQTT](#MQTT) es uno de los más populares en el ámbito del [IoT](#IoT). Diseñado para ser ligero y adecuado para redes con ancho de banda limitado y dispositivos con pocos recursos, este estándar del comité técnico [OASIS](#OASIS) permite el transporte bidireccional de mensajes con datos entre múltiples dispositivos @MQTT_Goto @MQTT_Emqx @MQTT_Wiki @Build_IoTProts.
-[MQTT](#MQTT) utiliza el patrón de comunicación publicación-suscripción. En este patrón, los publicadores categorizan los mensajes, y los suscriptores recibirán mensajes de las categorías de su interés, a diferencia de la comunicación directa en la que los participantes se envían los mensajes directamente. En el caso de [MQTT](#MQTT), el patrón está basado en temas o *topics*, siendo posible que los suscriptores se interesen por uno o varios.
+[MQTT](#MQTT) utiliza el patrón de comunicación publicación-suscripción. En este patrón, los publicadores categorizan los mensajes, y los suscriptores recibirán mensajes de las categorías de su interés, a diferencia de la comunicación directa en la que los participantes se envían los mensajes directamente. En el caso de [MQTT](#MQTT), el patrón está basado en temas o *topics*, siendo posible que los suscriptores se interesen por uno o varios @MQTT_Goto @MQTT_Emqx @MQTT_Wiki @PubSub_Wiki.
-En una red [MQTT](#MQTT), se definen dos roles principales: el broker o intermediario de mensajes y los clientes. El broker [MQTT](#MQTT) es un servidor comparable a una oficina de correos, que recibe todos los mensajes publicados por los clientes y los dirige a los clientes de destino apropiados. Por otra parte, un cliente es cualquier dispositivo conectado al broker a través de una red, y puede producir y recibir datos al publicar y suscribirse respectivamente. Este mecanismo es útil para compartir datos, controlar y gestionar dispositivos. El enrutamiento de mensajes realizado por el broker proporciona transparencia de localización y desacoplamiento en el espacio, ya que el publicador no necesita conocer las direcciones de los suscriptores y los suscriptores no necesitan conocer al publicador, ambos interactúan únicamente con el broker.
+En una red [MQTT](#MQTT), se definen dos roles principales: el broker o intermediario de mensajes y los clientes. El broker [MQTT](#MQTT) es un servidor comparable a una oficina de correos, que recibe todos los mensajes publicados por los clientes y los dirige a los clientes de destino apropiados. Por otra parte, un cliente es cualquier dispositivo conectado al broker a través de una red, y puede producir y recibir datos al publicar y suscribirse respectivamente. Este mecanismo es útil para compartir datos, controlar y gestionar dispositivos. El enrutamiento de mensajes realizado por el broker proporciona transparencia de localización y desacoplamiento en el espacio, ya que el publicador no necesita conocer las direcciones de los suscriptores y los suscriptores no necesitan conocer al publicador, ambos interactúan únicamente con el broker @MQTT_Goto @MQTT_Dzone @MQTT_Wiki.
-Los mensajes están organizados en una jerarquía de temas o *topics*. Al publicar un mensaje, se publica en un tema específico, y en el caso de querer publicar en varios se deben realizar varias publicaciones. En cambio, un suscriptor puede suscribirse a un tema específico o a varios simultáneamente y recibirá una copia de todos los mensajes compatibles con los temas suscritos. La manera de indicar varios temas es mediante el uso de los siguientes caracteres comodín:
+Los mensajes están organizados en una jerarquía de temas o *topics*. Al publicar un mensaje, se publica en un tema específico, y en el caso de querer publicar en varios se deben realizar varias publicaciones. En cambio, un suscriptor puede suscribirse a un tema específico o a varios simultáneamente y recibirá una copia de todos los mensajes compatibles con los temas suscritos @MQTT_Goto @MQTT_Dzone @MQTT_Wiki. La manera de indicar varios temas es mediante el uso de los siguientes caracteres comodín @MQTT_Goto @MQTT_Dzone:
- Comodín de un nivel '+': coincide con un nivel de tema y puede utilizarse más de una vez en la especificación del tema.
- Comodín de varios niveles '#': coincide con cualquier número de niveles y debe ser el último carácter en la especificación del tema.
Por ejemplo, cuando se publica un mensaje en el tema "`edificioA/sensor1/temperatura`", el broker enviará una copia del mensaje los clientes suscritos a los temas "`edificioA/sensor1/temperatura`", "`edificioA/+/temperatura`" y "`edificioA/#`", pero no a un cliente suscrito a "`edificioB`" o a "`edificioA/+/humedad`".
-La transmisión de mensajes se realiza de forma asíncrona, sin detener la ejecución de ambos componentes a la hora de publicar o recibir, y se puede realizar una comunicación uno a muchos (un publicador y varios suscriptores), muchos a uno (varios publicadores y un suscriptor), uno a uno (un publicador y un suscriptor, menos común) y muchos a muchos (varios publicadores y varios suscriptores).
+La transmisión de mensajes se realiza de forma asíncrona, sin detener la ejecución de ambos componentes a la hora de publicar o recibir, y se puede realizar una comunicación uno a muchos (un publicador y varios suscriptores), muchos a uno (varios publicadores y un suscriptor), uno a uno (un publicador y un suscriptor, menos común) y muchos a muchos (varios publicadores y varios suscriptores) @MQTT_Goto @A3logics_IoTProts.
-En el caso de que el broker reciba una publicación de un tema en el cual no hay nadie suscrito, el broker por defecto descarta el mensaje. Es posible activar la retención de mensajes configurando un campo en el mensaje para evitar esto, consiguiendo así que el broker almacene el último mensaje retenido de cada tema y lo distribuya inmediatamente a cualquier nuevo cliente suscrito, permitiendo así que el suscriptor reciba el valor más reciente en lugar de esperar a una nueva publicación, y además añadiendo soporte a una comunicación desacoplada en el tiempo, donde publicadores y suscriptores no necesitan estar conectados simultáneamente.
+En el caso de que el broker reciba una publicación de un tema en el cual no hay nadie suscrito, el broker por defecto descarta el mensaje. Es posible activar la retención de mensajes configurando un campo en el mensaje para evitar esto, consiguiendo así que el broker almacene el último mensaje retenido de cada tema y lo distribuya inmediatamente a cualquier nuevo cliente suscrito, sin necesidad de que publicadores y suscriptores estén conectados simultáneamente @MQTT_Goto @MQTT_Dzone.
-El protocolo soporta un mecanismo de limpieza de sesión. Por defecto, un cliente tras desconectarse y volverse a conectar no recibe los mensajes publicados durante su desconexión y el broker olvida las suscripciones del mismo cliente. Pero al desactivar dicho mecanismo, el broker mantiene tanto las relaciones de suscripción como los mensajes offline, enviándolos al cliente al momento de reconectarse, lo cual es útil para dispositivos que se conectan y desconectan constantemente, común en redes [IoT](#IoT). Además, [MQTT](#MQTT) enfrenta la inestabilidad de la red con un mecanismo *Keep Alive* que, al transcurrir un prolongado periodo sin interacción, ocurre un ping entre el cliente y el broker para evitar la desconexión. Si el ping falla y se identifica el cliente como desconectado, aplicará un mecanismo *Last Will*, que publica un último mensaje a un tema específico debido a una desconexión anormal, en el caso de estar configurado.
+El protocolo soporta un mecanismo de limpieza de sesión. Por defecto, un cliente tras desconectarse y volverse a conectar no recibe los mensajes publicados durante su desconexión y el broker olvida las suscripciones del mismo cliente. Pero al desactivar dicho mecanismo, el broker mantiene tanto las relaciones de suscripción como los mensajes offline, enviándolos al cliente al momento de reconectarse, lo cual es útil para dispositivos que se conectan y desconectan constantemente, común en redes [IoT](#IoT). Además, [MQTT](#MQTT) enfrenta la inestabilidad de la red con un mecanismo *Keep Alive* que, al transcurrir un prolongado periodo sin interacción, ocurre un ping entre el cliente y el broker para evitar la desconexión. Si el ping falla y se identifica el cliente como desconectado, aplicará un mecanismo *Last Will*, que publica un último mensaje a un tema específico debido a una desconexión anormal, en el caso de estar configurado @MQTT_Goto @MQTT_Dzone @MQTT_Emqx.
-[MQTT](#MQTT) dispone de 14 tipos de mensajes diferentes, utilizados para establecer y cerrar una conexión con el broker, comprobar si la conexión sigue viva, publicar mensajes, y suscribirse y desuscribirse a temas.
+El diseño de [MQTT](#MQTT) se basa en la simplicidad y en minimizar el ancho de banda, dejando la interpretación del contenido del mensaje en manos del desarrollador. Los mensajes transmitidos a través de la red tienen la posibilidad de configurar el [QoS](#QoS) o calidad de servicio por cada tema, asociados con distintas garantías de entrega. Aunque [MQTT](#MQTT) funciona sobre [TCP](#TCP), el cual tiene su propia garantía de entrega, históricamente los niveles [QoS](#QoS) eran necesarios para evitar la pérdida de datos en redes antiguas y poco fiables, una preocupación válida para las redes móviles actuales @MQTT_Goto @MQTT_Dzone @MQTT_Emqx.
-El diseño de [MQTT](#MQTT) se basa en la simplicidad y en minimizar el ancho de banda, dejando la interpretación del contenido del mensaje en manos del desarrollador. Los mensajes transmitidos a través de la red tienen la posibilidad de configurar el [QoS](#QoS) o calidad de servicio por cada tema, asociados con distintas garantías de entrega. Aunque [MQTT](#MQTT) funciona sobre [TCP](#TCP), el cual tiene su propia garantía de entrega, históricamente los niveles [QoS](#QoS) eran necesarios para evitar la pérdida de datos en redes antiguas y poco fiables, una preocupación válida para las redes móviles actuales.
-
-La transmisión de datos se realiza principalmente sobre la capa TCP/IP, pero existe la posibilidad de operar encima de otros protocolos de red que ofrezcan conexiones ordenadas, sin pérdidas y bidireccionales, y se transmiten en un tamaño reducido de paquetes de datos, estructurado por los siguientes campos mostrados en la Figura \ref{mqtt:frame}:
-
-- Cabecera fija, en la que se especifica el tipo de mensaje, si el mensaje es un duplicado, el [QoS](#QoS), si es un mensaje que retener y el tamaño del paquete.
-- Cabecera variable, no siempre presente en los mensajes, y puede transportar información adicional de control.
-- Payload o carga útil.
-
-{width=100%}
-
-Por defecto, este protocolo envía credenciales y mensajes en texto plano sin medidas de seguridad, pero admite utilizar conexiones [TLS](#TLS)/[SSL](#SSL) protegidas por certificado, nombre de usuario y contraseña para cifrar y proteger la información transferida contra la intercepción, modificación o falsificación. Además, un broker [MQTT](#MQTT) tiene soporte para conectar dispositivos IoT a escala masiva, un factor tenido en cuenta durante su diseño y que resulta en una alta capacidad de concurrencia, rendimiento y escalabilidad, características deseables en una red [IoT](#IoT). Implementaciones como EMQX[^protocolosIoT:emqx] y HiveMQ[^protocolosIoT:hiveMq] han alcanzado hitos notables, con 100 y 200 millones de conexiones respectivamente, y un pico de 1 millón de mensajes gestionados por segundo. A esto se le puede sumar la capacidad de implementar múltiples brokers, para así compartir la carga de clientes y tratar la redundancia y la copia de seguridad de los mensajes en caso de fallo.
+La transmisión de datos se estructura en un formato con tamaño reducido y en 14 tipos de mensajes diferentes, utilizados para establecer y cerrar una conexión con el broker, comprobar si la conexión sigue viva, publicar mensajes, y suscribirse y desuscribirse a temas. Se realiza principalmente sobre la capa TCP/IP, pero existe la posibilidad de operar encima de otros protocolos de red que ofrezcan conexiones ordenadas, sin pérdidas y bidireccionales. Por defecto, las credenciales de conexión y los mensajes se envían en texto plano sin medidas de seguridad, pero admite utilizar conexiones [TLS](#TLS)/[SSL](#SSL) protegidas por certificado, nombre de usuario y contraseña para cifrar y proteger la información transferida contra la intercepción, modificación o falsificación. Además, un broker [MQTT](#MQTT) tiene soporte para conectar dispositivos [IoT](#IoT) a escala masiva, un factor tenido en cuenta durante su diseño y que resulta en una alta capacidad de concurrencia, rendimiento y escalabilidad, características deseables en una red [IoT](#IoT). Implementaciones como EMQX[^protocolosIoT:emqx] y HiveMQ[^protocolosIoT:hiveMq] han alcanzado hitos notables, con 100 y 200 millones de conexiones respectivamente, y un pico de 1 millón de mensajes gestionados por segundo @MQTT_Emqx @HiveMQ_200mil. A esto se le puede sumar la capacidad de implementar múltiples brokers, para así compartir la carga de clientes y tratar la redundancia y la copia de seguridad de los mensajes en caso de fallo @MQTT_Emqx @MQTT_Goto @MQTT_Dzone.
[^protocolosIoT:emqx]:
[^protocolosIoT:hiveMq]:
-{
- https://en.wikipedia.org/wiki/MQTT
- https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
- https://www.emqx.com/en/blog/what-is-the-mqtt-protocol
- https://www.gotoiot.com/pages/articles/mqtt_intro/index.html
- https://dzone.com/refcardz/getting-started-with-mqtt
- https://www.hivemq.com/resources/achieving-200-mil-concurrent-connections-with-hivemq/
- http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/
-}
-
### Advanced Message Queuing Protocol ([AMQP](#AMQP))
-[AMQP](#AMQP) es un protocolo binario avanzado que opera sobre la capa de aplicación, cuyo estándar abierto permite desarrollar mensajería y patrones de comunicación entre dispositivos. Facilita la comunicación entre servicios definiendo el formato de los datos enviados a través de la red como un flujo de bytes, así como la creación de mensajes, el encolamiento y enrutamiento de los mensajes producidos, y la manera de entregarlos a los consumidores.
-
-Este protocolo se basa en el concepto de publicar y consumir de colas de mensajes a través de una conexión fiable, persistente y orientada al envío de flujos de datos. Además, es compatible con el envío de múltiples flujos de datos simultáneos mediante múltiples canales en una única conexión. Permite hacer uso de estas colas de mensajes mediante distintos tipos de comunicación, como la entrega directa punto a punto y el modelo publicación-suscripción, y, pese a no ser un protocolo diseñado originalmente para su uso en el [IoT](#IoT), funciona muy bien en este ámbito y en la gran variedad de escenarios de comunicación y mensajería posibles.
+[AMQP](#AMQP) es un protocolo binario avanzado que opera sobre la capa de aplicación, cuyo estándar abierto permite desarrollar patrones de comunicación entre dispositivos. Facilita la comunicación entre servicios definiendo el formato de los datos enviados a través de la red, así como la creación de mensajes, el encolamiento y enrutamiento de los mensajes producidos, y la manera de entregarlos a los consumidores. Este protocolo se basa en el concepto de publicar y consumir de colas de mensajes a través de una conexión fiable, persistente y orientada al envío de flujos de datos. Permite hacer uso de estas colas de mensajes mediante distintos tipos de comunicación, como la entrega directa punto a punto y el modelo publicación-suscripción, haciendo su uso adecuado para el [IoT](#IoT) pese a no ser diseñado originalmente para usarse en este ámbito @AMQP_Wiki @AMQP_Goto @AMQP_Emqx @Build_IoTProts @A3logics_IoTProts.
-En [AMQP](#AMQP) se definen las dos siguientes entidades principales que interactúan entre sí:
+En [AMQP](#AMQP) se definen las dos siguientes entidades principales que interactúan entre sí @AMQP_Goto @AMQP_Wiki:
- Cliente: del tipo suscriptor o publicador (o consumidor y productor, respectivamente), se conecta a un broker a través de credenciales y, en caso de estar autorizado, puede recibir o publicar mensajes.
- Broker: servidor de mensajería al que los clientes se conectan y que se encarga de distribuir los mensajes. Internamente, posee *exchanges* o intercambiadores, donde se conectan los productores de mensajes, y colas, vinculadas a los exchanges dependiendo de varios criterios y a las que se conectan los consumidores para extraer los mensajes producidos.
-De manera sencilla, se puede resumir el funcionamiento de este protocolo como un modelo en el que los mensajes son publicados y enviados a exchanges, los cuales enrutan los mensajes a las colas apropiadas según reglas o bindings, y los consumidores reciben los mensajes a través de las mismas colas.
-
-Los exchages, además de recibir mensajes de los productores, se encargan de enviar los datos a las colas apropiadas, ya sean a una o a varias dependiendo del exchange y la clave de enrutamiento o routing key con la que se publica el mensaje. A este funcionamiento se le puede asociar la analogía del funcionamiento del envío de emails, ya que estos se envían a direcciones "routing key@exchange", siendo la clave de enrutamiento la dirección de correo y el exchange el servidor. En [AMQP](#AMQP) existen cuatro tipos de exchanges: topic (permite una comunicación publicación-suscripción según clave y exchange), direct (permite una comunicación punto a punto), fanout (permite una comunicación similar a broadcast) y headers (permite una comunicación publicación-suscripción según cabeceras).
-
-Las colas son fragmentos de memoria creados por el cliente suscriptor identificadas unívocamente mediante un nombre, definido previamente por el cliente o automáticamente por el broker. Intrínsicamente, [AMQP](#AMQP) garantiza la recepción y procesamiento de mensajes, ya que dispone de un mecanismo de [ACK](#ACK) o acuse de recibo que permite confirmar la recepción y procesamiento del mensaje. En el caso de no recibir el [ACK](#ACK) de un mensaje por parte de un consumidor, por ejemplo, porque perdió la conexión o no se procesó correctamente, el broker encola de nuevo el mensaje para reintentar la entrega. Además, las colas admiten persistencia, para mantener la existencia de la cola incluso luego de que ocurra un reinicio en el broker.
+De manera sencilla, se puede resumir el funcionamiento de este protocolo como un modelo en el que los mensajes son publicados y enviados a exchanges, los cuales enrutan los mensajes a las colas apropiadas según reglas o bindings que dependen del exchange y la clave de enrutamiento o *routing key*, y los consumidores reciben los mensajes a través de las mismas colas. Tanto publicadores como consumidores están desacoplados en tiempo y espacio, desconociendo ambos su existencia y ubicación. Al funcionamiento de la transmisión se le puede asociar la analogía del funcionamiento del envío de emails, ya que estos se envían a direcciones "routing key@exchange", siendo la clave de enrutamiento la dirección de correo y el exchange el servidor. En [AMQP](#AMQP) existen cuatro tipos de exchanges: topic (permite una comunicación publicación-suscripción según clave y exchange), direct (permite una comunicación punto a punto), fanout (permite una comunicación similar a broadcast) y headers (permite una comunicación publicación-suscripción según cabeceras) @AMQP_Wiki @AMQP_Goto @AMQP_Emqx.
-Tras crear el exchange y la cola, se indica al broker la vinculación de ambas mediante un binding, especificando una clave de enrutamiento que, según el tipo de exchange, enruta adecuadamente las colas. El exchange entregará como máximo una copia de mensaje a una cola si corresponden las propiedades del mensaje con las propiedades del binding. Con los bindings es posible vincular varias colas a un mismo exchange, al igual que una cola a varios exchanges.
+Las colas son fragmentos de memoria creados por el cliente suscriptor identificadas unívocamente mediante un nombre, definido previamente por el cliente o automáticamente por el broker. Intrínsicamente, [AMQP](#AMQP) garantiza la recepción y procesamiento de mensajes, ya que dispone de un mecanismo de [ACK](#ACK) o acuse de recibo que permite confirmar la recepción y procesamiento del mensaje. En el caso de no recibir el [ACK](#ACK) de un mensaje por parte de un consumidor, por ejemplo, porque perdió la conexión o no se procesó correctamente, el broker encola de nuevo el mensaje para reintentar la entrega. Además, las colas admiten persistencia, para mantener la existencia de la cola incluso luego de que ocurra un reinicio en el broker @AMQP_Goto.
-Con los tres conceptos mencionados previamente, exchange, binding y cola, se produce un desacople en tiempo y espacio entre los productores y los consumidores, ya que ambos están aislados entre sí y desconocen su existencia y ubicación.
+Tras crear el exchange y la cola, se indica al broker la vinculación de ambas mediante un binding, especificando una clave de enrutamiento que, según el tipo de exchange, enruta adecuadamente las colas. El exchange entregará como máximo una copia de mensaje a una cola si corresponden las propiedades del mensaje con las propiedades del binding. Con los bindings es posible vincular varias colas a un mismo exchange, al igual que una cola a varios exchanges @AMQP_Goto @AMQP_Emqx.
-[AMQP](#AMQP) hace uso de la capa [TCP](#TCP) para la transmisión de mensajes y es extenso en cuanto a funciones. Ofrece interoperabilidad independientemente del lenguaje o del proveedor, cifrado de extremo a extremo, múltiples propiedades de mensajes y modos de entrega, fiabilidad en la entrega, persistencia de mensajes, enrutamiento basado en criterios, capacidad de escalabilidad y definición de topologías, entre otras características. Sin embargo, pese a su idoneidad para sistemas distribuidos, es un protocolo que conlleva un alto consumo de recursos, como energía y memoria.
+[AMQP](#AMQP) hace uso de la capa [TCP](#TCP) para la transmisión de mensajes y es extenso en cuanto a funciones. Ofrece interoperabilidad independientemente del lenguaje o del proveedor, cifrado de extremo a extremo, múltiples propiedades de mensajes y modos de entrega, fiabilidad en la entrega, persistencia de mensajes, enrutamiento basado en criterios, capacidad de escalabilidad y definición de topologías, entre otras características. Sin embargo, pese a su idoneidad para sistemas distribuidos, es un protocolo que conlleva un alto consumo de recursos @AMQP_Emqx @AMQP_Wiki @AMQP_Goto @Webby_IoTProts @A3logics_IoTProts.
### Extensible Messaging and Presence Protocol ([XMPP](#XMPP))
-Otra manera de comunicar varios dispositivos [IoT](#IoT) es utilizar el [XMPP](#XMPP), anteriormente conocido como Jabber. Este protocolo se basa en la transmisión de datos estructurados en formato [XML](#XML) dentro de una red de arquitectura cliente-servidor, en la cual los dispositivos están identificados por un Jabber ID, cuyo formato es similar al de una dirección de correo electrónico (por ejemplo, "abc@example.com"). En esta red, el cliente establece una conexión TCP/IP con el servidor. Posteriormente, el cliente se autentica con el servidor, y tras una autenticación exitosa, se habilita la posibilidad de enviar y recibir mensajes.
+Otra manera de comunicar varios dispositivos [IoT](#IoT) es utilizar el [XMPP](#XMPP), anteriormente conocido como Jabber. Este protocolo se basa en la transmisión de datos estructurados en formato [XML](#XML) dentro de una red de arquitectura cliente-servidor, en la cual los dispositivos están identificados por un Jabber ID, cuyo formato es similar al de una dirección de correo electrónico (por ejemplo, "abc@example.com"). En esta red, el cliente establece una conexión TCP/IP con el servidor. Posteriormente, el cliente se autentica con el servidor, y tras una autenticación exitosa, se habilita la posibilidad de enviar y recibir mensajes @A3logics_IoTProts @XMPP_Wiki @XMPP_PubNub.
-Una característica notable de [XMPP](#XMPP) es que cualquiera puede tener su propio servidor [XMPP](#XMPP), no restringiendo a los usuarios a conectarse únicamente con otros usuarios en el mismo servidor central. Al ser un protocolo abierto formalizado por la Internet Engineering Task Force ([IETF](#IETF))[^protocolosIoT:ietf], los desarrolladores disponen de un protocolo bien documentado y fiable, de este modo, es posible interoperar entre diferentes implementaciones de [XMPP](#XMPP) a través de Internet, independientemente del proveedor. En el caso de querer comunicarse con otro servidor, ambos servidores [XMPP](#XMPP) intercambian la información necesaria, habilitando un modelo federado.
+Una característica notable de [XMPP](#XMPP) es que cualquiera puede tener su propio servidor [XMPP](#XMPP), no restringiendo a los usuarios a conectarse únicamente con otros usuarios en el mismo servidor central. Al ser un protocolo abierto formalizado por la Internet Engineering Task Force ([IETF](#IETF))[^protocolosIoT:ietf], los desarrolladores disponen de un protocolo bien documentado y fiable, de este modo, es posible interoperar entre diferentes implementaciones de [XMPP](#XMPP) a través de Internet, independientemente del proveedor. En el caso de querer comunicarse con otro servidor, ambos servidores [XMPP](#XMPP) intercambian la información necesaria, habilitando un modelo federado @XMPP_Wiki @XMPP_PubNub.
[^protocolosIoT:ietf]:
-Este protocolo está diseñado para ofrecer mensajería instantánea o casi en tiempo real a través de la red, sin importar la distancia entre los dispositivos, uno de los problemas más comunes en [IoT](#IoT). Además, permite obtener información sobre los usuarios conectados y mantener una lista de contactos para cada usuario. [XMPP](#XMPP) también es extensible, permitiendo a los desarrolladores añadir características y funcionalidades personalizadas, adaptando el protocolo a necesidades específicas de aplicaciones, como la transmisión de señales [VoIP](#VoIP), video, ficheros, chat grupal, conferencias multiusuario, suscripción de presencia y comunicación publicación-suscripción para recibir actualizaciones sobre temas específicos de interés.
+Este protocolo está diseñado para ofrecer mensajería instantánea o casi en tiempo real a través de la red, sin importar la distancia entre los dispositivos, uno de los problemas más comunes en [IoT](#IoT) @Build_IoTProts. Además, permite obtener información sobre los usuarios conectados y mantener una lista de contactos para cada usuario. [XMPP](#XMPP) también es extensible, permitiendo a los desarrolladores añadir características y funcionalidades personalizadas, adaptando el protocolo a necesidades específicas de aplicaciones, como la transmisión de señales [VoIP](#VoIP), video, ficheros, chat grupal, conferencias multiusuario, suscripción de presencia y comunicación publicación-suscripción para recibir actualizaciones sobre temas específicos de interés @XMPP_Wiki @XMPP_PubNub.
-En los mensajes [XMPP](#XMPP) se utilizan estructuras [XML](#XML) denominadas *stanzas* para transportar datos. Existen 3 tipos principales de stanzas: de mensaje (para enviar mensajes entre clientes), de presencia (para conocer el estado y la disponibilidad de un cliente) y de info/query (para hacer consultas al servidor).
-
-El protocolo [XMPP](#XMPP) es altamente escalable debido a su capacidad de manejar multitud de conexiones y mensajes simultáneos. Además, al ser descentralizado, permite implementar fácilmente más servidores para gestionar el aumento de usuarios y altos picos de uso. En cuanto a seguridad, [XMPP](#XMPP) es compatible con cifrado de extremo a extremo mediante [TLS](#TLS) o [SSL](#SSL), garantizando así la confidencialidad de los mensajes. Por último, cuenta con una amplia comunidad de usuarios, diversas implementaciones y guías que facilitan a los desarrolladores la creación de aplicaciones que integren este protocolo.
+En los mensajes [XMPP](#XMPP) se utilizan estructuras [XML](#XML) denominadas *stanzas* para transportar datos. Existen 3 tipos principales de stanzas: de mensaje (para enviar mensajes entre clientes), de presencia (para conocer el estado y la disponibilidad de un cliente) y de info/query (para hacer consultas al servidor) @XMPP_Blazeclan.
+El protocolo [XMPP](#XMPP) es altamente escalable debido a su capacidad de manejar multitud de conexiones y mensajes simultáneos. Además, al ser descentralizado, permite implementar fácilmente más servidores para gestionar el aumento de usuarios y altos picos de uso. En cuanto a seguridad, [XMPP](#XMPP) es compatible con cifrado de extremo a extremo mediante [TLS](#TLS) o [SSL](#SSL), garantizando así la confidencialidad de los mensajes. Por último, cuenta con una amplia comunidad de usuarios, diversas implementaciones y guías que facilitan a los desarrolladores la creación de aplicaciones que integren este protocolo @XMPP_Wiki @XMPP_PubNub.
### Data Distribution Service ([DDS](#DDS))
-[DDS](#DDS) es un estándar de middleware y [API](#API) máquina-máquina que facilita la comunicación y el intercambio de datos. Fue desarrollado por el Object Management Group con el fin de responder a las necesidades específicas de aplicaciones que requieren intercambios de datos fiables y de alto rendimiento en sistemas distribuidos en tiempo real, sin dejar de lado la eficiencia. Su arquitectura se basa en un modelo de publicación-suscripción sin servidor, ya que los dispositivos se conectan entre sí, y donde los datos son publicados en un dominio y los suscriptores se conectan a este para recibir la información que les interesa.
-
-Este middleware se corresponde con la capa de software que se encuentra entre el sistema operativo y las aplicaciones, abstrayendo la comunicación entre ambos y, por tanto, los detalles del tranporte de red y de los datos a bajo nivel. Permite que los distintos componentes de un sistema compartan y comuniquen datos, gestionando automáticamente el formato de los mensajes, el protocolo de transporte a usar, la fiabilidad, la calidad de sevicio y la seguridad, y simplificando así el desarrollo. [DDS](#DDS) se centra completamente en los datos, asegurando un buen transporte e incluyendo información contextual de los mismos, lo que lo hace ideal para el [IoT](#IoT) aplicado en entornos industriales.
+[DDS](#DDS) es un estándar de middleware y [API](#API) máquina-máquina que facilita la comunicación y el intercambio de datos. Fue desarrollado por el Object Management Group con el fin de responder a las necesidades específicas de aplicaciones que requieren intercambios de datos fiables y de alto rendimiento en sistemas distribuidos en tiempo real, sin dejar de lado la eficiencia. Su arquitectura se basa en un modelo de publicación-suscripción sin servidor, ya que los dispositivos se conectan entre sí, y donde los datos son publicados en un dominio y los suscriptores se conectan a este para recibir la información que les interesa @DDS_Standard @Webby_IoTProts @TechTarget_IoTProts @Build_IoTProts.
-[DDS](#DDS) funciona con el concepto de espacio de datos global, un almacén de datos que a ojos del programador parece una memoria local accedida mediante [API](#API)s. Sin embargo, este espacio es solo una ilusión, ya que no existe un lugar donde residan todos los datos, se refiere a una colección de distintos almacenes locales en cada nodo por los cuales se reparten los datos. El programador piensa que está enviando mensajes a un almacén global, pero en realidad [DDS](#DDS) envía mensajes a los almacenes locales apropiados.
+Este middleware abstrae la comunicación entre el sistema operativo y las aplicaciones, y facilita la comunicación entre componentes de un sistema, gestionando automáticamente el formato de los mensajes, el protocolo de transporte a usar, la fiabilidad, la calidad de servicio y la seguridad, y simplificando así el desarrollo. [DDS](#DDS) se centra completamente en los datos, asegurando un buen transporte e incluyendo información contextual de los mismos, lo que lo hace ideal para el [IoT](#IoT) aplicado en entornos industriales @DDS_Standard @DDS_UTPL @TechTarget_IoTProts.
-Aunque este espacio global es tan característico, no se pierde compatibilidad, ya que el middleware es independiente del lenguaje de programación y la plataforma, posibilitando la interoperabilidad entre distintos sistemas y aplicaciones y una implementación que se adapte a las necesidades sin afectar a las comunicaciones entre dispositivos. Tampoco pierde efectividad, ya que su velocidad, baja latencia, baja sobrecarga en la comunicación, optimización del transporte y capacidad de transmitir millones de mensajes a multitud de receptores instantáneamente, lo convierten en una tecnología ideal para sistemas de alto rendimiento en tiempo real.
+[DDS](#DDS) funciona con el concepto de espacio de datos global, un almacén de datos que a ojos del programador parece una memoria local accedida mediante [API](#API)s. Sin embargo, este espacio es solo una ilusión, ya que no existe un lugar donde residan todos los datos, se refiere a una colección de distintos almacenes locales en cada nodo por los cuales se reparten los datos. Aunque este espacio global es tan característico, no se pierde compatibilidad, ya que el middleware es independiente del lenguaje de programación y la plataforma, posibilitando la interoperabilidad entre distintos sistemas y aplicaciones y una implementación que se adapte a las necesidades sin afectar a las comunicaciones entre dispositivos. Tampoco pierde efectividad, ya que su velocidad, baja latencia, baja sobrecarga en la comunicación, optimización del transporte y capacidad de transmitir millones de mensajes a multitud de receptores instantáneamente, lo convierten en una tecnología ideal para sistemas de alto rendimiento en tiempo real @DDS_Standard @DDS_UTPL.
-Al ser descentralizado, es decir, al no requerir un nodo central, el servicio [DDS](#DDS) es mucho más eficiente y eficaz, ya que los mensajes no deben atravesar un dispositivo intermediario, ejecutando la comunicación punto a punto, y resultando en una mayor velocidad. Además, dispone de un servicio de descubrimiento dinámico, haciendo que las aplicaciones [DDS](#DDS) sean extensibles y escalables. La aplicación no necesita conocer ni configurar los puntos finales de los dispositivos para la comunincación, ya que estos se descubren automáticamente en ejecución, y es capaz de identificar si el punto final se utiliza para publicar datos, para suscribirse o para ambos, el tipo de dato publicado o suscrito, y las características específicas de la comunicación.
+Al ser descentralizado y no requerir un nodo central, el servicio [DDS](#DDS) es mucho más eficiente y eficaz, ya que los mensajes no deben atravesar un dispositivo intermediario, ejecutando la comunicación punto a punto, y resultando en una mayor velocidad. Además, dispone de un servicio de descubrimiento dinámico de puntos finales, haciendo que las aplicaciones [DDS](#DDS) sean extensibles y escalables @DDS_Standard @DDS_UTPL.
-[DDS](#DDS) soporta principalmente el modelo de publicación-suscripción, intercambiando información basada en un tema o topic identificado por su nombre. En este modelo, cualquier nodo conectado puede publicar mensajes con el tema especificado o suscribirse a un tema, y [DDS](#DDS) se encarga de que los datos se entreguen a los suscriptores correctos en el momento adecuado mediante comunicación peer-to-peer. Al suscribirse, es posible especificar filtros de tiempo y subconjuntos de datos para obtener solo los requeridos, y tiene la capacidad de detectar cambios para que los suscriptores reciban actualizaciones adecuadas de los datos. Por otro lado, al publicar, es [DDS](#DDS) quien gestiona la complejidad de la transmisión y se encarga de almacenar los datos de manera segura. También ofrece compatibilidad con RPC o llamadas a procedimientos remotos.
+[DDS](#DDS) soporta principalmente el modelo de publicación-suscripción, intercambiando información basada en temas con componentes suscritos. Al suscribirse, es posible especificar filtros de tiempo y subconjuntos de datos para obtener solo los requeridos, y tiene la capacidad de detectar cambios para que los suscriptores reciban actualizaciones adecuadas de los datos. También ofrece compatibilidad con RPC o llamadas a procedimientos remotos @DDS_Standard @DDS_UTPL.
-El middleware es independiente del transporte, y puede funcionar sobre [UDP](#UDP), [TCP](#TCP) y memoria compartida, entre otros. Entre las características opcionales que ofrece, como el filtrado de grandes datos, se encuentra la gestión de calidad de servicio o [QoS](#QoS), donde se pueden especificar requisitos de rendimiento y confiabilidad, como la latencia, el ancho de banda, la prioridad, la disponibilidad de los datos, el uso de recursos y la sincronización. Además, incluye mecanismos de seguridad que proporcionan autenticación, encriptación, confidencialidad, control de acceso e integridad en la distribución de información.
+El middleware es independiente del transporte, y puede funcionar sobre [UDP](#UDP), [TCP](#TCP) y memoria compartida, entre otros. Entre las características opcionales que ofrece, como el filtrado de grandes datos, se encuentra la gestión de calidad de servicio o [QoS](#QoS), donde se pueden especificar requisitos de rendimiento y confiabilidad, como la latencia, el ancho de banda, la prioridad, la disponibilidad de los datos, el uso de recursos y la sincronización. Además, incluye mecanismos de seguridad que proporcionan autenticación, encriptación, confidencialidad, control de acceso e integridad en la distribución de información @DDS_Standard.
### Constrained Application Control ([CoAP](#CoAP))
-[CoAP](#CoAP) es un protocolo de la capa de aplicación que permite a dispositivos con recursos limitados, como los que se encuentran en una red [IoT](#IoT), comunicarse entre sí. Funciona en un marco cliente-servidor, en el cual el cliente realiza una solicitud a un punto de comunicación del dispositivo servidor, y este responde, permitiendo la interoperabilidad entre los dispositivos uno a uno.
-
-Este protocolo opera sobre el protocolo de transporte [UDP](#UDP), que, a diferencia de [TCP](#TCP), no requiere que los dispositivos establezcan una conexión de datos previa al envío de datos. Esto trae tanto consecuencias positivas como negativas. La consecuencia negativa radica en la poca fiabilidad en la comunicación, ya que el protocolo [UDP](#UDP) no garantiza la entrega de los mensajes, sino que esta garantía se gestiona desde la implementación de [CoAP](#CoAP). Es posible establecer garantía de entrega mediante acuses de recibo ([ACK](#ACK)) y tiempos de espera. La consecuencia positiva del uso de [UDP](#UDP) es la posibilidad de funcionar en redes con pérdidas o inestables, adecuado para sistemas [IoT](#IoT), ya que suelen operar en entornos de red difíciles, y la rapidez en la comunicación, pues no requiere una conexión de datos previa, enviando directamente el mensaje.
-
-Esta comunicación utiliza una arquitectura [REST](#REST)ful, en la cual los datos y las funcionalidades se consideran recursos a los que se accede mediante una interfaz estándar y uniforme. Estos recursos se acceden y se interactúa con ellos mediante métodos [HTTP](#HTTP) estándar, permitiendo una interoperabilidad sencilla entre distintos tipos de dispositivos y facilitando a los desarrolladores el uso del protocolo. No es necesario que los recursos de la red sean conocidos por el dispositivo que vaya a utilizarlos, ya que [CoAP](#CoAP) implementa un mecanismo de descubrimiento integrado a través de un núcleo en la red, útil en redes [IoT](#IoT) en las que los dispositivos constantemente se conectan y desconectan. Además, el intercambio de mensajes entre dispositivos es asíncrono, lo que significa que un dispositivo puede enviar una solicitud a otro y continuar ejecutando otras tareas mientras que la respuesta puede recibirla en cualquier momento.
+[CoAP](#CoAP) es un protocolo de la capa de aplicación que permite a dispositivos con recursos limitados, como los que se encuentran en una red [IoT](#IoT), comunicarse entre sí @Build_IoTProts. Funciona en un marco cliente-servidor, en el cual el cliente realiza una solicitud a un punto de comunicación del dispositivo servidor, y este responde, permitiendo la interoperabilidad entre los dispositivos uno a uno @rfc7252 @A3logics_IoTProts @CoAPIntro @CoAP_EMQX.
-[CoAP](#CoAP) se basa en el intercambio de mensajes compactos codificados en un formato binario simple, cuyo tamaño no debe superar el necesario para encapsularlos dentro de un datagrama [IP](#IP). Los distintos tipos de mensajes son: confirmables (CON, para enviar mensajes fiables), no confirmables (NON, para enviar mensajes con menos fiabilidad), de acuse de recibo (ACK) y de reinicio (RST, para indicar que el receptor no puede procesar una solicitud).
+Este protocolo opera sobre el protocolo de transporte [UDP](#UDP) @TechTarget_IoTProts, que, a diferencia de [TCP](#TCP), no requiere que los dispositivos establezcan una conexión de datos previa al envío de datos. Esto trae tanto consecuencias positivas como negativas. La consecuencia negativa radica en la poca fiabilidad en la comunicación, ya que el protocolo [UDP](#UDP) no garantiza la entrega de los mensajes, sino que esta garantía se gestiona desde la implementación de [CoAP](#CoAP). Es posible establecer garantía de entrega mediante acuses de recibo ([ACK](#ACK)) y tiempos de espera. La consecuencia positiva del uso de [UDP](#UDP) es la posibilidad de funcionar en redes con pérdidas o inestables, adecuado para sistemas [IoT](#IoT), ya que suelen operar en entornos de red difíciles, y la rapidez en la comunicación, pues no requiere una conexión de datos previa, enviando directamente el mensaje @CoAPIntro @CoAP_EMQX.
-Además es un protocolo diseñado para utilizar un bajo consumo de recursos en la transferencia, y permite hacer uso del protocolo de seguridad de la capa de transporte (Data Transport Layer Security, [DTLS](#DTLS)) para aumentar la seguridad, además de extender su implementación con funcionalidades adicionales. Por el contrario, es menos maduro que sus alternativas, resultando en una menor cantidad de recursos, guías y herramientas, además de una compatibilidad reducida con otros dispositivos [IoT](#IoT).
+Esta comunicación utiliza una arquitectura [REST](#REST)ful, en la cual los datos y las funcionalidades se consideran recursos a los que se accede mediante métodos [HTTP](#HTTP) estándar, permitiendo una interoperabilidad sencilla entre distintos tipos de dispositivos y facilitando a los desarrolladores el uso del protocolo. No es necesario que los recursos de la red sean conocidos por el dispositivo que vaya a utilizarlos, ya que [CoAP](#CoAP) implementa un mecanismo de descubrimiento integrado a través de un núcleo en la red, útil en redes [IoT](#IoT) en las que los dispositivos constantemente se conectan y desconectan. Además, el intercambio de mensajes entre dispositivos es asíncrono, lo que significa que un dispositivo puede enviar una solicitud a otro y continuar ejecutando otras tareas mientras que la respuesta puede recibirla en cualquier momento @CoAPIntro @CoAP_EMQX.
+[CoAP](#CoAP) se basa en el intercambio de mensajes compactos codificados en un formato binario simple, cuyo tamaño no debe superar el necesario para encapsularlos dentro de un datagrama [IP](#IP). Los distintos tipos de mensajes son: confirmables (CON, para enviar mensajes fiables), no confirmables (NON, para enviar mensajes con menos fiabilidad), de acuse de recibo (ACK) y de reinicio (RST, para indicar que el receptor no puede procesar una solicitud) @CoAPIntro @CoAP_EMQX @rfc7252.
-https://webbylab.com/blog/mqtt-vs-other-iot-messaging-protocols-detailed-comparison/
-https://www.techtarget.com/iotagenda/tip/Top-12-most-commonly-used-IoT-protocols-and-standards
-https://build5nines.com/top-iot-messaging-protocols/
-https://www.a3logics.com/blog/iot-messaging-protocols/
-https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol
-https://www.gotoiot.com/pages/articles/amqp_intro/index.html
-https://www.emqx.com/en/blog/mqtt-vs-amqp-for-iot-communications#what-is-amqp
-http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format
-https://en.wikipedia.org/wiki/XMPP
-https://www.pubnub.com/guides/xmpp/
-https://blazeclan.com/blog/xmpp-for-dummies-part-3-stanzas-in-detail/
-https://slixmpp.readthedocs.io/en/latest/api/stanza/presence.html
-https://slixmpp.readthedocs.io/en/latest/api/stanza/iq.html
-https://www.dds-foundation.org/omg-dds-standard/
-https://www.utpl.edu.ec/proyectomiddleware/?q=tutorial-dds
-https://www.emqx.com/en/blog/coap-protocol0
-https://www.gotoiot.com/pages/articles/coap_intro/index.html
-(DOCUMENTO) https://datatracker.ietf.org/doc/html/rfc7252
+Además es un protocolo diseñado para utilizar un bajo consumo de recursos en la transferencia, y permite hacer uso del protocolo de seguridad de la capa de transporte (Data Transport Layer Security, [DTLS](#DTLS)) para aumentar la seguridad, además de extender su implementación con funcionalidades adicionales. Por el contrario, es menos maduro que sus alternativas, resultando en una menor cantidad de recursos, guías y herramientas, además de una compatibilidad reducida con otros dispositivos [IoT](#IoT) @A3logics_IoTProts @CoAPIntro @CoAP_EMQX.
### Comparación de middleware y protocolos
@@ -323,189 +170,107 @@ A partir de la información de los apartados anteriores, se pueden recopilar las
- **Patrón de comunicación:** Publicación-suscripción.
- **Necesita intermediario:** Sí, el broker.
- **Protocolo de transporte:** [TCP](#TCP).
- - **Ventajas:** Muy utilizado, ligero, eficiente, útil en dispositivos y redes de recursos limitados, soporta distintas calidades de servicio.
- - **Desventajas:** Encriptación y enrutación limitadas, bajo soporte para tipos de datos complejos.
- - **Casos de uso:** Telemetría, mensajería ligera, automatización industrial, monitorización del entorno, hogares inteligentes, soluciones energéticas.
+ - **Ventajas:** Muy utilizado, ligero, eficiente, útil en dispositivos y redes de recursos limitados, soporta distintas calidades de servicio @Webby_IoTProts @A3logics_IoTProts.
+ - **Desventajas:** Encriptación y enrutación limitadas, bajo soporte para tipos de datos complejos @Webby_IoTProts @A3logics_IoTProts.
+ - **Casos de uso:** Telemetría, mensajería ligera, automatización industrial, monitorización del entorno, hogares inteligentes, soluciones energéticas @MQTT_Dzone @Webby_IoTProts.
2. *[AMQP](#AMQP)*:
- **Descripción corta:** Basado en colas de mensajes y exchanges.
- **Patrón de comunicación:** Publicación-suscripción, directa o fanout.
- **Necesita intermediario:** Sí, el broker.
- **Protocolo de transporte:** [TCP](#TCP).
- - **Ventajas:** Alto rendimiento, seguro, ampliamente usado, parecido a [MQTT](#MQTT).
- - **Desventajas:** Alto consumo de recursos, difícil aprendizaje.
- - **Casos de uso:** Servicios financieros, procesamiento de transacciones, envío de datos en tiempo real, comunicación segura entre entidades.
+ - **Ventajas:** Alto rendimiento, seguro, ampliamente usado, parecido a [MQTT](#MQTT) @Webby_IoTProts @A3logics_IoTProts.
+ - **Desventajas:** Alto consumo de recursos, difícil aprendizaje @A3logics_IoTProts.
+ - **Casos de uso:** Servicios financieros, procesamiento de transacciones, envío de datos en tiempo real, comunicación segura entre entidades @A3logics_IoTProts.
3. *[XMPP](#XMPP)*:
- **Descripción corta:** Comunicación de datos y presencia mediante mensajes [XML](#XML).
- **Patrón de comunicación:** Cliente-servidor.
- **Necesita intermediario:** Sí, el servidor XMPP.
- **Protocolo de transporte:** [TCP](#TCP).
- - **Ventajas:** Robusto, extensible, muy ampliable de funciones.
- - **Desventajas:** No optimizado para entornos limitados, complejo de implementar.
- - **Casos de uso:** Mensajería instantánea, redes sociales, plataformas de colaboración.
+ - **Ventajas:** Robusto, extensible, muy ampliable de funciones @A3logics_IoTProts @Webby_IoTProts.
+ - **Desventajas:** No optimizado para entornos limitados, complejo de implementar @Webby_IoTProts.
+ - **Casos de uso:** Mensajería instantánea, redes sociales, plataformas de colaboración @Webby_IoTProts.
4. *[DDS](#DDS)*:
- **Descripción corta:** Comunicación sin servidor.
- **Patrón de comunicación:** Publicación-suscripción.
- **Necesita intermediario:** No.
- **Protocolo de transporte:** [TCP](#TCP) y [UDP](#UDP), compatible con otros.
- - **Ventajas:** Alto rendimiento, fácil de escalar, comunicación centrada en datos en tiempo real, soporte de tipos de datos complejos, configurable la calidad de servicio.
- - **Desventajas:** Complejo de implementar, altos recursos de dispositivos y de ancho de banda.
- - **Casos de uso:** Sistemas de tiempo real, aplicaciones de misión crítica, automatización industrial, automoción, gestión de cadenas de suministro, sistemas distribuidos de gran escala.
+ - **Ventajas:** Alto rendimiento, fácil de escalar, comunicación centrada en datos en tiempo real, soporte de tipos de datos complejos, configurable la calidad de servicio @Webby_IoTProts.
+ - **Desventajas:** Complejo de implementar, altos recursos de dispositivos y de ancho de banda @Webby_IoTProts.
+ - **Casos de uso:** Sistemas de tiempo real, aplicaciones de misión crítica, automatización industrial, automoción, gestión de cadenas de suministro, sistemas distribuidos de gran escala @Webby_IoTProts.
5. *[CoAP](#CoAP)*:
- **Descripción corta:** Basada en recursos compartidos y accesibles mediante [REST](#REST).
- **Patrón de comunicación:** Cliente-servidor.
- **Necesita intermediario:** No.
- **Protocolo de transporte:** [UDP](#UDP).
- - **Ventajas:** Eficiente en redes y dispositivos de recursos limitados, soporte nativo para tecnologías web.
+ - **Ventajas:** Eficiente en redes y dispositivos de recursos limitados, soporte nativo para tecnologías web @Webby_IoTProts @TechTarget_IoTProts.
- **Desventajas:** Bajo soporte de clientes concurrentes.
- - **Casos de uso:** Dispositivos de recursos limitados, automatización en hogares.
-
-{
- https://webbylab.com/blog/mqtt-vs-other-iot-messaging-protocols-detailed-comparison/
- https://www.a3logics.com/blog/iot-messaging-protocols/
-
-}
-
+ - **Casos de uso:** Dispositivos de recursos limitados, automatización en hogares @Webby_IoTProts.
## Espressif y sus dispositivos
-Espressif Systems[^espressif:espressifSystems] es una multinacional de semiconductores fundada en 2008, que opera como líder mundial en el ámbito del [IoT](#IoT) y está comprometida a proporcionar a millones de usuarios algunos de los mejores dispositivos y plataformas de software de la industria, junto con una variedad de soluciones [IoT](#IoT) seguras, robustas, eficientes, versátiles, asequibles y orientadas al código abierto.
+Espressif Systems[^espressif:espressifSystems] es una multinacional de semiconductores fundada en 2008, que opera como líder mundial en el ámbito del [IoT](#IoT) y está comprometida a proporcionar a millones de usuarios algunos de los mejores dispositivos y plataformas de software de la industria, junto con una variedad de soluciones [IoT](#IoT) seguras, robustas, eficientes, versátiles, asequibles y orientadas al código abierto. Los productos de Espressif se utilizan ampliamente en dispositivos de electrónica de consumo, y es conocido por sus populares series de chips, módulos y placas de desarrollo ESP8266 y ESP32, los cuales se analizarán en los siguientes apartados @AboutEspressif @EurotronixEspressif @DigikeyEspressif.
[^espressif:espressifSystems]:
-Los productos de Espressif se utilizan ampliamente en dispositivos de electrónica de consumo, y es conocido por sus populares series de chips, módulos y placas de desarrollo ESP8266 y ESP32, los cuales se analizarán en los siguientes apartados.
-
-{
-https://www.espressif.com/en/company/about-espressif
-https://www.eurotronix.com/es/fabricantes/espressif
-https://www.digikey.es/es/supplier-centers/espressif-systems
-}
-
### ESP8266
-El ESP8266 es un [SoC](#SoC) o sistema en un chip diseñado para dispositivos móviles, electrónica portátil y aplicaciones del [IoT](#IoT). Lanzado en agosto de 2014, integra un procesador mononúcleo Tensilica L106 con una arquitectura *Reduced Instruction Set Computer* ([RISC](#RISC)) de 32 bits de bajo consumo y una velocidad de reloj de entre 80 y 160 [MHz](#MHz).
-
-Presenta una arquitectura para el ahorro de energía, permitiendo establecer el chip en modo activo, reposo y reposo profundo, lo cual es útil para que los dispositivos diseñados para alimentarse por batería funcionen durante mucho más tiempo.
-
-En cuanto a memoria, no dispone de una memoria flash para almacenar programas, la cual debe ser proporcionada por el módulo que implemente este chip y puede tener un tamaño máximo de 16 [MiB](#MiB). Integra una [RAM](#RAM) para instrucciones de 32 [KiB](#KiB), una caché de instrucciones 32 [KiB](#KiB), 80 [KiB](#KiB) para almacenar datos del usuario y 16 [KiB](#KiB) para datos del sistema de [ETS](#ETS).
-
-Su bajo voltaje operativo oscila entre 2,5 y 3,6 [V](#V), con una corriente de operación alrededor de los 80 [mA](#mA). Cuenta con la capacidad de funcionar en entornos industriales gracias a su amplio rango de temperatura de operación, que va de -40 a 125 [ºC](#ºC).
+El ESP8266 es un [SoC](#SoC) o sistema en un chip diseñado para dispositivos móviles, electrónica portátil y aplicaciones del [IoT](#IoT). Lanzado en agosto de 2014, integra un procesador mononúcleo Tensilica L106 con una arquitectura *Reduced Instruction Set Computer* ([RISC](#RISC)) de 32 bits de bajo consumo y una velocidad de reloj de entre 80 y 160 [MHz](#MHz). Presenta una arquitectura para el ahorro de energía, permitiendo establecer el chip en modo activo, reposo y reposo profundo, útil para conservar la batería en dispositivos que hagan uso de esta. En cuanto a memoria, no dispone de una memoria flash para almacenar programas, la cual debe ser proporcionada por el módulo que implemente este chip y puede tener un tamaño máximo de 16 [MiB](#MiB). Integra una [RAM](#RAM) para instrucciones de 32 [KiB](#KiB), una caché de instrucciones 32 [KiB](#KiB), 80 [KiB](#KiB) para almacenar datos del usuario y 16 [KiB](#KiB) para datos del sistema de [ETS](#ETS). Su bajo voltaje operativo oscila entre 2,5 y 3,6 [V](#V), con una corriente de operación alrededor de los 80 [mA](#mA). Cuenta con la capacidad de funcionar en entornos industriales gracias a su amplio rango de temperatura de operación, que va de -40 a 125 [ºC](#ºC) @ESP8266_Espressif @ESP8266_Datasheet @ProgFacil_ESP8266 @ESP8266_Llamas @ESP8266_Wiki.
-Admite distintos tipos de protocolos de comunicación, como [IP](#IP)v4, [TCP](#TCP), [UDP](#UDP) y [HTTP](#HTTP). Es un dispositivo certificado para funcionar por Wi-Fi y compatible con los protocolos 802.11 b/g/n en una frecuencia de 2,4 [GHz](#GHz). Tiene la capacidad de actuar como cliente en redes protegidas por claves [WEP](#WEP), [WPA](#WPA) y [WPA](#WPA)2, además de poder actuar como punto de acceso inalámbrico.
+Admite distintos tipos de protocolos de comunicación, como [IP](#IP)v4, [TCP](#TCP), [UDP](#UDP) y [HTTP](#HTTP). Es un dispositivo certificado para funcionar por Wi-Fi y compatible con los protocolos 802.11 b/g/n en una frecuencia de 2,4 [GHz](#GHz). Tiene la capacidad de actuar como cliente en redes protegidas por claves [WEP](#WEP), [WPA](#WPA) y [WPA](#WPA)2, además de poder actuar como punto de acceso inalámbrico. También integra en sus dimensiones compactas 16 pines [GPIO](#GPIO) para conectar dispositivos de entrada y salida, un conversor analógico de 10 bits, conmutadores de antena, un amplificador de potencia y de recepción, un balun de radiofrecuencia y módulos de gestión de potencia @ESP8266_Datasheet @ProgFacil_ESP8266 @ESP8266_Llamas @ESP8266_Wiki.
-También integra en sus dimensiones compactas 16 pines [GPIO](#GPIO) para conectar dispositivos de entrada y salida, un conversor analógico de 10 bits, conmutadores de antena, un amplificador de potencia y de recepción, un balun de radiofrecuencia y módulos de gestión de potencia.
-
-Este sistema admite varios [IDE](#IDE)s y lenguajes de programación, como C y C++, utilizando Arduino [IDE](#IDE)[^espressif:arduinoIde] o PlatformIO; MicroPython[^espressif:micropython], utilizando Mu Editor, Thonny [IDE](#IDE) o Pymakr; y Lua[^espressif:lua], utilizando LuaLoader.
+Este sistema admite varios [IDE](#IDE)s y lenguajes de programación, como C y C++, utilizando Arduino [IDE](#IDE)[^espressif:arduinoIde] o PlatformIO; MicroPython[^espressif:micropython], utilizando Mu Editor, Thonny [IDE](#IDE) o Pymakr @ESP_Micropython; y Lua[^espressif:lua], utilizando LuaLoader @ESP_Lua @ESP8266_Llamas.
[^espressif:arduinoIde]:
[^espressif:micropython]:
[^espressif:lua]:
-
-{
- https://www.espressif.com/en/products/socs/esp8266
- https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf
- https://en.wikipedia.org/wiki/ESP8266
- https://www.luisllamas.es/esp8266/
- https://programarfacil.com/podcast/esp8266-wifi-coste-arduino
- https://randomnerdtutorials.com/micropython-ides-esp32-esp8266/
- https://www.danielmartingonzalez.com/es/usando-lua-en-esp8266-nodemcu-con-lualoader-y-esplorer/
-}
-
### ESP32
-El ESP32 es el [SoC](#SoC) sucesor del ESP8266. Igual de apto para electrónica portátil e [IoT](#IoT), comparte muchas características y añade mejoras que lo convierten en un sistema muy superior.
-
-Integra un procesador Tensilica Xtensa LX6 de doble núcleo (o de uno, dependiendo de la variante utilizada) cuya frecuencia de reloj oscila entre los 160 y 240 [MHz](#MHz), que trabaja en conjunto con un coprocesador de ultra baja energía.
+El ESP32 es el [SoC](#SoC) sucesor del ESP8266. Igual de apto para electrónica portátil e [IoT](#IoT), comparte muchas características y añade mejoras que lo convierten en un sistema muy superior. Integra un procesador Tensilica Xtensa LX6 de doble núcleo (o de uno, dependiendo de la variante utilizada) cuya frecuencia de reloj oscila entre los 160 y 240 [MHz](#MHz), que trabaja en conjunto con un coprocesador de ultra baja energía. La memoria experimenta un significativo aumento respecto a su predecesor, con un total de 520 [KiB](#KiB) de SRAM, 448 [KiB](#KiB) de memoria de solo lectura, 32 [KiB](#KiB) de caché y hasta 4 [MiB](#MiB) de memoria de almacenamiento (dependiendo del modelo) @ESP32_Datasheet @ESP32_Llamas @ESP32_Wiki.
-La memoria experimenta un significativo aumento respecto a su predecesor, con un total de 520 [KiB](#KiB) de SRAM, 448 [KiB](#KiB) de memoria de solo lectura, 32 [KiB](#KiB) de caché y hasta 4 [MiB](#MiB) de memoria de almacenamiento (dependiendo del modelo).
+Este chip, lanzado en septiembre de 2016, añade en comparación con el ESP8266 una mejora de potencia, soporte de Bluetooth 4.2 y [BLE](#BLE), sensor de temperatura, sensor hall, sensor táctil, reloj de tiempo real, más pines [GPIO](#GPIO) (hasta 34) y varios modos de energía. Además, incorpora arranque seguro, encriptado de la flash y soporte de aceleración por hardware para los algoritmos y protocolos de cifrado y encriptación [AES](#AES), [SHA](#SHA)-2, [RSA](#RSA), [ECC](#ECC) y el generador de números aleatorios @ESP32_Datasheet @ESP32_Llamas @ESP32_Wiki. El ESP32 tiene la posibilidad de funcionar como un sistema autónomo o como parte de un puente e interconexiones, y es capaz de interactuar con otros sistemas para proveer funcionalidad Wi-Fi y Bluetooth a través de sus interfaces @ESP32_Espressif.
-Este chip, lanzado en septiembre de 2016, añade en comparación con el ESP8266 una mejora de potencia, soporte de Bluetooth 4.2 y [BLE](#BLE), sensor de temperatura, sensor hall, sensor táctil, reloj de tiempo real, más pines [GPIO](#GPIO) (hasta 34) y varios modos de energía.
-
-Además, incorpora arranque seguro, encriptado de la flash y soporte de aceleración por hardware para los algoritmos y protocolos de cifrado y encriptación [AES](#AES), [SHA](#SHA)-2, [RSA](#RSA), [ECC](#ECC) y el generador de números aleatorios.
-
-El ESP32 tiene la posibilidad de funcionar como un sistema autónomo o como parte de un puente e interconexiones, y tiene la capacidad de interactuar con otros sistemas para proveer funcionalidad Wi-Fi y Bluetooth a través de sus interfaces.
-
-Desde el lanzamiento del ESP32 original, han ido apareciendo variantes con distintas capacidades y procesadores, pero gran parte del código del ESP32 es compatible. Estas variantes son:
-
-- ESP32-S2: enfocado en el consumo, integra un procesador mononúcleo LX7, reduce la memoria disponible y no tiene soporte de Bluetooth.
-- ESP32-S3: utiliza el mismo procesador que el anterior, contiene más memoria y da soporte a Bluetooth 5 y [BLE](#BLE), enfocado al soporte de inteligencia artificial.
-- ESP32-C3: contiene un procesador [RISC](#RISC)-V mononúcleo y admite Bluetooth 5 y [BLE](#BLE), enfocado en la seguridad.
-- ESP32-C6: centrado en la conectividad, la principal diferencia con el anterior es el soporte de Bluetooth 5.3, Wi-Fi 6 (802.11ax) y conectividad de radio (802.15.4) compatible con los protocolos Thread, Zigbee y Matter.
-- ESP32-C2: incorpora un procesador [RISC](#RISC)-V mononúcleo y admite Bluetooth 5 y [BLE](#BLE). Es un chip de pequeñas dimensiones que mantiene una conectividad robusta y estándares de seguridad.
-- ESP32-C5: es la versión más reciente con mayor velocidad de reloj y capacidad de memoria, y es el primero que soporta Wi-Fi 6 a 5 [GHz](#GHz). Su enfoque en la conectividad también proviene de la capacidad de conexión con Bluetooth 5.2.
-
-{
- https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
- https://www.espressif.com/en/products/socs/esp32
- https://en.wikipedia.org/wiki/ESP32
- https://www.luisllamas.es/esp32/
- https://www.espboards.dev/blog/esp32-soc-options/
-}
+Desde el lanzamiento del ESP32 original, han ido apareciendo variantes con distintas capacidades y procesadores, como el S3 con Bluetooth 5, el C6 con Thread, Zigbee y Matter, y el más reciente C5 con Wi-Fi 6, pero gran parte del código del ESP32 es compatible entre estas @ESP32Versions @ESP32_Wiki.
## ESP-NOW
El [IoT](#IoT) se forma a partir de la conectividad entre objetos, donde surge la necesidad de un protocolo que equilibre las necesidades de latencia, uso de energía, capacidad de transmisión, confiabilidad y seguridad en la transmisión de datos. Son factores determinantes en el futuro desarrollo de esta tecnología, y aparecen como candidatos un gran número de tecnologías y protocolos, destinados tanto para la comunicación en área local, como Wi-Fi, para áreas amplias, como LoRa y LoRaWAN, y para transmisión a corta distancia, como [RFID](#RFID). Recientemente, al mencionado grupo se ha añadido ESP-NOW, el cual, pese a sus limitaciones, tiene características notables y es adecuado para [IoT](#IoT).
-ESP-NOW es un protocolo de comunicación inalámbrica diseñado por Espressif para su uso entre sus dispositivos, como los ESP8266 y ESP32. Con el objetivo de sustituir a Wi-Fi y a otras tecnologías, ESP-NOW es capaz de realizar transmisiones de información y control rápidas, estables y con un bajo consumo de recursos de [CPU](#CPU) y memoria flash entre dispositivos inteligentes, sin necesidad de un enrutador.
-
-Se caracteriza por la rapidez de la transmisión, lograda evitando la necesidad de establecer una conexión previa entre dispositivos. Permite a su vez poner a disposición los dispositivos para transmitir datos y recibir órdenes instantáneamente tras el encendido. Además, este protocolo está basado en la capa de enlace de datos y es capaz de omitir las capas de red, transporte, sesión, presentación y aplicación del modelo [OSI](#OSI), reduciendo el consumo de energía (mejorando la autonomía en dispositivos con batería) y el retardo en la recepción y en el procesamiento de mensajes debido a la nula necesidad de cabeceras de paquete o desempaquetadores de cada capa. En redes congestionadas, es una característica beneficiosa, ya que brinda la capacidad de respuestas rápidas que reducen el retraso causado por la pérdida de paquetes. En el modelo utilizado en ESP-NOW en comparación con el modelo [OSI](#OSI) estándar de la Figura \ref{espnow:modeloOsiEspNow} se puede observar la ausencia de las 5 capas mencionadas anteriormente.
-
-{width=88%}
-
-Pese al objetivo de ESP-NOW de reemplazar Wi-Fi, en los dispositivos de Espressif es capaz de coexistir simultáneamente junto a Wi-Fi y Bluetooth. Esto es útil para utilizar un dispositivo como gateway y exportar los datos intercambiados entre ESP-NOW hacia otras redes.
-
-Tiene la capacidad de transmitir datos de manera máquina a máquina o broadcast, y para establecer la comunicación solo se requiere la dirección [MAC](#MAC) del dispositivo de destino y establecer un canal de transmisión. No obstante, dispone de una cantidad limitada de dispositivos con los que se puede emparejar. En general, el número de dispotivos emparejados no puede exceder de 20, y la cantidad de estos con los que se puede establecer una comunicación cifrada es configurable. Por defecto, este valor es 7, y admite un valor máximo de 17. Esta limitación puede ser un inconveniente en caso de necesitar una gran cantidad de dispositivos interconectados, pero una solución sería formar jerarquías de dispositivos.
+ESP-NOW es un protocolo de comunicación inalámbrica diseñado por Espressif para su uso entre sus dispositivos, como los ESP8266 y ESP32. Con el objetivo de sustituir a Wi-Fi y a otras tecnologías, es capaz de realizar transmisiones de información y control rápidas, estables y con un bajo consumo de recursos de [CPU](#CPU) y memoria flash entre dispositivos inteligentes, sin necesidad de un enrutador @ESPNOW_Espressif @ESPNOW_FAQ.
-Permite establecer funciones de callback que serán llamadas instantáneamente tras el envío y la recepción de datos para poder gestionarlos adecuadamente. Cabe remarcar que el protocolo no garantiza que se reciban los datos correctamente, pero existe la posibilidad de establecer [ACK](#ACK)s para confirmar la correcta recepción y procesamiento de los datos, además de números de secuencia para afrontar la duplicidad.
+Se caracteriza por la rapidez de la transmisión, lograda evitando la necesidad de establecer una conexión previa entre dispositivos. Permite a su vez poner a disposición los dispositivos para transmitir datos y recibir órdenes instantáneamente tras el encendido. Además, este protocolo está basado en la capa de enlace de datos y es capaz de omitir las capas de red, transporte, sesión, presentación y aplicación del modelo [OSI](#OSI), reduciendo el consumo de energía (mejorando la autonomía en dispositivos con batería) y el retardo en la recepción y en el procesamiento de mensajes debido a la nula necesidad de cabeceras de paquete o desempaquetadores de cada capa. En redes congestionadas, es una característica beneficiosa, ya que brinda la capacidad de respuestas rápidas que reducen el retraso causado por la pérdida de paquetes. En el modelo utilizado en ESP-NOW en comparación con el modelo [OSI](#OSI) estándar de la Figura \ref{espnow:modeloOsiEspNow} se puede observar la ausencia de las 5 capas mencionadas anteriormente @ESPNOW_Espressif @ESPNOW_Emariete.
-ESP-NOW utiliza tramas de acción específicas del proveedor para encapsular y transmitir datos de una longitud máxima de 250 bytes, con un alcance de transmisión de entre 100 y 500 metros, dependiendo de las condiciones atmosféricas, y con una tasa de velocidad de bits de 1 megabit por segundo. Esto es beneficioso para la comunicación a larga distancia debido a su gran alcance en dispositivos al aire libre o incluso separados por paredes o pisos. Sin embargo, su uso puede estar limitado por la pequeña carga útil que puede transmitir, por lo que en otros casos podría ser mejor utilizar otras tecnologías como Wi-Fi. ESP-NOW utiliza tramas de un tamaño entre 43 y 293 bytes, cuyo formato, mostrado en la Figura \ref{espnow:frame}, está compuesto por los siguientes campos:
+{width=92%}
-{width=82%}
+Pese al objetivo de ESP-NOW de reemplazar Wi-Fi, en los dispositivos de Espressif es capaz de coexistir simultáneamente junto a Wi-Fi y Bluetooth. Esto es útil para utilizar un dispositivo como gateway y exportar los datos intercambiados entre ESP-NOW hacia otras redes @ESPNOW_Espressif @ESPNOW_FAQ.
-- Cabecera [MAC](#MAC), distinta de una cabecera [MAC](#MAC) común debido a su funcionamiento sin conexión.
-- Código de categoría, establecido a 127 para indicar la categoría específica del proveedor.
-- Identificador de la organización único, que son los 3 primeros bytes de la dirección [MAC](#MAC) aplicada por Espressif.
-- Valores aleatorios, utilizados para prevenir ataques de retransmisión.
-- Contenido específico del proveedor, que ocupa entre 7 y 257 bytes y contiene los siguientes campos específicos del proveedor:
- - ID del elemento, establecido a 221 para indicar que se trata del elemento específico del proveedor.
- - Longitud total del resto de campos.
- - Identificador de la organización, igual que el mencionado antes, los 3 primeros bytes de la dirección [MAC](#MAC).
- - Tipo, con valor 4 para indicar ESP-NOW.
- - Versión de ESP-NOW.
- - Cuerpo, que contiene los datos de ESP-NOW y puede ocupar entre 0 y 250 bytes.
-- Frame Check Sequence, utilizado para verificar la integridad de la información recibida.
+Tiene la capacidad de transmitir datos de manera máquina a máquina o broadcast, y para establecer la comunicación solo se requiere la dirección [MAC](#MAC) del dispositivo de destino y establecer un canal de transmisión. No obstante, dispone de una cantidad limitada de dispositivos con los que se puede emparejar. En general, el número de dispotivos emparejados no puede exceder de 20, y la cantidad de estos con los que se puede establecer una comunicación cifrada es configurable. Por defecto, este valor es 7, y admite un valor máximo de 17. Esta limitación puede ser un inconveniente en caso de necesitar una gran cantidad de dispositivos interconectados, pero una solución sería formar jerarquías de dispositivos @ESPNOW_FAQ @ESPNOW_Emariete.
-Existe la posibilidad de asegurar la transmisión de datos a través de ESP-NOW utilizando algoritmos de encriptación [ECDH](#ECDH) y [AES](#AES) y el método CBC-MAC Protocol (CCMP) que protegen las tramas de acción. Esto está limitado a comunicaciónes entre pares, no se admite el cifrado de tramas utilizadas para la multidifusión.
+ESP-NOW utiliza tramas de entre 43 y 293 bytes en las que se encapsulan y transmiten datos de una longitud máxima de 250 bytes, con un alcance de transmisión de entre 100 y 500 metros según las condiciones atmosféricas, y con una tasa de velocidad de bits de 1 megabit por segundo. Esto es beneficioso para la comunicación a larga distancia debido a su gran alcance en dispositivos al aire libre o incluso separados por paredes o pisos. Sin embargo, su uso puede estar limitado por la pequeña carga útil que puede transmitir, por lo que en otros casos podría ser mejor utilizar otras tecnologías como Wi-Fi @ESPNOW_FAQ @ESPNOW_Docs @ESPNOW_Emariete.
-En cuanto a la gestión de dispositivos, puede utilizarse como un protocolo que ayude al aprovisionamiento de datos y configuraciones a dispositivos, depurarlos y actualizar su firmware.
+Este protocolo permite establecer funciones de callback que serán llamadas instantáneamente tras el envío y la recepción de datos para poder gestionarlos adecuadamente. Cabe remarcar que el protocolo no garantiza que se reciban los datos correctamente, pero es posible establecer [ACK](#ACK)s para confirmar la correcta recepción y procesamiento de los datos, además de números de secuencia para afrontar la duplicidad. También existe la posibilidad de asegurar la transmisión de datos utilizando algoritmos de encriptación [ECDH](#ECDH) y [AES](#AES) y el método CBC-MAC Protocol (CCMP) que protegen las tramas de acción. Esto está limitado a comunicaciónes entre pares, no se admite el cifrado de tramas utilizadas para la multidifusión @ESPNOW_Docs @ESPNOW_FAQ.
-ESP-NOW no necesita ningún procedimiento especial aparte de la implementación para poder utilizarse con fines comerciales. En la actualidad, se encuentra ampliamente utilizado en electrodomésticos inteligentes, iluminación inteligente, control remoto, sensores y otros.
+En cuanto a la gestión de dispositivos, puede utilizarse como un protocolo que ayude al aprovisionamiento de datos y configuraciones a dispositivos, depurarlos y actualizar su firmware @ESPNOW_Espressif @ESPNOW_Emariete.
-{
- (imagen, fuente): https://www.espressif.com/sites/all/themes/espressif/images/esp-now/model-en-mobile.png
- https://www.espressif.com/en/solutions/low-power-solutions/esp-now
- https://docs.espressif.com/projects/espressif-esp-faq/en/latest/application-solution/esp-now.html
- https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html
- https://emariete.com/esp8266-esp32-espnow/
-}
+ESP-NOW no necesita ningún procedimiento especial aparte de la implementación para poder utilizarse con fines comerciales. En la actualidad, se encuentra ampliamente utilizado en electrodomésticos inteligentes, iluminación inteligente, control remoto, sensores y otros @ESPNOW_FAQ @ESPNOW_Emariete.
### Tecnologías alternativas más comunes
#### Wi-Fi
-"Wi-Fi" es el nombre que otorga la Wi-Fi Alliance a esta tecnología de red inalámbrica basado en los estándares [IEEE](#IEEE) 802.11. Esta tecnología es ampliamente utilizado para enlazar dispositivos en redes [LAN](#LAN) y proveer de acceso a Internet utilizando ondas de radio de 2,4 o 5 [GHz](#GHz) (dependiendo de la versión) para transmitir la información, cumpliendo con la misión de ser una alternativa al envío de datos a través de cables.
+"Wi-Fi" es el nombre que otorga la Wi-Fi Alliance a esta tecnología de red inalámbrica basado en los estándares [IEEE](#IEEE) 802.11. Esta tecnología es ampliamente utilizada para enlazar dispositivos en redes [LAN](#LAN) y proveer de acceso a Internet utilizando ondas de radio de 2,4 o 5 [GHz](#GHz) (dependiendo de la versión) para transmitir la información, cumpliendo con la misión de ser una alternativa al envío de datos a través de cables @Wifi_WikiEn @Wifi_AZone @Wifi_Proofpoint @Wifi_WikiEs.
-En una red Wi-Fi se pueden encontrar una variedad de dispositivos cliente, que son los que aprovechan las características de la red, y dispositivos que distribuyen la red. Estos últimos consisten en routers o enrutadores, que brindan la conexión a Internet a los dispositivos y enrutan los mensajes enviados a través de la red; puntos de acceso, que transmiten la señal inalámbrica y es donde se conectan los dispositivos introduciendo las credenciales de la red; y repetidores, utilizados para extender el área de cobertura de una red. Entre los dispositivos, tanto clientes como los distribuidores de red, se utilizan adaptadores de red inalámbrica, que convierten los datos en una señal de radio y viceversa.
+En una red Wi-Fi se pueden encontrar una variedad de dispositivos cliente, que son los que aprovechan las características de la red, y dispositivos que distribuyen la red. Estos últimos consisten en routers o enrutadores, que brindan la conexión a Internet a los dispositivos y enrutan los mensajes enviados a través de la red; puntos de acceso, que transmiten la señal inalámbrica y es donde se conectan los dispositivos introduciendo las credenciales de la red; y repetidores, utilizados para extender el área de cobertura de una red. Entre los dispositivos, tanto clientes como los distribuidores de red, se utilizan adaptadores de red inalámbrica, que convierten los datos en una señal de radio y viceversa @Wifi_AZone @Wifi_WikiEs.
-Es una de las tecnologías más utilizadas a nivel mundial, siendo que la mayoría de hogares y establecimientos disponen de una red Wi-Fi. Esta popularidad es beneficiosa para el [IoT](#IoT), ya que ofrece una capa de compatibilidad con una amplia gama de dispositivos sin necesidad de antenas, adaptadores de red ni otro tipo de hardware adicional. Además, Wi-Fi no es una tecnología nueva, tiene un sólido legado de interoperabilidad, y permite enviar información entre dispositivos con baja latencia.
+Es una de las tecnologías más utilizadas a nivel mundial, siendo que la mayoría de hogares y establecimientos disponen de una red Wi-Fi. Esta popularidad es beneficiosa para el [IoT](#IoT), ya que ofrece una capa de compatibilidad con una amplia gama de dispositivos sin necesidad de antenas, adaptadores de red ni otro tipo de hardware adicional. Además, Wi-Fi no es una tecnología nueva, tiene un sólido legado de interoperabilidad, y permite enviar información entre dispositivos con baja latencia @Wifi_Official @Wifi_AZone @Wifi_WikiEn.
-Entre sus características adicionales se encuentra la topología flexible, que permite conectar los dispositivos de distintas maneras; la seguridad, ya que es posible tener redes protegidas con contraseñas cifradas mediante distintos protocolos ([WEP](#WEP), [WPA](#WPA) y [WPA](#WPA)2), el bajo coste de instalación, que en comparación con la instalación de una red cableada, resulta más económico; y la capacidad de llegar a donde los cables no pueden llegar.
+Entre sus características adicionales se encuentra la topología flexible, que permite conectar los dispositivos de distintas maneras; la seguridad, ya que es posible tener redes protegidas con contraseñas cifradas mediante distintos protocolos ([WEP](#WEP), [WPA](#WPA) y [WPA](#WPA)2), el bajo coste de instalación, que en comparación con la instalación de una red cableada, resulta más económico; y la capacidad de llegar a donde los cables no pueden llegar @Wifi_Official @Wifi_AZone.
-Existen distintos estándares de Wi-Fi que definen cómo actúa la red, y que cambian cada pocos años trayendo mejoras en el alcance, la velocidad y la conectividad. Por lo general, los dispositivos certificados para un estándar son intercomunicables con los certificados para otro estándar Wi-Fi siempre que compartan la misma banda de frecuencia, por lo que no es una preocupación tener todos los dispositivos con la versión más reciente. Los estándares Wi-Fi se muestran en la Tabla \ref{espnow:estandaresWiFi}.
+Existen distintos estándares de Wi-Fi que definen cómo actúa la red, y que cada pocos años mejoran el alcance, la velocidad y la conectividad. Por lo general, los dispositivos certificados para un estándar son intercomunicables con los certificados para otro estándar Wi-Fi siempre que compartan la misma banda de frecuencia, por lo que no es una preocupación tener todos los dispositivos con la versión más reciente @Wifi_Official @Wifi_AZone @Wifi_WikiEn. Los estándares Wi-Fi se muestran en la Tabla \ref{espnow:estandaresWiFi}.
| Nombre comercial | Estándar [IEEE](#IEEE) | Año | Frecuencia ([GHz](#GHz)) | Velocidad máxima | Rango (metros) |
|------------------|------------------------|------|--------------------------|-------------------|------------------|
@@ -518,48 +283,20 @@ Existen distintos estándares de Wi-Fi que definen cómo actúa la red, y que ca
| Wi-Fi 6 | 802.11ax | 2019 | 2,4, 5 y 6 | 9,6 [Gbps](#Gbps) | 240 |
| Wi-Fi 7 | 802.11be | 2024 | 2,4, 5 y 6 | 46 [Gbps](#Gbps) | (Por determinar) |
-: Lista de estándares Wi-Fi *TODO: REFERENCIAR*\label{espnow:estandaresWiFi}
+: Lista de estándares Wi-Fi (Fuentes: @WifiComparison_Intel @WifiComparison_Monolitic @WifiComparison_Makeuseof @WifiComparison_Netspot @WifiComparison_Xataka @WifiComparison_Geckoandfly @WifiComparison_Business)\label{espnow:estandaresWiFi}
La popularidad de Wi-Fi abarca una gran variedad de dispositivos soportados, como teléfonos inteligentes, ordenadores, televisores inteligentes, impresoras e incluso placas de desarrollo como ESP8266 y ESP32.
-{
- https://en.wikipedia.org/wiki/Wi-Fi
- https://es.wikipedia.org/wiki/Wifi
- https://emariete.com/esp8266-esp32-espnow/
- https://www.wi-fi.org/discover-wi-fi/internet-things
- https://www.adslzone.net/reportajes/tecnologia/que-es-wifi-como-funciona/
- https://www.proofpoint.com/es/threat-reference/wifi#:~:text=Wifi%2C%20que%20es%20una%20contracci%C3%B3n,red%20mediante%20frecuencias%20de%20radio.
-
- Fuentes de tabla
- https://www.intel.la/content/www/xl/es/support/articles/000005725/wireless/legacy-intel-wireless-products.html
- https://www.monolitic.com/cual-es-la-mejor-tecnologia-wifi-para-desarrollos-iot/
- https://www.makeuseof.com/tag/understanding-common-wifi-standards-technology-explained/
- https://www.netspotapp.com/es/blog/wifi-standards/
- https://www.xataka.com/nuevo/nuevo-wifi-7-informacion
- https://www.geckoandfly.com/10041/wireless-wifi-802-11-abgn-router-range-and-distance-comparison/
- https://www.business.com/articles/what-is-802-11-ax-wi-fi/
-
-}
-
#### Bluetooth
-Bluetooth es un estándar de tecnología que facilita el intercambio de datos entre dispositivos a través de distancias cortas, con un máximo de 10 metros.
-
-Desde su introducción en 1998, ha pasado por múltiples revisiones, siendo las más relevantes las de la última década:
+Bluetooth es un estándar de tecnología que facilita el intercambio de datos entre dispositivos a través de distancias cortas @Bluetooth_Official @Bluetooth_Wiki. Desde su introducción en 1998, ha pasado por múltiples revisiones, siendo las más relevantes las de la última década @Bluetooth_Wiki @Bluetooth_Xataka:
-- Versión 4.0 hasta 4.2: aumentó la velocidad de transferencia de datos a 24 Mbps y el alcance hasta 100 metros, y añadió soporte al protocolo IPv6. Además, introdujo BLE o Bluetooth Low Energy, una nueva variante de esta tecnología.
-- Versión 5.0 hasta 5.2: aumentó la velocidad de transferencia de datos a 50 Mbps y el alcance hasta 200 metros, y realizó mejoras en la transmisión de audio y en el consumo de energía.
+- Versión 4.0 hasta 4.2: velocidad de transferencia de datos de 24 Mbps y alcance de hasta 100 metros, añadiendo soporte para el protocolo IPv6. Además, introdujo BLE o Bluetooth Low Energy, una nueva variante de esta tecnología.
+- Versión 5.0 hasta 5.2: velocidad de transferencia de datos a 50 Mbps, alcance de hasta 200 metros, y realizó mejoras en la transmisión de audio y en el consumo de energía.
-Bluetooth Low Energy fue diseñado para operaciones de bajo consumo de energía, capaz de soportar diferentes tipologías de comunicación (punto a punto, difusión y malla), a diferencia del clásico que solo admite punto a punto. Mientras que el Bluetooth clásico se usa para transferir datos y sonido, BLE es capaz de utilizarse para analizar con alta precisión la presencia, distancia y dirección del dispositivo.
+Bluetooth Low Energy fue diseñado para operaciones de bajo consumo de energía, capaz de soportar diferentes tipologías de comunicación (punto a punto, difusión y malla), a diferencia del clásico que solo admite punto a punto. Mientras que el Bluetooth clásico se usa para transferir datos y sonido, BLE es capaz de utilizarse para analizar con alta precisión la presencia, distancia y dirección del dispositivo @Bluetooth_Official @Bluetooth_Wiki.
-Bluetooth utiliza ondas de radio UHF en las bandas ISM sin licencia de 2,4 GHz, y se utiliza como alternativa a las conexiones por cable para intercambiar ficheros y conectar transmisores de audio. Gracias a su bajo consumo de energía, seguridad, capacidad contra interferecias, compatibilidad con varios sistemas operativos y facilidad de implementación, esta tecnología se convierte en una buena opción para la implementación del [IoT](#IoT). Además, tiene la capacidad de agregar capas de cifrado, autenticación y verificación, y de construir redes PAN entre dispositivos al interconectar varios entre sí. Es común encontrarlo en pulseras y relojes inteligentes, teléfonos inteligentes, ordenadores, reproductores de música, altavoces, auriculares, y placas de desarrollo como ESP32.
-
-{
- https://www.bluetooth.com/learn-about-bluetooth/tech-overview/
- https://en.wikipedia.org/wiki/Bluetooth
- https://www.xatakahome.com/curiosidades/bluetooth-su-evolucion-estas-diferencias-distintas-versiones
- https://www.mokosmart.com/es/what-is-bluetooth-iot-and-why-choose-it/
-}
+Bluetooth utiliza ondas de radio UHF en las bandas ISM sin licencia de 2,4 GHz, y se utiliza como alternativa a las conexiones por cable para intercambiar ficheros y conectar transmisores de audio. Gracias a su bajo consumo de energía, seguridad, capacidad contra interferecias, compatibilidad con varios sistemas operativos y facilidad de implementación, esta tecnología se convierte en una buena opción para la implementación del [IoT](#IoT). Además, tiene la capacidad de agregar capas de cifrado, autenticación y verificación, y de construir redes PAN entre dispositivos al interconectar varios entre sí @Bluetooth_Official @Bluetooth_Wiki @Bluetooth_Xataka @Bluetooth_Mokosmart. Es común encontrarlo en pulseras y relojes inteligentes, teléfonos inteligentes, ordenadores, reproductores de música, altavoces, auriculares, y placas de desarrollo como ESP32.
#### Más tecnologías y protocolos [IoT](#IoT)
@@ -573,9 +310,9 @@ En el ámbito del [IoT](#IoT), existen otras tecnologías y protocolos populares
#### Comparaciones entre Wi-Fi, Bluetooth y ESP-NOW
-Es de alta relevancia comparar estas tecnologías y ESP-NOW entre sí, ya que son las más populares en el ámbito del [IoT](#IoT) y son compatibles con las placas ESP32 que incorporan el reciente e innovador ESP-NOW. En particular, ESP32 es compatible con Bluetooth 4.2 y con Wi-Fi b, g y n de 2,4 GHz, por lo que a lo largo de este apartado se comparan estas versiones. Estos tres protocolos son similares en varios aspectos, ya que utilizan ondas de radio para transmitir datos de forma inalámbrica a una amplia gama de dispositivos, de manera rápida y fiable. Esto puede resultar en una decisión compleja para elegir entre los tres, aunque hay escenarios en los que no es necesario elegir, ya que en un ESP32 pueden trabajar en conjunto.
+Es de alta relevancia comparar estas tecnologías y ESP-NOW entre sí, ya que son las más populares en el ámbito del [IoT](#IoT) y vienen incorporadas en las placas ESP32. En particular, ESP32 es compatible con Bluetooth 4.2 y con Wi-Fi b, g y n de 2,4 [GHz](#GHz), por lo que a lo largo de este apartado se comparan estas versiones. Estos tres protocolos son similares en varios aspectos, ya que utilizan ondas de radio para transmitir datos de forma inalámbrica a una amplia gama de dispositivos, de manera rápida y fiable. Esto puede resultar en una decisión compleja para elegir entre los tres, aunque hay escenarios en los que no es necesario elegir, ya que en un ESP32 pueden trabajar en conjunto.
-De manera más resumida, estas son las características teóricas que ofrecen los protocolos:
+De manera más resumida y a partir de lo mencionado en anteriores subsecciones, estas son las características teóricas que ofrecen los protocolos:
1. *ESP-NOW*:
- **Alcance**: 220 metros.
@@ -586,68 +323,22 @@ De manera más resumida, estas son las características teóricas que ofrecen lo
2. *Wi-Fi b/g/n (2,4 [GHz](#GHz))*:
- **Alcance**: 250 metros.
- **Cantidad de dispositivos conectables**: depende de la configuración de la red y la asignación de direcciones [IP](#IP).
- - **Unidad de Transmisión Máxima (MTU)**: 1460 bytes, configurado en la librería de red de ESP32.
+ - **Unidad de Transmisión Máxima (MTU)**: 1460 bytes, configurado en la librería de red de ESP32 @WifiESPMTU.
- **Velocidad de transmisión**: 54 [Mbps](#Mbps).
- **Uso**: conexión a internet, acceso a dispositivos e [IoT](#IoT).
3. *Bluetooth 4.2*:
- - **Alcance**: 50 metros.
- - **Cantidad de dispositivos conectables**: 7 a cada nodo.
- - **Unidad de Transmisión Máxima (MTU)**: 251 bytes.
- - **Velocidad de transmisión**: 1 [Mbps](#Mbps).
+ - **Alcance**: 50-100 metros.
+ - **Cantidad de dispositivos conectables**: 7 a cada nodo @Bluetooth_Wiki.
+ - **Unidad de Transmisión Máxima (MTU)**: 251 bytes @BlePacket.
+ - **Velocidad de transmisión**: 1 [Mbps](#Mbps) @DiffBl542_Amar.
- **Uso**: audio, dispositivos personales e [IoT](#IoT).
-/*TODO: referenciar*/
-
-/*TODO: re-redactar*/
-Para detallar las comparaciones aplicando los protocolos en escenarios de uso real, se han tomado los datos de distintas pruebas realizadas y detalladas en una publicación de 2021 llevada a cabo por Dania Eridani, Adian Fatchur Rochim y Faiz Noerdiyan Cesara, miembros del Departamento de Ingeniería Informática de la Universidad de Diponegoro[^espnow:informaticaDiponegoro], en Indonesia.
-
-[^espnow:informaticaDiponegoro]:
-
-En esta publicación @ESPNOW_WiFi_BT_Comparison se realizaron pruebas de rango, velocidad, latencia, consumo y resistencia a barreras. Para ello, se utilizaron una placa ESP32 Development Board, una ESP32-CAM y una ESP32U, además de una antena externa de 2.4GHz conectada a la última placa mencionada y utilizada en ciertas pruebas.
+Para comparar estos protocolos, se han tomado los datos de distintas pruebas en escenarios de uso real realizadas y detalladas en una publicación de 2021, llevada a cabo por Dania Eridani, Adian Fatchur Rochim y Faiz Noerdiyan Cesara, miembros del Departamento de Ingeniería Informática de la Universidad de Diponegoro[^espnow:informaticaDiponegoro], en Indonesia. Esta publicación @ESPNOW_WiFi_BT_Comparison comparó el rango, la velocidad, la latencia, el consumo y la resistencia a barreras entre estas tecnologías y protocolos utilizando placas ESP32, obteniendo una serie de conclusiones, representadas en la Figura \ref{espnow:rendimientoComparacionProtocolos} y listadas de la siguiente manera:
{width=62%}
-Las conclusiones a las que se llega en esta publicación se pueden representar en la Figura \ref{espnow:rendimientoComparacionProtocolos}, que muestra que:
-
- La mayor ventaja de Bluetooth se encuentra en el consumo, ya que su rendimiento en el resto de los aspectos es muy deficiente.
- ESP-NOW es el mejor candidato cuando se requieren rangos elevados, una señal de comunicación resistente y mínima latencia en velocidades de datos muy pequeñas, pero su uso consume mucha energía relativamente.
- Wi-Fi es una tecnología muy equilibrada, y destaca por su velocidad.
-{
- https://es.wikipedia.org/wiki/Bluetooth_(especificaci%C3%B3n)
-https://docs.espressif.com/projects/esp-faq/en/latest/application-solution/esp-now.html
-https://www.amarinfotech.com/differences-comparisons-bluetooth-5-vs-4-2.html
-https://www.symmetryelectronics.com/blog/bluetooth-5-versus-bluetooth-4-2-what-s-the-difference/
-https://docs.arduino.cc/tutorials/nano-esp32/esp-now/
-https://github.com/espressif/arduino-esp32/blob/master/libraries/Network/src/NetworkUdp.cpp
-https://www.electronicdesign.com/technologies/communications/article/21801788/ble-v42-creating-faster-more-secure-power-efficient-designspart-1
-
- (documento)https://ieeexplore.ieee.org/document/9573246
- }
-
-
-## Ejemplo de modelo tradicional publicador-broker-suscriptor con MQTT y ESP32
-
-Tras introducir una serie de conceptos sobre el [IoT](#IoT), en este apartado se detallará el ejemplo visto en el apartado de [Internet de las Cosas](#internet-de-las-cosas), en la Figura \ref{iot:ejemploRiegoIoT}, que trata de un sistema de riego por aspersión.
-
-La primera parte consiste en identificar los dispositivos a utilizar. Los sensores y actuadores deben estar conectados a un dispositivo capaz de interactuar con ellos, como puede ser una placa ESP32.
-
-El broker utilizará una comunicación basada en colas para recibir todos los datos, integrando así una implementación del protocolo de mensajería [MQTT](#MQTT), como puede ser Mosquitto, que únicamente se puede llevar a cabo si el broker es un ordenador, como un ordenador portátil o un single board computer. Para este ejemplo, se puede suponer que el broker será una placa Raspberry Pi.
-
-Teniendo las placas ESP32 y la Raspberry Pi con Mosquitto, es necesario establecer la comunicación entre ambos. Una de las opciones a evaluar que sea compatible con ambas placas es Bluetooth, pero no es adecuado para una comunicación a larga distancia, ni para transmitir datos en tiempo casi real debido a su su baja velocidad, y tampoco es compatible con Mosquitto. Por lo tanto, se debe utilizar Wi-Fi para que las placas ESP32 publiquen los datos que generen y se suscriban a las órdenes y configuraciones mediante las colas adecuadas de Mosquitto. En este caso, se deberá desplegar una serie de puntos de acceso y routers para formar una red [LAN](#LAN) o [MAN](#MAN) que dote de Internet a todos los dispositivos.
-
-Finalmente, se configuran las placas ESP32 para que, con la ayuda de alguna librería de código, puedan interactuar con las colas de Mosquitto, y también el broker para poder interactuar con el servidor.
-
-La implementación de este sistema de riego presenta una serie de inconvenientes. En cuanto a inversión de dinero y tiempo, implica el despliegue de numerosos puntos de acceso y routers, así como su configuración y mantenimiento. Además, se debe asegurar una buena señal al aire libre, evaluar la zona donde se instalarán y proveer más baterías en los dispositivos que formen esta red.
-
-Todos los dispositivos están conectados en la misma red, por lo que un tráfico alto de datos o una interrupción en el servicio puede provocar una congestión de la red y un mal funcionamiento de la misma.
-
-Finalmente, en cuanto a seguridad, a todos los dispositivos de esta red se les otorga acceso a Internet, por lo que deben estar preparados para no sufrir un ciberataque que pueda invalidar el sistema por completo y todos los dispositivos conectados. Esto supone una mayor complejidad en el despliegue y mayor mantenimiento para evitar un riesgo significativo en la red.
-
-Aunque la implementación de este sistema de riego se puede realizar de distintas maneras, en este ejemplo se intenta demostrar la complejidad que supone un despliegue limitado por utilizar [MQTT](#MQTT) y ESP32 en la actualidad. Pese a que, de manera independiente, ambos tienen grandes ventajas, su combinación supone una complejidad difícil de evitar.
-
-/*TODO: añadir un nuevo esquema*/
-
-{
- https://www.prometec.net/esp32-mqtt/ (libreria de codigo)
-}
+[^espnow:informaticaDiponegoro]:
diff --git a/tfg_report/templateAPP/input/chapters/03_herramientas_metodologia.md b/tfg_report/templateAPP/input/chapters/03_herramientas_metodologia.md
index 97f9741..133766d 100644
--- a/tfg_report/templateAPP/input/chapters/03_herramientas_metodologia.md
+++ b/tfg_report/templateAPP/input/chapters/03_herramientas_metodologia.md
@@ -1,4 +1,4 @@
-# Herramientas y Metodología
+# Herramientas y metodología
## Herramientas
@@ -10,31 +10,34 @@ El núcleo de este [TFG](#TFG) se basa en la programación de una placa de desar
**Ordenador portátil**: es el componente principal para el desarrollo de este [TFG](#TFG), en el cual se han instalado las herramientas necesarias, se ha escrito el código, se ha accedido a herramientas y recursos en línea, y ha permitido subir el código a la placa. En este caso, el ordenador personal del alumno es un Lenovo Ideapad 3 15ALC6, cuyas características destacadas para este trabajo son:
-- Procesador AMD Ryzen 7 5700 U, de 64 bits y lanzado en enero de 2021, que permite ejecutar aplicaciones y servicios aprovechando sus 8 núcleos, su alta frecuencia de 1,8 [GHz](#GHz) hasta 4,3 [GHz](#GHz) y su bajo consumo @Ryzen7Specs.
-- 12 GB de [RAM](#RAM) DDR4, que almacenan la información temporal generada por los programas en ejecución. Su capacidad determina cuántas tareas simultáneas se pueden ejecutar y su velocidad determina la rapidez de ejecución de estas.
-- Almacenamiento interno SSD de 1 [TB](#TB), encargado de almacenar de manera persistente información como el sistema operativo, las herramientas instaladas y los ficheros de código utilizados en el proyecto.
-- 3 puertos USB, que permiten conectar distintos dispositivos simultáneamente al ordenador, como en este trabajo, las placas para subir el código y observar la salida por terminal durante la ejecución.
-- Lector de tarjetas SD, utilizado para acceder al contenido de la tarjeta SD que se conecta a una de las placas (detallado posteriormente).
-- Adaptador de red Bluetooth y Wi-Fi, para poder conectar el ordenador a Internet y acceder a los recursos necesarios para el desarrollo.
+- Procesador AMD Ryzen 7 5700 U, de 64 bits. Lanzado en enero de 2021, con 8 núcleos y una frecuencia de 1,8 [GHz](#GHz) hasta 4,3 [GHz](#GHz) @Ryzen7Specs.
+- 12 GB de [RAM](#RAM) DDR4.
+- Almacenamiento interno SSD de 1 [TB](#TB).
+- 3 puertos USB.
+- Lector de tarjetas SD.
+- Adaptador de red Bluetooth y Wi-Fi.
-**Dos placas ESP32 DEVKIT V1**: ambas fueron cedidas por la [UCLM](#UCLM) para el desarrollo de este [TFG](#TFG). Este tipo de placas contienen las mismas características que el SoC ESP32 mencionado en el apartado \ref{02_estado_arte.esp32} /*TODO: comprobar funcionamiento referencia*/.Ambas utilizan el módulo ESP32-WROOM-32.
+{width=100%}
+
+
+**Dos placas ESP32 DEVKIT V1**: ambas fueron cedidas por la [UCLM](#UCLM) para el desarrollo de este [TFG](#TFG). Este tipo de placas, mostrado en la Figura \ref{hardware:placas}, contienen las mismas características que el SoC ESP32 mencionado en la Subsección [2.3.2](#esp32). Utilizan el módulo ESP32-WROOM-32.
Las placas están distribuidas en una placa de pruebas o breadboard, permitiendo conectar distintos elementos a los pines de las placas mediante jump wires o cables puente, sin necesidad de soldadura ni diseñar circuitos integrados y facilitando la prueba de componentes. En este caso, tienen conectados distintos módulos y sensores que permiten ampliar las funciones de estas:
- - **Módulo lector de tarjeta microSD**: compuesto por un socket para insertar tarjetas microSD en un circuito impreso del cuál salen 7 pines para poder utilizar el bus SPI de las tarjetas microSD. El SPI o Serial Peripheral Interface es un estándar que se utiliza para transferir información entre circuitos integrados, como pueden ser la placa ESP32 DEVKIT y el lector de tarjetas. Los pines que tiene este módulo son los siguientes:
+ - **Módulo lector de tarjeta microSD**: observable en la Figura \ref{hardware:placas}, está compuesto por un socket para insertar tarjetas microSD en un circuito impreso del cuál salen 7 pines para poder utilizar el bus SPI de las tarjetas microSD @ModuloSDSF. El SPI o Serial Peripheral Interface es un estándar que se utiliza para transferir información entre circuitos integrados, como pueden ser la placa ESP32 DEVKIT y el lector de tarjetas. Los pines que tiene este módulo son los siguientes @Wiki_Spi:
- VCC: entrada de energía, se conecta a una fuente de alimentación para alimentar el lector.
- GND: conexión a tierra, se conecta al terminal negativo de la fuente de alimentación.
- - Data In: también conocido como MOSI o Master Output Slave Input, se utiliza para enviar datos desde la placa ESP32 hasta la tarjeta microSD.
- - Data Out: también conocido como MISO o Master Input Slave Output, se utiliza para enviar datos desde la tarjeta microSD hasta la placa ESP32.
+ - Data In o Master Output Slave Input: se utiliza para enviar datos desde la placa ESP32 hasta la tarjeta microSD.
+ - Data Out o Master Input Slave Output: se utiliza para enviar datos desde la tarjeta microSD hasta la placa ESP32.
- Serial Clock: reloj SPI, se utiliza para sincronizar la transferencia de datos entre las placas.
- Chip Select: se utiliza para activar y desactivar la comunicación con el lector.
- Card Detect: se utiliza para detectar si hay una tarjeta insertada en el lector.
Para este trabajo, el lector, cedido por la UCLM, se utiliza para leer y escribir datos en una tarjeta microSD desde la ESP32 DEVKIT V1 que actúe como broker y gestione los registros o logs y las direcciones de los dispositivos suscritos contenidos.
- - **Sensor DHT11**: sensor digital capaz de medir la temperatura y la humedad, cedido por la [UCLM](#UCLM). Alimentado por 3,3 o 5 voltios, es capaz de leer la humedad en el ambiente entre los rangos 20 y 95% (con un 5% de fallo) y la temperatura entre 0 y 50 [ºC](#ºC) (con 2 [ºC](#ºC) de fallo).
- - **Potenciómetro BQ Zum Kit Advanced**: contenido originalmente en un kit junto a varios sensores y una placa controladora @Pot_TiendaBQ @Pot_KitBQ, este potenciómetro de señal analógica cedido por la [UCLM](#UCLM) es capaz de devolver un valor en función a su rotación, siendo su rotación máxima 300º, al alimentarlo con 3,3 o 5 voltios @Pot_TiendaRobotica.
+ - **Sensor DHT11**: sensor digital capaz de medir la temperatura y la humedad, cedido por la [UCLM](#UCLM). Alimentado por 3,3 o 5 voltios, es capaz de leer la humedad en el ambiente entre los rangos 20 y 95% (con un 5% de fallo) y la temperatura entre 0 y 50 [ºC](#ºC) (con 2 [ºC](#ºC) de fallo) @DHT11_Specs. Está representado en la Figura \ref{hardware:placas}.
+ - **Potenciómetro BQ Zum Kit Advanced**: contenido originalmente en un kit junto a varios sensores y una placa controladora @Pot_TiendaBQ @Pot_KitBQ, este potenciómetro de señal analógica cedido por la [UCLM](#UCLM) es capaz de devolver un valor en función a su rotación, siendo su rotación máxima 300º, al alimentarlo con 3,3 o 5 voltios @Pot_TiendaRobotica. Se muestra en la Figura \ref{hardware:placas}.
-**Placa ESP32-2432S028R**: esta placa proporcionada por el autor y popularmente conocida como Cheap-Yellow-Display o CYD para abreviar, se ha utilizado para hacer pruebas del funcionamiento de la herramienta desarrollada, y al igual que las anteriormente mencionadas placas ESP32, está potenciado por un ESP32-WROOM-32. En cuanto a componentes integra:
+**Placa ESP32-2432S028R**: esta placa proporcionada por el autor y popularmente conocida como Cheap-Yellow-Display o CYD para abreviar, se ha utilizado para hacer pruebas del funcionamiento de la herramienta desarrollada, y al igual que las anteriormente mencionadas placas ESP32, está potenciado por un ESP32-WROOM-32 @ESP32_CYD_Git. Se puede observar en la Figura \ref{hardware:placas}. En cuanto a componentes integra @ESP32_CYD_Git:
- Pantalla LCD de 2,8 pulgadas con resolución 320x240 píxeles, y táctil de tipo resistivo.
- LED multicolor RGB.
@@ -44,68 +47,46 @@ Las placas están distribuidas en una placa de pruebas o breadboard, permitiendo
**Tarjeta microSD**: tarjeta proporcionada por el alumno autor y utilizada por una de las placas con lector de tarjetas para almacenar los registros o logs y las direcciones de los dispositivos suscritos al broker.
-**Adaptador de tarjeta microSD a SD**: proporcionada por el autor, permite utilizar una tarjeta microSD en un lector de tarjetas SD normal al adaptar su tamaño y forma. Se ha utilizado para leer, modificar y eliminar contenidos de la tarjeta microSD desde el ordenador portátil, útil para hacer probar el funcionamiento de la herramienta.
-
-{
- https://www.sparkfun.com/products/544
- https://es.wikipedia.org/wiki/Serial_Peripheral_Interface
- https://tienda.bricogeek.com/sensores-temperatura/1574-modulo-sensor-dht11-humedad-y-temperatura.html
- https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/
-}
-
### Software
Para poder realizar el desarrollo correcto de este [TFG](#TFG), se han requerido las siguientes piezas de software:
-**Windows 10**[^herramientasSw:w10]: el sistema operativo es clave para poder hacer funcionar el Trabajo de Fin de Grado. En este caso, el autor ha utilizado la versión más reciente a fecha de la escritura de este documento, 22H2. Este sistema operativo desarrollado por Microsoft se encuentra instalado en el ordenador portátil mencionado en el apartado de hardware /*TODO: mencionar*/, y debido a su alta popularidad tiene una gran compatibilidad con la mayoría de aplicaciones existentes, y en este caso es beneficioso para el resto de software mencionado posteriormente. Además, integra:
-
-- Drivers: Ofrecen compatibilidad y rendimiento con todo el hardware contenido en el ordenador, como procesador, tarjeta gráfica, teclado y ratón, puertos USB, lectores de tarjetas y otros dispositivos externos. En este caso, para poder hacer uso de las placas, se ha necesitado instalar un driver adicional denominado *CH341SER*[^herramientasSw:driver].
-
-La relevancia de usar Windows 10 es mínima, ya que es posible de adaptar el proyecto a un entorno en Linux con pocas o nulas complicaciones. El uso de Windows 10 ha sido decisión del autor por gusto.
+**Windows 10**[^herramientasSw:w10]: el sistema operativo es clave para poder hacer funcionar el [TFG](#TFG). Este sistema operativo de Microsoft se encuentra instalado en el ordenador portátil mencionado en la Subsección [3.1.1](#hardware). El autor ha utilizado la reciente versión 22H2 con el apropiado driver[^herramientasSw:driver] instalado para poder hacer uso de las placas. Pese a que la alta popularidad de Windows asegura una gran compatibilidad con las aplicaciones existentes, es posible de adaptar el proyecto a un entorno en Linux con pocas o nulas complicaciones, haciendo irrelevante la elección del sistema operativo. Su uso ha sido por gusto del autor.
[^herramientasSw:w10]:
[^herramientasSw:driver]:
-**GitHub**[^herramientasSw:gh]: es una plataforma en la nube propiedad de Microsoft que permite a los equipos de desarrolladores almacenar código, colaborar y realizar cambios en proyectos compartidos, alojados en esta plataforma en forma de repositorios de Git.
+**GitHub**[^herramientasSw:gh]: es una plataforma en la nube propiedad de Microsoft que permite a los equipos de desarrolladores almacenar código, colaborar y realizar cambios en proyectos compartidos, alojados en esta plataforma en forma de repositorios de Git @GitAndGitHubDocs @WikiGitHub.
-Git es un sistema de control de versiones de código abierto que permite gestionar el código fuente y el historial de cambios mediante comandos ejecutados en una terminal. Tiene la característica de ser distribuido, permitiendo usar ramas para aislar partes del código, como pueden ser nuevas funcionalidades en desarrollo, sin afectar al código final desplegado. Cada parte del equipo puede crear una rama, integrar los cambios necesarios y luego fusionarla con la rama principal para hacer efectivos estos cambios. Esto es útil para desarrollar varias funcionalidades simultáneamente que editen los mismos ficheros, comprobar las diferencias entre estos, aprobarlas y volver a una versión funcional anterior en caso de que errores.
+Git es un sistema de control de versiones de código abierto que permite gestionar el código fuente y el historial de cambios. Tiene la característica de ser distribuido, permitiendo usar ramas para aislar partes del código, como pueden ser nuevas funcionalidades en desarrollo por distintas partes de un mismo equipo. Estos cambios se pueden integrar y luego fusionar las ramas con la principal para hacerlos efectivos, y revertir a una versión funcional en caso de errores @GitAndGitHubDocs @Hostinger_Git.
-Los repositorios en GitHub pueden ser públicos o privados, siendo en este último caso que en el repositorio solo pueden interactuar los usuarios agregados y cuya funcionalidad está limitada (a menos que se disponga de licencia de pago). Desde estos se pueden crear y modificar ramas, cargar ficheros, realizar *commits* (la unidad de trabajo que representa un cambio en el repositorio), ver su histórico para hacer un seguimiento de los cambios realizados, obtener las modificaciones realizadas por otros usuarios y hacer *pull requests* (solicitudes de cambios) para integrar estos cambios en el proyecto. GitHub va un paso más allá de alojar proyectos, ya que permite la gestión de proyectos y la interacción del equipo de desarrollo a través de *issues* que retroalimentan el proyecto y ofrecen ideas, asignación de responsabilidades, hitos, etiquetas, discusiones, y gráficos y tableros estilo Kanban que permiten observar fácilmente el trabajo realizado y por hacer. Otras funciones que permite esta plataforma son:
+Los repositorios en GitHub pueden ser públicos o privados, y desde estos se pueden crear y modificar ramas, cargar ficheros, realizar *commits* (la unidad de trabajo que representa un cambio en el repositorio), ver su histórico de cambios, obtener las modificaciones realizadas por otros usuarios y hacer *pull requests* (solicitudes de cambios) para integrar estos cambios en el proyecto @GitHub_Commits. GitHub va un paso más allá de alojar proyectos, ya que permite la gestión de proyectos y la interacción del equipo de desarrollo a través de *issues* que retroalimentan el proyecto y ofrecen ideas, asignación de responsabilidades, hitos, etiquetas, discusiones, y tableros estilo Kanban @GitHub_Issues @GitAndGitHubDocs @WikiGitHub. Otras funciones que permite esta plataforma son @GitAndGitHubDocs @WikiGitHub:
-- Documentación de proyectos, mediante la creación de ficheros de texto "readme" o "léeme" en lenguaje Markdown en los directorios del proyecto.
+- Documentación de proyectos con ficheros "readme" o "léeme" en Markdown en los directorios del proyecto.
- Creación de wikis.
- Automatización de pruebas, lanzamientos y despliegues con GitHub Actions, especificando los pasos a ejecutar tras una acción específica realizada en el repositorio.
- Alojamiento de páginas web estáticas con GitHub Pages como parte de un repositorio.
- Gists o fragmentos de código compartibles.
- GitHub Codespaces, un [IDE](#IDE) online.
-En el caso de este proyecto, se ha utilizado, con el plan gratuito de GitHub, un repositorio privado durante el desarrollo para alojar el código, compartirlo fácilmente con los tutores para enviar dudas e informar del estado del proyecto, y llevar un histórico de los cambios realizados. Posteriormente, se ha modificado la visibilidad del repositorio a público para compartir el proyecto a través de la plataforma de librerías de PlatformIO (mencionado en los siguientes puntos) y aprovechar la funcionalidad de GitHub Pages para incluir una página web estática que documente las distintas funciones que componen el proyecto, ambas funciones automatizadas a través de GitHub Actions /*TODO: realizar*/. Pese a conocer alternativas a la plataforma, como GitLab, se ha decidido utilizar GitHub por la experiencia previa del alumno y la facilidad de uso que ofrece.
+En el caso de este proyecto, se ha utilizado, con el plan gratuito de GitHub, un repositorio privado durante el desarrollo para alojar el código, compartirlo fácilmente con los tutores para enviar dudas e informar del estado del proyecto, y llevar un histórico de los cambios realizados. Posteriormente, se ha modificado la visibilidad del repositorio a público para compartir el proyecto a través de la plataforma de librerías de PlatformIO y aprovechar la funcionalidad de GitHub Pages para incluir una página web estática que documente las distintas funciones que componen el proyecto, ambas funciones automatizadas a través de GitHub Actions. Pese a conocer alternativas a la plataforma, como GitLab, se ha decidido utilizar GitHub por la experiencia previa del alumno y la facilidad de uso que ofrece.
-Otra herramienta que ofrece GitHub para no separar la funcionalidad del escritorio local es **GitHub Desktop**[^herramientasSw:ghDesktop], que permite simplificar el flujo de trabajo del desarrollador y centrarse en su trabajo. Proporciona una interfaz gráfica que evita interactuar directamente con Git para clonar proyectos, hacer *commits*, cambiar de rama y ver los cambios y diferencias en los archivos.
+Otra herramienta que ofrece GitHub para no separar la funcionalidad del escritorio local es **GitHub Desktop**[^herramientasSw:ghDesktop], que permite simplificar el flujo de trabajo del desarrollador y centrarse en su trabajo. Proporciona una interfaz gráfica que evita interactuar directamente con Git para clonar proyectos, hacer *commits*, cambiar de rama y ver los cambios y diferencias en los archivos @GHDesktop_Whatis.
[^herramientasSw:gh]:
[^herramientasSw:ghDesktop]:
-{
- https://docs.github.com/es/get-started/start-your-journey/about-github-and-git
- https://www.hostinger.es/tutoriales/que-es-github
- https://en.wikipedia.org/wiki/GitHub
- https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits
- https://docs.github.com/es/issues/tracking-your-work-with-issues/about-issues
- https://desktop.github.com/
-}
-
-**Visual Studio Code**[^herramientasSw:vsc]: es un [IDE](#IDE) ligero, potente, multiplataforma, personalizable y de código abierto, creado por Microsoft. Permite abrir directorios como espacios de trabajo capaces de contener múltiples lenguajes de programación, ofreciendo soporte nativo para JavaScript, TypeScript y Node.js. Visual Studio Code integra funcionalidades clave para incrementar la productividad del desarrollador, tales como el subrayado de sintaxis y errores, la sangría automática, la refactorización, el autocompletado, las sugerencias, la compilación y ejecución mediante clics, el depurador interactivo y la compatibilidad con repositorios Git. Tanto la funcionalidad como la compatibilidad con lenguajes son ampliables mediante extensiones.
+**Visual Studio Code**[^herramientasSw:vsc]: es un [IDE](#IDE) ligero, potente, multiplataforma, personalizable y de código abierto, creado por Microsoft. Permite abrir directorios como espacios de trabajo capaces de contener múltiples lenguajes de programación, ofreciendo soporte nativo para JavaScript, TypeScript y Node.js. Visual Studio Code integra funcionalidades clave para incrementar la productividad del desarrollador, tales como el subrayado de sintaxis y errores, la sangría automática, la refactorización, el autocompletado, las sugerencias, la compilación y ejecución mediante clics, el depurador interactivo y la compatibilidad con repositorios Git. Tanto la funcionalidad como la compatibilidad con lenguajes son ampliables mediante extensiones @WhyVSC @VSC_Wiki.
Este ha sido el [IDE](#IDE) de preferencia para el desarrollo de este trabajo, y se ha complementado con las siguientes extensiones:
- PlatformIO IDE[^herramientasSw:vscPlatformIO]: habilita el desarrollo de software embebido para distintas plataformas y frameworks utilizando el sistema de PlatformIO (explicado posteriormente) @PlatformIO_VSMarketplace.
-- C/C++ Extension Pack[^herramientasSw:vscCppPack]: facilita el desarrollo de proyectos en C/C++ añadiendo compatibilidad con estos lenguajes.
-- GitHub Copilot[^herramientasSw:vscGHCopilot]: una herramienta de programación basada en inteligencia artificial entrenada a partir de repositorios públicos y que ayuda a escribir código de forma rápida e inteligente @GHCopilot_VSMarketplace. Ofrece sugerencias de código inteligentes mientras se escribe y proporciona un chat para realizar consultas acerca del código, como pedir explicaciones, informarse acerca de conceptos de programación y guiar al usuario para mejorar su código o implementar nuevas funcionalidades @GHCopilot_VSMarketplace @GHCopilot_Overview. El uso de esta herramienta está limitado a los usuarios de pago o a quienes disponen de un GitHub Student Developer Pack @GHEducation, como ocurre en este proyecto.
+- C/C++ Extension Pack[^herramientasSw:vscCppPack]: añade compatibilidad con el desarrollo de proyectos en C/C++.
+- GitHub Copilot[^herramientasSw:vscGHCopilot]: una herramienta de programación basada en inteligencia artificial entrenada a partir de repositorios públicos y que ayuda a escribir código de forma rápida e inteligente, mediante sugerencias y un chat para realizar consultas @GHCopilot_VSMarketplace @GHCopilot_Overview.
- Better Comments[^herramientasSw:vscBetterComments]: añade diferencias de estilo y enfatizaciones a comentarios en el código destinados a alertar, hacer peticiones, indicar acciones por realizar o TODOs, o remarcar información importante, logrando así comentarios más comprensibles @BetterComments_VSMarketplace.
- TODO Highlight[^herramientasSw:vscTodoHighlight] y Todo Tree[^herramientasSw:vscTodoTree]: ambas extensiones se utilizan en conjunto para llevar un seguimiento de las tareas que se deben realizar en el código, permitiendo resaltar líneas que contienen el texto "TODO" y "FIXME" @TODOHighlight_VSMarketplace y mostrarlas de manera agrupada en forma de árbol @TodoTree_VSMarketplace.
- Code Spell Checker[^herramientasSw:vscSpellChecker]: un corrector ortográfico que marca los errores ortográficos detectados en los comentarios y en el código, y que ayuda a solucionarlos a través de sugerencias @SpellChecker_VSMarketplace.
-- Doxygen Documentation Generator[^herramientasSw:vscDoxygenDoc]: permite generar automáticamente en formato Doxygen los comentarios junto a parámetros como las descripciones, los parámetros y los valores retornados para su uso en la documentación. Además, ofrece soporte para autocompletado y sugerencias de comandos Doxygen @DoxygenGenerator_VSMarketplace.
+- Doxygen Documentation Generator[^herramientasSw:vscDoxygenDoc]: permite generar automáticamente en formato Doxygen los comentarios junto a parámetros como las descripciones, los parámetros y los valores retornados para su uso en la documentación @DoxygenGenerator_VSMarketplace.
[^herramientasSw:vsc]:
[^herramientasSw:vscPlatformIO]:
@@ -117,44 +98,27 @@ Este ha sido el [IDE](#IDE) de preferencia para el desarrollo de este trabajo, y
[^herramientasSw:vscSpellChecker]:
[^herramientasSw:vscDoxygenDoc]:
-{
- https://code.visualstudio.com/docs/editor/whyvscode
- https://en.wikipedia.org/wiki/Visual_Studio_Code
-}
-
-**PlatformIO**[^herramientasSw:platformIO]: es una herramienta de código abierto y multiplataforma, destinada a ingenieros y desarrolladores de software de sistemas embebidos, ya sean aficionados y profesionales, que incluye lo necesario para compilar, ejecutar, subir y escribir el código. Ofrece una amplia compatibilidad, con soporte para más de mil placas embebidas diferentes, más de 40 plataformas de desarrollo y más de 20 marcos de trabajo o frameworks.
-
-PlatformIO aloja uno de los mayores registros de bibliotecas embebidas en PlatformIO Registry, lo que permite explorar e instalar de manera sencilla distintas bibliotecas de código, plataformas y herramientas, listadas junto a ejemplos e instrucciones de uso. Este registro se puede utilizar desde la interfaz gráfica de la herramienta, por línea de comandos y desde su página web[^herramientasSw:platformIOReg].
+**PlatformIO**[^herramientasSw:platformIO]: es una herramienta de código abierto y multiplataforma, destinada a ingenieros y desarrolladores de software de sistemas embebidos, ya sean aficionados y profesionales, que incluye lo necesario para compilar, ejecutar, subir y escribir el código. Ofrece una amplia compatibilidad, con soporte para más de mil placas embebidas diferentes, más de 40 plataformas de desarrollo y más de 20 marcos de trabajo o frameworks @WhatIsPlatformIO @PlatformIOPlatforms.
-Una de sus características más importantes es la gestión de dependencias integrada. Es común que los proyectos aprovechen funcionalidades ofrecidas en bibliotecas, por lo que, tras ser referenciadas por el desarrollador, PlatformIO se encarga de resolver las dependencias al compilar el código. Además, contiene un depurador de código, un analizador estático de código, un monitor de puerto serial y soporte para pruebas unitarias. Esta herramienta se pone a disposición del usuario mediante la integración con otros [IDE](#IDE)s o editores de texto a través de extensiones, siendo Visual Studio Code el más recomendado.
+PlatformIO aloja uno de los mayores registros de bibliotecas embebidas en PlatformIO Registry[^herramientasSw:platformIOReg], lo que permite explorar e instalar de manera sencilla distintas bibliotecas de código, plataformas y herramientas, listadas junto a ejemplos e instrucciones de uso @PlatformIODependencies @PlatformIORegistry. Junto a esta, una de sus características más importantes es la gestión de dependencias integrada para que los proyectos aprovechen funcionalidades de otras bibliotecas @PlatformIODependencies. Además, contiene un depurador de código, un analizador estático de código, un monitor de puerto serial y soporte para pruebas unitarias @PlatformIO_VSMarketplace. Esta herramienta se pone a disposición del usuario mediante la integración con otros [IDE](#IDE)s o editores de texto a través de extensiones, siendo Visual Studio Code el más recomendado @PlatformIOIdeIntegration.
-El código de este proyecto se ha creado con PlatformIO y se ha configurado para utilizar la placa ESP32 DEVKIT V1 con la plataforma Espressif32. En cuanto al framework, se ha utilizado el de Arduino, pese a ser posible también utilizar el de Espressif (ESP-IDF), debido a que cumple las necesidades del desarrollador, a la experiencia previa con placas de desarrollo Arduino por parte del autor y a la facilidad de uso. Las diferencias entre ambos son las siguientes:
+El código de este proyecto se ha creado con PlatformIO y se ha configurado para utilizar la placa ESP32 DEVKIT V1 con la plataforma Espressif32. En cuanto al framework, se ha utilizado el de Arduino, pese a ser posible también utilizar el de Espressif (ESP-IDF), debido a que cumple las necesidades del desarrollador, a la experiencia previa con placas de desarrollo Arduino por parte del autor y a la facilidad de uso. Las diferencias entre ambos son las siguientes @PIOFramework:
- El framework ESP-IDF ofrece un soporte completo de los lenguajes C y C++, permitiendo escribir código eficiente y de alto rendimiento. Por otro lado, Arduino utiliza una implementación simplificada y adaptada a los microcontroladores, limitando la flexibilidad y funcionalidad del código.
- Las aplicaciones desarrolladas con ESP-IDF están preparadas para hacer uso de los núcleos disponibles en la placa y su estructura se basa en tareas, mientras que en Arduino por defecto solo se aprovecha de un núcleo y las aplicaciones siguen una estructura en la que se debe declarar una función `setup` y otra `loop`.
-- El framework de Arduino es útil si previamente el desarrollador lo ha utilizado para desarrollar en otras placas, además de ser fácil de usar para quienes no tienen mucha experiencia, y contiene un gran rango de librerías y APIs por defecto que facilitan el desarrollo. En cambio, ESP-IDF se puede utilizar para desarrollar software que requiera controlar funciones avanzadas del hardware, como el consumo de energía y recursos, e incluye un mayor conjunto de herramientas para depurar la placa y gestionar el uso de la memoria.
+- El framework de Arduino es útil si previamente el desarrollador lo ha utilizado para desarrollar en otras placas, además de ser fácil de usar para quienes no tienen mucha experiencia, y contiene un gran rango de librerías y [API](#API)s por defecto que facilitan el desarrollo. En cambio, ESP-IDF se puede utilizar para desarrollar software que requiera controlar funciones avanzadas del hardware, como el consumo de energía y recursos, e incluye un mayor conjunto de herramientas para depurar la placa y gestionar el uso de la memoria.
- En cuanto a la comunidad, debido a la implementación de Arduino en una gran variedad de placas, es la que mayor comunidad tiene en comparación con ESP-IDF.
[^herramientasSw:platformIO]:
[^herramientasSw:platformIOReg]:
-{
- https://docs.platformio.org/en/latest/what-is-platformio.html
- https://marketplace.visualstudio.com/items?itemName=platformio.platformio-ide
- https://docs.platformio.org/en/latest/platforms/index.html
- https://docs.platformio.org/en/latest/librarymanager/dependencies.html
- https://docs.platformio.org/en/latest/integration/ide/index.html
- https://registry.platformio.org/
- https://www.espboards.dev/blog/esp-idf-vs-arduino-core/
-}
-
-**Trello**[^herramientasSw:trello]: desarrollado por Atlassian, es una aplicación web que facilita la gestión de tareas utilizando tableros visuales al estilo Kanban. Los componentes clave son:
+**Trello**[^herramientasSw:trello]: desarrollado por Atlassian, es una aplicación web que facilita la gestión de tareas utilizando tableros visuales al estilo Kanban, cuyos componentes clave son @Trello_Main @Trello_Tour @Trello_Wiki:
- Listas: columnas que representan las fases de una tarea.
- Tarjetas: tareas o ideas que se mueven entre listas según su estado. Pueden incluir miembros asignados, fechas de vencimiento, archivos adjuntos, descripciones, comentarios y checklists.
- Miembros: usuarios con tareas asignadas y permisos en el tablero.
-Trello tiene la capacidad de ampliar la funcionalidad gracias a las integraciones con otras aplicaciones, a las automatizaciones sin código para centrarse únicamente en el trabajo, y a los powerups, que actúan como extensiones de la funcionalidad básica de Trello.
+Trello tiene la capacidad de ampliar la funcionalidad gracias a las integraciones con otras aplicaciones, a las automatizaciones sin código para centrarse únicamente en el trabajo, y a los powerups, que actúan como extensiones de la funcionalidad básica de Trello @Trello_Main @Trello_Tour.
Para el proyecto, el alumno ha creado un tablero adaptado a sus necesidades (detallado posteriormente) usando el plan gratuito de Trello. Este tablero permite llevar un seguimiento de todas las tareas, tanto de código como de la memoria, realizadas durante el desarrollo, y ha facilitado las reuniones de seguimiento al poder mostrar a los tutores el estado de las tareas. Utiliza los siguientes *power-ups*:
@@ -165,17 +129,7 @@ Para el proyecto, el alumno ha creado un tablero adaptado a sus necesidades (det
[^herramientasSw:trelloGH]:
[^herramientasSw:trelloSmartFields]:
-{
- https://en.wikipedia.org/wiki/Trello
- https://trello.com/es
- https://trello.com/es/about
- https://trello.com/es/tour
-
-}
-
-**Doxygen**[^herramientasSw:doxygen]: utilizada para la documentación de este trabajo, esta herramienta de código abierto, muy empleada en el desarrollo de software, permite obtener documentación a partir del código de forma sencilla. Posibilita la generación automática de documentación en distintos formatos, como [HTML](#HTML), [PDF](#PDF), Word y [XML](#XML), a partir de los comentarios insertados en el código durante el desarrollo, analizando la información de las distintas clases, funciones y variables. Gracias a esta automatización, se agiliza y estandariza el proceso de documentación de proyectos, lo cual es beneficioso para entender el proyecto y el código que lo compone, además de mejorar la colaboración entre los miembros del equipo de desarrollo y el mantenimiento del propio código.
-
-Soporta C++, C, Python, Java, PHP y otros lenguajes. La documentación se realiza a partir de comentarios, como se muestra en el Listado \ref{herramientasSw:ejemploDoxygen}.
+**Doxygen**[^herramientasSw:doxygen]: utilizada para la documentación de este trabajo, esta herramienta de código abierto, muy empleada en el desarrollo de software, permite obtener documentación a partir del código de forma sencilla. Posibilita la generación automática de documentación en distintos formatos, como [HTML](#HTML), [PDF](#PDF), Word y [XML](#XML), a partir de los comentarios insertados en el código durante el desarrollo, analizando la información de las distintas clases, funciones y variables. Gracias a esta automatización, se agiliza y estandariza el proceso de documentación de proyectos, lo cual es beneficioso para entender el proyecto y el código que lo compone, además de mejorar la colaboración entre los miembros del equipo de desarrollo y el mantenimiento del propio código. Soporta C++, C, Python, Java, PHP y otros lenguajes @Doxygen_Main. La documentación se realiza a partir de comentarios, como se muestra en el Listado \ref{herramientasSw:ejemploDoxygen}.
```{.cpp #herramientasSw:ejemploDoxygen .numberLines caption="Ejemplo de uso de Doxygen" frame=single}
/**
@@ -191,115 +145,62 @@ Soporta C++, C, Python, Java, PHP y otros lenguajes. La documentación se realiz
public int ejemploFuncion(int parametro1, bool parametro2, ...)
```
-Entre las capacidades adicionales se encuentran las referencias cruzadas entre distintas partes de la documentación, soporte de Markdown en los comentarios, dibujo de diagramas para representar gráficamente clases, herencias y relaciones entre partes del código, personalización de la documentación resultante y configuración mediante un fichero Doxyfile con distintos parámetros establecidos por el usuario.
+Entre las capacidades adicionales se encuentran las referencias cruzadas entre distintas partes de la documentación, soporte de Markdown en los comentarios, dibujo de diagramas para representar gráficamente clases, herencias y relaciones entre partes del código, personalización de la documentación resultante y configuración mediante un fichero Doxyfile con distintos parámetros establecidos por el usuario @Doxygen_Main.
-En el caso de este trabajo, se ha generado documentación en formato [HTML](#HTML) para crear una página web con toda la información de las distintas funciones que componen el proyecto, y se ha personalizado con Doxygen Awesome[^herramientasSw:doxygenAwesome], un tema [CSS](#CSS) aplicable a la página para disponer de una página con un aspecto moderno, limpio y compatible con la interfaz móvil.
+En el caso de este trabajo, se ha generado documentación en formato [HTML](#HTML) para crear una página web con toda la información de las distintas funciones que componen el proyecto, y se ha personalizado con Doxygen Awesome[^herramientasSw:doxygenAwesome], un tema [CSS](#CSS) aplicable a la página para disponer de una página con un aspecto moderno, limpio y compatible con la interfaz móvil @DoxyAwesome_Main.
[^herramientasSw:doxygen]:
[^herramientasSw:doxygenAwesome]:
-{
- https://doxygen.nl/
- https://en.wikipedia.org/wiki/Doxygen
- https://jothepro.github.io/doxygen-awesome-css/
-}
-
-**Plantilla de [TFG](#TFG)**[^herramientasSw:plantilla]: fue desarrollada por Félix Albertos Marco, profesor del Grado de Ingeniería Informática de la sede de la [UCLM](#UCLM) de Talavera de la Reina, ofreciendo una alternativa para desarrollar la memoria del Trabajo de Fin de Grado. Esta plantilla, utilizada en este [TFG](#TFG), se caracteriza por emplear Markdown para redactar todos los apartados, evitando las complicaciones del formato del documento (como el interlineado, fuentes, cabeceras y pie de página y saltos de página), además de proporcionar la portabilidad del trabajo, ya que estos ficheros son de marcado ligero y no necesitan editores ni sistemas operativos específicos. El soporte de Markdown también incluye todos los elementos que este lenguaje ofrece, como tablas, listados, fragmentos de código o formateado del texto.
+**Plantilla de [TFG](#TFG)**[^herramientasSw:plantilla]: fue desarrollada por Félix Albertos Marco, profesor del Grado de Ingeniería Informática de la sede de la [UCLM](#UCLM) de Talavera de la Reina, ofreciendo una alternativa para desarrollar la memoria del Trabajo de Fin de Grado. Esta plantilla, utilizada en este [TFG](#TFG), se caracteriza por emplear Markdown para redactar todos los apartados, evitando las complicaciones del formato del documento (como el interlineado, fuentes, cabeceras y pie de página y saltos de página), además de proporcionar la portabilidad del trabajo, ya que estos ficheros son de marcado ligero y no necesitan editores ni sistemas operativos específicos. El soporte de Markdown también incluye todos los elementos que este lenguaje ofrece, como tablas, listados, fragmentos de código o formateado del texto @FelixTemplate.
[^herramientasSw:plantilla]:
-{
- https://www.felixalbertos.com/resources/downloads/tfg_template.html
-}
-
-**Teams**[^herramientasSw:teams]: es una aplicación multiplataforma de colaboración en equipo, disponible de forma gratuita con un plan personal limitado o mediante una licencia Microsoft 365.
+**Teams**[^herramientasSw:teams]: es una aplicación multiplataforma de colaboración en equipo, disponible de forma gratuita con un plan personal limitado o mediante una licencia Microsoft 365 @MSTeams_Wiki @MSTeams_Buy.
-Microsoft 365 es una suscripción que incluye las aplicaciones de Microsoft Office (Word, PowerPoint y Excel), almacenamiento en la nube, copias de seguridad y correo electrónico, que habilita el uso en la nube de éstas y permite mantener siempre la última versión con los parches de seguridad correctos mediante un pago mensual o anual. La [UCLM](#UCLM) provee a sus usuarios de cuentas de Microsoft 365 Empresa, la cual se ha aprovechado para este desarrollo.
+Microsoft 365 es una suscripción que incluye las aplicaciones de Microsoft Office (Word, PowerPoint y Excel), almacenamiento en la nube, copias de seguridad y correo electrónico, que habilita el uso en la nube de éstas y permite mantener siempre la última versión con los parches de seguridad correctos mediante un pago mensual o anual @Microsoft365WhatIs. La [UCLM](#UCLM) provee a sus usuarios de cuentas de Microsoft 365 Empresa, la cual se ha aprovechado para este desarrollo.
-Teams centraliza la comunicación en los equipos al permitir la interacción a través de mensajes instantáneos y reuniones. Su funcionamiento se basa en el concepto de equipos o *teams*, espacios de trabajo compartidos donde se intercambian mensajes, contenido y herramientas entre los miembros. Dentro de los equipos existen los canales, que son áreas para conversaciones sobre temas específicos en los que es posible restringir el acceso únicamente a ciertos miembros del equipo, permitiendo crear subdivisiones en el equipo. Por otro lado, para comunicaciones directas o en grupos pequeños, se pueden utilizar chats normales en lugar de equipos.
-
-Además, Teams dispone de otras funciones, como aplicaciones instalables dentro del propio software para ampliar la funcionalidad, y un calendario con capacidad para programar reuniones.
+Teams centraliza la comunicación en los equipos al permitir la interacción a través de mensajes instantáneos y reuniones. Su funcionamiento se basa en el concepto de equipos o *teams*, espacios de trabajo compartidos donde se intercambian mensajes, contenido y herramientas entre los miembros. Dentro de los equipos existen los canales, que son áreas para conversaciones sobre temas específicos en los que es posible restringir el acceso únicamente a ciertos miembros del equipo, permitiendo crear subdivisiones en el equipo. Por otro lado, para comunicaciones directas o en grupos pequeños, se pueden utilizar chats normales en lugar de equipos. Además, Teams dispone de otras funciones, como aplicaciones instalables dentro del propio software para ampliar la funcionalidad, y un calendario con capacidad para programar reuniones @Teams_Demo @MSTeams_Wiki.
Para este [TFG](#TFG), Microsoft Teams ha permitido mantener un contacto directo entre los tutores y el alumno a través de un equipo organizado por canales destinados a las partes de desarrollo y memoria. Estos han agilizado la consulta de dudas y de disponibilidad y organizado archivos compartidos. Por ejemplo, en el canal destinado a la memoria se alojaron las distintas versiones del documento de la memoria, mientras que en el canal de desarrollo se encuentran enlaces, manuales y códigos de ejemplo. Además, se han programado y celebrado reuniones de seguimiento en esta aplicación, de la cual tanto el alumno como los tutores tenían experiencia de uso.
[^herramientasSw:teams]:
-{
- https://teamsdemo.office.com
- https://en.wikipedia.org/wiki/Microsoft_Teams
- https://www.microsoft.com/es-es/microsoft-teams/compare-microsoft-teams-business-options
- https://www.microsoft.com/es-ES/microsoft-365/buy/compare-all-microsoft-365-products
- }
-
-
-**Visio**[^herramientasSw:visio]: es un programa para crear diagramas y vectores profesionales de manera fácil gracias a su incluida y extensa librería de objetos. Su uso está limitado a los usuarios con licencia de Microsoft 365, servicio mencionado anteriormente y del cual la [UCLM](#UCLM) distribuye la licencia a todos los usuarios de la universidad, como es el caso del autor, quien ha destinado el uso de la aplicación al dibujo de algunos esquemas de la memoria. Este programa facilita la visualización de datos e ideas de manera atractiva, lo cual resulta útil en equipos y en la documentación para asegurar la comprensión sencilla de los conceptos.
+**Visio**[^herramientasSw:visio]: es un programa para crear diagramas y vectores profesionales de manera fácil gracias a su incluida y extensa librería de objetos. Su uso está limitado a los usuarios con licencia de Microsoft 365, servicio mencionado anteriormente y del cual la [UCLM](#UCLM) distribuye la licencia a todos los usuarios de la universidad, como es el caso del autor, quien ha destinado el uso de la aplicación al dibujo de algunos esquemas de la memoria. Este programa facilita la visualización de datos e ideas de manera atractiva, lo cual resulta útil en equipos y en la documentación para asegurar la comprensión sencilla de los conceptos @Visio_Main @Visio_Wiki.
[^herramientasSw:visio]: https://www.microsoft.com/es-es/microsoft-365/visio/flowchart-software/
-{
- https://www.microsoft.com/es-es/microsoft-365/visio/flowchart-software#x68bca46524744e268ea489ad8cc29bbb
- https://en.wikipedia.org/wiki/Microsoft_Visio
-}
+**Visual Paradigm**[^herramientasSw:visualParadigm]: es una herramienta que soporta los diagramas resultantes de todas las fases del ciclo de vida del desarrollo de software, entre otros, los diagramas de casos de uso, de clases, de secuencia, de flujo y de arquitectura. Este programa facilita al usuario la realización de diagramas que cumplen con el Lenguaje Unificado de Modelado, ya sea de manera manual o a través de ingeniería inversa, es decir, a partir de código. Además, tiene la capacidad de generar código a partir de los diagramas creados, ayudando al desarrollo @VisualParadigm. En este caso, se ha utilizado esta herramienta para ofrecer una comprensión visual de la solución mediante el modelado de una serie de diagramas integrados en esta memoria.
+
+[^herramientasSw:visualParadigm]:
**Navegador web**, como Firefox[^herramientasSw:firefox] y Microsoft Edge[^herramientasSw:edge]: utilizados en este proyecto para acceder a las herramientas web mencionadas anteriormente y realizar búsquedas de información acerca de partes del código en desarrollo y del contenido de esta memoria.
[^herramientasSw:firefox]:
[^herramientasSw:edge]:
-
-/*TODO: poner lo que vaya a utilizar para diagramas*/
-
-
### Lenguajes
-**C++**: es un lenguaje de programación diseñado en 1979 por Bjarne Stroustrup para extender el ya existente C y añadir mecanismos de manipulación de objetos. Es un lenguaje que requiere una compilación para que el programa pueda ser ejecutado, además de ser multiparadigma, abarcando programación estructurada, orientada a objetos, genérica e imperativa (es decir, las instrucciones indican cómo realizar una tarea y se conoce el estado del programa durante la ejecución).
+**C++**: es un lenguaje de programación diseñado en 1979 para extender el ya existente C con mecanismos de manipulación de objetos. Es un lenguaje que requiere una compilación para que el programa pueda ser ejecutado, además de ser multiparadigma, abarcando programación estructurada, orientada a objetos, genérica e imperativa (es decir, las instrucciones indican cómo realizar una tarea y se conoce el estado del programa durante la ejecución @ProgImperativaDef) @FundamentosCpp @CppAprendiendoArdu. La orientación a objetos permite descomponer los proyectos en distintos archivos con tipos de datos abstractos o clases, asignar propiedades y funciones a un objeto de esa clase y relacionar las propias clases entre sí, por ejemplo, para que una clase pueda heredar de otra @Cpp_Wiki.
-La orientación a objetos permite descomponer los proyectos en distintos archivos que contienen tipos de datos abstractos o clases. Estas son estructuras de tipos de datos concretos con un nombre definido. Además, permite asignar propiedades y funciones ejecutables a un objeto de esa clase y relacionar las propias clases con otras, por ejemplo, para que una clase pueda heredar de otra.
+Tanto C++ como su predecesor C requieren que el programador tenga claro qué hacer y cómo hacerlo, ya que permiten al programador expresar lo que quiere hacer sin restringir lo que está permitido. Son lenguajes simples, concisos y rápidos, pero, por otro lado, la compilación no comprueba las conversiones incorrectas de tipos, los índices erróneos de arrays ni el mal uso de punteros. Además, no cuentan con un recolector de basura, por lo que la gestión de la memoria debe realizarse manualmente. Esto convierte a C++ en un lenguaje frágil y exigente en la gestión de recursos @EssentialC @Cpp_Wiki.
-Tanto C++ como su predecesor C son lenguajes que requieren que el programador tenga claro qué hacer y cómo hacerlo, ya que permiten al programador expresar lo que quiere hacer sin restringir lo que está permitido. Son lenguajes simples, concisos y rápidos, pero, por otro lado, la compilación del código no comprueba las conversiones incorrectas de tipos, los índices erróneos de arrays ni el mal uso de punteros. Además, no cuentan con un recolector de basura que gestione la memoria automáticamente, por lo que el programador debe realizarlo manualmente. Esto convierte a C++ en un lenguaje frágil y exigente en la gestión de recursos.
+C++ fue diseñado teniendo en cuenta la programación de sistemas, tanto grandes como embebidos y con recursos limitados, utilizando el rendimiento, la eficiencia y la flexibilidad como puntos clave de diseño. @CppAprendiendoArdu
-C++ fue diseñado teniendo en cuenta la programación de sistemas, tanto grandes como embebidos y con recursos limitados, utilizando el rendimiento, la eficiencia y la flexibilidad como puntos clave de diseño.
+En el caso de este trabajo, se utiliza el framework de Arduino, una implementación de C++ que limita las funciones por defecto e incluye algunas propias. Junto a este lenguaje, se han utilizado las siguientes librerías compatibles con la placa ESP32 y que la añaden funcionalidades y mejoran el desarrollo de código:
-{
- https://www2.eii.uva.es/fund_inf/cpp/temas/1_introduccion/introduccion.html
- https://academia-lab.com/enciclopedia/programacion-imperativa/
- http://cslibrary.stanford.edu/101/EssentialC.pdf
- https://aprendiendoarduino.wordpress.com/2015/03/26/lenguaje-de-programacion-c/
- https://en.wikipedia.org/wiki/C%2B%2B
-}
-
-En el caso de este trabajo, se utiliza el framework de Arduino, una implementación de este lenguaje que limita las funciones que C++ trae por defecto y se puede usar, e incluye algunas propias. Junto a este lenguaje, se han utilizado las siguientes librerías compatibles con la placa ESP32 y que la añaden funcionalidades y mejoran el desarrollo de código:
-
- - FreeRTOS[^herramientasSw:freeRtos]: esta biblioteca permite utilizar FreeRTOS como un sistema operativo en el proyecto, encargándose del acceso al hardware y de la gestión de las tareas. Es un sistema operativo en tiempo real, centrado en tener un control preciso del tiempo, y está destinado a ser utilizado en dispositivos embebidos.
+ - FreeRTOS[^herramientasSw:freeRtos]: permite utilizar FreeRTOS como un sistema operativo en el proyecto, gestionando el acceso al hardware y las tareas. Es un sistema operativo en tiempo real, centrado en el control preciso del tiempo y destinado a ser utilizado en dispositivos embebidos @Wiki_FreeRTOS @FreeRTOSArduino.
- FreeRTOS se basa en tareas definidas por el desarrollador, cada una con su frecuencia de ejecución. Estas tareas se ejecutan dependiendo de su estado, los cuales pueden ser: disponible, en ejecución, suspendida o bloqueada. El núcleo de FreeRTOS es el scheduler o planificador, que se encarga de gestionar y ejecutar las tareas. Este distribuye el tiempo de ejecución del procesador entre las tareas y asigna las tareas a los núcleos del procesador disponibles (solo se puede ejecutar una tarea por núcleo), permitiendo la ejecución en paralelo o alternando la ejecución entre varias tareas. Además, es el responsable de cambiar los estados entre las tareas.
-
- FreeRTOS también ofrece otras funcionalidades y herramientas, como semáforos para sincronizar tareas, colas para compartir datos entre tareas, temporizadores y un bus de notificaciones.
-
- {
- https://es.wikipedia.org/wiki/FreeRTOS
- https://www.luisllamas.es/como-usar-freertos-en-arduino/
- }
+ FreeRTOS se basa en tareas definidas por el desarrollador, cada una con su frecuencia de ejecución. Estas tareas se ejecutan dependiendo de su estado, los cuales pueden ser: disponible, en ejecución, suspendida o bloqueada. El núcleo de FreeRTOS es el scheduler o planificador, que se encarga de gestionar y ejecutar las tareas. Este distribuye el tiempo de ejecución del procesador entre las tareas y asigna las tareas a los núcleos del procesador disponibles (solo se puede ejecutar una tarea por núcleo), permitiendo la ejecución en paralelo o alternando la ejecución entre varias tareas. Además, es el responsable de cambiar los estados entre las tareas. FreeRTOS también incluye otras funcionalidades y herramientas, como semáforos para sincronizar tareas, colas para compartir datos entre tareas, temporizadores y un bus de notificaciones @FreeRTOSArduino.
- - bblanchon/ArduinoJson[^herramientasSw:arduinoJson]: es capaz de abstraer documentos [JSON](#JSON) y las herramientas para serializarlos y deserializarlos, añadiendo una inexistente compatibilidad de C++ con este formato de datos estructurado. Este proyecto utiliza ArduinoJson 7.0.4 para crear ficheros en los que almacenar propiedades de objetos, como una lista de placa suscriptoras, y almacenarlos en una tarjeta microSD, para poder recuperarlos durante el arranque de la placa ESP32.
- - x385832/Elog[^herramientasSw:elog]: creada para manejar eficientemente los logs o registros sin que impacte en el rendimiento de la ejecución, añade la capacidad de mostrar los registros por terminal serial, agregarlos a un fichero en una tarjeta SD y almacenarlos en la memoria flash. Admite distintos tipos de registros, dependiendo de cómo de crítico sea el mensaje, diferenciar mensajes por clases especificadas y mostrar marcas de tiempo. En el caso de este trabajo, se utiliza en la versión 1.1.5 para añadir mensajes de registro, como avisos o errores, para informar del estado de la ejecución del código, y ofrecer la posibilidad de almacenar los registros en una tarjeta microSD.
+ - bblanchon/ArduinoJson[^herramientasSw:arduinoJson]: es capaz de abstraer documentos [JSON](#JSON) y las herramientas para serializarlos y deserializarlos, añadiendo una inexistente compatibilidad de C++ con este formato de datos estructurado @ArduinoJson_Serialize @ArduinoJson_Tutorial. Este proyecto utiliza ArduinoJson 7.0.4 para crear ficheros en los que almacenar propiedades de objetos, como una lista de placa suscriptoras, y almacenarlos en una tarjeta microSD, para poder recuperarlos durante el arranque de la placa ESP32.
+ - x385832/Elog[^herramientasSw:elog]: creada para manejar eficientemente los logs o registros sin que impacte en el rendimiento de la ejecución, añade la capacidad de mostrar los registros por terminal serial, agregarlos a un fichero en una tarjeta SD y almacenarlos en la memoria flash. Admite distintos tipos de registros, dependiendo de cómo de crítico sea el mensaje, diferenciar mensajes por clases especificadas y mostrar marcas de tiempo @Elog_PIOReg. En el caso de este trabajo, se utiliza en la versión 1.1.6 para añadir mensajes de registro, como avisos o errores, para informar del estado de la ejecución del código, y ofrecer la posibilidad de almacenar los registros en una tarjeta microSD.
[^herramientasSw:freeRtos]:
[^herramientasSw:arduinoJson]:
[^herramientasSw:elog]:
-{
- https://arduinojson.org/v7/faq/automatically-serialize-an-object/
- https://www.luisllamas.es/en/arduino-json/
- https://registry.platformio.org/libraries/x385832/Elog
-}
-
-**Markdown**: es un lenguaje de marcado ligero utilizado en este [TFG](#TFG) para redactar los distintos apartados de la memoria. Markdown permite escribir en documentos de texto plano, utilizando su propia sintaxis para indicar formatos especiales y el aspecto que debe tener (como negrita, cursiva o títulos), con la característica de mantener una lectura natural del documento en casos en los que no sea posible previsualizar el formato. A pesar de ser un lenguaje ligero, no limita el uso a únicamente texto, ya que permite insertar imágenes, tablas, listados y otros tipos de elementos.
-
-{
- https://www.markdownguide.org/getting-started/
-}
-
+**Markdown**: es un lenguaje de marcado ligero utilizado en este [TFG](#TFG) para redactar los distintos apartados de la memoria. Markdown permite escribir en documentos de texto plano, utilizando su propia sintaxis para indicar formatos especiales y el aspecto que debe tener (como negrita, cursiva o títulos), con la característica de mantener una lectura natural del documento en casos en los que no sea posible previsualizar el formato. A pesar de ser un lenguaje ligero, no limita el uso a únicamente texto, ya que permite insertar imágenes, tablas, listados y otros tipos de elementos @MD_Description.
## Metodología
@@ -346,11 +247,10 @@ En adición, los principios del Manifiesto Ágil también enfatizan la colaborac
Dentro de este tipo de metodología se pueden encontrar, entre otros:
-- Scrum: define de forma flexible roles, eventos, artefactos y reglas que los equipos deben seguir para mejorar la productividad, la calidad del trabajo y la comunicación. Los eventos principales que ocurren son los sprints iterativos e incrementales en los cuales existe un control continuo de la calidad del producto. Debe utilizarse por equipos de menos de 10 personas que sepan autoorganizar su trabajo. En grandes proyectos, el uso de esta metodología puede resultar en una pérdida de la perspectiva general durante el desarrollo. Además, aunque es compatible con todo tipo de proyectos, no es sencillo de integrar en todas las organizaciones @Scrum_Ionos.
-- Kanban: se centra en la mejora del flujo de trabajo, de la productividad y de la calidad a través del uso de un tablero. El tablero muestra las tareas como tarjetas que se van desplazando entre las columnas para representar si están pendientes, en curso o concluidas. Estas columnas admiten priorización y limitación, evitando tener equipos sobrecargados. Las tareas se completan antes de comenzar otras, y ocurren reuniones regulares para obtener retroalimentación. Es una metodología fácil de integrar y que muestra los avances del proyecto de manera sencilla, pero requiere que el trabajo sea divisible en fases y que los miembros se adapten a trabajar en distintas etapas del proceso @Kanban_Ionos.
+- Scrum: define roles, eventos, artefactos y reglas para mejorar la productividad y la comunicación en equipos de menos de 10 personas a través de sprints iterativos, pero puede complicar la visión general en proyectos grandes y no siempre es fácil de integrar en todas las organizaciones @Scrum_Ionos.
+- Kanban: se centra en la mejora del flujo de trabajo, de la productividad y de la calidad a través del uso de un tablero Kanban, con tarjetas que se desplazan entre columnas según el estado de la tarea. Soporta la priorización y limitación de tareas, las cuales se deben completar antes que otras y revisar regularmente. Es una metodología fácil de integrar que muestra los avances del proyecto de manera sencilla, pero requiere que el trabajo sea divisible en fases y que los miembros se adapten a trabajar en distintas etapas del proceso @Kanban_Ionos.
- Programación Extrema (eXtreme Programming): se basa en un entorno de comunicación constante entre desarrolladores y cliente, y en el cual existe respeto para tratar errores y críticas. Es utilizada en proyectos en los cuales el cliente no tiene una idea clara del producto final, por lo que ocurren procesos iterativos para entregar una versión y revisarla. Sin embargo, requiere una gran inversión de tiempo y disciplina para llevarla a cabo @XtremeProgram_Ionos.
-
### Scrum
Como está definido en la Guía de Scrum @ScrumGuide, Scrum es un marco de trabajo ligero para el desarrollo ágil de software que ayuda a personas, equipos y organizaciones a generar valor a través de soluciones adaptativas. Busca conseguir un equipo que trabaje en colaboración y obtener el mejor resultado posible de los proyectos, pero en vez de detallar instrucciones específicas a seguir, ofrece una guía de relaciones e interacciones en el equipo. Esta libertad permite usar varios procesos, técnicas y métodos que visibilicen la eficacia de la gestión, el entorno y las técnicas de trabajo para poder mejorarlas.
@@ -365,8 +265,6 @@ El proceso de llevar a cabo Scrum se define por sus eventos, roles y artefactos,
{width=90%}
-https://arrizabalagauriarte.com/en/10-principios-clave-metodologias-agile-scrum/
-
Durante los sprints y en toda la implementación de Scrum, se encuentra una pequeña unidad de personas responsables: el equipo Scrum. Este equipo es multifuncional, y sus miembros poseen las habilidades necesarias para generar valor en cada sprint. Es autogestionado, asignándose internamente las tareas y la forma de realizarlas, y está enfocado en el objetivo del producto. El equipo Scrum es responsable de llevar a cabo todas las actividades relacionadas con el producto (colaboración con interesados, mantenimiento, desarrollo, investigación y otras), además de crear un incremento útil y valioso en cada sprint. No tiene jerarquías ni subequipos, todos sus miembros están al mismo nivel. El tamaño ideal del equipo es de 10 personas o menos, pero no implica que no pueda haber más personas, en dicho caso se organizarán varios equipos Scrum. En el equipo existen tres roles principales:
- Equipo de desarrollo: grupo de personas comprometidas a crear cualquier aspecto de un incremento de calidad en cada sprint. Se encargan de crear el Sprint Backlog con las tareas a realizar durante el sprint y de adaptar su plan de trabajo diario para cumplir con el objetivo del sprint.
@@ -413,7 +311,7 @@ OpenUP organiza las iteraciones en cuatro fases del ciclo de vida del proyecto,
### Implementación en este proyecto
-Tras la definición de los conceptos necesarios acerca de las metodologías, esta sección desarrolla la manera en la que se aplicaron Scrum y OpenUP. El desarrollo de este proyecto se ha realizado teniendo OpenUP en mente, mientras que el esfuerzo de este proyecto se ha gestionado utilizando la metodología Scrum. Pese a conocer que la aplicación no es la más adecuada al ser un equipo más pequeño de lo normal y en el que existe un único desarrollador, la aplicación de esta metodología procura ser fiel con todos los elementos esenciales que la componen. Se ha optado por metodologías ágiles debido a que es un proyecto cuyo desarrollo comienza con unos requisitos básicos y atraviesa fases en las que se identifican fallos de rendimiento, posibles mejoras y nuevos requisitos. Una característica importante de estas metodologías es la constante retroalimentación de los interesados, que permiten redirigir el proyecto según transcurría, y la baja formalidad en cuanto a documentación permitía centrar el esfuerzo en el funcionamiento del proyecto. Por otro lado, la elección ha sido influida por la preferencia y la previa experiencia del autor con estas metodologías.
+Tras la definición de los conceptos necesarios acerca de las metodologías, esta sección desarrolla la manera en la que se aplicaron Scrum y OpenUP. El desarrollo de este proyecto se ha realizado teniendo OpenUP en mente, mientras que el esfuerzo de este proyecto se ha gestionado utilizando la metodología Scrum. Pese a conocer que la aplicación no es la más adecuada al ser un equipo más pequeño de lo normal y en el que existe un único desarrollador, la aplicación de esta metodología procura ser fiel con todos los elementos esenciales que la componen. Se ha optado por metodologías ágiles debido a que es un proyecto cuyo desarrollo comienza con unos requisitos básicos y atraviesa fases en las que se identifican fallos de rendimiento, posibles mejoras y nuevos requisitos. Una característica importante es la constante retroalimentación de los interesados, que permitieron redirigir el proyecto según transcurría, y la baja formalidad en cuanto a documentación permitía centrar el esfuerzo en el funcionamiento del proyecto. Por otro lado, la elección ha sido influida por la preferencia y la previa experiencia del autor con estas metodologías.
#### Roles y artefactos
@@ -498,10 +396,10 @@ Los eventos definidos en [Scrum](#Scrum) se han realizado mediante Teams, donde
En este apartado se detalla la forma en la que se ha implementado el control de versiones, una característica beneficiosa en el desarrollo de software, ya que permite a los equipos de desarrollo trabajar en paralelo evitando conflictos en el código. Además, facilita el rastreo y la gestión de los cambios realizados a lo largo del desarrollo, y permite comparar el estado actual del código fuente con versiones previas para resolver errores @ControlVersiones. Para este [TFG](#TFG), se han aprovechado las herramientas que ofrece GitHub, como las ramas, los pull requests y las liberaciones o releases.
-{width=75%}
-
En cuanto a la ramificación del repositorio, se utiliza una adaptación del flujo de trabajo Gitflow, un modelo de creación de ramas publicado en 2010 por Vincent Driessen, útil para proyectos de entrega continua @Gitflow_Atlassian. Según la publicación @Gitflow_Nvie, y para detallar la Figura \ref{metodologia:gitflow}, existen dos ramas principales que perduran a lo largo del tiempo: `master` o `main`, que registra el historial de publicación oficial del proyecto, y `develop`, en la cual se van integrando las funciones para la siguiente liberación del código. Cuando el código de la rama `develop` se encuentra en un punto estable y listo para la liberación, todos los cambios se fusionan hacia la rama `master`, lo que se traduce en una nueva versión del producto que se etiqueta. Junto a estas ramas, se utilizan otras con un tiempo de vida limitado y que en algún momento se eliminarán:
+{width=75%}
+
- Ramas de características o *feature*: se utilizan para desarrollar nuevas características para una futura versión. Se crean a partir de `develop`, existen mientras la característica está en desarrollo, y finalmente se fusionan de nuevo hacia `develop` añadiendo la característica, o se descartan.
- Ramas de lanzamiento o *release*: nombradas `release-`, se utilizan para preparar una nueva versión de producción. Se crea una a partir de `develop` cuando este último refleja las características destinadas a la versión a construir, se le asigna un número de versión, se mantiene la rama para añadir cambios ligeros y metadatos, hasta que finalmente está lista para el lanzamiento y se fusiona en `master`, representando una nueva versión. También se fusiona hacia `develop`, para mantener esos pequeños cambios realizados a esta rama.
- Ramas de parche rápido o *hotfix*: nombradas `hotfix-`, se utilizan para resolver un fallo crítico en una versión de producción. Se crea a partir de `master`, se solventa el problema y finalmente se fusiona en `master`, aumentando la versión del producto, y en `develop`.
@@ -521,8 +419,6 @@ La primera versión lanzada al público se define como `1.0.0`, y es posible agr
Se ha preferido el versionado semántico sobre otros, como el versionado de calendario (usado por Ubuntu, cuya versión 24.04 muestra que salió en abril de 2024). Por ejemplo, ante el de calendario, es preferible este uso para que la versión no muestre una sensación de obsolescencia al utilizar una versión lanzada hace años ni una falta de madurez al utilizar una versión lanzada recientemente. De manera general, su uso se debe a la facilidad, la comprensión y a la previa experiencia del alumno.
-/*TODO: hablar de automatización (RELEASES AUTOMATICAS, GENERACION DE LA WEB, CUANDO SE IMPLEMENTE)*/
-
### Criterios de calidad y estilo del código
A lo largo del desarrollo del código, se han seguido unos criterios de calidad establecidos por el autor con el fin de obtener un código comprensible tanto para desarrolladores como para usuarios, fácil de mantener y retomar en el futuro. Además, se ha procurado mantener un estilo homogéneo del código, también definido en este apartado. Los criterios son los siguientes:
@@ -550,4 +446,4 @@ public int main(int argc, char *argv[]) {
- La ejecución muestra registros o *logs* si el usuario lo desea, los cuales se distribuyen por el código en puntos clave. Estos registros permiten realizar un seguimiento de lo que realiza la ejecución del código del proyecto e identificar fácilmente los fallos.
-/*TODO: mencionar test si al final se hacen TENER EN CUENTA LAS MENCIONES A TESTS A LO LARGO DEL APARTADO*/
+También, como parte de la calidad del código, se han establecido pruebas para comprobar el correcto funcionamiento del código, las cuales están detalladas en el Anexo [A](#pruebas).
diff --git a/tfg_report/templateAPP/input/chapters/04_resultados.md b/tfg_report/templateAPP/input/chapters/04_resultados.md
index aac0410..5a02900 100644
--- a/tfg_report/templateAPP/input/chapters/04_resultados.md
+++ b/tfg_report/templateAPP/input/chapters/04_resultados.md
@@ -1,8 +1,10 @@
# Resultados
-En este capítulo se describe el avance del desarrollo del proyecto a través de iteraciones o sprints, mencionando los logros y problemas identificados en cada uno. Además, se muestra, mediante diagramas y listados, el funcionamiento de la herramienta desarrollada en su última versión a fecha de redacción de esta memoria. Este proyecto se puede encontrar en el repositorio /*TODO: insertar repo*/
+En este capítulo se describe el avance del desarrollo del proyecto a través de iteraciones o sprints, mencionando los logros y problemas identificados en cada uno. Además, se describe y muestra el funcionamiento de la herramienta desarrollada en su última versión a fecha de redacción de esta memoria. Este proyecto, nombrado "*LoboMQ*" durante el desarrollo, se puede encontrar en el siguiente repositorio:
-Las iteraciones se comenzaron el 28 de septiembre de 2023, luego de evaluar la viabilidad del proyecto y de recopilar los requisitos y objetivos del mismo entre los tutores y el alumno, así como de establecer las metodologías y herramientas a utilizar. Estas iteraciones se desarrollaron en orden y se representan en la Figura \ref{resultados:gantt}, mostrada de manera optimizada a partir de febrero de 2024.
+\centerline{\url{https://github.com/rubnium/LoboMQ}}
+
+Las iteraciones se comenzaron el 28 de septiembre de 2023, luego de evaluar la viabilidad del proyecto y de recopilar los requisitos y objetivos del mismo entre los tutores y el alumno, así como de establecer las metodologías y herramientas a utilizar. Estas iteraciones se desarrollaron en orden y se representan en la Figura \ref{resultados:gantt}, mostrada de manera optimizada a partir de febrero de 2024. Además, las iteraciones se han apoyado en la realización de ejemplos y códigos de prueba, localizados en la carpeta `aside_testing` del repositorio.
```{.plantuml #resultados:gantt caption="Diagrama de Gantt del proyecto desde febrero de 2024" frame=single}
@startgantt
@@ -31,7 +33,7 @@ Project starts 2024-02-01
Periodo: 28/09/2023 - 18/02/2024 (20,43 semanas). Peso total: 143.
-El objetivo principal de este sprint fue la preparación previa al desarrollo y la obtención de conocimientos necesarios. Esta es la iteración más larga y con menor progreso por semana debido a la necesidad de compaginar las asignaturas del grado con este desarrollo y a la lenta pero eficaz captación de conocimientos por parte del alumno.
+El objetivo principal de este sprint fue la preparación previa al desarrollo y la obtención de conocimientos necesarios. Esta es la iteración más larga y con menor progreso por semana debido a la necesidad de compaginar las asignaturas de la formación académica con este desarrollo y a la lenta pero eficaz captación de conocimientos por parte del alumno.
Tareas:
@@ -159,8 +161,6 @@ Función loop():
Esperar 2 segundos
```
-/*TODO: preguntar si mencionar los ejemplos que utilicé*/
-
## Iteración 2
Periodo: 26/02/2024 - 08/03/2024 (1,71 semanas). Peso total: 49.
@@ -403,11 +403,11 @@ Función OnDataRecv(uint8_t mac, uint8_t incomingData):
Función fixTopicAndCheckLength(char topic):
Si topic es null:
- Retornar error
+ Retornar error
Eliminar caracteres / añadidos al principio o al final de topic
Si topic es demasiado grande:
Retornar error
- Retornar éxito
+ Retornar éxito
Función pubTopicCheck(char topic):
Si fixTopicAndCheckLength(topic) retorna error:
@@ -456,7 +456,7 @@ El objetivo principal de este sprint fue añadir soporte para la desuscripción
Tareas:
- Probar publicador/suscriptor [MQTT](#MQTT) con Python (peso: 5). Parecido a la [iteración 0](#iteración-0), trata de desarrollar un código en Python para explorar las capacidades de [MQTT](#MQTT). En concreto, en esta iteración se comprobó que si un usuario se suscribe a dos temas como `cocina/nevera` y `cocina/+`, y se publica un mensaje en `cocina/nevera`, cuántas veces recibe el mensaje el suscriptor. El resultado fue 1.
-- Realizar pruebas de estrés o bullying a la solución actual (peso: 5). La solución desarrollada en la [iteración 3](#iteración-3) presentó una vulnerabilidad revisada al final del sprint anterior. Anteriormente, se creaban tareas cada vez que se recibía un mensaje, lo que significaba que un nodo malicioso que publicara o se suscribiera constantemente al broker podría realizar ataques de denegación de servicio, provocando sobrecargas en la memoria o tareas mal ejecutadas. La tarea consistió en desarrollar un publicador malicioso que enviara mensajes constantemente a un broker desplegado y modificado para que las tareas demoren más tiempo, generando tres tipos de errores:
+- Realizar pruebas de estrés a la solución actual (peso: 5). La solución desarrollada en la [iteración 3](#iteración-3) presentó una vulnerabilidad revisada al final del sprint anterior. Anteriormente, se creaban tareas cada vez que se recibía un mensaje, lo que significaba que un nodo malicioso que publicara o se suscribiera constantemente al broker podría realizar ataques de denegación de servicio, provocando sobrecargas en la memoria o tareas mal ejecutadas. La tarea consistió en desarrollar un publicador malicioso que enviara mensajes constantemente a un broker desplegado y modificado para que las tareas demoren más tiempo, generando tres tipos de errores:
- El broker no podía crear tareas, posiblemente debido a que la memoria de la placa estaba saturada con demasiadas tareas encoladas.
- Error de "núcleo entró en pánico" y "carga prohibida".
@@ -651,7 +651,7 @@ El objetivo principal de este sprint fue la integración del broker en el códig
Tareas:
-- Tomar inspiración de otras memorias de [TFG](#TFG) (peso: 5).
+- Planificar el contenido de la memoria (peso: 5). Diseñar una estructura inicial con los distintos temas que se detallan en la memoria.
- Crear ejemplos con las funciones integradas de log y la librería Elog (peso: 13). Dos ejemplos sencillos probando el registro o log en diferentes niveles y en la tarjeta SD, con el fin de comparar las capacidades de cada uno y decidir cuál es considerado más adecuado para las necesidades del alumno. Se descubrió poca libertad de uso con las funciones integradas, ya que requieren una configuración del proyecto que vaya a utilizarlas, traduciéndose negativamente en trabajo adicional para el usuario final.
- Mover el código fuente del broker a la librería (peso: 13). Al igual que lo realizado previamente con las funciones de publicar, suscribir y desuscribir, tras haberse probado en profundidad el funcionamiento del código del broker, se movió al código final de la librería, resultando en la función `setupBroker()`.
- Probar librería refactorizada (peso: 5). El proyecto pasó por una refactorización, incluyendo una jerarquía de ficheros, variables y definiciones organizadas, y la modificación y creación de cabeceras apropiadas para los usuarios finales que únicamente requieran de las funciones de cliente, solo las del broker, o ambas simultáneamente. La prueba implementó la librería y confirmó su correcto funcionamiento.
@@ -740,7 +740,7 @@ Tareas:
- Añadir persistencia al broker para los temas y suscriptores (peso: 20). La persistencia permite almacenar en la tarjeta SD los temas y suscriptores que se están utilizando al momento de la ejecución del broker, permitiendo que el sistema se pueda reiniciar y continuar funcionando sin perder información. A partir de la estructura y las pruebas de la [iteración 8](#iteración-8), se ha implementado en el código del broker, comenzando por ofrecer la opción al usuario mediante los parámetros de `setupBroker(Elog logger = initializeSerialLogger(BROKER), bool persistence = false, int csSdPin = -1)`. Si el usuario activa la persistencia, se almacena el pin CS de la tarjeta SD y se inicializa un semáforo mutex, que controla los accesos a la tarjeta. El broker lee los ficheros almacenados al iniciarse y escribe el fichero correspondiente al topic cada vez que ocurre una suscripción o desuscripción, gracias a las funciones probadas en la iteración, incluidas en los ficheros `BrokerSDUtils` y recopiladas en el Listado \ref{resultados:brokerSdUtils}. Para evitar la constante conversión del topic al nombre de fichero compatible, se ha creado un atributo `filename` en la clase `BrokerTopic`.
- Redactar Estado del arte (peso: 40). Primera redacción de la memoria.
-- Implementar códigos de error en las funciones (peso: 5). Con la intención de ofrecer al usuario herramientas para conocer el estado de su código, se han modificado las funciones para que retornen información sobre la ejecución, ya sea que esta fue correcta o que ocurrió algún error, mediante los siguientes códigos definidos:
+- Implementar códigos de error en las funciones (peso: 5). Con la intención de ofrecer al usuario informado acerca del resultado de la ejecución de las funciones, se han modificado para que retornen si esta fue correcta u ocurrió algún error, mediante los siguientes códigos definidos:
- `LMQ_ERR_SUCCESS`: ejecución correcta, sin errores.
- `LMQ_ERR_INVAL_TOPIC`: el tema utilizado para publicar, suscribirse o desuscribirse no cumple con los requisitos de formato.
@@ -814,7 +814,7 @@ El objetivo principal de este sprint fue añadir una capa de seguridad adicional
Tareas:
- Crear clase para almacenar una lista de direcciones MAC (peso: 20). La creación de la nueva clase `MACAddrList` facilita al usuario la creación de listas de direcciones MAC. Esta clase hereda de la clase `vector` y añade funciones para verificar si una dirección MAC ya está incluida, para añadir una o varias direcciones a la vez (pasándolas como un string o un `uint8_t[6]`), para eliminarlas y para limpiar la lista.
-- Añadir autenticación mediante una whitelist de MACs (peso: 20). A partir de la clase `MACAddrList` creada recientemente , el usuario puede crear una lista de direcciones al iniciar el broker, la cuál que será utilizada para comprobar quién tiene acceso. Esta lista es pasada a la función principal del broker, mostrada en el Listado \ref{resultados:finalBrokerH}. Por defecto, la whitelist es un puntero nulo, utilizado para indicar que no se ha especificado ninguna. En caso de estar especificada la whitelist, el broker, al recibir mensajes, primero verifica si el emisor se encuentra en dicha lista, y si no es así no procesa el mensaje.
+- Añadir autenticación mediante una whitelist de MACs (peso: 20). A partir de la clase `MACAddrList` creada recientemente, el usuario puede crear una lista de direcciones al iniciar el broker, la cuál que será utilizada para comprobar quién tiene acceso. Esta lista es pasada a la función principal del broker, mostrada en el Listado \ref{resultados:finalBrokerH}. Por defecto, la whitelist es un puntero nulo, utilizado para indicar que no se ha especificado ninguna. En caso de estar especificada la whitelist, el broker, al recibir mensajes, primero verifica si el emisor se encuentra en dicha lista, y si no es así no procesa el mensaje.
```{.md #resultados:finalBrokerH .numberLines caption="Versión final del pseudocódigo de la declaración de funciones del broker" frame=single}
#definir BRO_DEFAULT_WHITELIST = nullptr
@@ -870,14 +870,41 @@ Tareas:
- Crear test de publicador y suscriptor (peso: 13). Asegurar que las funciones de crear mensaje, extraer contenido y comprobar el topic funcionan correctamente, siendo además útil para comprobar estas funciones luego de que surja alguna modificación.
- Redactar Resultados (peso: 40), Estado del arte y Herramientas y metodología (peso: 40).
+## Iteración 14
+
+Periodo: 06/07/2024 - 12/07/2024 (1 semana). Peso total: 88.
+
+El objetivo principal de este sprint fue arreglar algunos fallos, ampliar el tamaño de los mensajes y los topics, y finalizar el proyecto.
+Tareas:
+
+- Cambiar el nombre del repositorio (peso: 3). Renombrar el repositorio a "LoboMQ", completando así el traspaso de la librería a dicho nombre.
+- Añadir tamaño como parámetro de `publish` (peso: 3). Tras descubrirse un fallo en el procesamiento de los mensajes, debido a que siempre se publicaban mensajes de 4 bytes, se identificó que la causa residía en el empaquetado, el cual tenía la capacidad de obtener el tamaño del parámetro `void *payload`. La solución consistió en añadir el nuevo parámetro `size_t payloadSize` y asignarlo correctamente.
+- Ampliar el tamaño de `topic` y `payload` (peso: 8). Hasta el momento, el tamaño de ambos era de 10 y 64 bytes respectivamente, lo cual no aprovechaba el espacio disponible en un mensaje ESP-NOW. Ambos fueron ampliados hasta 24 y 120 bytes.
+- Crear ejemplo básico publicador-suscriptor (peso: 8). El resultado de esta tarea se encuentra en el Anexo [C](#manual-de-uso-y-ejemplo-simple).
+- Preparar código de demostración (peso: 13). Preparar demostración con publicación y suscripción de lecturas de sensores para la presentación.
+- Configurar GitHub Actions para desplegar la página Doxygen y publicar la librería en el registro de PlatformIO (peso: 13). Automatizar estos procesos permitirá trabajar en el repositorio en el futuro sin preocuparse de dichas tareas.
+- Finalizar memoria (peso: 40).
## Diseño final del protocolo
-Una vez finalizado el desarrollo, los artefactos del protocolo quedan definidos. En LoboMQ existen 2 tipos de nodos: el broker y los clientes. El broker gestiona las suscripciones y actúa como un centro de mensajería, ya que redirige las publicaciones a los suscriptores interesados en el mismo tema. Los clientes, por su parte, publican mensaje en temas y se suscriben o desuscriben de estos. Tanto la publicación como la suscripción o desuscripción se transmiten de forma asíncrona, permitiendo la ejecución de tareas sin estar bloqueados esperando una respuesta.
+Una vez finalizado el desarrollo, los artefactos del protocolo quedan definidos. En LoboMQ existen dos tipos de nodos: el broker y los clientes, que interactúan con el sistema según se muestra en el diagrama de casos de uso de la Figura \ref{resultados:casoUso}. El broker gestiona las suscripciones y actúa como un centro de mensajería, redirigiendo las publicaciones a los suscriptores interesados en el mismo tema. Los clientes, por su parte, publican mensajes en temas y se suscriben o desuscriben de estos. Tanto la publicación como la suscripción o desuscripción se transmiten de forma asíncrona, permitiendo la ejecución de tareas sin estar bloqueados esperando una respuesta.
+
+{width=82%}
+
+Se identifican tres tipos de mensajes: SubscribeAnnouncement, UnsubscribeAnnouncement y PublishContent, cuyos campos se muestran en la Figura \ref{resultados:trama}. Estos mensajes tienen en común los campos `type`, que identifica el tipo de mensaje, y `topic`, el tema al cual se relaciona el mensaje. El topic, al igual que en [MQTT](#MQTT), admite el uso de wildcards, pero en este caso está limitado a 24 caracteres. Además, el contenido a publicar no puede superar los 120 bytes, ya que se ha ideado que el mensaje ocupe 152 bytes para no sobrecargar la memoria del microcontrolador. La estructura de este contenido debe ser conocida tanto por el publicador como por el suscriptor para poder procesarla correctamente.
+
+{width=80%}
+
+Los diagramas de secuencia mostrados en las Figuras \ref{resultados:secuencia1} y \ref{resultados:secuencia2} demuestran el procesamiento de los mensajes en este protocolo de la siguiente manera:
+
+- Se comprueba si el emisor del mensaje tiene acceso. Si es así, el mensaje se procesa.
+- Con cada suscripción a un tema, el broker registra dicho tema en caso de no existir, y le asocia el suscriptor. En la librería LoboMQ, se utiliza la clase `BrokerTopic` para representar un tema.
+- Con cada desuscripción de un tema, el broker desasocia el suscriptor del tema y, en el caso de estar vacío, elimina el tema del registro.
+- Con cada publicación a un tema, se comprueba si dicho tema es compatible con cada tema del registro. Por cada uno que sí lo sea, se les envía la publicación a sus suscriptores.
-Se identifican tres tipos de mensajes: SubscribeAnnouncement, UnsubscribeAnnouncement y PublishContent, cuyos campos se muestran en la Figura /*TODO: crear*/. Estos mensajes tienen en común el campo `MessageType`, que identifica el tipo de mensaje, y `topic`, el tema al cual se relaciona el mensaje. El topic, al igual que en [MQTT](#MQTT), admite el uso de wildcards, pero en este caso está limitado a /*TODO: mencionar caracteres*/. Además, los mensajes no pueden superar los 250 bytes debido a las limitaciones de ESP-NOW.
+{width=80%}
-/*TODO: hacer figura campos del protocolo*/
+{width=100%}
-La implementación de este protocolo se realiza mediante la creación de código en C++ que utilice la homónima librería LoboMQ, la cual está disponible tanto en el anteriormente mencionado repositorio como en el registro de PlatformIO /*TODO: insertar enlace*/. La documentación de esta librería también se encuentra disponible en la página /*TODO: insertar enlace*/
+La implementación de este protocolo se realiza mediante la creación de código en C++ que utiliza la homónima librería LoboMQ, la cual está disponible tanto en el anteriormente mencionado repositorio como en el registro de PlatformIO \url{https://registry.platformio.org/libraries/rubnium/LoboMQ}. El manual de uso de la librería está disponible en el Anexo [C](#manual-de-uso-y-ejemplo-simple), y el diagrama de clases completo se encuentra en el Anexo [B](#diagrama-de-clases). Por otro lado, la documentación completa de la librería está disponible en la página \url{https://rubnium.github.io/LoboMQ}.
diff --git a/tfg_report/templateAPP/input/chapters/05_conclusiones.md b/tfg_report/templateAPP/input/chapters/05_conclusiones.md
index 6d53cd2..d20f093 100644
--- a/tfg_report/templateAPP/input/chapters/05_conclusiones.md
+++ b/tfg_report/templateAPP/input/chapters/05_conclusiones.md
@@ -1,20 +1,64 @@
# Conclusiones
-En este capítulo se debe incluir el juicio crítico y discusión sobre los resultados obtenidos. Si es pertinente deberá incluir información sobre trabajos derivados como publicaciones o ponencias, así como trabajos futuros, solo si estos están planificados en el momento en que se redacta el texto. Incluirá obligatoriamente la justificación de las competencias de la tecnología específica cursada por el estudiante que se han adquirido durante el desarrollo del TFG
+En este capítulo final se presentan las conclusiones respecto a cómo se ha abordado el problema principal, analizando los objetivos cumplidos y el coste total del proyecto, y revisando las competencias de la formación académica adquiridas. Finalmente, se realiza una autocrítica del proyecto, señalando las posibles mejoras que se podrían implementar en el futuro.
-## Revisión de los Objetivos
+## Revisión de los objetivos
-En esta sección se deberá revisar en qué grado se han completado los objetivos fijados al principio del proyecto. Se deberá también indicar las posibles desviaciones de los objetivos fijados, así como de la planificación, y tratar de justificar tales desviaciones.
+En esta sección se analiza la consecución del objetivo principal del proyecto, el diseño y la implementación de un protocolo de mensajería publicador-subscriptor inspirado en [MQTT](#MQTT) y que haga uso del protocolo de comunicación inalámbrica ESP-NOW. Este objetivo se alcanzó a través de los siguientes objetivos específicos:
-## Presupuesto
+a. **Diseñar un protocolo de mensajería para redes ESP-NOW que incorpore características de publicación y suscripción similares a MQTT.** El diseño se ha alcanzado observando el funcionamiento y las características de MQTT y los límites de ESP-NOW. En base a esto, se definieron los tipos de mensaje intercambiados, los roles y las acciones realizables.
+
+b. **Implementar librerías de software que permitan a los desarrolladores integrar fácilmente el protocolo propuesto en sus aplicaciones del Internet de las Cosas.** Este objetivo ha sido cumplido al crear una librería basada en la especificación anterior del protocolo que contiene las funciones necesarias para desplegar el broker, publicar, suscribirse o desuscribirse, y otras adicionales que complementan el uso del protocolo. Estas funciones fueron creadas con empatía hacia el usuario novato, quitándole en la mayor cantidad posible la responsabilidad de manejar la comunicación del protocolo mediante funciones que abstraen la creación de tareas y colas, la conexión con los nodos y la creación de los mensajes, y cuyos parámetros contienen lo justo y necesario. El código fuente ha sido desarrollado siguiendo criterios de calidad (listados en el Apartado [3.2.6](#criterios-de-calidad-y-estilo-del-codigo)), permitiendo al usuario comprender la ejecución de las funciones y el motivo de la existencia de las variables y estructuras. A esta característica se le suma el estar disponible la librería de manera pública en GitHub, posibilitando a que otros desarrolladores tomen la librería y creen su propia versión o aporten a la ya existente con funcionalidades nuevas.
+
+c. **Presentar demostraciones o casos de uso que ilustren la utilidad y aplicabilidad del protocolo en contextos reales del Internet de las Cosas**. El desarrollo del manual de uso y los ejemplos mostrados en el Anexo [C](#manual-de-uso-y-ejemplo-simple) permitieron cumplir este objetivo, listando y demostrando el uso de las diferentes funcionalidades integradas en LoboMQ.
+
+Adicionalmente, la lista de objetivos se ha desviado desde la original según se han progresado y descubierto nuevas oportunidades para mejorar el proyecto. Estas desviaciones se listan a continuación:
-Si el TFG consiste en el desarrollo e implementación de un prototipo, la memoria debe incluir el coste del prototipo considerando tanto el hardware como los recursos humanos necesarios para su desarrollo.
+- **Proteger el uso de la solución mediante control de acceso.** Se ha logrado añadir una medida de seguridad a través de una lista blanca que lista los remitentes aceptados por el broker, evitando un posible robo de información o manipulación de mensajes.
-Cuando se tiene en cuenta la puesta en marcha de un proyecto de ingeniería, la planificación y presupuesto que se realizan de modo previo a su ejecución son críticos para gestionar los recursos que permitan alcanzar los objetivos de calidad, temporales y económicos previstos para el proyecto. Es muy importante que todas las justificaciones aportadas se sustenten no solo en juicios de valor sino en evidencias tangibles como: historiales de actividad, repositorios de código y documentación, porciones de código, trazas de ejecución, capturas de pantalla, demos, etc.
+- **Crear un mecanismo de recuperación de información tras un reinicio en el broker.** Los suscriptores y los temas se almacenan como objetos en la memoria de la placa, y además se ha añadido la posibilidad de almacenarse en la tarjeta micro SD en formato [JSON](#JSON). Cuando ocurre un reinicio en la placa, la información almacenada en la RAM es eliminada, pero con la persistencia es posible recuperar los suscriptores y temas que estaban en uso.
-## Competencias Específicas de Intensificación Adquiridas y/o Reforzadas
+- **Permitir al usuario adaptar el protocolo a sus necesidades.** Se han parametrizado las funciones, más en concreto la de levantar el broker, para no forzar al usuario a utilizar todas las funcionalidades o utilizar únicamente las esenciales. Estos parámetros dan al usuario la capacidad de elección si su sistema necesita persistencia y control de acceso. Por otro lado, el usuario también puede decidir sobre el uso del logger o gestor de mensajes de registro y los tipo de mensajes que imprime y donde los imprime.
+
+- **Mantener al usuario desarrollador informado y ofrecer la capacidad de adaptarse al estado de ejecución.** El ya mencionado logger es una funcionalidad importante en este caso, ya que establecerlo al nivel `DEBUG` permite observar los tamaños de mensajes intercambiados, en el caso de los nodos cliente, y la gestión de temas y mensajes en el caso de los nodos broker. Por otro lado, la implementación de códigos de error permite al desarrollador utilizar una función y controlar el resultado de esta para, por ejemplo, realizar determinadas acciones en caso de error.
+
+- **Facilitar el acceso a la documentación de la librería.** El uso de Doxygen y GitHub Pages permite al usuario acceder a la documentación de la librería desde cualquier dispositivo, sin necesidad de utilizar el IDE ni revisar ficheros de código fuente manualmente.
+
+## Presupuesto
-Se deberán listar aquellas competencias de la intensificación que hayan sido adquiridas y/o reforzadas con el desarrollo de este TFG, incluyendo su justificación.
+Los costes del proyecto son estimados y listados en la Tabla \ref{conclusiones:presupuesto}, resultando en un total de 15.599,54 €. Es importante destacar que este total no refleja costes adicionales como la electricidad y el Internet. Por otro lado, la licencia de Visual Paradigm utilizada es de un mes, ya que esta herramienta se empleó en las fases finales del proyecto y no a lo largo del mismo. El salario del desarrollador se calcula en base al salario medio de un ingeniero de software en España, pero aplicado a tiempo parcial, debido a que no hubo un horario fijo para la realización del proyecto, variando entre 1 y 8 horas diarias.
+
+| Concepto | Precio/unidad | Cantidad | Precio total |
+| -------------------------------------- | ---------------------------------: | :------: | --------------: |
+| Ordenador Lenovo Ideapad 3 15ALC6 | 699,00 € @PcCompsLenovo | 1 | 699,00 € |
+| Placa ESP32 DEVKIT V1 | 8,00 € @ESP32_Precio | 2 | 16,00 € |
+| Placa ESP32-2432S028R | 11,51 € @ESP32CYDAliexpress | 1 | 11,51 € |
+| Placa de pruebas | 1,79 € @Protoboard_Precio | 2 | 3,58 € |
+| 20 cables puente | 0,90 € @Cables_Precio | 1 | 0,90 € |
+| Sensor DHT11 | 1,99 € @DHT11_Precio | 1 | 1,99 € |
+| Potenciómetro BQ Zum Kit | 3,55 € @Pot_TiendaBQ | 1 | 3,55€ |
+| Módulo lector de tarjeta microSD | 6,21 € @LectorSD_Precio | 1 | 6,21 € |
+| Tarjeta microSD | 5,50 € @AmazonMicroSd | 1 | 5,50 € |
+| Licencia Windows 10 | 145,00 € @LicenciaWindows | 1 | 145,00 € |
+| Licencia Microsoft 365, 10 meses | 7,00 €/mes @LicenciaM365 | 1 | 70,00 € |
+| Licencia Visual Paradigm, 1 mes | 6,00 $/mes @LicenciaVisualParadigm | 1 | 5,50 € |
+| Licencia Smart Fields, 10 meses | 4,99 $/mes @SmartFields_TrelloPU | 1 | 45,80 € |
+| Salario desarrollador, 10 meses | 1.458,50 € / mes @SueldoIso | 1 | 14.585,00 € |
+| -------------------------------------- | ---------------------------------- | -------- | ----------------|
+| **TOTAL** | | | **15.599,54 €** |
+
+: Estimación de costes del proyecto\label{conclusiones:presupuesto}
+
+## Competencias específicas de intensificación adquiridas y/o reforzadas
+
+El desarrollo de este [TFG](#TFG) ha permitido adquirir, junto al resto de competencias del Grado en Ingeniería Informática, las competencias específicas de intensificación en Sistemas de Información, listadas y justificadas a continuación.
+
+- **[SI1] Capacidad de integrar soluciones de Tecnologías de la Información y las Comunicaciones y procesos empresariales para satisfacer las necesidades de información de las organizaciones, permitiéndoles alcanzar sus objetivos de forma efectiva y eficiente, dándoles así ventajas competitivas.** El protocolo LoboMQ ofrece un método de comunicación indirecta entre microcontroladores comúnmente utilizados en IoT, posibilitando su uso en el ámbito empresarial para desarrollar soluciones que aprovechen el valor y las ventajas del IoT.
+- **[SI2] Capacidad para determinar los requisitos de los sistemas de información y comunicación de una organización atendiendo a aspectos de seguridad y cumplimiento de la normativa y la legislación vigente.** El alumno y los tutores realizaron una recogida de requisitos para planificar la implementación de LoboMQ, incluyendo roles, mensajes y acciones a realizar en el proceso de comunicación. Durante esta recogida, se mencionó la conveniencia de implementar un mecanismo de seguridad mediante usuario y contraseña, encriptación y verificación de mensajes y control de acceso, ya que una vulnerabilidad podría resultar en la pérdida de información, manipulación de mensajes y caídas en el sistema. Debido al limitado tiempo de desarrollo, únicamente se implementó un control de acceso mediante whitelist.
+- **[SI3] Capacidad para participar activamente en la especificación, diseño, implementación y mantenimiento de los sistemas de información y comunicación.** El proyecto ha implicado la ejecución de las fases comunes del desarrollo de software por parte del autor, distribuidas en varias etapas iterativas y cuyo éxito se refleja en el cumplimiento de los objetivos establecidos.
+- **[SI4] Capacidad para comprender y aplicar los principios y prácticas de las organizaciones, de forma que puedan ejercer como enlace entre las comunidades técnica y de gestión de una organización y participar activamente en la formación de los usuarios.** Un principio muy activo durante el desarrollo de LoboMQ ha sido la comprensión del código de la librería, el cual abarca los comentarios, la documentación, la organización del código fuente y los ejemplos. Esto permite entender sus capacidades, limitaciones y funcionamiento, pudiendo así comprobar si es adecuado para implementarlo en un proyecto de una organización y formar a desarrolladores que conozcan la manera de implementarlo y adaptarlo a situaciones específicas.
+- **[SI5] Capacidad para comprender y aplicar los principios de la evaluación de riesgos y aplicarlos correctamente en la elaboración y ejecución de planes de actuación.** En cuanto al desarrollo, la elección de Scrum como metodología de gestión de proyectos se justifica, entre otros motivos, por su capacidad de adaptación a requisitos cambiantes, como los que pueden surgir al encontrar fallos. Esto abre la posibilidad de crear parches rápidos o hotfixes en casos de errores críticos, o tareas para futuras iteraciones. En cambio, en LoboMQ se evaluó el riesgo de posibles reinicios de una placa broker durante su ejecución (debido a cortes de energía) y la pérdida de temas y suscriptores, que justificó la creación de un mecanismo de persistencia para almacenar y recuperar los temas y suscriptores en una tarjeta micro SD.
+- **[SI6] Capacidad para comprender y aplicar los principios y las técnicas de gestión de la calidad y de la innovación tecnológica en las organizaciones.** El proyecto se ha realizado siguiendo buenas prácticas y estándares, como el uso de metodologías ágiles que permiten mantener una constante comunicación entre los miembros del equipo. Por otro lado, el código resultante ha experimentado un constante incremento de calidad siguiendo unos criterios establecidos para mejorar su uso y comprensión.
## Propuestas de trabajo a futuro
diff --git a/tfg_report/templateAPP/input/dedication.md b/tfg_report/templateAPP/input/dedication.md
index 5bdee29..c65cd8d 100644
--- a/tfg_report/templateAPP/input/dedication.md
+++ b/tfg_report/templateAPP/input/dedication.md
@@ -1,2 +1 @@
-Dedicado a mi familia y a todos
-aquellos ...
+Dedicado a todos los que han estado ahí
diff --git a/tfg_report/templateAPP/input/resources/bibliography/bibliography.bib b/tfg_report/templateAPP/input/resources/bibliography/bibliography.bib
index 9804b4f..bb38fc4 100644
--- a/tfg_report/templateAPP/input/resources/bibliography/bibliography.bib
+++ b/tfg_report/templateAPP/input/resources/bibliography/bibliography.bib
@@ -28,6 +28,367 @@ @misc{IoTConexiones_Statista
howpublished = {\url{https://es.statista.com/estadisticas/517654/prevision-de-la-evolucion-de-los-dispositivos-conectados-para-el-internet-de-las-cosas-en-el-mundo/}},
}
+@misc{IoT_Ashton_Avast,
+ title = {{Cómo Kevin Ashton nombró El Internet de las Cosas}},
+ howpublished = {\url{https://blog.avast.com/es/kevin-ashton-named-the-internet-of-things}},
+}
+
+@misc{IoT_Swifttalk,
+ author = {Adekola},
+ month = {10},
+ title = {{The Concept of IoT (Internet of Things)}},
+ year = {2021},
+ howpublished = {\url{https://swifttalk.net/2021/10/06/the-concept-of-iot-internet-of-things/}},
+}
+
+@misc{Podcast_Lewis,
+ author = {Lewis, Peter},
+ month = {10},
+ title = {{The origin of the Internet of Things with Peter Lewis}},
+ year = {2022},
+ howpublished = {\url{https://www.datacenterdynamics.com/en/podcasts/zero-downtime/episode-18-the-origin-of-the-internet-of-things-with-peter-lewis/}},
+}
+
+@misc{Itop_IoT,
+ title = {{IoT: origen, importancia en el presente y perspectiva de futuro}},
+ howpublished = {\url{https://www.itop.es/blog/item/iot-origen-importancia-en-el-presente-y-perspectiva-de-futuro.html}},
+}
+
+@misc{Linkedin_OrigenIoT,
+ author = {Comnet},
+ month = {10},
+ title = {{El origen del Internet de las cosas (IoT)}},
+ year = {2021},
+ howpublished = {\url{https://www.linkedin.com/pulse/el-origen-del-internet-de-las-cosas-iot-comnet-s-a-/}},
+}
+
+@inproceedings{IoT_Survey,
+ author = {Giri, Arindam and Dutta, Subrata and Neogy, Sarmistha and Dahal, Keshav and Pervez, Zeeshan},
+ year = {2017},
+ month = {10},
+ pages = {1-12},
+ title = {Internet of things (IoT): a survey on architecture, enabling technologies, applications and challenges},
+ doi = {10.1145/3109761.3109768}
+}
+
+@misc{IoT_at3w,
+ month = {1},
+ title = {{Historia del IoT: qué es y cómo ha cambiado los sistemas de puesta a tierra y protección contra el rayo}},
+ year = {2023},
+ howpublished = {\url{https://at3w.com/blog/iot-internet-of-things-tecnologia-proteccion-contra-rayo-tomas-tierra/}},
+}
+
+@misc{IoT_RH,
+ title = {{¿Qué es el Internet de las cosas (IoT) y cómo funciona?}},
+ howpublished = {\url{https://www.redhat.com/es/topics/internet-of-things/what-is-iot}},
+}
+
+@misc{KevinAshton_Eexcellence,
+ author = {De Santos, Federico Fernández},
+ title = {{Kevin Ashton, un tecnólogo visionario}},
+ howpublished = {\url{https://www.eexcellence.es/expertos/kevin-ashton-un-tecnologo-visionario}},
+}
+
+@misc{Redeweb_IoT,
+ author = {Redeweb},
+ month = {10},
+ title = {{Los sensores inalámbricos IoT y el problema de la corta duración de las baterías | Revista Española de Electrónica}},
+ year = {2015},
+ howpublished = {\url{https://www.redeweb.com/articulos/sensores/los-sensores-inalambricos-iot-y-el-problema-de-la-corta-duracion-de-las-baterias/}},
+}
+
+@misc{Neurona_IoT,
+ author = {Ba, Neurona},
+ month = {6},
+ title = {{IoT a tu alcance}},
+ year = {2020},
+ howpublished = {\url{https://neurona-ba.com/iot-a-tu-alcance/}},
+}
+
+@misc{IoTDesf_Deing,
+ author = {Deingenierias.com},
+ month = {4},
+ title = {{1.4. Desafíos y limitaciones de IoT}},
+ year = {2024},
+ howpublished = {\url{https://deingenierias.com/curso/iot/1-4-desafios-y-limitaciones-de-iot/}},
+}
+
+@misc{Chakray_IoTArq,
+ author = {Chakray},
+ month = {10},
+ title = {{5 requerimientos de una arquitectura IoT - Chakray}},
+ year = {2020},
+ howpublished = {\url{https://www.chakray.com/es/5-requesitos-de-una-arquitectura-iot/}},
+}
+
+@misc{Incibe_IoT,
+ title = {{Riesgos y retos de ciberseguridad y privacidad en IoT | INCIBE-CERT | INCIBE}},
+ howpublished = {\url{https://www.incibe.es/incibe-cert/blog/riesgos-y-retos-ciberseguridad-y-privacidad-iot}},
+}
+
+@misc{IoT_Wiki,
+ author = {{Colaboradores de Wikipedia}},
+ month = {6},
+ title = {{Internet de las cosas}},
+ year = {2024},
+ howpublished = {\url{https://es.wikipedia.org/wiki/Internet_de_las_cosas}},
+}
+
+@book{IoTBook,
+ author = {Hanes, David and Salgueiro, Gonzalo and Grossetete, Patrick and Barton, Robert and Henry, Jerome},
+ month = {1},
+ publisher = {Fundamentals},
+ title = {{IoT Fundamentals: Networking Technologies, Protocols, and Use Cases for the Internet of Things}},
+ year = {2017},
+}
+
+@book{IoTDef_ITU,
+ author = {ITU-T Study Group 20},
+ month = {6},
+ title = {{Y series: Global information infrastructure, Internet protocol aspects, next-generation networks, Internet of Things and smart cities}},
+ year = {2012},
+ howpublished = {\url{https://handle.itu.int/11.1002/1000/11559}},
+}
+
+@misc{IoTDef_Nougir,
+ title = {{¿Qué es IOT o Internet de las cosas y sus aplicaciones?}},
+ howpublished = {\url{https://www.nougir.com/index.php/blog-3/item/13-que-es-iot-o-internet-de-las-cosas-y-sus-aplicaciones}},
+}
+
+@misc{IoTDefs_InfoMatters,
+ author = {{Information Matters}},
+ month = {9},
+ title = {{Internet of Things (IoT): definitions}},
+ year = {2022},
+ howpublished = {\url{https://informationmatters.net/internet-of-things-definitions/}},
+}
+
+@misc{IoT_IBM,
+ title = {{¿Qué es el Internet de las cosas (IoT)? | IBM}},
+ howpublished = {\url{https://www.ibm.com/es-es/topics/internet-of-things}},
+}
+
+@misc{IoT_IHS,
+ author = {{IHS Markit}},
+ title = {{The Internet of Things: a movement, not a market}},
+ howpublished = {\url{https://cdn.ihs.com/www/pdf/IoT_ebook.pdf}},
+}
+
+@misc{IoT_VideoClase,
+ author = {Alberto Prieto Espinosa},
+ month = {5},
+ title = {{¿Qué utilidades y obstáculos tiene Internet de las Cosas?}},
+ year = {2018},
+ howpublished = {\url{https://www.youtube.com/watch?v=RnasX1bFBh8}},
+}
+
+@book{IoT_Rama,
+ author = {Seuba, Manel López I},
+ month = {1},
+ title = {{Internet de las Cosas}},
+ year = {2019},
+}
+
+@misc{IoT_Bankinter,
+ author = {Fundación Innovación Bankinter},
+ month = {6},
+ title = {{Future Trends Forum: Internet de las cosas}},
+ year = {2024},
+ howpublished = {\url{https://www.fundacionbankinter.org/ftf-informes/internet-de-las-cosas/}},
+}
+
+@misc{IoT_CdU_Ubi,
+ author = {Jiménez, Laura Millet},
+ title = {{IoT: Tecnologías, Casos de uso, ventajas y limitaciones - Guía completa}},
+ howpublished = {\url{https://blog.ubisolutions.net/es/iot-tecnologias-casos-de-uso-ventajas-y-limitaciones-guia-completa}},
+}
+
+@misc{IoT_VentDesv_Tokio,
+ title = {{Estas son las ventajas y desventajas del internet de las cosas}},
+ howpublished = {\url{https://www.tokioschool.com/noticias/ventajas-desventajas-internet-cosas/}},
+}
+
+@misc{IoT_VentDesv_Krypton,
+ author = {Alex},
+ month = {3},
+ title = {{Principales ventajas y desventajas de IoT en los negocios}},
+ year = {2024},
+ howpublished = {\url{https://kryptonsolid.com/principales-ventajas-y-desventajas-de-iot-en-los-negocios/}},
+}
+
+@misc{Coke_Home,
+ title = {{CMU SCS Coke Machine home page}},
+ howpublished = {\url{https://www.cs.cmu.edu/~coke/}},
+}
+
+@misc{Coke_History,
+ author = {The Carnegie Mellon University Computer Science Department Coke Machine},
+ title = {{The "Only" Coke Machine on the Internet}},
+ howpublished = {\url{https://www.cs.cmu.edu/~coke/history_long.txt}},
+}
+
+@misc{Info_Trojan,
+ title = {{Trojan Room coffee machine}},
+ howpublished = {\url{https://www.cl.cam.ac.uk/coffee/coffee.html}},
+}
+
+@misc{Bio_Trojan,
+ month = {5},
+ title = {{Trojan Room Coffee Pot biography}},
+ year = {1995},
+ howpublished = {\url{https://www.cl.cam.ac.uk/coffee/qsf/coffee.html}},
+}
+
+@misc{Switchoff_Trojan,
+ title = {{Switching off the Trojan Room Coffee Pot camera}},
+ howpublished = {\url{https://www.cl.cam.ac.uk/coffee/qsf/switchoff.html}},
+}
+
+@misc{Trojan_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {5},
+ title = {{Trojan Room coffee pot}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Trojan_Room_coffee_pot}},
+}
+
+@misc{BBC_Trojan,
+ author = {Kesby, Rebecca},
+ month = {11},
+ title = {{How the world's first webcam made a coffee pot famous}},
+ year = {2012},
+ howpublished = {\url{https://www.bbc.com/news/technology-20439301}},
+}
+
+@misc{HoI_Trojan,
+ title = {{The First Webcam Points at the Trojan Room Coffee Pot : History of Information}},
+ howpublished = {\url{https://www.historyofinformation.com/detail.php?id=1507}},
+}
+
+@misc{Quentin_Trojan,
+ title = {{The Trojan Room Coffee Pot: Bob Metcalfe's article - Quentin Stafford-Fraser}},
+ howpublished = {\url{https://quentinsf.com/coffeepot/metcalfe/}},
+}
+
+@misc{Coffee_Video,
+ author = {The Centre for Computing History},
+ month = {8},
+ title = {{Quentin Stafford-Fraser - The First Webcam (aka The Trojan Room Coffee Pot cam)}},
+ year = {2021},
+ howpublished = {\url{https://www.youtube.com/watch?v=uF982_aRKrI}},
+}
+
+@misc{Coffee_Museum,
+ month = {10},
+ title = {{Krups ProAroma 305 - Trojan-Room-Kaffeemaschine :: Heinz Nixdorf MuseumsForums}},
+ year = {2023},
+ howpublished = {\url{https://owl.museum-digital.de/object/3761}},
+}
+
+@misc{AboutEspressif,
+ title = {{About Espressif | Espressif Systems}},
+ howpublished = {\url{https://www.espressif.com/en/company/about-espressif}},
+}
+
+@misc{EurotronixEspressif,
+ title = {{Espressif - Eurotronix}},
+ howpublished = {\url{https://www.eurotronix.com/es/fabricantes/espressif}},
+}
+
+@misc{DigikeyEspressif,
+ title = {{Espressif Systems - Digikey}},
+ howpublished = {\url{https://www.digikey.es/es/supplier-centers/espressif-systems}},
+}
+
+@misc{ESP32Versions,
+ month = {3},
+ title = {{Exploring the ESP32 versions. Differences and similarities.}},
+ year = {2023},
+ howpublished = {\url{https://www.espboards.dev/blog/esp32-soc-options/}},
+}
+
+@misc{ESP32_Llamas,
+ author = {Llamas, Luis},
+ month = {4},
+ title = {{ESP32, el "hermano mayor" del ESP8266 con WiFi y Bluetooth}},
+ year = {2018},
+ howpublished = {\url{https://www.luisllamas.es/esp32/}},
+}
+
+@misc{ESP32_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {7},
+ title = {{ESP32 - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/ESP32}},
+}
+
+@misc{ESP32_Espressif,
+ title = {{ESP32 Wi-Fi & Bluetooth SOC | Espressif Systems}},
+ howpublished = {\url{https://www.espressif.com/en/products/socs/esp32}},
+}
+
+@book{ESP32_Datasheet,
+ author = {{Espressif Systems}},
+ edition = {4.5},
+ title = {{ESP32 Series Datasheet}},
+ year = {2024},
+ howpublished = {\url{https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf}},
+}
+
+@misc{ESP_Lua,
+ author = {González, Daniel Martín},
+ month = {2},
+ title = {{Usando LUA en ESP8266 / NodeMCU con LuaLoader y ESPlorer}},
+ year = {2017},
+ howpublished = {\url{https://www.danielmartingonzalez.com/es/usando-lua-en-esp8266-nodemcu-con-lualoader-y-esplorer/}},
+}
+
+@misc{ESP_Micropython,
+ author = {Santos, Sara},
+ month = {10},
+ title = {{MicroPython IDEs for ESP32 and ESP8266 | Random Nerd Tutorials}},
+ year = {2022},
+ howpublished = {\url{https://randomnerdtutorials.com/micropython-ides-esp32-esp8266/}},
+}
+
+@misc{ProgFacil_ESP8266,
+ author = {Del Valle Hernández, Luis},
+ month = {1},
+ title = {{ESP8266 todo lo que necesitas saber del módulo WiFi para Arduino}},
+ year = {2022},
+ howpublished = {\url{https://programarfacil.com/podcast/esp8266-wifi-coste-arduino}},
+}
+
+@misc{ESP8266_Llamas,
+ author = {Llamas, Luis},
+ month = {3},
+ title = {{ESP8266, la alternativa a Arduino con Wifi}},
+ year = {2018},
+ howpublished = {\url{https://www.luisllamas.es/esp8266/}},
+}
+
+@misc{ESP8266_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {5},
+ title = {{ESP8266 - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/ESP8266}},
+}
+
+@misc{ESP8266_Espressif,
+ title = {{ESP8266 Wi-Fi SOC | Espressif Systems}},
+ howpublished = {\url{https://www.espressif.com/en/products/socs/esp8266}},
+}
+
+@book{ESP8266_Datasheet,
+ author = {{Espressif Systems}},
+ edition = {7.0},
+ title = {{ESP8266EX Datasheet}},
+ year = {2023},
+ howpublished = {\url{https://www.espressif.com/sites/default/files/documentation/0a-esp8266ex_datasheet_en.pdf}},
+}
+
@misc{EdgeCloudFog_ISA,
author = {Manole, Lucy},
month = {11},
@@ -44,6 +405,63 @@ @misc{EdgeCloudFog_Industria40
howpublished = {\url{https://www.podcastindustria40.com/fog-computing/}},
}
+@misc{Webby_IoTProts,
+ author = {Oliynyk, Kostiantyn},
+ month = {6},
+ title = {{MQTT vs Other IoT Messaging Protocols: Detailed Comparison | Webbylab}},
+ year = {2024},
+ howpublished = {\url{https://webbylab.com/blog/mqtt-vs-other-iot-messaging-protocols-detailed-comparison/}},
+}
+
+@misc{TechTarget_IoTProts,
+ author = {Pratt, Mary K.},
+ month = {7},
+ title = {{Top 12 most commonly used IoT protocols and standards}},
+ year = {2023},
+ howpublished = {\url{https://www.techtarget.com/iotagenda/tip/Top-12-most-commonly-used-IoT-protocols-and-standards}},
+}
+
+@misc{Build_IoTProts,
+ author = {Pietschmann, Chris},
+ month = {12},
+ title = {{Top 5 IoT messaging Protocols | Build5Nines}},
+ year = {2022},
+ howpublished = {\url{https://build5nines.com/top-iot-messaging-protocols/}},
+}
+
+@misc{A3logics_IoTProts,
+ author = {A3Logics},
+ month = {5},
+ title = {{A Comprehensive Guide to IoT Messaging Protocols}},
+ year = {2024},
+ howpublished = {\url{https://www.a3logics.com/blog/iot-messaging-protocols/}},
+}
+
+@misc{MQTT_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {7},
+ title = {{MQTT - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/MQTT}},
+}
+
+@misc{MQTT_Emqx,
+ author = {{Emqx Team}},
+ title = {{What Is MQTT and Why Is It the Best Protocol for IoT?}},
+ howpublished = {\url{https://www.emqx.com/en/blog/what-is-the-mqtt-protocol}},
+}
+
+@misc{MQTT_Goto,
+ title = {{Goto IoT | Introducción a MQTT}},
+ howpublished = {\url{https://www.gotoiot.com/pages/articles/mqtt_intro/}},
+}
+
+@misc{MQTT_Dzone,
+ author = {Bowers, Mike},
+ title = {{MQTT Essentials - DZOne Refcardz}},
+ howpublished = {\url{https://dzone.com/refcardz/getting-started-with-mqtt}},
+}
+
@inproceedings{MQTT_Frame,
author = {Mishra, Biswajeeban},
year = {2018},
@@ -53,6 +471,116 @@ @inproceedings{MQTT_Frame
doi = {10.1109/ICCSA.2018.8439562}
}
+@misc{PubSub_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {4},
+ title = {{Publish–subscribe pattern - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern}},
+}
+
+@misc{HiveMQ_200mil,
+ title = {{Achieving 200 Million Concurrent Connections with HiveMQ}},
+ howpublished = {\url{https://www.hivemq.com/resources/achieving-200-mil-concurrent-connections-with-hivemq/}},
+}
+
+@misc{AMQP_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {5},
+ title = {{Advanced Message queuing protocol}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol}},
+}
+
+@misc{AMQP_Goto,
+ title = {{Goto IoT | Introducción a AMQP}},
+ howpublished = {\url{https://www.gotoiot.com/pages/articles/amqp_intro/}},
+}
+
+@misc{AMQP_Emqx,
+ author = {{Emqx Team}},
+ title = {{MQTT vs AMQP for IoT Communications: Head to Head}},
+ howpublished = {\url{https://www.emqx.com/en/blog/mqtt-vs-amqp-for-iot-communications}},
+}
+
+@misc{XMPP_Wiki,
+ author = {Wikipedia contributors},
+ month = {7},
+ title = {{XMPP}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/XMPP}},
+}
+
+@misc{XMPP_PubNub,
+ title = {{What is XMPP Protocol?}},
+ howpublished = {\url{https://www.pubnub.com/guides/xmpp/}},
+}
+
+@misc{XMPP_Blazeclan,
+ author = {Blazeclan, Team},
+ month = {3},
+ title = {{XMPP for Dummies- Part 3- Stanzas in Detail}},
+ year = {2023},
+ howpublished = {\url{https://blazeclan.com/blog/xmpp-for-dummies-part-3-stanzas-in-detail/}},
+}
+
+@misc{DDS_UTPL,
+ title = {{Tutorial DDS - UTPL}},
+ howpublished = {\url{https://www.utpl.edu.ec/proyectomiddleware/?q=tutorial-dds}},
+}
+
+@misc{DDS_Standard,
+ title = {{What’s in the DDS Standard?}},
+ howpublished = {\url{https://www.dds-foundation.org/omg-dds-standard/}},
+}
+
+@misc{CoAP_EMQX,
+ author = {Team, Emqx},
+ title = {{CoAP Protocol: Key Features, Use Cases, and Pros/Cons}},
+ howpublished = {\url{https://www.emqx.com/en/blog/coap-protocol}},
+}
+
+@misc{CoAPIntro,
+ title = {{Goto IoT | Introducción a CoAP}},
+ howpublished = {\url{https://www.gotoiot.com/pages/articles/coap_intro/}},
+}
+
+@misc{rfc7252,
+ series = {Request for Comments},
+ number = 7252,
+ howpublished = {RFC 7252},
+ publisher = {RFC Editor},
+ doi = {10.17487/RFC7252},
+ howpublished = {\url{https://www.rfc-editor.org/info/rfc7252}},
+ author = {Zach Shelby and Klaus Hartke and Carsten Bormann},
+ title = {{The Constrained Application Protocol (CoAP)}},
+ pagetotal = 112,
+ year = 2014,
+ month = jun
+}
+
+@misc{ESPNOW_Espressif,
+ title = {{ESP-NOW Wireless Communication Protocol | Espressif Systems}},
+ howpublished = {\url{https://www.espressif.com/en/solutions/low-power-solutions/esp-now}},
+}
+
+@misc{ESPNOW_FAQ,
+ title = {{ESP-NOW - ESP-FAQ latest documentation}},
+ howpublished = {\url{https://docs.espressif.com/projects/esp-faq/en/latest/application-solution/esp-now.html}},
+}
+
+@misc{ESPNOW_Docs,
+ title = {{ESP-NOW - ESP-IDF Programming Guide latest documentation}},
+ howpublished = {\url{https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_now.html}},
+}
+
+@misc{ESPNOW_Emariete,
+ month = {11},
+ title = {{Comunicación vía radio para ESP8266 y ESP32 con ESPNOW}},
+ year = {2023},
+ howpublished = {\url{https://emariete.com/esp8266-esp32-espnow/}},
+}
+
@inproceedings{ESPNOW_Frame,
author = {Urazayev, Dnislam and Eduard, Aida and Ahsan, Muhammad and Zorbas, Dimitrios},
year = {2023},
@@ -62,6 +590,130 @@ @inproceedings{ESPNOW_Frame
doi = {10.1109/SIST58284.2023.10223585}
}
+@misc{WifiESPMTU,
+ author = {espressif},
+ title = {{arduino-esp32/libraries/Network/src/NetworkUdp.cpp at master · espressif/arduino-esp32}},
+ howpublished = {\url{https://github.com/espressif/arduino-esp32/blob/master/libraries/Network/src/NetworkUdp.cpp}},
+}
+
+@misc{Wifi_WikiEn,
+ author = {{Wikipedia contributors}},
+ month = {7},
+ title = {{Wi-Fi - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Wi-Fi}},
+}
+
+@misc{Wifi_WikiEs,
+ author = {{Colaboradores de Wikipedia}},
+ month = {7},
+ title = {{Wifi - Wikipedia}},
+ year = {2024},
+ howpublished = {\url{https://es.wikipedia.org/wiki/Wifi}},
+}
+
+@misc{Wifi_Official,
+ title = {{Internet of Things | Wi-Fi Alliance}},
+ howpublished = {\url{https://www.wi-fi.org/discover-wi-fi/internet-things}},
+}
+
+@article{Wifi_AZone,
+ author = {Gallego, Guille},
+ month = {4},
+ title = {{Qué es el WiFi y cómo funciona para conectar todo a Internet}},
+ year = {2024},
+ howpublished = {\url{https://www.adslzone.net/reportajes/tecnologia/que-es-wifi-como-funciona/}},
+}
+
+@misc{Wifi_Proofpoint,
+ month = {12},
+ title = {{¿Qué es el wifi? - Tipos de conexiones wifi y seguridad | Proofpoint ES}},
+ year = {2023},
+ howpublished = {\url{https://www.proofpoint.com/es/threat-reference/wifi}},
+}
+
+@misc{WifiComparison_Intel,
+ title = {{Diferentes protocolos de Wi-Fi y velocidades de datos - Intel}},
+ howpublished = {\url{https://www.intel.la/content/www/xl/es/support/articles/000005725/wireless/legacy-intel-wireless-products.html}},
+}
+
+@misc{WifiComparison_Monolitic,
+ author = {Monolitic},
+ month = {6},
+ title = {{¿Cuál es la mejor tecnología WiFi para desarrollos IoT? - Monolitic}},
+ year = {2023},
+ howpublished = {\url{https://www.monolitic.com/cual-es-la-mejor-tecnologia-wifi-para-desarrollos-iot/}},
+}
+
+@misc{WifiComparison_Makeuseof,
+ author = {Phillips, Gavin},
+ month = {12},
+ title = {{The Most Common Wi-Fi Standards and Types, Explained}},
+ year = {2023},
+ howpublished = {\url{https://www.makeuseof.com/tag/understanding-common-wifi-standards-technology-explained/}},
+}
+
+@misc{WifiComparison_Netspot,
+ author = {Morelo, David},
+ month = {7},
+ title = {{Descubra los estándares WiFi, incluido el último WiFi 6 (802.11ax)}},
+ year = {2024},
+ howpublished = {\url{https://www.netspotapp.com/es/blog/wifi-standards/}},
+}
+
+@misc{WifiComparison_Xataka,
+ author = {Aguilar, Ricardo},
+ month = {5},
+ title = {{WiFi 7: qué es, para qué sirve y todas las novedades del nuevo estándar WiFi}},
+ year = {2024},
+ howpublished = {\url{https://www.xataka.com/nuevo/nuevo-wifi-7-informacion}},
+}
+
+@misc{WifiComparison_Geckoandfly,
+ author = {Tengyuen, Ngan},
+ month = {3},
+ title = {{5 Wireless Wifi 802.11 a, b, g, n, ac, ad, ah, aj, ax, ay Router Range and Distance Comparison}},
+ year = {2023},
+ howpublished = {\url{https://www.geckoandfly.com/10041/wireless-wifi-802-11-abgn-router-range-and-distance-comparison/}},
+}
+
+@misc{WifiComparison_Business,
+ author = {Peek, Sean},
+ month = {4},
+ title = {{Why You Should Care About IEEE 802.11ax}},
+ year = {2024},
+ howpublished = {\url{https://www.business.com/articles/what-is-802-11-ax-wi-fi/}},
+}
+
+@misc{Bluetooth_Official,
+ title = {{Bluetooth Technology Overview | Bluetooth® Technology Website}},
+ howpublished = {\url{https://www.bluetooth.com/learn-about-bluetooth/tech-overview/}},
+}
+
+@misc{Bluetooth_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {6},
+ title = {{Bluetooth}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Bluetooth}},
+}
+
+@misc{Bluetooth_Xataka,
+ author = {Carmona, Jose Antonio},
+ month = {10},
+ title = {{Bluetooth y su evolución: estas son las diferencias entre las distintas clases y versiones}},
+ year = {2021},
+ howpublished = {\url{https://www.xatakahome.com/curiosidades/bluetooth-su-evolucion-estas-diferencias-distintas-versiones}},
+}
+
+@misc{Bluetooth_Mokosmart,
+ author = {Kuan, Fiona},
+ month = {12},
+ title = {{What is Bluetooth IoT and Why Choose It?}},
+ year = {2023},
+ howpublished = {\url{https://www.mokosmart.com/es/what-is-bluetooth-iot-and-why-choose-it/}},
+}
+
@misc{Zigbee_Wiki,
author = {{Wikipedia contributors}},
month = {6},
@@ -113,6 +765,21 @@ @inproceedings{ESPNOW_WiFi_BT_Comparison
doi={10.1109/iSemantic52711.2021.9573246}
}
+@misc{DiffBl542_Amar,
+ author = {Amar},
+ month = {2},
+ title = {{Differences Between Bluetooth 5 vs 4.2}},
+ year = {2023},
+ howpublished = {\url{https://www.amarinfotech.com/differences-comparisons-bluetooth-5-vs-4-2.html}},
+}
+
+@article{BlePacket,
+ author = {Gupta, Sachin},
+ month = {8},
+ title = {{BLE v4.2: Creating Faster, More Secure, Power-Efficient Designs—Part 1}},
+ year = {2016},
+ howpublished = {\url{https://www.electronicdesign.com/technologies/communications/article/21801788/ble-v42-creating-faster-more-secure-power-efficient-designspart-1}},
+}
@misc{Ryzen7Specs,
author = {David Baños Expósito},
@@ -138,6 +805,82 @@ @misc{Pot_TiendaRobotica
howpublished = {\url{https://centroderobotica.com/producto/potenciometro-para-proyectos/}}
}
+@misc{ESP32_CYD_Git,
+ author = {Witnessmenow},
+ title = {{GitHub - witnessmenow/ESP32-Cheap-Yellow-Display: Building a community around a cheap ESP32 Display with a touch screen}},
+ howpublished = {\url{https://github.com/witnessmenow/ESP32-Cheap-Yellow-Display/}},
+}
+
+@misc{ModuloSDSF,
+ title = {{SparkFun MicroSD Transflash Breakout}},
+ howpublished = {\url{https://www.sparkfun.com/products/544}},
+}
+
+@misc{Wiki_Spi,
+ author = {{Colaboradores de Wikipedia}},
+ month = {12},
+ title = {{Serial Peripheral Interface}},
+ year = {2023},
+ howpublished = {\url{https://es.wikipedia.org/wiki/Serial_Peripheral_Interface}},
+}
+
+@misc{DHT11_Specs,
+ title = {{Módulo sensor DHT11 humedad y temperatura BricoGeek | BricoGeek.com}},
+ howpublished = {\url{https://tienda.bricogeek.com/sensores-temperatura/1574-modulo-sensor-dht11-humedad-y-temperatura.html}},
+}
+
+@misc{Hostinger_Git,
+ author = {B, Gustavo and B, Gustavo},
+ month = {1},
+ title = {{Qué es GitHub y cómo empezar a usarlo}},
+ year = {2023},
+ howpublished = {\url{https://www.hostinger.es/tutoriales/que-es-github#%C2%BFQue_es_Git}},
+}
+
+@misc{WikiGitHub,
+ author = {{Wikipedia contributors}},
+ month = {7},
+ title = {{GitHub}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/GitHub}},
+}
+
+@misc{GitHub_Commits,
+ title = {{About commits - GitHub Docs}},
+ howpublished = {\url{https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits}},
+}
+
+@misc{GitAndGitHubDocs,
+ title = {{Acerca de GitHub y Git - Documentación de GitHub}},
+ howpublished = {\url{https://docs.github.com/es/get-started/start-your-journey/about-github-and-git}},
+}
+
+@misc{GitHub_Issues,
+ title = {{Acerca de las propuestas - Documentación de GitHub}},
+ howpublished = {\url{https://docs.github.com/es/issues/tracking-your-work-with-issues/about-issues}},
+}
+
+@misc{GHDesktop_Whatis,
+ title = {{GitHub Desktop | Simple collaboration from your desktop}},
+ year = {2024},
+ howpublished = {\url{https://github.com/apps/desktop}},
+}
+
+@misc{WhyVSC,
+ month = {11},
+ title = {{Why Visual Studio code?}},
+ year = {2021},
+ howpublished = {\url{https://code.visualstudio.com/docs/editor/whyvscode}},
+}
+
+@misc{VSC_Wiki,
+ author = {Wikipedia contributors},
+ month = {7},
+ title = {{Visual Studio Code}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Visual_Studio_Code}},
+}
+
@misc{CppProgrammingVSC,
month = {7},
title = {{C++ programming with Visual Studio Code}},
@@ -174,6 +917,38 @@ @misc{GHEducation
note = {{Accedido: 12 Jun 2024}}
}
+@misc{WhatIsPlatformIO,
+ title = {{What is PlatformIO? — PlatformIO latest documentation}},
+ howpublished = {\url{https://docs.platformio.org/en/latest/what-is-platformio.html}},
+}
+
+@misc{PlatformIOPlatforms,
+ title = {{Development Platforms — PlatformIO latest documentation}},
+ howpublished = {\url{https://docs.platformio.org/en/latest/platforms/index.html}},
+}
+
+@misc{PlatformIODependencies,
+ title = {{Dependency Management — PlatformIO latest documentation}},
+ howpublished = {\url{https://docs.platformio.org/en/latest/librarymanager/dependencies.html}},
+}
+
+@misc{PlatformIOIdeIntegration,
+ title = {{Cloud & Desktop IDEs — PlatformIO latest documentation}},
+ howpublished = {\url{https://docs.platformio.org/en/latest/integration/ide/index.html}},
+}
+
+@misc{PlatformIORegistry,
+ title = {{PlatformIO Registry}},
+ howpublished = {\url{https://registry.platformio.org/}},
+}
+
+@misc{PIOFramework,
+ month = {3},
+ title = {{ESP-IDF vs Arduino Core: Which Framework to Choose in 2023}},
+ year = {2023},
+ howpublished = {\url{https://www.espboards.dev/blog/esp-idf-vs-arduino-core/}},
+}
+
@misc{VisualParadigm,
author = {{EcuRed}},
title = {{Visual Paradigm - ECUReD}},
@@ -208,6 +983,34 @@ @misc{TodoTree_VSMarketplace
note = {{Accedido: 12 Jun 2024}}
}
+@misc{Trello_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {5},
+ title = {{Trello}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Trello}},
+}
+
+@misc{Trello_Main,
+ title = {{Gestiona los proyectos de tu equipo desde cualquier lugar | Trello}},
+ howpublished = {\url{https://trello.com/es}},
+}
+
+@misc{Trello_Tour,
+ title = {{Qué es Trello: descubre sus funciones, usos y todo lo que ofrece | Trello}},
+ howpublished = {\url{https://trello.com/es/tour}},
+}
+
+@misc{Doxygen_Main,
+ title = {{Doxygen homepage}},
+ howpublished = {\url{https://doxygen.nl/}},
+}
+
+@misc{DoxyAwesome_Main,
+ title = {{Doxygen awesome}},
+ howpublished = {\url{https://jothepro.github.io/doxygen-awesome-css/}},
+}
+
@misc{SpellChecker_VSMarketplace,
author = {{Street Side Software}},
title = {{Code Spell Checker - Visual Studio Marketplace}},
@@ -234,6 +1037,122 @@ @misc{GH_TrelloPU
note = {{Accedido: 13 Jun 2024}}
}
+@misc{FelixTemplate,
+ title = {{Template for the Bachelor’s Final Project (TFG) - Felix Albertos}},
+ howpublished = {\url{https://www.felixalbertos.com/resources/downloads/tfg_template.html}}
+}
+
+@misc{Microsoft365WhatIs,
+ author = {Microsoft},
+ title = {{Compara todos los planes de Microsoft 365 (anteriormente Office 365): Microsoft Store}},
+ howpublished = {\url{https://www.microsoft.com/es-ES/microsoft-365/buy/compare-all-microsoft-365-products}},
+}
+
+@misc{MSTeams_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {7},
+ title = {{Microsoft Teams}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Microsoft_Teams}},
+}
+
+@misc{MSTeams_Buy,
+ title = {{Compara precios y planes de las opciones para empresas online | Microsoft Teams}},
+ howpublished = {\url{https://www.microsoft.com/es-es/microsoft-teams/compare-microsoft-teams-business-options}},
+}
+
+@misc{Teams_Demo,
+ title = {{Teams Basics}},
+ howpublished = {\url{https://teamsdemo.office.com}},
+}
+
+@misc{Visio_Main,
+ title = {{Software de diagramación y creación de diagramas de flujo | Microsoft Visio}},
+ howpublished = {\url{https://www.microsoft.com/es-es/microsoft-365/visio/flowchart-software}},
+}
+
+@misc{Visio_Wiki,
+ author = {{Wikipedia contributors}},
+ month = {5},
+ title = {{Microsoft Visio}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/Microsoft_Visio}},
+}
+
+@misc{FundamentosCpp,
+ title = {{El lenguaje C++ — Fundamentos de Programación en C++}},
+ howpublished = {\url{https://www2.eii.uva.es/fund_inf/cpp/temas/1_introduccion/introduccion.html}},
+}
+
+@misc{ProgImperativaDef,
+ title = {{Programación imperativa _ AcademiaLab}},
+ howpublished = {\url{https://academia-lab.com/enciclopedia/programacion-imperativa/}},
+}
+
+@misc{CppAprendiendoArdu,
+ author = {Jecrespom},
+ month = {3},
+ title = {{Lenguaje de programación C++}},
+ year = {2015},
+ howpublished = {\url{https://aprendiendoarduino.wordpress.com/2015/03/26/lenguaje-de-programacion-c/}},
+}
+
+@misc{Cpp_Wiki,
+ author = {Wikipedia contributors},
+ month = {7},
+ title = {{C++}},
+ year = {2024},
+ howpublished = {\url{https://en.wikipedia.org/wiki/C%2B%2B}},
+}
+
+@book{EssentialC,
+ author = {Parlante, Nick},
+ month = {4},
+ title = {{Essential c}},
+ year = {2003},
+ howpublished = {\url{http://cslibrary.stanford.edu/101/EssentialC.pdf}},
+}
+
+@misc{FreeRTOSArduino,
+ author = {Llamas, Luis},
+ month = {12},
+ title = {{Cómo usar FreeRTOS en Arduino}},
+ year = {2021},
+ howpublished = {\url{https://www.luisllamas.es/como-usar-freertos-en-arduino/}},
+}
+
+@misc{Wiki_FreeRTOS,
+ author = {{Colaboradores de Wikipedia}},
+ month = {9},
+ title = {{FreeRTOS}},
+ year = {2023},
+ howpublished = {\url{https://es.wikipedia.org/wiki/FreeRTOS}},
+}
+
+@misc{ArduinoJson_Serialize,
+ author = {BenoitBlanchon},
+ title = {{Can I automatically serialize an object?}},
+ howpublished = {\url{https://arduinojson.org/v7/faq/automatically-serialize-an-object/}},
+}
+
+@misc{ArduinoJson_Tutorial,
+ author = {Llamas, Luis},
+ month = {9},
+ title = {{Cómo usar ficheros Json en Arduino con Arduino Json}},
+ year = {2019},
+ howpublished = {\url{https://www.luisllamas.es/en/arduino-json/}},
+}
+
+@misc{Elog_PIOReg,
+ title = {{PlatformIO Registry - x385832/Elog}},
+ howpublished = {\url{https://registry.platformio.org/libraries/x385832/Elog}},
+}
+
+@misc{MD_Description,
+ title = {{Getting started | Markdown Guide}},
+ howpublished = {\url{https://www.markdownguide.org/getting-started/}},
+}
+
@misc{Mets_Tecnitium,
author = {Meno, Alejandro},
month = {9},
diff --git a/tfg_report/templateAPP/input/resources/images/hardware_placas.png b/tfg_report/templateAPP/input/resources/images/hardware_placas.png
new file mode 100644
index 0000000..13e5011
Binary files /dev/null and b/tfg_report/templateAPP/input/resources/images/hardware_placas.png differ
diff --git a/tfg_report/templateAPP/input/resumen.md b/tfg_report/templateAPP/input/resumen.md
index b40d8cb..3ca2738 100644
--- a/tfg_report/templateAPP/input/resumen.md
+++ b/tfg_report/templateAPP/input/resumen.md
@@ -1 +1,2 @@
-Esta plantilla puede modificarse para adaptarse a las particularidades de cada Proyecto, tanto en contenido como en formato, siempre y cuando se respete las directrices básicas indicadas en la guía de estilo y formato para la elaboración de TFG del Grado en Ingeniería Informática de la Facultad de Ciencias Sociales y Tecnologías de la Información de Talavera de la Reina.
+El Internet de las Cosas es muy relevante en la sociedad actual, ya que permite crear sistemas para recopilar y procesar datos, así como transmitir órdenes a distintos dispositivos. Sin embargo, la implantación de estos sistemas presenta problemas en ciertos entornos debido a diversas dificultades y costos. Estas dificultades pueden surgir por la imposibilidad de instalar una red de Internet, el alto consumo de energía de los dispositivos o la necesidad de utilizar una red inalámbrica sin una infraestructura adecuada para procesar y transmitir mensajes.
+Para solucionar esta problemática, se propone el protocolo LoboMQ, que permite gestionar mensajes transmitidos entre varios microcontroladores de bajo consumo mediante colas de mensajes inspiradas en el patrón publicación-suscripción de MQTT, y aprovecha ESP-NOW para realizar las transmisiones sin necesidad de una red de Internet. El fin del desarrollo del protocolo y su implementación en una librería C++ es ofrecer una solución sencilla de utilizar a la comunidad del Internet de las Cosas
diff --git a/tfg_report/templateAPP/output/tfgii.pdf b/tfg_report/templateAPP/output/tfgii.pdf
index 976021c..e71dc43 100644
Binary files a/tfg_report/templateAPP/output/tfgii.pdf and b/tfg_report/templateAPP/output/tfgii.pdf differ
diff --git a/tfg_report/templateAPP/static/source/firstPage.md b/tfg_report/templateAPP/static/source/firstPage.md
index 845b588..a5c527e 100644
--- a/tfg_report/templateAPP/static/source/firstPage.md
+++ b/tfg_report/templateAPP/static/source/firstPage.md
@@ -44,7 +44,7 @@ TRABAJO FIN DE GRADO
\vspace*{\fill}
-\Month , \Year
+\Month, \Year
\endgroup
diff --git a/tfg_report/templateAPP/static/source/frontPage.md b/tfg_report/templateAPP/static/source/frontPage.md
index 7b57be3..bf611fe 100644
--- a/tfg_report/templateAPP/static/source/frontPage.md
+++ b/tfg_report/templateAPP/static/source/frontPage.md
@@ -33,7 +33,7 @@ TRABAJO FIN DE GRADO
\vspace*{\fill}
-\Month , \Year
+\Month, \Year
\end{center}
diff --git a/tfg_report/templateAPP/static/source/header.md b/tfg_report/templateAPP/static/source/header.md
index cbc2a18..87daf47 100644
--- a/tfg_report/templateAPP/static/source/header.md
+++ b/tfg_report/templateAPP/static/source/header.md
@@ -6,7 +6,7 @@ header-includes: |
\usepackage{fontspec}
\setmainfont{Times New Roman}
\usepackage[top=1in,bottom=1in,left=3.25cm,right=3.5cm]{geometry}
- \renewcommand{\baselinestretch}{1.5}
+ \renewcommand{\baselinestretch}{1.25}
\usepackage{lipsum}
\usepackage{graphicx}
\usepackage{fancyhdr}
@@ -40,7 +40,7 @@ header-includes: |
\renewcommand{\lstlistlistingname}{Índice de Listados}
}
\lstset{
- basicstyle=\ttfamily\fontsize{10.5}{11.5}\selectfont,
+ basicstyle=\ttfamily\fontsize{10.4}{12.0}\selectfont,
columns=fullflexible,
frame=single,
breaklines=true,
diff --git a/tfg_report/templateAPP/static/tmp/dedication.md b/tfg_report/templateAPP/static/tmp/dedication.md
index 0a57612..304135a 100644
--- a/tfg_report/templateAPP/static/tmp/dedication.md
+++ b/tfg_report/templateAPP/static/tmp/dedication.md
@@ -1,5 +1,4 @@
\begin{flushright}
\textit
-Dedicado a mi familia y a todos\\
-aquellos ...\\
+Dedicado a todos los que han estado ahí\\
\end{flushright}
diff --git a/tfg_report/templateAPP/static/tmp/firstPage.md b/tfg_report/templateAPP/static/tmp/firstPage.md
index 79aa5c5..9043146 100644
--- a/tfg_report/templateAPP/static/tmp/firstPage.md
+++ b/tfg_report/templateAPP/static/tmp/firstPage.md
@@ -44,7 +44,7 @@ Cotutor Académico: \Cotutor
\vspace*{\fill}
-\Month , \Year
+\Month, \Year
\endgroup
diff --git a/tfg_report/templateAPP/static/tmp/frontPage.md b/tfg_report/templateAPP/static/tmp/frontPage.md
index b5e68e2..f458e26 100644
--- a/tfg_report/templateAPP/static/tmp/frontPage.md
+++ b/tfg_report/templateAPP/static/tmp/frontPage.md
@@ -33,7 +33,7 @@ GRADO EN INGENIERÍA INFORMÁTICA
\vspace*{\fill}
-\Month , \Year
+\Month, \Year
\end{center}
diff --git a/tfg_report/templateAPP/static/tmp/header.md b/tfg_report/templateAPP/static/tmp/header.md
index dceeaf6..f855942 100644
--- a/tfg_report/templateAPP/static/tmp/header.md
+++ b/tfg_report/templateAPP/static/tmp/header.md
@@ -9,7 +9,7 @@ header-includes: |
\usepackage{fontspec}
\setmainfont{Times New Roman}
\usepackage[top=1in,bottom=1in,left=3.25cm,right=3.5cm]{geometry}
- \renewcommand{\baselinestretch}{1.5}
+ \renewcommand{\baselinestretch}{1.25}
\usepackage{lipsum}
\usepackage{graphicx}
\usepackage{fancyhdr}
@@ -43,7 +43,7 @@ header-includes: |
\renewcommand{\lstlistlistingname}{Índice de Listados}
}
\lstset{
- basicstyle=\ttfamily\fontsize{10.5}{11.5}\selectfont,
+ basicstyle=\ttfamily\fontsize{10.4}{12.0}\selectfont,
columns=fullflexible,
frame=single,
breaklines=true,