micropython / micropython/micropython-lib

MQTT connection and client.check_msg() problem

Offen
#386 7 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Python
Sterne
2.9k
Forks
1.1k
Ø Merge
7 T. 6 Std.
Gemergte PRs (30 T.)
3

Beschreibung

I'm using Adafruit IO switches to turn my nodeMCU lights ON and OFF. The following code works but for a limited period of time. 5 minutes after the connection into Adafruit IO it seems the client tries to reconnect and if this happens I lose my switch funcionality at my adafruit dashboard. Either if I try to turn on or off the LED on my dashboard, the nodeMCU does not responds accordingly. Here is the code used (I'm using micropython, pycharm and a Lolin v3 nodemcu)

from machine import Pin
import sys
import os
import network
from umqtt.robust import MQTTClient

random_num = int.from_bytes(os.urandom(3), 'little')
mqtt_client_id = bytes('client_' + str(random_num), 'utf-8')

ADAFRUIT_LINK = b'io.adafruit.com'
ADAFRUIT_USERNAME = b'rodrigo1120'
ADAFRUIT_KEY = b'AAAAAAAAAAAAAAAAAAAAAAAAAAAA'
ADAFRUIT_FEEDNAME1 = b'gpio16'
ADAFRUIT_FEEDNAME2 = b'gpio2'

ssid = "WIFIUSERNAME"
password = "WIFIPASSWORD"

client = MQTTClient(client_id= mqtt_client_id,
                    server= ADAFRUIT_LINK,
                    user=ADAFRUIT_USERNAME,
                    password=ADAFRUIT_KEY)

mqtt_feedname1 = bytes('{:s}/feeds/{:s}'.format(ADAFRUIT_USERNAME, ADAFRUIT_FEEDNAME1), 'utf-8')
mqtt_feedname2 = bytes('{:s}/feeds/{:s}'.format(ADAFRUIT_USERNAME, ADAFRUIT_FEEDNAME2), 'utf-8')


def connect_to_ap():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('Connecting to {}'.format(ssid))
        wlan.connect(ssid, password)
        while not wlan.isconnected():
            pass
    print('Credentials: ', wlan.ifconfig())
    try:
        client.connect()
    except Exception as e:
        print('Could not connect to MQTT Server {}{}'.format(type(e).__name__, e))


def callback_routine(feed, msg):
    print('Received Data from: feed={}, msg={}'.format(feed, msg))
    if ADAFRUIT_FEEDNAME1 in feed:
        action = str(msg, 'utf-8')
        if action == 'ON':
            pin16.value(0)
        else:
            pin16.value(1)
        print('Action: {}'.format(action))
    if ADAFRUIT_FEEDNAME2 in feed:
        action = str(msg, 'utf-8')
        if action == 'ON':
            pin2.value(0)
        else:
            pin2.value(1)
        print('Action: {}'.format(action))


pin16 = Pin(16, Pin.OUT)
pin2 = Pin(2, Pin.OUT)
pin16.value(1)
pin2.value(1)


def main():
    connect_to_ap()
    while True:
        client.set_callback(callback_routine)
        client.subscribe(mqtt_feedname1)
        client.subscribe(mqtt_feedname2)
        try:
            client.wait_msg()
        except KeyboardInterrupt:
            print('Ctrl+C pressed, exiting')
            client.disconnect()
            sys.exit()


if __name__ == '__main__':
    main()

Here is a picture of my serial monitor with this problem: (I took this picture 15 minutes after I stopped using the adafruit IO switches)
problemmp023

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Das Issue enthält eine MicroPython-Reproduktion mit umqtt.robust.MQTTClient, connect_to_ap() und der wait_msg()-Schleife in main(), nennt jedoch keine Repository-Datei oder keinen Test. Beginne damit, die Wiederverbindung nach mehreren Minuten zu reproduzieren und das Reconnect- und wait_msg-Verhalten von MQTTClient zu untersuchen; die Aufgabe ist abgeschlossen, wenn eine bestätigte Ursache und eine abgestimmte Änderung oder Aktualisierung der Dokumentation identifiziert wurden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
embedded-iot, networking
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.