Improve stability on connection with AWS
-
Hello and sorry for the english:
I'm trying to use AWS IOT with Python i i'm implementing mqtt client:
#Importamos los modulos de sistema from MQTTLib import AWSIoTMQTTClient import gc import machine from machine import Pin, SD import time import pycom import os import sys #Informacion de sistema print(os.uname()) #Recoleccion de basura automatica gc.enable() #Deshabilitamos el LED azul que se activa al inicio pycom.heartbeat(False) ############################################CONFIGURACION DEL WIFI#################################################### #Importamos el modulo personalizado de conexion de wifi import connectwifi as cw #mensaje de inicio print('Starting ...') #Conectamos al wiFi y pasamos las credenciales cw.connect("*****", "*****") ###############################################CONFIGURACION DE AWS################################################### #Configuramos el puerto para MQTT cifrado AWS_PORT = 8883 #Definimos el 'endpoint' esto es proporcionado por AMAZON AWS_HOST = "*****.amazonaws.com" #Definimos la ubicacion de los certificados, estos tambien son proporcionados por Amazon #IMPORTANTE: los nombres de las carpetas DEBEN ser esctrictos para que la AWS_ROOT_CA = "/flash/cert/*****.pem" AWS_CLIENT_CERT = "/flash/cert/*****.cert.pem" AWS_PRIVATE_KEY = "/flash/cert/*****.key" #Definimos la identificacion del cliente, DEBE SER LA MISMA que la configurada en Amazon #Para conexion basada en certificados myMQTTClient = AWSIoTMQTTClient("Pycom-client") #Para conexion basada en Websockets # myMQTTClient = AWSIoTMQTTClient("Pycom-client", useWebsocket=True) #Configuramos las credenciales #Para autenticazion mutua en TLS myMQTTClient.configureEndpoint(AWS_HOST, 8883) #Para Websockets # myShadowClient.configureEndpoint(AWS_HOST, 443) #myMQTTClient.configureCredentials(AWS_ROOT_CA, AWS_PRIVATE_KEY, AWS_CLIENT_CERT) myMQTTClient.configureCredentials(AWS_ROOT_CA, AWS_PRIVATE_KEY, AWS_CLIENT_CERT) #Para Websockets solo necesitamos el certificado CA #myMQTTClient.configureCredentials(AWS_ROOT_CA) #Configuraciones adicionales obligatorias myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec myMQTTClient.configureMQTTOperationTimeout(50) # 5 sec ########################################################################################################################## #Especificamos un 'callback' que se ejecutara cada vez que se reciba un mensaje del servidor def customCallback(client, userdata, message): print("Mensaje recibido: ") print(message.payload) print("Desde el tema: ") print(message.topic) print("--------------\n\n") #Creamos un dato para enviar dataToSend = "Hola AWS, soy la Pycom!!!" #Nos suscribimos a un tema para recibir mensajes del servidor myMQTTClient.subscribe("topic_2", 1, customCallback) #Ciclo principal while True: #Nos suscribimos a un tema para recibir mensajes del servidor myMQTTClient.subscribe("topic_2", 1, customCallback) #Corremos el recolector de basura gc.collect() #En cada ciclo tratamos de hacer la conexion y reiniciamos cuando se rompa try: #Conectamos myMQTTClient.connect() #Mensaje de conexion exitosa if myMQTTClient.connect(): print('AWS connection succeeded') #Publicamos en continuo notificaciones al servidor print("Enviando un dato: ", dataToSend) myMQTTClient.publish("topic_1", dataToSend, 0) #Desconectamos myMQTTClient.disconnect() except OSError as error: #En caso de error forzamos la reconexion print('Error en la conexion: {0} \n Intentanto reconectar...'.format(error)) machine.reset()
However the connection still is very Instability, i receive a timeout or server rejection messages very often, I can send a couple of meessages and receive some others but is difficult to receive messages via subscription and i don't if i should use additional code in order to improve, i don't know if i must use additional code in order to improve.
Thank you and sorry for the English