程序启动后 MQTT 挂起,LDR 处理在没有 MQTT 消息的情况下不起作用

物联网 MQTT 树莓派
2021-05-29 09:00:52

我正在尝试使用 Raspberry Pi 套件的 GPIO 引脚(引脚 4)将 LDR 传感器连接到 IoT 并发布 MQTT 消息。我使用激光作为发射器,LDR传感器作为接收器,LDR传感器的输出信号是(0或1),如果有东西通过激光线,LDR传感器的输出将为1,那么代码必须发布一个 MQTT 消息。

我试过这个代码:

import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import time
import ssl

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN)

# Define Variables
MQTT_PORT = 1883
MQTT_KEEPALIVE_INTERVAL = 60
MQTT_TOPIC = "ldr"
MQTT_MSG = "there is a product"
MQTT_HOST = "iot.eclipse.org"


# Define on_publish event function
def on_publish(client, userdata, mid):
    print ("Message Published...")

# Initiate MQTT Client
mqttc = mqtt.Client()

# Register publish callback function
mqttc.on_publish = on_publish


# Connect with MQTT Broker
mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
print ("Connected Successfully")
mqttc.loop_forever()

#Main Loop

 while True       
    input_value = GPIO.input(4)
        if input_value == 1:
            mqttc.publish(MQTT_TOPIC,MQTT_MSG,qos=1)
            print ("message published")
            time.sleep(1)

当我运行它时,我只看到打印的输出文本“成功连接”,我没有看到任何预期的 MQTT 消息。

你能告诉我这段代码有什么问题吗?我根据这个想法创建了主循环:input_value = GPIO.input(4)如果信号的值为 1 应该输入信号然后它应该发布消息我的代码有什么问题?

1个回答

我会发布一个答案,只是为了弄清楚你的问题是什么。

然而,这并不是我的真正答案——当@hardillb 说“提示:你的主循环仍然永远不会被执行”时,你应该能够看到它。

由于它永远不会被执行,我查看了它上面的一行,上面写着mqttc.loop_forever(). 然后我用谷歌搜索了那个函数,第二个或第三个答案是理解循环 - 使用 Python MQTT 客户端,它清楚地说明

loop_forever() 方法会阻塞程序,当程序必须无限期运行时非常有用。

因此,显然永远不会达到以下语句。这就是你的答案。


我不会做的是为你修复你的程序,但我会给你一些提示(教人钓鱼)。

  • 也许你不需要调用mqttc.loop_forever(). 我不太了解你想让你的程序做什么来解决这个问题(接收一个激光信号,或循环接收多个)。也许你可以删除它。如果你需要它,那么你需要学习threading有些人一开始对这个主题有困难,但有时你只需要使用它。

  • 有人通过插入打印语句提到调试。要这样做。给自己一个合适的 IDE。对于 Python,我不知道有什么比出色的Pycharm更好的了它是免费的,即使用于商业用途。请随时在我们的姊妹网站上寻找其他选项

    一旦你有了一个好的 IDE,学习设置断点,这是好的调试的核心概念。代码将一直运行到断点并停止。然后,您可以检查甚至更改变量的值,检查调用堆栈,查看哪个函数调用了哪个函数以及使用了哪些参数,并且您可以一次单步执行代码。

    在这种情况下,您会看到代码不会超出对 的调用mqttc.loop_forever(),这应该使您检查文档并发现您的问题是它是一个阻塞调用。

  • 实际上,这看起来像是一个纯粹的软件问题,而不是任何特定于物联网的问题。我知道很难说清楚,也很难知道要在哪个网站上发帖,但是,总的来说,如果我要发布代码,那么我认为Stack Overflow是正确的网站。

    在那里发布时,您应该发布您的代码,解释它应该做什么,以及它做错了什么。只有有了这些信息,其他人才能帮助您。

  • 最后,当您的代码正常工作时,如果您不熟悉该语言,您可能希望将其发布到我们的代码审查站点。不要发布非工作代码。如果您发布可运行的代码,那里的人将帮助您了解它如何变得更高效、更好的布局、更易于理解和维护等,这可能是一个非常好的学习辅助工具。

我希望这对您有所帮助,并期待在各个 SE 站点见到您:-)