为什么监控所有的MQTT数据都是一秒一个?何处改设置?

方案一:从Neuron,北向设备为MQTT,指向emqx所在服务器,发现是1秒一个。
方案二:从neuron,北向设备为ekuiper插件,然后ekuiperManager配置为MQTT,指向emqx所在服务器,同样也是一秒一个。

上述的Neuron都是200ms采样间隔。但是一直没有做到,emqx监控的数据能到200ms,也就是一秒5个的速率,这什么原因。谢谢。

不止一次听到,这MQTT是事件驱动的,正常情况,是不是Neuron采样的指令间隔更高,那MQTT发布的频率越高? 但是我不管是MQTTX客户端接收,还是自己写的python代码去,onmessage的回调函数去接收,这都是固定在一秒一次MQTT数据。
这怎么解决? 是不是那里的设置问题? 谢谢。

目前在时序上,还发现一个问题:
不管是Neuron的指令间隔设置为100ms,还是3000ms,这显示的延时时间都是200ms左右。也就是说,以下载的Neuron-demo为准,它的采样速度是固定的? 并没有受到指令间隔的设置而改变?

EMQX 这边是没有这个限制的。能检查下 Neuron 也相关的配置么?处理上报到 EMQX 的频率?

@xiumei.li 有想法么

能确认neuron mqtt北向简单连接emqx有这样的问题吗?麻烦确认一下neuron的版本是多少,系统是什么,南向是什么驱动?

我先回复您这个问题:系统是Ubuntu22.04,neuron版本是2.5.3,南向是Modbus-TCP,完全是neuron-deamon版本。不是docker运行,而是安装neuron2.5.3版本。
目前不管是neuron mqtt 到broker,还是通过ekuiper插件,再sink选择mqtt到broker,都是一秒一次的频率。

我使用对应版本,未能复现出你描述的问题。方便的话可以贴一下日志出来。

经过测试,有下面的数据传输(南向设备接收速率)和mqtt的(北向设备发布传输速率):
一:南向设备接收到的数据,随着指令间隔的延长,从0ms到1000ms,确实是逐步减少的,从最初的24个,降低到了8个(一次传输8个字节)。
二:北向设备的mqtt发布,其数据量不受指令间隔影响,一直是3个。这就导致了emqx接受,始终速率不变,这不是事件驱动的表现。
我这就去找日志。
不过哪怕把Modbus tcp的响应时间降低到0,南向设备的指令间隔降低到0ms,这最大南向数据接收速率也不高,相当于一秒只能接受三次数据(一次是8个寄存器的内容,一秒统计的接收数据是24个)。这是因为neuron-demo版的缘故吗?

今天比较晚了。暂时根据数据测试现状小结一下,可能跟mqtt的发布和订阅机制设置有关。
1.neuron的南向设备,modbus tcp 的传输速率有点低,哪怕是设置了0延时,收发数据的频率可能也不高。
2.neuron的mqtt发布速率也是固定不变的,是否可能在那里限定了设置参数?
3.broker的mqtt订阅,也可能在那里设置了参数,导致向MQTTX,或者通过onMessage()消息,都严格限制在1秒一次了。
之前一直打算是走通neuron–>ekuiper–>TDengine的路,是不是在emqx设置上,对mqtt broker有参数设置? 谢谢回答。这走一点弯路也属正常。

可以明确broker和ekuiper都没有这种限制。不是很理解你所说的neuron部分的设置,方便的话截个南向连接配置的图和北向mqtt连接配置的图,或者neuron群里加一下开发者远程看一下。

其实目前的数据传输功能已经实现,前端的Modbus TCP数据源输出什么字节,在MQTTx,或者直接自己的程序,在回调函数onMessage()中取到mqtt订阅的数据,都能一一对应上。

现在的问题,则是数据传输的性能问题;白天我这边不在调试区,有其他的事;也只有晚上才能描述调试现象和配置。

比如昨天的调试,Neuron以Modbus TCP协议方式轮询,设置的指令间隔是0ms,数据源的响应也是设置0ms,也能观察到南向设备的数据传输量,随着指令间隔的降低,数据传输的速率逐步降低;但是北向设备的mqtt发布,则是固定不变的;体现在emqx的监控端,那就是消息流入是一秒一个的频率。现在的问题,是没能找到应该在什么地方的设置,改变上述的mqtt发布频率。

另外,我是做了多年的数据采样和数据分析的工程师,有相应的排查能力,只是有不熟悉,在这问题上卡了很久,才专门请教。谢谢。

问题找到了。
是在group采样间隔上,没有修改1000ms的值。
目前要修改的是数据源的响应间隔,group的采样间隔,以及南向设备本身的指令间隔三处,最后能确保mqtt的发布速度。
谢谢大家解答。其他问题基本走通了。也通过mqtt数据桥接到了公网。

另外剩下的问题,就直接到了,如何从emqx==>TDengine,数据桥接的类型中,没有TDengine选项,这需要用什么插件? 其实也有打算,emqx==>MySQL,但是遇到同样的问题,数据桥接中没有MySQL选项。

数据持久化到TDengine和MySQL是企业版本的功能

谢谢,昨天你们同事的指点几句,让我少走了很多弯路,终于调试出来了。
后续我再做一些数据传输压力测试,如果有进一步的疑问,到时再来请教。