{"id":4508,"date":"2020-09-30T20:23:41","date_gmt":"2020-09-30T19:23:41","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4508"},"modified":"2025-10-11T05:07:28","modified_gmt":"2025-10-11T03:07:28","slug":"un-gateway-lorawan-de-un-canal-trasteando-con-el-protocolo","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4508","title":{"rendered":"Un gateway LoRaWAN de un canal. Trasteando con el protocolo"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 7 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>Comentaba en un art\u00edculo anterior de la serie que hab\u00eda implementado un <a href=\"http:\/\/bitacora.eniac2000.com\/?p=4492\" title=\"El gateway LoRa*. Hardware y software\" target=\"_blank\">gateway LoRa*<\/a>. Y no me faltaba raz\u00f3n. Estaba haciendo uso del protocolo LoRa de enlace basado en 868 MHz para enviar se\u00f1ales de entre un nodo emisor y un receptor, y de este \u00faltimo a un servidor MQTT. \u00bfCu\u00e1l es la diferencia? La m\u00e1s importante es que no estaba realizando ning\u00fan tipo de verificaci\u00f3n de nodos, sin ni siquiera molestarme en verificar cu\u00e1l es el emisor y cu\u00e1l el receptor. Y ni hablemos de cifrado de comunicaciones ni nada que se le parezca. Pero para las pruebas preliminares que ven\u00eda efectuando, en lo que el aspecto importante era verificar alcance entre nodos, sobraba y bastaba. Por cierto, para ver m\u00e1s detalles de las diferencias entre LoRa y LoRaWAN, tengo <a href=\"http:\/\/bitacora.eniac2000.com\/?p=4388\" title=\"M\u00e1s all\u00e1 de LoRa: LoRaWan\" target=\"_blank\">otro art\u00edculo dedicado a tal efecto<\/a>.<\/p>\n<p>Pero para este proyecto necesitaba dar un paso m\u00e1s all\u00e1, e implementar un verdadero gateway LoRaWAN. Y eso implicaba hacer uso de una red LoRaWAN, que proporcione su servidor de procesado de tr\u00e1fico de red, y te permita explotar los datos enviados desde los dispositivos. Cuando te enfrentas a esto, tienes dos posibilidades: o te implementas la red, o te conectas a una ya existente. Sobre la primera opci\u00f3n ya hablaremos m\u00e1s adelante, en un art\u00edculo al respecto, pero para salir r\u00e1pidamente del paso hice uso de la segunda. Existe una red p\u00fablica a la que puedes conectar gateways y dispositivos LoRaWAN, que es la red <a href=\"https:\/\/www.thethingsnetwork.org\/\" target=\"_blank\">The Things Network<\/a>, o TTN. Cuando te registras como usuario, puedes a\u00f1adir a la red tanto dispositivos como gateways. Si haces lo primero, dependes de que haya alg\u00fan gateway cercano a ti para que tus dispositivos env\u00eden datos a la red. Pero si no tienes ning\u00fan gateway a tu alcance, no te queda otra que implementar un gateway, y conectarlo a la red. Que es precisamente de lo que va esta serie.<\/p>\n<p>Tengo que decir algo desde un principio: estoy haciendo trampas. Una de las especificaciones del protocolo LoRaWAN es que a la hora de establecer un enlace entre dispositivo y gateway se puede utilizar de manera aleatoria cualquier canal de la banda que est\u00e9s utilizando. En el caso de Europa, la banda es la de 868 MHz, y existen <a href=\"http:\/\/https:\/\/www.thethingsnetwork.org\/docs\/lorawan\/frequency-plans.html\" target=\"_blank\">9 canales dedicados a tal efecto<\/a> (aunque en realidad son 8+1). La raz\u00f3n para ello es evitar la congesti\u00f3n en cualquiera de los canales, siendo la red la encargada de analizar esta circunstancia, y la responsable de tomar las medidas necesarias (cambio de canal) para solucionarlo. Para ello, la idea es que cuando se configura un nuevo gateway, tu hardware tiene que estar preparado para operar en estos canales. El problema, en mi caso, es que el hardware del que dispongo s\u00f3lo es capaz de funcionar en un solo canal. \u00bfY cu\u00e1l es este hardware? Nuestro viejo amigo el Heltec LoRa 32.<\/p>\n<figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7560\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/IMG_20200930_202951961_2-me.jpg\" alt=\"IMG 20200930 202951961 2\" \/><\/a><figcaption><strong>IMG 20200930 202951961 2<\/strong><\/figcaption><\/figure>\n<p>Tras trastear un poco por Internet, encontr\u00e9 un <a href=\"https:\/\/github.com\/things4u\/ESP-1ch-Gateway\" target=\"_blank\">proyecto bastante interesante de Things4U que consiste exactamente en eso: implementar un gateway de un solo canal<\/a>. Por supuesto, es un proyecto experimental que no debe usarse en un sistema en producci\u00f3n, pero para mis prop\u00f3sitos de investigaci\u00f3n basta y sobra. La instalaci\u00f3n es bastante sencilla: tan simple como descargar el c\u00f3digo (viene con todas sus librer\u00edas), y en el caso de Arduino, hacer lo siguiente:<\/p>\n<ul>\n<li>Crear un proyecto, y copiar al mismo el contenido del directorio <em>ESP-sc-gway<\/em>. Por otro lado, copiar el contenido del directorio <em>lib<\/em> en el directorio <em>libraries<\/em> de tu instalaci\u00f3n de Arduino.<\/li>\n<li>Por otro lado, editar el contenido de los ficheros <em>configGway.h<\/em> y <em>configNode.h<\/em>, que permiten establecer los par\u00e1metros de red WiFi a la que conectarse, modelo de dispositivo utilizado (Heltec, en mi caso), banda a utilizar (868), y algunos elementos adicionales como a qu\u00e9 nodo de la red TTN conectarse.<\/li>\n<li>Compilar y listo. El dispositivo levanta una interfaz web que permite verificar el funcionamiento del mismo y cambiar algunos par\u00e1metros en tiempo de ejecuci\u00f3n, y muestra informaci\u00f3n del comportamiento del dispositivo en la pantalla de cristal l\u00edquido.<\/li>\n<\/ul>\n<p><figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7561\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/Screenshot_20200927-103047-me.png\" alt=\"Screenshot 20200927-103047\" \/><\/a><figcaption><strong>Screenshot 20200927-103047<\/strong><\/figcaption><\/figure><br \/>\n<strong>Captura de pantalla de la web de administraci\u00f3n del gateway<\/strong><\/p>\n<p>Si todo ha ido bien, tu gateway se conectar\u00e1 a la red TTN (donde es preciso configurar tu gateway, aunque por lo que he visto no parece interactuar demasiado bien con la informaci\u00f3n de estado del mismo), y es cuesti\u00f3n de encender un dispositivo, empezar a emitir, y ver entrar los paquetes en tu aplicaci\u00f3n:<\/p>\n<figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7562\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/Screenshot_20200927-103236-me.png\" alt=\"Screenshot 20200927-103236\" \/><\/a><figcaption><strong>Screenshot 20200927-103236<\/strong><\/figcaption><\/figure>\n<p>&#8230;s\u00ed claro. Ojal\u00e1. <img src=\"https:\/\/bitacora.eniac2000.com\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> Y es que hay un <em>peque\u00f1o<\/em> problema. Con esto hemos configurado nuestro gateway para que trabaje en un solo canal, pero por defecto nuestro dispositivo trabajar\u00e1 en <em>cualquier<\/em> canal de la banda, de manera aleatoria. Y esto implica que s\u00f3lo vamos a recibir, estad\u00edsticamente hablando, 1 de cada 9 paquetes enviados. Una tasa bastante baja. \u00bfCu\u00e1l es la soluci\u00f3n? Obviamente, forzar al dispositivo a emitir en una sola banda. Existe un <a href=\"https:\/\/learn.sparkfun.com\/tutorials\/esp32-lora-1-ch-gateway-lorawan-and-the-things-network\/all\" target=\"_blank\">tutorial de Sparkfun que lo explica bastante bien<\/a>, pero para el caso de los dispositivos Heltec LoRa es necesario trastear un poco m\u00e1s, y especificar los valores del dispositivo:<\/p>\n<p><code>const lmic_pinmap lmic_pins = {<br \/>\n .nss = 18,<br \/>\n .rxtx = LMIC_UNUSED_PIN,<br \/>\n .rst = 14,<br \/>\n .dio = {26, 35, 33},<br \/>\n};<\/code><\/p>\n<p>&#8230;y con eso, \u00a1listos! Bueno, casi. Para los Heltec LoRa 32 vale, pero por desgracia no para los Cube Cell que estoy empleando, ya que las implementaciones de la librer\u00eda LMIC que he encontrado no parecen funcionar bien con estos dispositivos. \u00bfLa soluci\u00f3n? Ser un poco m\u00e1s imaginativo. En mi caso, he modificado los par\u00e1metros de la librer\u00eda LoRaWan_APP del fabricante, para hacer que todas las definiciones de la banda de 868 MHz trabajen exactamente en la frecuencia del canal 0, que es que se utiliza por parte del servidor. En concreto, se trata de localizar el fichero RegionEU868.h (en el directorio packages\\CubeCell\\hardware\\CubeCell\\1.x.0\\cores\\asr650x\\loramac\\mac\\region), y modificar lo siguiente:<\/p>\n<p><code>#define EU868_LC1                                   { 868100000, 0, { ( ( DR_5 < < 4 ) | DR_0 ) }, 1 }\n\n\/*!\n * LoRaMac default channel 2\n * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }\n *\/\n#define EU868_LC2                                   { 868100000, 0, { ( ( DR_5 < < 4 ) | DR_0 ) }, 1 }\n\n\/*!\n * LoRaMac default channel 3\n * Channel = { Frequency [Hz], RX1 Frequency [Hz], { ( ( DrMax << 4 ) | DrMin ) }, Band }\n *\/\n#define EU868_LC3                                   {868100000, 0, { ( ( DR_5 < < 4 ) | DR_0 ) }, 1 }\n\n#define EU868_LC4                { 868100000,0, { ( ( DR_5 < < 4 ) | EU868_TX_MIN_DATARATE ) }, 0 }\n#define EU868_LC5                { 868100000,0, { ( ( DR_5 < < 4 ) | EU868_TX_MIN_DATARATE ) }, 0 }\n#define EU868_LC6                { 868100000,0, { ( ( DR_5 < < 4 ) | EU868_TX_MIN_DATARATE ) }, 0 }\n#define EU868_LC7                { 868100000,0, { ( ( DR_5 < < 4 ) | EU868_TX_MIN_DATARATE ) }, 0 }\n#define EU868_LC8                { 868100000,0, { ( ( DR_5 < < 4 ) | EU868_TX_MIN_DATARATE ) }, 0 }<\/code><\/p>\n<p>S\u00ed, es una \u00f1apa. Pero una \u00f1apa que funciona. :mrgreen: Una vez hecho esto y subido el c\u00f3digo al Cube Cell, todo va como la seda. Y aprovechando que me encontraba en C\u00f3rdoba, me decid\u00ed a hacer algunas pruebas adicionales de transmisi\u00f3n de datos: un verdadero (bueno, de aquella manera) gateway LoRaWAN conectado a la red TTN, y un dispositivo emitiendo de manera peri\u00f3dica una informaci\u00f3n sencilla (00 01 02 03). La idea era probar la transmisi\u00f3n en un entorno urbano, con orograf\u00eda acusada, y sin visibilidad directa, y con el emisor haciendo uso de las antenas por defecto que proporciona el fabricante. Nada de antenas avanzadas. Y el resultado fue bastante mejor del esperado. EL sistema pudo cubrir sin interrupciones todo el parque de la Asomadilla con un \u00fanico gateway, incluso en zonas donde la curvatura del terreno oculta de manera total el emisor del receptor.<\/p>\n<p><figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7543\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/20200926_202706-me.jpg\" alt=\"20200926 202706\" \/><\/a><figcaption><strong>20200926 202706<\/strong><\/figcaption><\/figure><br \/>\n<strong>Emisor en el punto m\u00e1s alejado del parque<\/strong><\/p>\n<p>Como comentaba, el sistema fue capaz de proporcionar cobertura en todo el Parque de la Asomadilla de C\u00f3rdoba.<\/p>\n<p><figure class=\"wp-block-piwigo-gallery-single-image piwigo-single-image\"><a href=\"https:\/\/www.eniac2000.com\/piwigo\/picture.php?\/7540\" target=\"_blank\" rel=\"noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/www.eniac2000.com\/piwigo\/_data\/i\/galleries\/albums\/202009-LoRaWAN\/20200926-asomadilla-me.JPG\" alt=\"20200926-asomadilla\" \/><\/a><figcaption><strong>20200926-asomadilla<\/strong><\/figcaption><\/figure><br \/>\n<strong>Imagen de la zona cubierta<\/strong><\/p>\n<p>Es de esperar que en una zona con una ubicaci\u00f3n \u00f3ptima (zona alta del parque) la zona de cobertura fuera muy superior. Pero eso ya quedar\u00e1 para otro d\u00eda.<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 7 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>Comentaba en un art\u00edculo anterior de la serie que hab\u00eda<\/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":[33,133,489,789,996,998,1633,1671],"series":[1836],"class_list":["post-4508","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-868-mhz","tag-arduino","tag-cubecell","tag-heltec","tag-lora","tag-lorawan","tag-the-things-network","tag-ttn","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\/4508","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=4508"}],"version-history":[{"count":1,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4508\/revisions"}],"predecessor-version":[{"id":11033,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4508\/revisions\/11033"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4508"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}