如何将 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 中修复。
我正在研究通过卫星连接使用 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 中修复。