Unknown fault
-
I do not understand what is happening, I put you capture of the beginning of the program in its normal functionality:
But when a Wi-Fi connection arrives, the program fails and starts to put the following (despite having "controlled" with the try and catch):
Follow with a few paragraphs like this:
and so ends:
the used code:
#Generado el 07-06-2018 from network import LoRa from machine import Timer import socket import machine import time import os import pycom import _thread import gc import select ### Funciones def existe(arg): try: fichero = open(arg) fichero.close() return True except: return False def iniciarWifi(pssid): try: import network from network import WLAN wlan = network.WLAN(mode=network.WLAN.STA) wlan.init(mode=WLAN.AP, ssid=pssid, auth=(WLAN.WPA2,'witeklab@2018'), channel=7, antenna=WLAN.INT_ANT) from network import Server server = Server(login=('micro', 'python'), timeout=600) server.timeout(300) server.timeout() server.isrunning() ConfirmacionLed('wifi') return True except: return False def resetDocument(): #Lista de documentos posible: alerta.txt | dorsal.txt | myposition.txt | registro.txt | seguidores.txt lista = ['alertas','dorsal','myposition','registro','seguidores','alertapersonalizada'] for i in lista: if existe(i+'.txt'): print('Borrando',i+'.txt') os.remove(i+'.txt') def pulsaciones(color): for x in range(3): pycom.rgbled(color) time.sleep(0.1) pycom.heartbeat(False) time.sleep(0.2) def ConfirmacionLed(funcion): funciones={'wifi':0x0007F,'recibido':0xfffe02,'nogps':0x7f0000,'encendido':0x7f700,'sendalert':0xC011EB}# wifi(azul) | recibido(Amarillo) | nogps(rojo) | encendido(verde) | sendalert(lila) -gpsok() pulsaciones(funciones[funcion]) def enviarAlertas(s,listalertas=[]): a = open('alertas.txt') j = a.read() j = j.strip("|") j = j.split("|") b= len(j) print("N alertas=",b) for x in range(b): j[x] = j[x].replace('\n','') j[x] = j[x].replace('\r','') if j[x] not in listalertas: listalertas.append(j[x]) cuenta = 0 for z in j[x]: if z =="-": cuenta+=1 print("Cuenta-->",cuenta) if cuenta == 1: print("Mensaje Personalizado no estaba guardado:",j[x]) p=j[x].split("-") msg = "alerta-"+p[1].replace(' ','')+";"+p[0] s.send(msg) else: j[x] print("Mensaje no estaba guardado:",j[x]) msg = "alerta-"+j[x] s.send(msg) #Mostramos para comprobar el mensaje enviado: print("Mensaje enviado:",msg) ConfirmacionLed('sendalert') print("Asi esta la lista: ",listalertas) return listalertas def inciarAlertas(lora,s): listalertas=[] s.setblocking(False) tiempo=time.time() tmp2=tiempo re=0 print('2-> Iniciamos seguno hilo con la busqueda de alertas:') while True: try: time.sleep(30) tiempo=time.time() if existe('alertas.txt'): if re==0: listalertas = enviarAlertas(s,listalertas) tmp2=tiempo re+=1 elif tiempo-tmp2>=60 and re !=0: tmp2=tiempo print("Reenviando la lista de alertas") del listalertas[:] #Borro la lista y reenvio leyendo de nuevo. listalertas = enviarAlertas(s,listalertas) else: print("Alertas existe, pero aun no ha pasado los 60 segundos=", tiempo-tmp2) else: print("- No hay alertas(Archivo 'alertas.txt' no existe.)") del listalertas[:] re=0 except: print("*** - Algo ha fallado en IniciarAlertas - ***") def iniciarSeguidores(lora,s,tiempoEnvioSeguidores): s.setblocking(False) tiempo = time.time() tmp=tiempo print('3-> Iniciamos el tercer hilo con la busqueda de seguidores') while True: try: time.sleep(12) tiempo=time.time() if existe('seguidores.txt'): if tiempo-tmp >= tiempoEnvioSeguidores: tmp=tiempo a = open('seguidores.txt') j = a.read() j = j.replace('\r','') j = j.replace('\n','') j = j.strip("|") j = j.split("|") b= len(j) print("N seguidores",b) for x in range(b): msg = "seguidores-"+j[x] s.send(msg) print("Mensaje enviado:",msg) ConfirmacionLed('sendalert') else: print("Seguidores.txt existe pero Aun no han pasado X segundos",tiempo-tmp) else: print("- No hay Seguidores(Archivo 'seguidores.txt' no existe.)") except: print('*** - Algo ha fallado en IniciarSeguidores - ***') def iniciarCorredores(lora,s,tiempoVaciarBasura): print('1-> Iniciamos primer hilo el registro de corredores:') corredores=[] while True: try: actualizado = 0 s.setblocking(True) data = s.recv(64) #socket.recv (bufsize [, flags]) Reciba datos del socket. El valor de retorno es una cadena que representa los datos recibidos. La cantidad máxima de datos que se recibirán a la vez se especifica mediante bufsize j =data.decode("utf-8") j = j.split('-') if j[0] == 'witeklab': #j[dorsalDefault],j[dorsalactual],j[contador],j[latitud],j[Longitud] print('mensaje entrante->',data) for c in range(len(corredores)): if j[2] in corredores[c]: if int(j[1]) > int(corredores[c][2]): corredores[c]=([j[2],j[3],j[1],j[4],j[5]]) ConfirmacionLed('recibido') actualizado=1 break if actualizado==0: corredores.append([j[2],j[3],j[1],j[4],j[5]]) msj = "baseConfirma-"+j[2]+";OK" s.send(msj) ConfirmacionLed('recibido') print("Corredores:",len(corredores)) print(corredores) print("Memoria libre actual->",gc.mem_free()) #print(gc.isenabled()) #print("crono->",crono.read()) if crono.read() > tiempoVaciarBasura : gc.collect() crono.reset() print("Vaciando papelera...Memoria disponible:",gc.mem_free()) #linea = j[2]+";"+j[1]+";"+j[3]";"+j[4]+"|" #ID;NºRegistro;Latitud;Longitud| f = open ('registro.txt', 'w')#Modo 'a' Para añadir no sobre escribir for c in range(len(corredores)): if len(corredores)!=0: d = corredores[c] texto = d[1]+";"+d[3]+";"+d[4]+"|" f.write(texto) f.close() except Exception as e: print("*** - Algo ha fallado en IniciarCorredores - *** -> ",e) def escucharBaseRepetidora(): port = 12345 print('4-> Iniciamos el cuarto hilo con la espera de recibir el registro de la base repetidora') while True: try: while True: s = socket.socket() s.bind(socket.getaddrinfo("0.0.0.0", port)[0][4]) s.listen(2) print("Mostramos listado:",os.listdir()) if existe('registro2.txt'): print("Mostramos contenido fichero registro2.txt:") print(open('registro2.txt').read()) pass print("\n\nEsperando conexion") readable, writable, errored = select.select([s], [], []) for s in readable: cl, remote_addr = s.accept() cl.setblocking(True) cl.settimeout(2) print("Client connection from:", remote_addr) file = "/flash/registro2.txt" print("writing: ", file) with open(file, 'wb') as f: while True: try: data = cl.recv(1024) print(data) f.write(data) f.close() except TimeoutError: break print("Recibido...Faltaría actualizar corredores.") s.close() except Exception as e: print("*** - Algo ha fallado en escucharBaseRepetidora - ***") print("Except->",e) ### Variables pssid = "Gateway1" tiempoEnvioSeguidores = 20 tiempoVaciarBasura = 100 lora = LoRa(mode=LoRa.LORA) s = socket.socket(socket.AF_LORA, socket.SOCK_RAW) crono = Timer.Chrono() crono.start() ### Main pycom.heartbeat(False) resetDocument() iniciarWifi(pssid) time.sleep(0.2) a = _thread.start_new_thread(iniciarCorredores,(lora,s,tiempoVaciarBasura,)) time.sleep(0.3) b = _thread.start_new_thread(inciarAlertas,(lora,s,)) time.sleep(0.2) c = _thread.start_new_thread(iniciarSeguidores,(lora,s,tiempoEnvioSeguidores,)) time.sleep(0.3) #Pendiente implantacion: _thread.start_new_thread(escucharBaseRepetidora,()) time.sleep(0.2)
The added function of where this happens is:
def escucharBaseRepetidora():
Since without this function the rest of the code works correctly.
On the other hand I will add that using the code in an independent and unique way. In other words, testing only the piece of code that I put below works perfectly. I do not finish understanding the failure and because it only happens when I put it with the complete program and it does not happen when I only execute the following:
Test code that works perfectly:
Lopy transmitter:from network import WLAN import socket import select import machine import time # Connect to server AP wlan = WLAN(mode=WLAN.STA) nets = wlan.scan() for net in nets: if net.ssid == 'Gateway1': print('Network found!') wlan.connect(net.ssid, auth=(net.sec, 'password'), timeout=5000) while not wlan.isconnected(): machine.idle() # save power while waiting print('WLAN connection succeeded!') break else: raise Exception("WiFi network not found") # sleep just to make sure the wifi is connected time.sleep(1) ip, subnet, gateway, dns = wlan.ifconfig() print("wlan->",wlan.ifconfig()) # Connect to server port = 12345 s = socket.socket() print("g->",gateway) print("Connecting to: ", gateway, port) s.connect((gateway, port)) s.setblocking(True) s.settimeout(2) file = "/flash/registro.txt" print("Sending: ", file) with open(file, 'rb') as f: data = f.read(1024) while(data): print("sending", data) s.sendall(data) data = f.read(1024) print("Done Sending") s.close() wlan.disconnect()
Lopy receiver:
from network import WLAN import socket import select import time #Setup WiFi AP wlan = WLAN(mode=WLAN.AP, ssid='Gateway1', auth=(WLAN.WPA2,'password'), antenna=WLAN.INT_ANT) def existe(fichero): try: f = open(fichero, "r") exists = True f.close() except: exists = False return exists # Bind to the port port = 12345 while True: s = socket.socket() s.bind(socket.getaddrinfo("0.0.0.0", port)[0][4]) s.listen(1) print("Mostramos listado:",os.listdir()) if existe('testeando.txt'): print("Mostramos contenido fichero testeando.txt:") print(open('testeando.txt').read()) pass print("\n\nEsperando conexion") readable, writable, errored = select.select([s], [], []) for s in readable: cl, remote_addr = s.accept() cl.setblocking(True) cl.settimeout(2) print("Client connection from:", remote_addr) file = "/flash/testeando.txt" print("writing: ", file) with open(file, 'wb') as f: while True: try: data = cl.recv(1024) print(data) f.write(data) f.close() except TimeoutError: break print("Recibido...") s.close()
If someone can tell me what kind of error that is happening and because it only fails in the entire program, I would greatly appreciate it! a greeting