【问题标题】:How to make each MQTT Publih Message in Separate Packet?如何使每个 MQTT 以单独的数据包发布消息?
【发布时间】:2019-05-25 11:38:00
【问题描述】:

我正在制作一个电子票务系统,我使用 MQTT V3.1.1 允许用户打开大门(大门是使用 Raspberry Pi 3 Model B+ 制作的)。

在这种情况下,我想用 10000 条发布消息和每个消息的不同主题(主题范围从 bcn/bcn0000 - bcn/bcn00010000)一次性负载测试代理和树莓派,负载为 unix nano 时间戳。测试成功,但是当我尝试在测试期间捕获进入我的 Raspberry Pi 的 MQTT 数据包时,它只捕获不到 10000 个(应该是 10000 个数据包吧?)MQTT 发布消息并且我使用 MQTT QoS 0。代理我使用的是安装在我的 VPS 中的 Mosquitto。

捕获的数据包(使用 TCPDUMP 捕获)在一个 MQTT 数据包中有超过 10 个 MQTT 发布消息。这是由nagle的算法引起的吗?以及如何使每条消息同时发送,每个发布消息都有单独的数据包

编辑:使用 golang (paho.mqtt.golang) 的服务器端编程和逻辑和使用 python (paho.mqtt.python) 的树莓派,我将 mosquitto.conf 上的 set_tcp_nodelay 设置为 true 但没有运气

【问题讨论】:

  • 为什么你认为它们应该是单独的数据包?不需要将 MQTT 消息分解为单独的 TCP 数据包,而且效率更高

标签: tcp mqtt mosquitto paho


【解决方案1】:

请在 python paho 客户端中使用以下行来禁用 Nagle 算法,该算法不会在一个数据包/帧中发送多条消息

client.connect("0.0.0.0", 1883, 60)  
client.socket().setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, True)

【讨论】:

    【解决方案2】:

    捕获的数据包(使用 TCPDUMP 捕获)在一个 MQTT 数据包中有超过 10 个 MQTT 发布消息。这是由nagle的算法引起的吗?以及如何使每条消息同时发送,每个发布消息都有单独的数据包

    我将 mosquitto.conf 上的 set_tcp_nodelay 设置为 true 但没有运气

    set_tcp_nodelay 应该可以工作,但可能会同时发送消息,因此一些消息绑定在一起从应用层传递到 tcp/ip 层。

    在 (paho.mqtt.golang) 中是否有类似 flush() 的方法?

    或者最糟糕的想法是,发布一条消息,关闭连接并重新启动新连接以发送下一条消息。疯了……

    和@hardillb 一样,我很好奇你为什么要发送单独的数据包? 根据 tcp/ip 模型,不管 tcp/ip 层如何发送消息,我们可以在应用层接收正确的消息,这就足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多