在 Azure VM Broker 上使用 Keep-Alive > 5 分钟静默断开连接的 MQTT 连接?

物联网 MQTT 蚊子 emq 天蓝色
2021-06-24 04:36:40

问题摘要:

  1. 连接到 test.mosquitto.org 或 iot.eclipse.org 并保持 5 分钟以上的活动状态,一切似乎都按预期工作。

  2. 连接到我的代理(都在 Azure 托管的 VM 上 - 一个是 Mosquitto,一个是 Emqttd),如果保持活动时间超过 5 分钟,我的客户端不会发送 ping。他们只是死了。经纪人最终会因为没有 ping 而断开它们的连接。我没有使用 Azure 负载平衡器,而是直接连接到 VM)。

问题是,如果它是通过蜂窝网络连接的设备不知道它已断开连接(不知道为什么?)

通过以太网,它会按照它应该的方式重新连接自己。

不确定 Azure VM 是否有什么独特之处导致了我的断开连接/超时问题以及更长的保活时间?

最后,如果我使用 2 分钟或更短的 keep-alive,一切正常。

3个回答

我发现了我的问题以及如何解决它。在这里发布作为完整的答案,以防其他人有类似的问题。

可以使用公共 IP 地址创建 Azure 虚拟机(资源管理器,非经典)。这是管理空闲超时的地方。默认为 4 分钟。

如果您单击门户中的 ip 地址,您将被带到该 VM 的公共 ip 刀片。

在菜单中选择配置以查看该刀片。有一个标有“空闲超时(分钟)”的滑块。调整它并单击顶部的保存。

或者,这可以通过 powershell 配置

    Login-AzureRmAccount 
    Set-AzureRmContext -SubscriptionId "subscription name"
    $publicIpAddress = Get-AzureRmPublicIPAddress -Name "ip address name" -ResourceGroupName "resource group name"
    $publicIpAddress.IdleTimeoutInMinutes = 29
    Set-AzureRmPublicIpAddress -PublicIpAddress $publicIpAddress

只是为了完成这个问题。

正如评论中所说。看起来 Azure 的路由器会丢弃闲置 5 分钟的连接。有关详细信息,请参阅此堆栈溢出答案:https : //stackoverflow.com/questions/16840834/are-established-network-connections-to-azure-endpoint-terminated-by-firewall-or

这。

tcp_keepalive_time

我不记得我是从哪里捕捉到的,所以我无法链接到源代码。尽管如此,所有的信息都准确无误。

是的,微软应该在他们的 Azure Linux 映像中加入更合适的值。