{"id":4492,"date":"2020-09-19T13:35:02","date_gmt":"2020-09-19T12:35:02","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4492"},"modified":"2025-10-11T05:06:08","modified_gmt":"2025-10-11T03:06:08","slug":"el-gateway-lora-hardware-y-software","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4492","title":{"rendered":"El gateway LoRa*. Hardware y software"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 3 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=gateway-lorawan\" class=\"series-1836\" title=\"Gateway LoRaWAN\">Gateway LoRaWAN<\/a><\/div><p>Seguimos haciendo progresos con mi gateway LoRaWAN. En este caso, en el \u00e1mbito del gateway en s\u00ed. El lector avispado habr\u00e1 notado que he encabezado este art\u00edculo con Lora* en vez de con LoRaWAN. Y es que en este punto lo que tengo implementado es m\u00e1s bien un gateway LoRa que act\u00faa de pasarela a un servidor MQTT, y no un gateway LoRaWAN propiamente dicho. \u00bfCu\u00e1l es la diferencia? Es sutil, pero importante. A estas alturas lo que he implementado es un gateway, s\u00ed, entre dispositivos, y terceros servidores, pero no realizo a\u00fan control de acceso, identificadores de equipos en la red, ni nada por el estilo. As\u00ed que no puedo -en realidad- considerarlo un gateway LoRaWAN completo. Pero de momento, para el prop\u00f3sito que manejo, basta y sobra.<\/p>\n<figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7539\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/20200805_094600-me.jpg\" alt=\"20200805 094600\" \/><\/a><figcaption><strong>20200805 094600<\/strong><\/figcaption><\/figure>\n<p>Ya he hablado con anterioridad del dispositivo que estoy utilizando para construir el gateway: se trata de una placa Heltec Lora 32, que proporciona capacidad de conexi\u00f3n LoRa, WiFi y Bluetooth, incluyendo la variante Low Energy. Con anterioridad he estado haciendo pruebas con la variante de 433 MHz, pero para este proyecto en cuesti\u00f3n he optado por respetar la normativa radioel\u00e9ctrica europea, y desplegarlo con la variante de 868 MHz, de la que dispon\u00eda de un dispositivo que hasta ahora no hab\u00eda hecho un gran uso (en parte porque vino con la pantalla OLED quebrada, y \u00e9sta funciona bastante mal). Otro elemento de la configuraci\u00f3n es la antena de recepci\u00f3n y el adaptador el\u00e9ctrico, pero estos elementos quedar\u00e1n para otro art\u00edculo.<\/p>\n<p>En lo referente al software, he desarrollado un software con las siguientes caracter\u00edsticas:<\/p>\n<ul>\n<li>La base del sistema son las <a href=\"https:\/\/github.com\/HelTecAutomation\/Heltec_ESP32\" target=\"_blank\">librer\u00edas de Heltec<\/a> que permiten implementar comunicaciones LoRa. Los aspectos principales de la configuraci\u00f3n ha sido establecer los <a href=\"http:\/\/community.heltec.cn\/t\/cube-cell-and-esp32-lora-problems\/953\" target=\"_blank\">par\u00e1metros de conexi\u00f3n adecuados<\/a> para comunicarse adecuadamente con los dispositivos cliente, en este caso unos Heltec CubeCell. En concreto, los siguientes aspectos son los que hay que configurar:<br \/>\n  LoRa.setSpreadingFactor(8);<br \/>\n  LoRa.setSignalBandwidth(125E3);<br \/>\n  LoRa.setCodingRate4(4);<br \/>\n  LoRa.setPreambleLength(8);<br \/>\n  LoRa.setSyncWord(0x12);<\/li>\n<li>El siguiente punto de importancia es la implementaci\u00f3n de un sistema de configuraci\u00f3n de la conexi\u00f3n del cliente WiFi mediante un AP provisional: <a href=\"https:\/\/github.com\/prampec\/IotWebConf\" target=\"_blank\">IotWebConf<\/a>. Con esta librer\u00eda, v\u00e1lida para dispositivos ESP8266 y ESP32, se puede levantar un portal web y un AP para realizar la configuraci\u00f3n de la WiFi en el dispositivo. La idea es sencilla: cuando el dispositivo no tiene configurada una conexi\u00f3n WiFi, levanta un punto de acceso con un portal web de configuraci\u00f3n, al que se puede conectar para establecer los par\u00e1metros de la WiFi (as\u00ed como otro tipo de par\u00e1metros configurables, como el servidor MQTT, por ejemplo). Una vez establecidos, el sistema almacena estos par\u00e1metros en la EEPROM de la placa, reinicia, y conecta a la WiFi proporcionada. Tambi\u00e9n permite introducir una nueva configuraci\u00f3n WiFi en caso de que se mueva el dispositivo a una ubicaci\u00f3n en la que la WiFi configurada no tenga alcance. La principal ventaja es que no hay que preconfigurar en c\u00f3digo los par\u00e1metros de conexi\u00f3n, pudiendo hacerlo en tiempo de ejecuci\u00f3n. A continuaci\u00f3n se puede ver una captura de la interfaz web que se levanta:<\/li>\n<figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7567\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/galleries\/albums\/202009-LoRaWAN\/portal-wifi.jpg\" alt=\"portal-wifi\" \/><\/a><figcaption><strong>portal-wifi<\/strong><\/figcaption><\/figure>\n<li>Otro aspecto adicional de esta librer\u00eda es que permite realizar la actualizaci\u00f3n de firmware On-The-Air: la interfaz web proporciona una v\u00eda para cargar el software precompilado de Arduino en la placa, sin tener que conectar la misma a un PC mediante cable, adem\u00e1s de incluir un sistema de seguimiento de versiones de firmware. Sumamente \u00fatil, teniendo en cuenta que el gateway va a estar ubicado, en mi caso, en lo alto del tejado.<\/li>\n<li>Por \u00faltimo, he realizado algunos ajustes adicionales en optimizaci\u00f3n de la transmisi\u00f3n de datos entre dispositivo y gateway. La principal (en el caso de transmisi\u00f3n de valores num\u00e9ricos) es la utilizaci\u00f3n de codificaci\u00f3n hexadecimal, para transmitir menos bytes y optimizar el tiempo de vuelo de los datos.<\/li>\n<\/ul>\n<p>En cuanto a la recepci\u00f3n de datos, ha sido sumamente exitosa. En el c\u00f3digo de ejemplo utilizado en el cliente, se env\u00eda una trama compuesta de dos valores en hexadecimal, que son inyectados en un <em>topic<\/em> MQTT, junto con el valor del RSSI de la transmisi\u00f3n, a fin de controlar la calidad de la misma. El servidor MQTT se encuentra completamente ajeno al sistema, siendo un servidor multifunci\u00f3n que utilizo para diversos proyectos.<\/p>\n<figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7569\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/galleries\/albums\/202009-LoRaWAN\/trafico-mqtt.jpg\" alt=\"trafico-mqtt\" \/><\/a><figcaption><strong>trafico-mqtt<\/strong><\/figcaption><\/figure>\n<p>El resultado es, hasta ahora, bastante bueno. En pr\u00f3ximos cap\u00edtulos hablar\u00e9 de otros elementos del sistema.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 3 de 7 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=gateway-lorawan\" class=\"series-1836\" title=\"Gateway LoRaWAN\">Gateway LoRaWAN<\/a><\/div><p>Seguimos haciendo progresos con mi gateway LoRaWAN. En este caso,<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[133,489,673,686,716,789,996,998,1134,1199],"series":[1836],"class_list":["post-4492","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-arduino","tag-cubecell","tag-firmware","tag-fota","tag-gateway","tag-heltec","tag-lora","tag-lorawan","tag-mqtt","tag-on-the-air","series-gateway-lorawan"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4492"}],"version-history":[{"count":1,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4492\/revisions"}],"predecessor-version":[{"id":11029,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4492\/revisions\/11029"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4492"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}