【问题标题】:Mqtt Subscribing and reading from multiple topicsMqtt 订阅和阅读多个主题
【发布时间】:2018-08-12 08:22:53
【问题描述】:

我需要读取两个传感器并在 pygame 窗口中获取结果。我有一个 pi 零作为传感器的发布者和代理运行。它创建了两个主题,“房子”和“热量”。在第二个 pi(virtualbox 上的 jessie)上,我运行以下 python 脚本并得到预期的结果。因此,我会问我选择创建两个不同的客户端(具有两个不同的 on_message)是否是正确的选择,以便从两个不同的主题中获取两个值。 请原谅我的代码错误或不准确之处,我不是专家,一个月前我才知道 Mosquitto。大部分代码是仅用于测试 mqtt 的原始代码。在网上冲浪我没有找到关于如何读取传感器值并将它们放入窗口(如 pygame 或 Tkinter)的实际示例,而不使用云应用程序和使用 python 和 pi 的;有人知道这样的教程吗? 谢谢

import time
import paho.mqtt.client as paho
import pygame, sys

pygame.init()
screen = pygame.display.set_mode((640,480),0,32)
background = pygame.Surface(screen.get_size())
background.fill((0,0,0))
font = pygame.font.SysFont("comicsansms", 72)

broker = "192.168.100.21"

ss=''
tt=''
def omessage(client, userdata, message):
    if message.topic=="house":
        global ss
        ss=(str(message.payload.decode("utf-8")+message.topic))
    if message.topic=="heat":
        global tt
        tt=(str(message.payload.decode("utf-8")+message.topic))

client=paho.Client("cliente-001")
client.on_message=omessage
client.connect(broker)
client.loop_start()

client.subscribe("house")
client.subscribe("heat")
while True:
    screen.blit(background, (0,0))

    text=font.render(" %s" %ss, True, (0,255,0))
    textRect = text.get_rect()
    screen.blit(text,textRect)

    text1=font.render(" %s" %tt, True, (0,255,0))
    text1Rect = text1.get_rect(center=(150,150))
    screen.blit(text1,text1Rect)
    time.sleep(0.2)    
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
pygame.quit()
sys.exit()

【问题讨论】:

  • on_message 函数中的 if 语句
  • 您的最后一个建议使我的代码按预期工作。我用最后的编辑更新了上面的代码。非常感谢!!

标签: python raspberry-pi mqtt paho


【解决方案1】:
  • 首先,您应该只使用一个客户端
  • 其次,您应该在循环之外subscribe 处理这两个主题
  • 第三,在on_message callback 中使用message.topic 来确定消息发布在哪个主题上。

【讨论】:

  • 非常感谢您的回复。我做了前两个建议,但和以前一样,我坚持使用 on_message。我在函数 def omessage 中更改了以下代码: ss=(str(message.payload.decode("utf-8") + message topic)) 但我只得到热温度。您能告诉我如何获得两个不同的温度,即两个主题吗?如何将它们放在两个不同的 text.get_rect 中?
  • 对不起,但我不明白你的意思是“编辑问题”,你可以看到我不是专家,我不想犯错误被论坛禁止!
  • 好的,我用我所做的更改编辑了我的代码。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2017-04-14
相关资源
最近更新 更多