IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    认输

    obaby发表于 2025-05-21 02:19:47
    love 0

    这几天在调整一个项目的 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.



沪ICP备19023445号-2号
友情链接