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ón
servidormqtt = "192.168.xx.xx"
topicolee = "#"
# Para el archivo.txt
nombrearchivo = 'unreporte.txt'
conteo = {"lineas":{'cuenta':0},
"gateway":{'cuenta':0},
"application":{'cuenta':0}
}
tipotrama = []
# para tabular
tabla = []
registros = {}
frecuencias = []
tramabuscada = ['application/1/device/c9c2a03913ac2ec5/event/up',
'application/1/device/b35915f22af620d1/event/up',
'application/1/device/b5a2349b828d97ea/event/up',
'application/1/device/f2f724028c0e996c/event/up']
# PROCEDIMIENTO
archivo = open(nombrearchivo,'r')
unalinea = archivo.readline()
while not(unalinea==''):
conteo["lineas"]['cuenta'] = conteo["lineas"]['cuenta'] + 1
unalinea = archivo.readline()
unalinea = unalinea.strip('\n')
desde = unalinea.find(" b'{")
untipotrama = unalinea[0:desde]
if not(untipotrama in tipotrama) and (untipotrama != ''):
tipotrama.append(untipotrama)
conteo[untipotrama] = {'cuenta':0}
for entrada in conteo:
if unalinea.startswith(entrada):
conteo[entrada]['cuenta'] = conteo[entrada]['cuenta']+1
for unapptrama in tramabuscada:
tamanot = len(unapptrama)
if unalinea.startswith(unapptrama):
datostxt = unalinea[tamanot+3:].strip("'")
datosjson = json.loads(datostxt)
undeviceName = datosjson["deviceName"]
unrssi = datosjson["rxInfo"][0]["rssi"]
unloRaSNR = datosjson["rxInfo"][0]["loRaSNR"]
unfrequency = datosjson["txInfo"]["frequency"]
undr = datosjson["txInfo"]["dr"]
if not(unfrequency in frecuencias):
frecuencias.append(unfrequency)
if undeviceName in registros:
registros[undeviceName]['conteo'] = registros[undeviceName]['conteo']+1
registros[undeviceName]['rssi'].append([unfrequency,unrssi,
unloRaSNR,undr])
else:
registros[undeviceName]={'rssi':[],
'conteo':0,
'resumen':[0,0,0,0],
}
archivo.close() # Cierra el archivo
# Calcula resumen por dispositivo
frecuencias.sort()
frecuencia = [902300000, 902500000, 902700000, 902900000,
903100000, 903300000, 903500000, 903700000]
canalobserva = len(frecuencia)
for dispositivo in registros:
vector = np.array(registros[dispositivo]['rssi'])
cuenta = np.zeros(canalobserva, dtype=int)
suma = np.zeros(canalobserva,dtype=int)
channelid = np.arange(1, canalobserva+1)
cadaRSSI = [[],[],[],[],[],[],[],[],[]]
cadaSNR = [[],[],[],[],[],[],[],[],[]]
cadadr = [[],[],[],[],[],[],[],[],[]]
resumen = []
# Clasificando
k = len(vector)
for j in range (0,k,1):
cual = frecuencia.index(vector[j][0])
valorRssi = vector[j][1]
valorSNR = vector[j][2]
valordr = vector[j][3]
cadaRSSI[cual].append(valorRssi)
cadaSNR[cual].append(valorSNR)
cadadr[cual].append(valordr)
for j in range(0,canalobserva,1):
vectorRSSI = np.array(cadaRSSI[j])
vectorSNR = np.array(cadaSNR[j])
vectordr = np.array(cadadr[j])
if len(vectorRSSI)>0:
promedioRSSI = np.average(vectorRSSI)
maximoRSSI = np.max(vectorRSSI)
cantidadRSSI = len(vectorRSSI)
minimoRSSI = np.min(vectorRSSI)
promedioSNR = np.average(vectorSNR)
maximoSNR = np.max(vectorSNR)
cantidadSNR = len(vectorSNR)
minimoSNR = np.min(vectorSNR)
promediodr = np.average(vectordr)
maximodr = np.max(vectordr)
cantidaddr = len(vectordr)
minimodr = np.min(vectordr)
resumen.append(np.array([ j+1,
cantidadRSSI,
promedioRSSI,
minimoRSSI,
maximoRSSI,
promedioSNR,
minimoSNR,
maximoSNR,
promediodr,
]))
resumen = np.array(resumen)
registros[dispositivo]['resumen'] = resumen
# SALIDA
np.set_printoptions(precision = 2)
print('conteo de tramas')
for entrada in conteo:
print(entrada,": ", conteo[entrada]['cuenta'])
print('frecuencias: ',frecuencia)
print('\nTabulando ---------')
for dispositivo in registros:
print()
print('dispositivo_id: '+str(dispositivo))
print('total muestras: '+str(registros[dispositivo]['conteo']))
print('Promedios RSSI y SNR: ')
print('[canal muestras\t RSSI \t min \t max \t SNR min max DR ]')
print(registros[dispositivo]['resumen'])
registros[dispositivo]['conteo']
