【问题标题】:Solution for continuously running a code part within a MQTT client?在 MQTT 客户端中持续运行代码部分的解决方案?
【发布时间】:2019-01-03 21:01:17
【问题描述】:

我正在尝试通过 mqtt 连接向我发送一条消息,然后对收件箱中收集的收到的消息执行一项任务。问题是当我运行代码时,消息还没有被接收到,代码中对消息中的信息起作用的部分没有再次运行。

我曾考虑为该位使用while True: 循环,但随后根本无法访问 mqtt 脚本。这不起作用。

这可能是一个非常基础的问题,但是我怎样才能实现连续运行 mqtt 客户端并在稍后的某个时间处理收集到的消息呢?

import paho.mqtt.client as client

hostname = 'test.mosquitto.org'
topic = "personal/topic"

# receiving the data
inbox = []    

def on_message(client, userdata, msg):
    msg = msg.payload.decode()
    inbox.append(msg)
    print("Received Message No. %s:    %s" % (len(inbox), msg))    

def on_connect(client, userdata, flags, rc):
    print("Connection returned result: " + str(rc))
    client.subscribe(topic)

# this is where I want to perform a task on the message
y = []
X = []
for msg in inbox:
    label, data = msg.split(': ')
    data = data.split(', ')
    y.append(label)
    X.append(data)

# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_forever()

这是在脚本末尾使用client.loop_start()的构造(与@hardillb 的回答有关):

# the mqtt part
client = client.Client()
client.on_message = on_message
client.on_connect = on_connect
client.connect(hostname)
client.loop_start()

while True:
    y = []
    X = []
    for msg in inbox:
        label, data = msg.split(': ')
        data = data.split(', ')
        y.append(label)
        X.append(data)

client.disconnect()
client.loop_stop()

【问题讨论】:

  • 您发布的代码没有问题,它按预期工作。请编辑问题以添加有关您希望它做什么的更多详细信息。
  • @hardillb 我将该部分添加到代码中,我想在其中处理收到的消息。但是y X 始终保持空白
  • 我想我会将消息放在Queue 对象中,然后让另一个线程尝试get 来自Queue 的项目,只要Queue 中没有项目, get 阻塞线程
  • @user8408080 到目前为止我还没有真正研究过线程,但我现在可能会考虑这样做......谢谢

标签: python python-3.x mqtt paho


【解决方案1】:

paho 客户端可以使用client.loop_start() 函数在单独的线程上启动它的网络工作者。

之后您可以开始自己的处理循环,但on_message 回调函数将在客户端的网络工作线程上运行,因此如果您想将传入消息排队以便稍后处理,您需要确保当您以线程安全的方式存储消息。

【讨论】:

  • 如果我将client.loop_forever()替换为client.loop_start(),客户端将无法连接并且Process finished with exit code 0。我在这里做错了什么?
  • 您需要将处理 for 循环移到 client.loop_start() 之后(您还需要将 for 循环包装在另一个循环中以处理空数组并等待它被填充)
  • 我在上面编辑了我的问题并添加了代码,我认为你建议。它是否正确?我还可以在哪种条件下处理True 的循环?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多