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



Pycom on Twitter