如何将 Microsoft.Azure.Devices.Client.DeviceClient KeepAliveInSeconds 设置为大于 30 的数字

How to set Microsoft.Azure.Devices.Client.DeviceClient KeepAliveInSeconds to a higher number than 30

我正在研究通过卫星连接使用 MQTT(或 AMQP)。我正在通过 HTTPS 将 MQTT 用于 Azure 中的物联网中心。卫星上的数据非常昂贵,我正试图尽量减少此连接的“空闲”消耗。我可以通过更改 SaS 令牌的更新频率(默认 1 小时)和 Keep Alive 来做到这一点。

我正在使用 Microsoft.Azure.Devices NuGet 包中的 DeviceClient,我可以在那里创建一个 TransportSettings 对象并设置保持活动状态:

ITransportSettings transportSettings = new MqttTransportSettings(TransportType.Mqtt_WebSocket_Only)
{
    KeepAliveInSeconds = 90,
};

然后我这样创建连接:

var client = DeviceClient.CreateFromConnectionString(connectionString , new[] { transportSettings });

我所经历的是。如果我省略传输设置,连接将每 5 秒发送一次保持活动状态。如果我将保持活动设置为 30 及以上的任何值,它总是每 30 秒发送一次保持活动。 KeepAliveInSeconds 属性 的描述告诉默认值为 300 秒:

但我的 Wireshark 跟踪却讲述了一个不同的故事:

当 CreateFromConnectionString 中没有给出 MqttTransportSettings 时,它会每 5 秒发送一次保持活动状态。当我添加设置时,我可以将 keep alive 设置为 10 或 30 seocnds 并且这有效,但是如果我像这个例子一样将它设置为 90,它会停留在 30 秒左右(Wireshark 跟踪显示)。 我试着查看 Azure 是否可以更改那里的任何内容。而且物联网中心没有这样的设置。

所以希望其他人经历过这个并找到了一个解决方案,从客户端有一个不是每 5 或 30 秒发送一次的保持活动。我的目标是每 2-5 分钟一次。

我是此 SDK 的开发人员之一,我查看了导致此问题的原因。

我们的 WebSocket 实现使用 ClientWebSocket class 来创建连接。默认情况下,ClientWebSocket 的 KeepAliveInterval 为 30 秒。这个 KeepAliveInterval 控制 WebSocket Ping 请求。 这与我们自己的 KeepAliveInSeconds 不同,后者用于 MQTT 中的特定 PINGREQ 数据包。

我们没有公开设置 WebSocket KeepAliveInterval 的方法,但我创建了 this issue 来跟踪并将在内部与团队讨论。

设置 KeepAliveInSeconds 有一个注意事项。 SDK使用时除以4。详见this documentation

The client will send a ping request 4 times per keep-alive duration set. It will wait for 30 seconds for the ping response, else mark the connection as disconnected. Setting a very low keep-alive value can cause aggressive reconnects, and might not give the client enough time to establish a connection before disconnecting and reconnecting.

万一有人遇到这个并且正在使用 AMQP 并且有类似的问题。在回答这个问题时,AMQP 服务有一个 4 分钟的内部保持活动间隔,它强加给客户端。 (这也独立于 WebSocket KeepAliveInterval。)此间隔无法更改,因为它是在服务中设置的。

此问题已在 released 版本 1.41.0 中修复。