2.5 LoRa Multipunto – errores de recepción en Gateway

Usando el ejemplo de comunicación multipunto, se revisa la secuencia de paquetes (msjID) enviada por cada uno de los nodos/dispositivos con mensajes que se envían con intervalos aleatorios entre [2-4 segundos].

La base de tiempo de 2 segundos se considera como tiempo que toma un sensor de temperatura DHT11 en dar una nueva lectura.

https://cdn-learn.adafruit.com/downloads/pdf/dht.pdf

Para la lectura de los datos desde el gateway se usa la comunicación por puerto serial (USB). de los datos de cada mensaje se usa el identificador de mensaje (msjID) que indica el orden del mensaje enviado.

Ejemplo de mensaje obtenido por puerto serial desde el «gateway simple»

remite,msjID,mensaje,estado,Rssi,Snr
d2,173,ON,1,-75,12

Usando como factor LoRa.setSpreadingFactor(8), se reduce la tasa de errores desde 0.36 en modo predeterminado de los dispositivos.

Ejemplo de resultados obtenidos.

ID	 [1 2]
cuenta	 [1879 1871]
errores	 [254 312]
increm	 [1 1]
antes	 [190 173]
%error 	 [0.14 0.17]

Instrucciones en Python

# prueba de recepción de mensajes
# en Gateway LoRa mutipunto
# edelros@espol.edu.ec

import numpy as np
import serial, time

# INGRESO
puerto = 'com8'
baudios = 115200
n = 2
encabezado =['ID','cuenta',
             'errores','increm',
             'antes']
m = len(encabezado)
tabla = np.zeros(shape=(n+1,m),dtype=int)
d_error = np.zeros(n+1,dtype=float)

for f in range(1,n+1,1):
    tabla[f,0]=f

# PROCEDIMIENTO
arduino = serial.Serial(puerto, baudios)
arduino.setDTR(False)
time.sleep(0.3)

# limpia buffer de datos anteriores
arduino.flushInput()  
arduino.setDTR()  
time.sleep(0.3)
print('\nEstado del puerto: ',arduino.isOpen())
print('Nombre del dispositivo conectado: ', arduino.name)
print('Dump de la configuración:\n ',arduino)
print('\n###############################################\n')

np.set_printoptions(precision=2)
# Lectura de datos
while True:
    # espera hasta recibir un dato
    while (arduino.inWaiting()==0):
        pass
    
    # lee binario del puerto serial
    lectura = arduino.readline()
    # binario a texto, elimina /r/n
    texto = lectura.decode().strip()
    print(texto)
    tamano = len(texto)
    if tamano>=3:
        if (texto[0]=='d' and texto[2]==','):
            partes = texto.split(',')
            msjID = int(partes[0][1])
            
            # incremento
            antes = tabla[msjID,4]
            ahora = int(partes[1])
            tabla[msjID,4] = ahora
            incremento = ahora - antes
            tabla[msjID,3] = incremento
            # cuenta
            if antes>0 and incremento>0:
                tabla[msjID,1]=tabla[msjID,1] + incremento
            # error
            if (tabla[msjID,1]>1 and incremento>1):
                tabla[msjID,2] = tabla[msjID,2]+incremento-1
            if (tabla[msjID,1]>0):
                d_error[msjID]=float(tabla[msjID,2])/tabla[msjID,1]
            for i in range(0,m,1):
                print(encabezado[i]+"\t",tabla[1:,i])
            print("%error \t",d_error[1:])
    
# Cerrar el puerto serial.
serial.Serial.close