{"id":3750,"date":"2021-09-05T23:30:16","date_gmt":"2021-09-06T04:30:16","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=3750"},"modified":"2026-08-04T22:39:31","modified_gmt":"2026-08-05T03:39:31","slug":"lorawan-parametros-up-down-archivo-ino","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-parametros-up-down-archivo-ino\/","title":{"rendered":"LoRaWan - Par\u00e1metros Up\/Down: Archivo.ino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">LoRaWan - Enlaces Up\/Down Par\u00e1metros<\/h2>\n\n\n\n<p>Para realizar pruebas de conectividad y calidad del enlace inal\u00e1mbrico, se propone usar dispositivos con una configuraci\u00f3n b\u00e1sica que registre los par\u00e1metros del enlace de subida y bajada.<\/p>\n\n\n\n<p>Los par\u00e1metros para subida (Uplink) se obtienen desde el gateway, de los par\u00e1metros regulares que registra el gateway.<\/p>\n\n\n\n<p>Los par\u00e1metros de bajada (Downlink) se obtienen de la trama de confirmaci\u00f3n (Acknowlegment) que son Rssi, Snr y datarate. Estos par\u00e1metros se usan en el pr\u00f3ximo env\u00edo de datos (Uplink) por lo que presentan un atraso equivalente al intervalo de lectura de datos del dispositivo.<\/p>\n\n\n\n<p>El dispositivo para la prueba se implementa con un m\u00f3dulo de desarrollo HELTEC Cubecell Board-Plus HTCC-AB02.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparaci\u00f3n de trama<\/h2>\n\n\n\n<p>La trama se configura usando los par\u00e1metros obtenidos en el dispositivo con una trama de confirmaci\u00f3n de subida (Ack). El primer valor enviado ser\u00e1 cero, puesto que no se dispone de par\u00e1metros iniciales.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rssi Downlink (1 byte)<\/li>\n\n\n\n<li>Snr Downlink (1 byte)<\/li>\n\n\n\n<li>Datarate Downlink (1 byte)<\/li>\n\n\n\n<li>Voltaje de bateria (2 bytes)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code><span style=\"color: #434f54\">\/\/ Ack parametros de recepci\u00f3n<\/span>\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">confirmaRssi<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #000000\">0<\/span><span style=\"color: #000000\">;<\/span>\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">confirmaSnr<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #000000\">0<\/span><span style=\"color: #000000\">;<\/span>\n<span style=\"color: #00979c\">uint8_t<\/span> <span style=\"color: #000000\">confirmaDatarate<\/span> <span style=\"color: #434f54\">=<\/span> <span style=\"color: #000000\">0<\/span><span style=\"color: #000000\">;<\/span><\/code><\/pre>\n\n\n\n<p>A Septiembre del 2021, se usan las librer\u00edas publicadas para el m\u00f3dulo HELTEC Cubecell Board-Plus HTCC-AB02. Para obtener los par\u00e1metros de la trama de confirmaci\u00f3n de recibido (Ack) el gateway para una trama de subida de datos (Uplink) se sustituye el procedimiento:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>downLinkAckHandle(McpsIndication_t *mcpsIndication)<\/code><\/pre>\n\n\n\n<p>Las instrucciones para el manejo de LoraWan se pueden revisar en:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/HelTecAutomation\/CubeCell-Arduino\/blob\/master\/libraries\/LoRa\/src\/LoRaWan_APP.cpp\">https:\/\/github.com\/HelTecAutomation\/CubeCell-Arduino\/blob\/master\/libraries\/LoRa\/src\/LoRaWan_APP.cpp<\/a><\/p>\n\n\n\n<p>El archivo<em><strong> LoRaWan_APP.cpp<\/strong><\/em> se encuentra instalado en el directorio de windows:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>C:\\Users\\MiUsuario\\AppData\\Local\\Arduino15\\packages\n  \\CubeCell\\hardware\\CubeCell\\1.3.0\\libraries\\LoRa\\src<\/code><\/pre>\n\n\n\n<p>desde donde es posible complementar las instrucciones usando un editor de texto en las l\u00edneas corespondientes:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>void __attribute__((weak)) downLinkAckHandle()\n{\n\t\/\/printf(\"ack received\\r\\n\");\n}<\/code><\/pre>\n\n\n\n<p>para indicar los par\u00e1metros a usar al recibir la trama Ack:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>void __attribute__((weak)) downLinkAckHandle(McpsIndication_t *mcpsIndication)\n{\n\t\/\/printf(\"ack received\\r\\n\");\n}<\/code><\/pre>\n\n\n\n<p>adicionalmente, en el mismo archivo, m\u00e1s adelante:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>static void McpsIndication( McpsIndication_t *mcpsIndication )\n....\n\tif(mcpsIndication-&gt;AckReceived)\n\t{\n\t\tdownLinkAckHandle(mcpsIndication);\n\t}<\/code><\/pre>\n\n\n\n<p>con lo que es posible usar las instrucciones del dispositivo para obtener los par\u00e1metros indicados para la trama de confirmaci\u00f3n de recibo (Ack)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Par\u00e1metros de trama de confirmaci\u00f3n de recibido - Ack<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownParametrosAck.png\"><img loading=\"lazy\" decoding=\"async\" width=\"808\" height=\"124\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownParametrosAck.png\" alt=\"LoRaWan Enlace UpDown Parametros Ack\" class=\"wp-image-3751\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownParametrosAck.png 808w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownParametrosAck-300x46.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownParametrosAck-768x118.png 768w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\nvoid downLinkAckHandle(McpsIndication_t *mcpsIndication){\n \u00a0confirmaRssi = uint8_t(abs(mcpsIndication-&gt;Rssi));\n \u00a0confirmaSnr \u00a0= uint8_t(mcpsIndication-&gt;Snr);\n \u00a0confirmaDatarate = uint8_t(mcpsIndication-&gt;RxDoneDatarate);\n \u00a0Serial.print(&quot; ack received(rssi,snd,datarate): -&quot;);\n \u00a0Serial.print(confirmaRssi);Serial.print(&quot; ,&quot;);\n \u00a0Serial.print(confirmaSnr);Serial.print(&quot; ,&quot;);\n \u00a0Serial.println(confirmaDatarate);\n}\n<\/pre><\/div>\n\n\n<p>con los par\u00e1metros obtenidos y a\u00f1adiendo el voltaje de la bater\u00eda, se conforma la trama a enviar.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownEnviar.png\"><img loading=\"lazy\" decoding=\"async\" width=\"808\" height=\"126\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownEnviar.png\" alt=\"LoRaWan Enlace UpDown Enviar\" class=\"wp-image-3752\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownEnviar.png 808w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownEnviar-300x47.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownEnviar-768x120.png 768w\" sizes=\"auto, (max-width: 808px) 100vw, 808px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/* Prepares the payload of the frame *\/\nstatic void prepareTxFrame( uint8_t port ) {\n \u00a0\/\/ enciende sensor\n \u00a0pinMode(Vext, OUTPUT);\n \u00a0digitalWrite(Vext, LOW);\n \u00a0\n \u00a0\/\/Lectura de Sensor\n\n \u00a0\/\/ apaga sensor\n \u00a0digitalWrite(Vext, HIGH);\n \u00a0\n \u00a0\/\/ lectura de bateria \u00a0\n \u00a0uint16_t batteryVoltage = getBatteryVoltage();\n \u00a0unsigned char *puc;\n\n \u00a0\/\/ trama\n \u00a0appDataSize = 5;\n \u00a0appData&#x5B;0] = confirmaRssi; \/\/Ack leido en dispositivo\n \u00a0appData&#x5B;1] = confirmaSnr;\n \u00a0appData&#x5B;2] = confirmaDatarate;\n \u00a0appData&#x5B;3] = (uint8_t)batteryVoltage;\n \u00a0appData&#x5B;4] = (uint8_t)(batteryVoltage&gt;&gt;8);\n\n \u00a0Serial.print(&quot;%, Bateria = &quot;);\n \u00a0Serial.println(batteryVoltage);\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Instrucciones Principales<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownPrincipal.png\"><img loading=\"lazy\" decoding=\"async\" width=\"809\" height=\"127\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownPrincipal.png\" alt=\"LoRaWan Enlace UpDown Principal\" class=\"wp-image-3753\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownPrincipal.png 809w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownPrincipal-300x47.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2021\/10\/LoRaWanEnlaceUpDownPrincipal-768x121.png 768w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n#include &quot;LoRaWan_APP.h&quot;\n#include &quot;Arduino.h&quot;\n\n\/* set LoraWan_RGB to Active,the RGB active in loraWan\n * red \u00a0\u00a0|sending; \u00a0\u00a0purple | joined done;\n * blue \u00a0|RxWindow1; yellow | means RxWindow2;\n * green | received done;\n *\/\n\/* Conexi\u00f3n LoRa: OTAA parametros*\/\nuint8_t devEui&#x5B;] = { 0xa6, 0x17, 0x74, 0xe9, 0x5c, 0x1c, 0x98, 0xbd };\nuint8_t appEui&#x5B;] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\nuint8_t appKey&#x5B;] = { 0x76, 0x9d, 0x1b, 0xc3, 0xf9, 0xe6, 0x7b, 0xbd,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xa3, 0x4d, 0xe3, 0xcf, 0xbc, 0x8e, 0x35, 0x8f };\n\/* ABP parametros*\/\nuint8_t nwkSKey&#x5B;] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe,\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 };\nuint8_t appSKey&#x5B;] = { 0x47, 0xdc, 0xac, 0x5f, 0xc2, 0x32, 0x24, 0x31, \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00xdf, 0xf1, 0xff, 0xf9, 0x46, 0xe5, 0x2e, 0x17 };\nuint32_t devAddr = \u00a0( uint32_t )0x007bc4af;\n\/*LoraWan channelsmask, default channels 0-7*\/ \nuint16_t userChannelsMask&#x5B;6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };\n\n\/*Select in arduino IDE tools*\/\nLoRaMacRegion_t loraWanRegion = ACTIVE_REGION;\nDeviceClass_t \u00a0loraWanClass = LORAWAN_CLASS;\nbool overTheAirActivation = LORAWAN_NETMODE;\nbool loraWanAdr = LORAWAN_ADR;\nbool keepNet = LORAWAN_NET_RESERVE;\nbool isTxConfirmed = LORAWAN_UPLINKMODE;\n\nuint32_t appTxDutyCycle = 1*15*1000;\nuint8_t appPort = 2; \/* Application port *\/\n\/* trials to transmit frame, if didn't receive ack.\n * The MAC performs a datarate adaptation,\n * Tx nb|Data Rate\n * -----|----------\n * 1 \u00a0\u00a0\u00a0|DR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0* 5 \u00a0\u00a0\u00a0| max(DR-2,0)\n * 2 \u00a0\u00a0\u00a0|DR \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0* 6 \u00a0\u00a0\u00a0| max(DR-2,0)\n * 3 \u00a0\u00a0\u00a0|max(DR-1,0) \u00a0* 7 \u00a0\u00a0\u00a0| max(DR-3,0)\n * 4 \u00a0\u00a0\u00a0|max(DR-1,0) \u00a0* 8 \u00a0\u00a0\u00a0| max(DR-3,0)\n*\/\nuint8_t confirmedNbTrials = 4;\n\n\/\/ Ack parametros de recepci\u00f3n\nuint8_t confirmaRssi = 0;\nuint8_t confirmaSnr = 0;\nuint8_t confirmaDatarate = 0;\n\nuint8_t itera = 0;\n\nvoid setup() {\n\tSerial.begin(115200);\n#if(AT_SUPPORT)\n\tenableAt();\n#endif\n \u00a0LoRaWAN.displayMcuInit();\n\tdeviceState = DEVICE_STATE_INIT;\n\tLoRaWAN.ifskipjoin(); \/\/if joinned,skip\n}\n\nvoid loop() {\n \u00a0Serial.print(&quot;.&quot;);\n \u00a0itera = itera + 1;\n \u00a0if (itera&gt;6){\n \u00a0\u00a0\u00a0itera = 0;\n \u00a0\u00a0\u00a0Serial.println(&quot; &quot;);\n \u00a0}\n\tswitch( deviceState ) {\n\t\tcase DEVICE_STATE_INIT: {\n#if(LORAWAN_DEVEUI_AUTO)\n\t\t\tLoRaWAN.generateDeveuiByChipID();\n#endif\n#if(AT_SUPPORT)\n\t\t\tgetDevParam();\n#endif\n\t\t\tprintDevParam();\n\t\t\tLoRaWAN.init(loraWanClass,loraWanRegion);\n\t\t\tdeviceState = DEVICE_STATE_JOIN;\n\t\t\tbreak;\n\t\t}\n\t\tcase DEVICE_STATE_JOIN: {\n \u00a0\u00a0\u00a0\u00a0\u00a0LoRaWAN.displayJoining();\n\t\t\tLoRaWAN.join();\n\t\t\tbreak;\n\t\t}\n\t\tcase DEVICE_STATE_SEND:\t{\n \u00a0\u00a0\u00a0\u00a0\u00a0LoRaWAN.displaySending();\n\t\t\tprepareTxFrame( appPort );\n\t\t\tLoRaWAN.send();\n\t\t\tdeviceState = DEVICE_STATE_CYCLE;\n\t\t\tbreak;\n\t\t}\n\t\tcase DEVICE_STATE_CYCLE: {\n\t\t\t\/\/ Schedule next packet transmission\n\t\t\ttxDutyCycleTime = appTxDutyCycle + randr( 0, APP_TX_DUTYCYCLE_RND );\n\t\t\tLoRaWAN.cycle(txDutyCycleTime);\n\t\t\tdeviceState = DEVICE_STATE_SLEEP;\n\t\t\tbreak;\n\t\t}\n\t\tcase DEVICE_STATE_SLEEP: {\n \u00a0\u00a0\u00a0\u00a0\u00a0LoRaWAN.displayAck();\n\t\t\tLoRaWAN.sleep();\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tdeviceState = DEVICE_STATE_INIT;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n<\/pre><\/div>\n\n\n<p>y en el caso de recibir instrucciones para el dispositivo, se dispone de un ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: arduino; title: ; notranslate\" title=\"\">\n\/\/downlink data handle function example\nvoid downLinkDataHandle(McpsIndication_t *mcpsIndication){\n \u00a0\/\/ revisa parametros\n \u00a0Serial.print(&quot;\\nLLEGo un mensaje para dispositivo...&quot;);\n \u00a0Serial.print(&quot;Rssi: &quot;);\n \u00a0Serial.println(mcpsIndication-&gt;Rssi);\n \u00a0\n \u00a0Serial.printf(&quot;+REV DATA:%s,RXSIZE %d,PORT %d\\r\\n&quot;,\n \u00a0mcpsIndication-&gt;RxSlot?&quot;RXWIN2&quot;:&quot;RXWIN1&quot;,\n \u00a0mcpsIndication-&gt;BufferSize,mcpsIndication-&gt;Port);\n \u00a0Serial.print(&quot;+REV DATA:&quot;);\n \u00a0for(uint8_t i=0;i&lt;mcpsIndication-&gt;BufferSize;i++)\n \u00a0{\n \u00a0\u00a0\u00a0Serial.printf(&quot;%02X&quot;,mcpsIndication-&gt;Buffer&#x5B;i]);\n \u00a0}\n \u00a0Serial.println();\n \u00a0uint32_t color=mcpsIndication-&gt;Buffer&#x5B;0]&lt;&lt;16|mcpsIndication-&gt;Buffer&#x5B;1]&lt;&lt;8|mcpsIndication-&gt;Buffer&#x5B;2];\n#if(LoraWan_RGB==1)\n \u00a0turnOnRGB(color,5000);\n \u00a0turnOffRGB();\n#endif\n}\n<\/pre><\/div>","protected":false},"excerpt":{"rendered":"<p>LoRaWan - Enlaces Up\/Down Par\u00e1metros Para realizar pruebas de conectividad y calidad del enlace inal\u00e1mbrico, se propone usar dispositivos con una configuraci\u00f3n b\u00e1sica que registre los par\u00e1metros del enlace de subida y bajada. Los par\u00e1metros para subida (Uplink) se obtienen desde el gateway, de los par\u00e1metros regulares que registra el gateway. Los par\u00e1metros de bajada [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1466680],"tags":[],"class_list":["post-3750","post","type-post","status-publish","format-standard","hentry","category-lorawan-parametros-up-down"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3750","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/comments?post=3750"}],"version-history":[{"count":9,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3750\/revisions"}],"predecessor-version":[{"id":4907,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/3750\/revisions\/4907"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=3750"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=3750"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=3750"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}