简体   繁体   中英

global name 'mqttClient' is not defined

I am new to python. I'm trying to connect my client with the broker. But I am getting an error "global name 'mqttClient' is not defined". Can anyone help me to what is wrong with my code.

Here is my code,

Test.py

#!/usr/bin/env python

import time, threading
import mqttConnector


class UtilsThread(object):
    def __init__(self):
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True  # Daemonize thread
        thread.start()  # Start the execution


class SubscribeToMQTTQueue(object):
    def __init__(self):
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True  # Daemonize thread
        thread.start()  # Start the execution

    def run(self):
        mqttConnector.main()


def connectAndPushData():
    PUSH_DATA = "xxx"
    mqttConnector.publish(PUSH_DATA)


def main():
    SubscribeToMQTTQueue()  # connects and subscribes to an MQTT Queue that receives MQTT commands from the server
    LAST_TEMP = 25

    try:
        if LAST_TEMP > 0:
            connectAndPushData()
            time.sleep(5000)
    except (KeyboardInterrupt, Exception) as e:
        print "Exception in RaspberryAgentThread (either KeyboardInterrupt or Other)"
        print ("STATS: " + str(e))
        pass


if __name__ == "__main__":
    main()

mqttConnector.py

#!/usr/bin/env python

import time
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("MQTT_LISTENER: Connected with result code " + str(rc))


def on_message(client, userdata, msg):
    print 'MQTT_LISTENER: Message Received by Device'


def on_publish(client, userdata, mid):
    print 'Temperature Data Published Succesfully'


def publish(msg):
    # global mqttClient
    mqttClient.publish(TOPIC_TO_PUBLISH, msg)


def main():

    MQTT_IP = "IP"
    MQTT_PORT = "port"

    global TOPIC_TO_PUBLISH
    TOPIC_TO_PUBLISH = "xxx/laptop-management/001/data"

    global mqttClient
    mqttClient = mqtt.Client()
    mqttClient.on_connect = on_connect
    mqttClient.on_message = on_message
    mqttClient.on_publish = on_publish

    while True:
        try:
            mqttClient.connect(MQTT_IP, MQTT_PORT, 180)
            mqttClient.loop_forever()

        except (KeyboardInterrupt, Exception) as e:
            print "MQTT_LISTENER: Exception in MQTTServerThread (either KeyboardInterrupt or Other)"
            print ("MQTT_LISTENER: " + str(e))

            mqttClient.disconnect()
            print "MQTT_LISTENER: " + time.asctime(), "Connection to Broker closed - %s:%s" % (MQTT_IP, MQTT_PORT)



if __name__ == '__main__':
    main()

I'm getting this,

Exception in RaspberryAgentThread (either KeyboardInterrupt or Other)
STATS: global name 'mqttClient' is not defined

You have not defined mqttClient globally.

Make the following changes

import time
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("MQTT_LISTENER: Connected with result code " + str(rc))


def on_message(client, userdata, msg):
    print 'MQTT_LISTENER: Message Received by Device'


def on_publish(client, userdata, mid):
    print 'Temperature Data Published Succesfully'


def publish(msg):
    global mqttClient
    mqttClient.publish(TOPIC_TO_PUBLISH, msg)


def main():

    MQTT_IP = "IP"
    MQTT_PORT = "port"

    global TOPIC_TO_PUBLISH
    TOPIC_TO_PUBLISH = "xxx/laptop-management/001/data"

    global mqttClient
    mqttClient.on_connect = on_connect
    mqttClient.on_message = on_message
    mqttClient.on_publish = on_publish

    while True:
        try:
            mqttClient.connect(MQTT_IP, MQTT_PORT, 180)
            mqttClient.loop_forever()

        except (KeyboardInterrupt, Exception) as e:
            print "MQTT_LISTENER: Exception in MQTTServerThread (either KeyboardInterrupt or Other)"
            print ("MQTT_LISTENER: " + str(e))

            mqttClient.disconnect()
            print "MQTT_LISTENER: " + time.asctime(), "Connection to Broker closed - %s:%s" % (MQTT_IP, MQTT_PORT)


mqttClient = mqtt.Client()
if __name__ == '__main__':
    main()

Error is occurs due to using following line :

mqttClient.on_connect = on_connect

the correct format should be

mqtt.Client.on_connect = on_connect

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM