普通视图

发现新文章,点击刷新页面。
昨天 — 2025年5月21日首页

认输

2025年5月21日 10:19

这几天在调整一个项目的 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。不得不说,这个广告没白听,我都记住了。

学校外面看到有卖小樱桃的,问了下十三一斤,回家的路上买了点,说要两三节,结果一下子来了四斤多。

到家之后打开袋子发现是上当了,篮子底下的基本都是坏的。也就是说给我装的就没几个好的,连表面一层好的想找也找不出来了。

对象说,你洗洗看看吧,不行就不要了。

那和樱桃放到水盆里,倒上水,挑的时候的确是绝望了,不单软软的,还有很多烂的,挑了几个长了一下,也不好吃。最后放弃了,连袋子一起扔到了垃圾桶里。

这的确是上了老当了,被骗了,只能认输。

The post 认输 appeared first on obaby@mars.

❌
❌