如何避免IoT边缘模块出现如此多的断开连接

时间:2019-09-12 18:27:15

标签: c# azure-iot-edge

已经按照最新的代码模板(来自VSCode)实现了一个不错的iotEdge模块,现在我实现了方法

private static void ConnectionStatusChangeHandler(ConnectionStatus status, ConnectionStatusChangeReason reason)
        {
            reports++;
            if ((reports % 20)==0) {
                Console.WriteLine("[{2}] Connection Status Changed to {0} ({1}) (now {3} reports).", status, reason, DateTimeOffset.UtcNow.ToString("u"), reports);
            }
}

这种方法被称为每小时大约一百万次,这似乎是错误的。在该小时内,连接一直稳定。我想在脱机的情况下选择更改模块状态的选项。

如您所见,我不会在每次通话时出于测试目的打印输出,因为那样会使设备崩溃。

我期望与IoT-Hub保持稳定的连接,并且断开的连接并不多。我似乎做错了,但我不知道在哪里。

初始化代码:

static async Task Init()
    {
        MqttTransportSettings mqttSetting = new MqttTransportSettings(TransportType.Mqtt_Tcp_Only);
        ITransportSettings[] settings = { mqttSetting };
        device_id = Environment.GetEnvironmentVariable("IOTEDGE_DEVICEID");
        s_deviceClient = DeviceClient.CreateFromConnectionString(ioTConnString + ";DeviceId=" + device_id.ToString() + ";", TransportType.Mqtt);
        s_deviceClient.SetConnectionStatusChangesHandler(ConnectionStatusChangeHandler);
    }

1 个答案:

答案 0 :(得分:0)

仅在连接状态更改时记录日志如何?

假设ConnectionStatus是一个枚举,则此代码可以解决问题。 我将_previousStatus设置为可空,以便在第一次调用该方法时肯定会触发日志记录。

        ConnectionStatus? _previousStatus;
        private static void ConnectionStatusChangeHandler(ConnectionStatus status, ConnectionStatusChangeReason reason) {
            if (status != _previousStatus) {
                _previousStatus = status;
                Console.WriteLine("[{2}] Connection Status Changed to {0} ({1}) (now {3} reports).", status, reason, DateTimeOffset.UtcNow.ToString("u"), reports);
            }
        }

相关问题