0

我正在使用 MQTT 将声纳传感器数据从 EV3DEV 设备传输到 PC。为此,我在运行于 Microsoft 的 Windows Linux 子系统 (WLS) 下的 ubuntu 上设置了 MQTT Mosquitto 代理,如下图所示。

当前架构的示意图

在 EV3DEV 端,我使用 umqtt.simple 模块,在 PC 端,我使用 Paho MQTT 模块。

从 EV3DEV 到代理的消息似乎像我预期的那样快速流动(与我在早期版本中使用 socks 时可以试验的速度相似)问题出现在订阅者端,我可以看到消息正在以非常慢的速度接收,导致消息在浏览器中排队。即使在几秒钟后我停止 EV3DEV 时,我也会在很长一段时间内不断在 PC 上收到消息。

这种性能差异合理吗?与普通的 sock 通信相比,我期待 MQTT 会为数据传输增加一些额外的延迟,但我当然没想到 MQTT 消息发送和消息订阅之间的通过输出会有如此大的差异。

附加说明 - 我在 WLS 下安装了蚊子,因为它看起来更容易,而且 Windows 版本似乎无法通过安装它来工作。- 我不确定我发送消息的速度。可能与代理接收它们一样快,因为它处于专用于获取传感器数据并将其发送到代理的循环中。无论如何,问题在于代理接受来自发布者的消息的速率远高于它向订阅者发送消息的速率。- 这是我在 on_message 回调函数上使用的代码示例:

def ProcessMessage(self, client, userdata, msg):
    logging.info("Message received from broker:" +msg.payload.decode())
    Switch = {'robot/sonar': self.PutInSonarQueue, "robot/odo": 
    self.PutInOdometryQueue}
    payloadasobject = ast.literal_eval(msg.payload.decode())
    Switch[msg.topic](payloadasobject)

switch 语句调用简单地将消息放入队列的函数。

4

1 回答 1

0

好的。似乎我用消息率太高而无法处理的消息代理压倒了消息代理。现在,我不是连续循环,而是让它在消息发布之间休眠 50 毫秒,现在订阅者似乎或多或少地以与发送消息相同的速率接收消息。

于 2020-02-10T20:14:18.360 回答