{"id":2486,"date":"2020-08-06T11:30:25","date_gmt":"2020-08-06T16:30:25","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2486"},"modified":"2025-06-28T01:17:27","modified_gmt":"2025-06-28T06:17:27","slug":"lorawan-codec-decode-para-datos-en-tramas","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-codec-decode-para-datos-en-tramas\/","title":{"rendered":"3. LoRaWAN - Codec\/Decode para datos en tramas"},"content":{"rendered":"<p>Los datos de sensor\/acci\u00f3n se ordenan en una trama LoRa en forma de bytes antes de la transmisi\u00f3n. Se pretende minimizar la cantidad de bytes usados por mensaje, siguiendo la directiva LoRa de mensajes de corta duraci\u00f3n.<\/p>\n<p>Un mensaje se puede simplificar, por ejemplo un \"ON\"\/\"OFF\" presentado en LoRa puede ser 1 \"o\" 0, que es tan solo un bit. Los mensajes se administran por ChirpStack y los puede traducir nuevamente en mensajes \"ON\"\/\"OFF\" para ser actualizados en un Broker como Home Assistant.<\/p>\n<p>Un ejemplo b\u00e1sico de instrucciones para un dispositivo gen\u00e9rico permite presentar el uso de librer\u00edas LoRaWAN de HELTEC.<\/p>\n<h2>Trama de datos en dispositivo<\/h2>\n<p>Los datos son enviados en una trama como un tren de bits escritos en orden. Por ejemplo, en el dispositivo se tiene los valores de contador1, contador2 y unalectura como datos a ser transmitidos, por lo que se plantea el siguiente esquema:<\/p>\n<p class=\"alignnone\"><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2487\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01.png\" alt=\"\" width=\"1188\" height=\"216\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01.png 1188w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01-300x55.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01-768x140.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos01-1024x186.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Las instrucciones en el IDE arduino para el ejemplo de la trama de datos Sigue el mismo orden.<\/p>\n<pre><span style=\"color: #00979c\">byte<\/span>    contador1 = 0;\r\n<span style=\"color: #00979c\">uint8_t<\/span> contador2 = 0;  \r\n<span style=\"color: #00979c\">int<\/span> unalectura = 221;\r\n\r\n<span style=\"color: #00979c\">static<\/span> <span style=\"color: #00979c\">void<\/span> prepareTxFrame( <span style=\"color: #00979c\">uint8_t<\/span> port ){\r\n    contador1 = contador1 + 1;\r\n    contador2 = contador2 - 1;\r\n\r\n    \/\/orden de trama\r\n    appDataSize = 4         \/\/AppDataSize max value is 64\r\n    appData[0] = contador1; \/\/0x01;\r\n    appData[1] = contador2;\r\n    appData[2] = <span style=\"color: #d35400\">highByte<\/span>(unalectura);\r\n    appData[3] = <span style=\"color: #d35400\">lowByte<\/span>(unalectura);\r\n\r\n    \/\/ mostrar en puerto USB\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(contador1);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(contador2);\r\n    <b><span style=\"color: #d35400\">Serial<\/span><\/b><span style=\"color: #434f54\">.<\/span><span style=\"color: #d35400\">println<\/span>(unalectura);\r\n}\r\n\r\n<\/pre>\n<p>En casos particulares hay que ajustar la trama de acuerdo a las lecturas de sensores o informaci\u00f3n que se requiera transmitir<\/p>\n<h2>Trama de datos en ChirpStack application - server<\/h2>\n<p>La trama de datos llega en binario hasta el componente application-server y de forma predeterminada se presenta en formato Base64.<\/p>\n<p>Para leer los datos se puede usar el convertidor en l\u00ednea o utilizar un decodificador\/codificador con instrucciones en JavaScript.<\/p>\n<p><a href=\"https:\/\/v2.cryptii.com\/base64\/decimal\">https:\/\/v2.cryptii.com\/base64\/decimal<\/a><\/p>\n<p>En ChirpStack en la secci\u00f3n Device-profiles\/codec se puede escribir un decodificador para la trama de datos y reconstruirlo en la forma con las variables originales.<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2489 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01.png\" alt=\"Chirpstack codec\" width=\"1273\" height=\"647\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01.png 1273w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01-300x152.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01-768x390.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/CS_DeviceProfile_Codec01-1024x520.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>para el ejemplo presentado y siguiendo el esquema inicial, las instrucciones en JavaScript son:<\/p>\n<pre>function Decode(fPort, bytes, variables) {\r\n\tvar contador1 = bytes[0];\r\n  \tvar contador2 = bytes[1];\r\n  \tvar unalectura = (bytes[2] &lt;&lt; 8) |(bytes[3]);\r\n  var appData = {'contador1':contador1, 'contador2':contador2, 'unalectura': unalectura}\r\n  return appData;\r\n}<\/pre>\n<p>Con lo que en Chirpstack se obtiene para datos del dispositivo de una trama en particular:<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2490 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos02.png\" alt=\"Chirpstack  device data\" width=\"972\" height=\"548\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos02.png 972w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos02-300x169.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos02-768x433.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p><em><strong>Referencia<\/strong><\/em>:<a href=\"https:\/\/heltec-automation-docs.readthedocs.io\/en\/latest\/general\/decode_payload.html\"> https:\/\/heltec-automation-docs.readthedocs.io\/en\/latest\/general\/decode_payload.html<\/a><\/p>\n<h2>Trama de datos en MQTT-Mosquitto<\/h2>\n<p>Para capturar los datos en un broker, por ejemplo Home Assistant, se puede usar el mensaje MQTT del application-server. Es posible leer las tramas MQTT de application-server o integrar las plataformas entre si por medio de \"integration\"<\/p>\n<h3>Lecturas de mensajes MQTT<\/h3>\n<p>Para observar la estructura del mensaje se realiza una subscripci\u00f3n al mensaje MQTT de la aplicaci\u00f3n para un dispositivo:<\/p>\n<pre>mosquitto_sub -v -h localhost -p 1883 -t 'application\/1\/device\/#'<\/pre>\n<p>y se obtiene los datos decodificados por JavaScript:<\/p>\n<p><a href=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2492 size-full\" src=\"http:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03.png\" alt=\"mqtt tramas\" width=\"1303\" height=\"455\" srcset=\"https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03.png 1303w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03-300x105.png 300w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03-768x268.png 768w, https:\/\/blog.espol.edu.ec\/girni\/files\/2020\/09\/TramaDatos03-1024x358.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/p>\n<p>Con lo que se puede proceder a incorporar la instrucci\u00f3n en Home-Assistant.<\/p>\n<p><em><strong>Referencia<\/strong><\/em>: TTN - Optimizacion Payload.pdf , <a href=\"https:\/\/github.com\/akirasan\/TTN_LoRaWAN\">https:\/\/github.com\/akirasan\/TTN_LoRaWAN<\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los datos de sensor\/acci\u00f3n se ordenan en una trama LoRa en forma de bytes antes de la transmisi\u00f3n. Se pretende minimizar la cantidad de bytes usados por mensaje, siguiendo la directiva LoRa de mensajes de corta duraci\u00f3n. Un mensaje se puede simplificar, por ejemplo un \"ON\"\/\"OFF\" presentado en LoRa puede ser 1 \"o\" 0, que &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-codec-decode-para-datos-en-tramas\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"3. LoRaWAN - Codec\/Decode para datos en tramas\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1447338],"tags":[602214,1457736],"class_list":["post-2486","post","type-post","status-publish","format-standard","hentry","category-lorawan-open-gateway","tag-iot","tag-lorawan"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2486","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=2486"}],"version-history":[{"count":7,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2486\/revisions"}],"predecessor-version":[{"id":4176,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2486\/revisions\/4176"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}