边缘计算mqtt监听会自动断开,不再监听,必须重新部署才会有数据

Blade 已结 1 92
hou52127
hou52127 2024-11-15 17:16

一、该问题的重现步骤是什么?

  1.  边缘计算mqtt监听会自动断开,不再监听,必须重新部署才会有数据,这个是因为什么?

  2. image.png

3.


二、你期待的结果是什么?实际看到的又是什么?

数据一直在传递

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

物联网平台,window

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  •  admin
    admin (楼主)
    2024-11-15 17:25

    是只有一个mqtt连接还是有多个,如果只有一个mqtt连接会自动断开的话,你部署一个原版的node-red,然后来监听mqtt,看看原版的会不会也断开。

    原版下载地址:https://github.com/node-red/node-red

    注:原版没有数据库读取,是文件形式单独创建的,底层功能一样

    作者追问:2024-11-15 17:25

    这个可以先不考虑,还有就是我的数据是每10秒保存数据库一次,但是保存的数据时间与当前时间一直在拉大,就是数据在排队保存,没法做到数据库实时数据展示image.png

    image.png

    作者追问:2024-11-15 17:25

    而且数据与实际数据时间差一直在拉大,有什么多线程或者其他方法来解决这种情况吗?

    作者追问:2024-11-15 17:25

    我的限制信息速率10秒,中间数据不要,只要首尾数据,实时保存到数据库,传递过来的数据时间都是当前时间的,但是数据库保存的最新数据还是4分钟之前的

    image.png

    回答: 2024-11-15 17:25

    你的意思是限制了10秒一条数据,但是存到数据库的最新数据还是4分钟之前的么?你把速率限制先取消,看看入库的数据是多少。感觉像是来的所有数据都是在进行排队,不会进行筛选,10秒入库一条数据,等时间久了,排队入库的数据依旧是很久之前的。


    这个速率的逻辑,你尝试用一个function节点来实现逻辑,在function节点内可以写对应逻辑。大概逻辑是这样的(没经过验证,需要调试)

     

     1. 设置全局变量记录时间:你可以使用一个全局变量来记录上一次保存数据的时间。

     2. 检查时间间隔:在接收到每条数据时,检查当前时间与上次保存时间的间隔。

     3. 保存数据:如果超过了10秒,则保存这条数据,并更新记录时间的全局变量

    // 获取当前时间
    let now = new Date();

    // 从全局变量中获取上次保存数据的时间
    let lastSaved = flow.get('lastSavedTime') || new Date(now.getTime() - 10000);

    // 计算时间差,单位为毫秒
    let diff = now - lastSaved;

    // 检查是否已经超过10秒
    if (diff >= 10000) {
       // 保存数据逻辑(这里假设你是将msg.payload保存到数据库)
       // 你需要根据实际情况调整这部分逻辑,例如调用数据库写入函数等
       node.send(msg); // 发送数据到下一个节点(例如数据库节点)

       // 更新上次保存时间
       flow.set('lastSavedTime', now);
    } else {
       // 如果没有超过10秒,不做任何操作
       return null; // 不发送任何数据
    }


    作者追问:2024-11-15 17:25

    确实是限制速率的问题,去掉之后,数据实时传递到数据库了,谢谢,我改用逻辑试一下

    2 讨论(2)
提交回复