How to accumulate messages as mqtt client for 1 second, then save it to a file(如何作为MQTT客户端累计消息1秒,然后保存到文件中)
本文介绍了如何作为MQTT客户端累计消息1秒,然后保存到文件中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的问题如下: 我写了一个订阅一个主题的程序,其中两个带有一个键的字典分别每秒到达更多的次数。在每条消息上,它们都会更改其值。 我将这些字典保存在一个名为&status&q;的大缓冲字典中。我需要的是将每秒状态的快照(&Q;)保存到文件中。
我尝试了计时。睡眠(1),但它漂移。而且我不知道如何用日程安排来处理这个问题,因为已经存在客户端循环.
我是Python和MQTT的新手,非常感谢您的帮助
我的代码:
import paho.mqtt.client as mqtt
import time
import json
Status = {}
#create client instance
client = mqtt.Client(client_id=None, clean_session=True, transport="tcp")
#connect to broker
client.connect("my_broker", 1883)
#use subscribe() to subscribe to a topic and receive messages
client.subscribe("topic/#", qos=0)
def test1_callback(client, userdata, msg):
msg_dict = json.loads((msg.payload))
Status.update(msg_dict)
client.message_callback_add("topic/test1", test1_callback)
while True:
client.loop_start()
time.sleep(1)
client.loop_stop()
with open('Data.txt', 'a+') as file:
t = time.localtime()
Status["time"]= time.strftime("%H:%M:%S", t)
file.write(str(Status["time"]) + " ")
file.write(str(Status["key1"]) + " ")
file.write(str(Status["key2"]) + " ")
client.loop_start()
推荐答案
与其手动停止网络线程,我更喜欢使用每秒触发的计时器。此外,将数据存储到文件时锁定数据可能是个好主意,否则两者之间可能会发生更新:
# ...
import threading
def test1_callback(client, userdata, msg):
msg_dict = json.loads((msg.payload))
lock.acquire()
Status.update(msg_dict)
lock.release()
def timer_event():
lock.acquire()
# save to file here
lock.release()
# restart timer
threading.Timer(1, timer_event).start()
Status = {}
lock = threading.Lock()
# client initialization
# ...
client.loop_start()
threading.Timer(1, timer_event).start()
while True:
pass
但这并不能防止您的存储值漂移,因为该主题显然发布得太频繁,因此您的订阅者(甚至是代理)无法足够快地处理消息。
因此,您可能希望缩短发布此主题的时间间隔。还要注意,您订阅了一个多级主题-即使"topic/test1"
之外的主题没有在代码中处理,它们仍然会给代理和订阅客户端带来负载
这篇关于如何作为MQTT客户端累计消息1秒,然后保存到文件中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何作为MQTT客户端累计消息1秒,然后保存到文件中
基础教程推荐
猜你喜欢
- 症状类型错误:无法确定关系的真值 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01