这几天在调整一个项目的 mqtt 上报的数据时发现一个诡异的问题,那就是同样的服务器,如果使用 mqtt 客户端连上去一切都是正常的,上报频率也确实是看起来跟客户说的一样一分钟 1 条。
然而,在代码里获取的时候就完全变了,有时候看起来一切正常有时候时间就变得异常不稳定。
[*] Time: 2025-05-20 15:09:13 [*] Time interval from last message: 240.51 seconds [*] Topic: canteen/third/second/valve1 [*] Message: {"switch1":1,"switch2":0,"switch3":0,"switch4":0} [A] Updated device status: canteen/third/second/valve1_switch1 [W] Device not found: canteen/third/second/valve1_switch3
甚至有时候时间能到十来分钟都没数据。这个就很诡异了。
输出错误日志会发现系统在一直尝试断线重连:
但是在不断重连之后又能间歇性 的收到消息,这就很神奇了。7: “Connection refused – not authorized (no credentials needed)”
在尝试调整 qos 以及优化连接代码之后,依然无果。没有任何的改进,不得已只能放弃原有的链接库paho,转投更先进的gmqtt。
gmqtt: Python async MQTT client implementation.
https://pypi.org/project/gmqtt/
看示例代码也比较简洁:
import asyncio import os import signal import time from gmqtt import Client as MQTTClient # gmqtt also compatibility with uvloop import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) STOP = asyncio.Event() def on_connect(client, flags, rc, properties): print('Connected') client.subscribe('TEST/#', qos=0) def on_message(client, topic, payload, qos, properties): print('RECV MSG:', payload) def on_disconnect(client, packet, exc=None): print('Disconnected') def on_subscribe(client, mid, qos, properties): print('SUBSCRIBED') def ask_exit(*args): STOP.set() async def main(broker_host, token): client = MQTTClient("client-id") client.on_connect = on_connect client.on_message = on_message client.on_disconnect = on_disconnect client.on_subscribe = on_subscribe client.set_auth_credentials(token, None) await client.connect(broker_host) client.publish('TEST/TIME', str(time.time()), qos=1) await STOP.wait() await client.disconnect() if __name__ == '__main__': loop = asyncio.get_event_loop() host = 'mqtt.flespi.io' token = os.environ.get('FLESPI_TOKEN') loop.add_signal_handler(signal.SIGINT, ask_exit) loop.add_signal_handler(signal.SIGTERM, ask_exit) loop.run_until_complete(main(host, token))
其实,各种方式或者库对我来说没什么特殊的喜好,只要能解决自己的问题就好,作为一个实用主义住,该认输就认输,毕竟要解决这个异常问题可能得从框架本身入手了,这也非我所愿。有这点时间干点别的不好吗?
白天又又又又收到了整改通知,现在看到这种整改通知,的确是有点沮丧,改不完,根本改不完。
不过这次反馈的是功能问题,该修复还是要修复的。不过白天也确实没时间了,晚上还要带宝子去石老人看沙滩音乐会。
下班还是果断先带宝子出去玩啊:
舞台比较小,毕竟是海尔组织的小型活动,所以也没多大的舞台。据说主要目的还是为了今天的集体婚礼,宝子一直在边上的游乐设施玩,等玩够了却发现连舞台边都看不到,什么也看不着,好在无人机表演倒是不需要往前挤。
早上送宝子上学,宝子嚷嚷着要听收音机的 青紫堂的广告,非得听那个念电话号码的 57813377。不得不说,这个广告没白听,我都记住了。
学校外面看到有卖小樱桃的,问了下十三一斤,回家的路上买了点,说要两三节,结果一下子来了四斤多。
到家之后打开袋子发现是上当了,篮子底下的基本都是坏的。也就是说给我装的就没几个好的,连表面一层好的想找也找不出来了。
对象说,你洗洗看看吧,不行就不要了。
那和樱桃放到水盆里,倒上水,挑的时候的确是绝望了,不单软软的,还有很多烂的,挑了几个长了一下,也不好吃。最后放弃了,连袋子一起扔到了垃圾桶里。
这的确是上了老当了,被骗了,只能认输。
17 comments
所以一直是华为脸最大吗
是因为国内的个人开发者,只有华为还允许上架 app。
小米 ov 系列都要求企业开发者。
听起来都累,还玩什么
累
网上有人提过这个库有问题么?python生态可能不那么强,java就比较容易搜到答案
公司项目嘛,能用就行,而自己项目就要死磕到底,哈
通过贵站提供的RSS链接订阅你的博客动态不知道为什么读取不了内容
用的哪个域名?
可能被cdn拦截了
这个链接 https://h4ck.org.cn/feed,还有其他链接吗,我再试试
嗯嗯,国外的访问可能需要通过 cdn 的验证,经常被打。
你试试这个吧https://da.bi/feed 这个没套 cdn。不过有 waf,如果没有异常操作应该不会被拦截。
谢谢!可以啦
客气 嘻嘻
巧了,昨晚老婆买了打折樱桃10元一斤,买了17元的。
也是坏掉的多,挑了半小时,留了6分之一左右。
没敢直接洗,担心污染了偶尔那几个好的。
拼多多看了贵一点15左右一斤
真是坑了爹了 前几天学校门口买的一个大爷的还不错也是15
这代码输出的界面确实很漂亮。
以前在马路边卖水果的忽悠我给了假钱,以后再也不在路边上买东西了
是的呢 的确容易被坑
上周路边买的枇杷13块一斤,还很酸,结果菜市场10块钱3-4斤。
灵妹妹你们家公主晚上都不做作业吗?
基本下午下课一个小时托管作业就写的差不多了