Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    AWSIoTMQTTClient not cleaning up after itself

    Scheduled Pinned Locked Moved Issues & Bugs
    mqtt bugsaws mqttwipy3.0
    3 Posts 2 Posters 911 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • I Offline
      InverseEffect
      last edited by InverseEffect

      I wrote a script to 'emulate' what would happen if a long running WiPy was to make several connects-disconnects to AWS MQTT server. After about 7 - 9 connect-send-disconnect cycles I get the following error: MemoryError: can't create thread. I suspect that calling the AWSIoTMQTTClient .disconnect() method does not destroy the threads and the mutex locks associated with the thread. The problem with most of these examples and libraries is that it works nice when you play nice but goes pear shaped otherwise. The whole reason for going the micropython route is to be able to develop rapidly in a high level language and not to worry about the complexities one would normally have when developing in C for baremetal systems.

      To reproduce:

      from MQTTLib import AWSIoTMQTTClient
      from network import WLAN
      import time
      import config
      import pycom
      from machine import Timer
      import gc
      
      pycom.heartbeat(False)
      
      pycom.rgbled(0xff000)
      # Connect to wifi
      wlan = WLAN(mode=WLAN.STA)
      if not wlan.isconnected():
      	wlan.connect(config.WIFI_SSID, auth=(None, config.WIFI_PASS), timeout=10000)
      	while not wlan.isconnected():
      		time.sleep(0.5)
      print('WLAN connection succeeded!')
      pycom.rgbled(0x0a0a00)
      
      # user specified callback function
      # def customCallback(client, userdata, message):
      # 	print("Received a new message: ")
      # 	print(message.payload)
      # 	print("from topic: ")
      # 	print(message.topic)
      # 	print("--------------\n\n")
         
      # # Subscribe to topic
      # pycomAwsMQTTClient.subscribe("dev_kwaa", 1, customCallback)
      # time.sleep(2)
      	
      gc.enable()
      
      # Send message to host
      nr_calls = 0
      pycomAwsMQTTClient = None
      while True:
      	time.sleep(2)
      	pycomAwsMQTTClient = AWSIoTMQTTClient(config.CLIENT_ID)
      	pycomAwsMQTTClient.configureEndpoint(config.AWS_HOST, config.AWS_PORT)
      	pycomAwsMQTTClient.configureCredentials(config.AWS_ROOT_CA, config.AWS_PRIVATE_KEY, config.AWS_CLIENT_CERT)
      
      	pycomAwsMQTTClient.configureOfflinePublishQueueing(config.OFFLINE_QUEUE_SIZE)
      	pycomAwsMQTTClient.configureDrainingFrequency(config.DRAINING_FREQ)
      	pycomAwsMQTTClient.configureConnectDisconnectTimeout(config.CONN_DISCONN_TIMEOUT)
      	pycomAwsMQTTClient.configureMQTTOperationTimeout(config.MQTT_OPER_TIMEOUT)
      	pycomAwsMQTTClient.configureLastWill(config.LAST_WILL_TOPIC, config.LAST_WILL_MSG, 1)		
      	if pycomAwsMQTTClient.connect():
      		print("connected")
      		time.sleep(1)
      		res = pycomAwsMQTTClient.publish(config.TOPIC, "New Message " + str(nr_calls), 1)
      		print("Send result: {}".format(res))
      		nr_calls += 1
      		print("%d messages posted" % nr_calls)
      		pycom.rgbled(0x00aa00)
      
      		time.sleep(1)
      		res = pycomAwsMQTTClient.disconnect()
      		print("Disconnect Result: {}".format(res))
      		pycom.rgbled(0xaa0000)
      	
      	print('still alive, free heap: %s' % gc.mem_free())
      	gc.collect()
      
      
      J 1 Reply Last reply Reply Quote 0
      • J Offline
        jmarcelino @InverseEffect
        last edited by

        @inverseeffect
        Thank you for this problem report, we'll review it internally

        Can you share which board you are using? The new models (WiPy3, LoPy4, FiPy and GPY) with 4MB of RAM tend to be more tolerant to memory issues

        I 1 Reply Last reply Reply Quote 0
        • I Offline
          InverseEffect @jmarcelino
          last edited by

          @jmarcelino Hi, I used a WiPy 3.0.

          1 Reply Last reply Reply Quote 0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          • 1 / 1
          • First post
            Last post

          Pycom on Twitter

          Pycom