{"id":2463,"date":"2020-08-06T12:10:08","date_gmt":"2020-08-06T17:10:08","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/girni\/?p=2463"},"modified":"2022-03-24T11:48:31","modified_gmt":"2022-03-24T16:48:31","slug":"lorawan-mensajes-mqtt-python-reporte","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/girni\/lorawan-mensajes-mqtt-python-reporte\/","title":{"rendered":"3.4 LoRaWAN - MQTT - Python reporte txt"},"content":{"rendered":"<p>Para procesar el archivo del reporte.txt se puede leer mensaje por mensaje y extraer el registro de RSSI y SNR de cada dispositivo usando Python.<\/p>\n<pre># procesar un archivo de mensajes mqtt\r\nimport numpy as np\r\nimport json as json\r\n\r\n# INGRESO\r\n# Parametros para la conexi\u00f3n\r\nservidormqtt = \"192.168.xx.xx\"\r\ntopicolee = \"#\"\r\n\r\n# Para el archivo.txt\r\nnombrearchivo = 'unreporte.txt'\r\nconteo = {\"lineas\":{'cuenta':0},\r\n          \"gateway\":{'cuenta':0},\r\n          \"application\":{'cuenta':0}\r\n          }\r\ntipotrama = []\r\n\r\n# para tabular\r\ntabla = []\r\nregistros = {}\r\nfrecuencias = []\r\ntramabuscada = ['application\/1\/device\/c9c2a03913ac2ec5\/event\/up',\r\n                'application\/1\/device\/b35915f22af620d1\/event\/up',\r\n                'application\/1\/device\/b5a2349b828d97ea\/event\/up',\r\n                'application\/1\/device\/f2f724028c0e996c\/event\/up']\r\n\r\n\r\n# PROCEDIMIENTO\r\narchivo = open(nombrearchivo,'r')\r\nunalinea = archivo.readline()\r\nwhile not(unalinea==''):\r\n    conteo[\"lineas\"]['cuenta'] = conteo[\"lineas\"]['cuenta'] + 1\r\n    unalinea = archivo.readline()\r\n    unalinea = unalinea.strip('\\n')\r\n    desde = unalinea.find(\" b'{\")\r\n    untipotrama = unalinea[0:desde]\r\n    if not(untipotrama in tipotrama) and (untipotrama != ''):\r\n        tipotrama.append(untipotrama)\r\n        conteo[untipotrama] = {'cuenta':0}\r\n    for entrada in conteo:\r\n        if unalinea.startswith(entrada):\r\n            conteo[entrada]['cuenta'] = conteo[entrada]['cuenta']+1\r\n\r\n    for unapptrama in tramabuscada:\r\n        tamanot = len(unapptrama)\r\n        if unalinea.startswith(unapptrama):\r\n            datostxt = unalinea[tamanot+3:].strip(\"'\")\r\n            datosjson = json.loads(datostxt)\r\n\r\n            undeviceName = datosjson[\"deviceName\"]\r\n            unrssi = datosjson[\"rxInfo\"][0][\"rssi\"]\r\n            unloRaSNR = datosjson[\"rxInfo\"][0][\"loRaSNR\"]\r\n            unfrequency = datosjson[\"txInfo\"][\"frequency\"]\r\n            undr = datosjson[\"txInfo\"][\"dr\"]\r\n            if not(unfrequency in frecuencias):\r\n                frecuencias.append(unfrequency)\r\n                \r\n            if undeviceName in registros:\r\n                registros[undeviceName]['conteo'] = registros[undeviceName]['conteo']+1\r\n                registros[undeviceName]['rssi'].append([unfrequency,unrssi,\r\n                                                         unloRaSNR,undr])\r\n            else:\r\n                registros[undeviceName]={'rssi':[],\r\n                                         'conteo':0,\r\n                                         'resumen':[0,0,0,0],\r\n                                         }      \r\n \r\narchivo.close()  # Cierra el archivo\r\n\r\n# Calcula resumen por dispositivo\r\nfrecuencias.sort()\r\nfrecuencia = [902300000, 902500000, 902700000, 902900000,\r\n              903100000, 903300000, 903500000, 903700000]\r\ncanalobserva = len(frecuencia)                                               \r\nfor dispositivo in registros:\r\n    vector = np.array(registros[dispositivo]['rssi'])\r\n    cuenta = np.zeros(canalobserva, dtype=int)   \r\n    suma = np.zeros(canalobserva,dtype=int)\r\n    channelid = np.arange(1, canalobserva+1)\r\n    cadaRSSI = [[],[],[],[],[],[],[],[],[]]\r\n    cadaSNR  = [[],[],[],[],[],[],[],[],[]]\r\n    cadadr   = [[],[],[],[],[],[],[],[],[]]\r\n    resumen = []\r\n    # Clasificando\r\n    k = len(vector)\r\n    for j in range (0,k,1):\r\n        cual = frecuencia.index(vector[j][0])\r\n        valorRssi = vector[j][1]\r\n        valorSNR = vector[j][2]\r\n        valordr = vector[j][3]\r\n        cadaRSSI[cual].append(valorRssi)\r\n        cadaSNR[cual].append(valorSNR)\r\n        cadadr[cual].append(valordr)\r\n    \r\n    for j in range(0,canalobserva,1):\r\n        vectorRSSI = np.array(cadaRSSI[j])\r\n        vectorSNR = np.array(cadaSNR[j])\r\n        vectordr = np.array(cadadr[j])\r\n        if len(vectorRSSI)&gt;0:\r\n            promedioRSSI = np.average(vectorRSSI)\r\n            maximoRSSI = np.max(vectorRSSI)\r\n            cantidadRSSI = len(vectorRSSI)\r\n            minimoRSSI = np.min(vectorRSSI)\r\n            \r\n            promedioSNR = np.average(vectorSNR)\r\n            maximoSNR = np.max(vectorSNR)\r\n            cantidadSNR = len(vectorSNR)\r\n            minimoSNR = np.min(vectorSNR)\r\n\r\n            promediodr = np.average(vectordr)\r\n            maximodr = np.max(vectordr)\r\n            cantidaddr = len(vectordr)\r\n            minimodr = np.min(vectordr)\r\n            \r\n            resumen.append(np.array([ j+1,\r\n                                      cantidadRSSI,\r\n                                      promedioRSSI,\r\n                                      minimoRSSI,\r\n                                      maximoRSSI,\r\n                                      promedioSNR,\r\n                                      minimoSNR,\r\n                                      maximoSNR,\r\n                                      promediodr,\r\n                                      ]))\r\n    resumen = np.array(resumen)\r\n    registros[dispositivo]['resumen'] = resumen\r\n\r\n# SALIDA\r\nnp.set_printoptions(precision = 2)\r\nprint('conteo de tramas')\r\nfor entrada in conteo:\r\n    print(entrada,\": \", conteo[entrada]['cuenta'])\r\nprint('frecuencias: ',frecuencia)\r\nprint('\\nTabulando ---------')\r\nfor dispositivo in registros:\r\n    print()\r\n    print('dispositivo_id: '+str(dispositivo))\r\n    print('total muestras: '+str(registros[dispositivo]['conteo']))\r\n    print('Promedios RSSI y SNR: ')\r\n    print('[canal muestras\\t RSSI \\t min \\t max \\t SNR  min   max   DR  ]')\r\n    print(registros[dispositivo]['resumen'])\r\n    registros[dispositivo]['conteo']\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para procesar el archivo del reporte.txt se puede leer mensaje por mensaje y extraer el registro de RSSI y SNR de cada dispositivo usando Python. # procesar un archivo de mensajes mqtt import numpy as np import json as json # INGRESO # Parametros para la conexi\u00f3n servidormqtt = \"192.168.xx.xx\" topicolee = \"#\" # Para &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.espol.edu.ec\/girni\/lorawan-mensajes-mqtt-python-reporte\/\" class=\"more-link\">Continuar leyendo<span class=\"screen-reader-text\"> \"3.4 LoRaWAN - MQTT - Python reporte txt\"<\/span><\/a><\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1447338],"tags":[602214,1457736],"class_list":["post-2463","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\/2463","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=2463"}],"version-history":[{"count":11,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2463\/revisions"}],"predecessor-version":[{"id":3386,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/posts\/2463\/revisions\/3386"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/media?parent=2463"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/categories?post=2463"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/girni\/wp-json\/wp\/v2\/tags?post=2463"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}