全局名称'mqttClient'未定义

时间:2017-01-31 06:41:41

标签: python mqtt

我是python的新手。我正在尝试将我的客户端与代理连接起来。但我得到一个错误“全局名称'mqttClient'未定义”。 任何人都可以帮我解决我的代码有什么问题。

这是我的代码,

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()

我收到了这个,

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

2 个答案:

答案 0 :(得分:0)

您尚未全局定义mqttClient。

进行以下更改

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()

答案 1 :(得分:0)

由于使用以下行而发生错误:

mqttClient.on_connect = on_connect

正确的格式应为

mqtt.Client.on_connect = on_connect