private static async void HubDeviceClientConnectionStatusChanged(ConnectionStatus status, ConnectionStatusChangeReason reason) { Console.WriteLine($"{nameof( HubDeviceClient )} connection status changed to: {status}, because of {reason}"); if (status == ConnectionStatus.Disconnected || status == ConnectionStatus.Disabled) { HubDeviceClient.Dispose(); await Task.Delay(HubDeviceClientFirstReconnectDelay); try { Console.WriteLine($"Attempting first reconnect of {nameof(HubDeviceClient)}..."); await CreateHubDeviceClientAsync(); } catch (Exception e) { Console.WriteLine($"Error occurred attempting first reconnect of {nameof( HubDeviceClient )}: {e}"); await Task.Delay(HubDeviceClientSecondReconnectDelay); try { Console.WriteLine($"Attempting final reconnect of {nameof( HubDeviceClient )}..."); await CreateHubDeviceClientAsync(); } catch (Exception ex) { Console.WriteLine($"Error occurred attempting final reconnect of {nameof( HubDeviceClient )}. Exiting application: {ex}"); _cts.Cancel(); Environment.Exit(999); } } } }
static async Task Main(string[] args) { SensorInfosByDataType[TemperatureDataType] = new SensorInfo(74, int.MinValue); SensorInfosByDataType[LightDataType] = new SensorInfo(1.0, double.MinValue); SensorInfosByDataType[MotionDataType] = new SensorInfo(false, null); var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", true) .AddEnvironmentVariables(); Configuration = builder.Build(); CancellationTokenSource cts = new CancellationTokenSource(); try { Console.CancelKeyPress += (s, e) => { _motionTimer?.Dispose(); e.Cancel = true; cts.Cancel(); Console.WriteLine("Exiting..."); }; Console.WriteLine("RoomDevice - Simulate a Digital Twins device with Temperature, Light, and Motion sensors. Ctrl-C to exit.\n"); if (!ValidateSettings()) { Console.WriteLine("RoomDevice - Your settings are invalid. Please check your setting values and try again."); Environment.Exit(1); } var hardwareId = Configuration[HardwareIdSetting]; Console.WriteLine($"Your hardware ID is: {hardwareId}"); TimeSpan startupDelay = TimeSpan.FromSeconds(double.Parse(Configuration[StartupDelayInSecondsSetting])); Console.WriteLine($"Waiting {startupDelay.TotalSeconds} seconds to startup..."); await Task.Delay(startupDelay, cts.Token); _motionTimer = new Timer(RandomizeMotionValue, null, 5000, _randomizationDelay); var topologyClient = new TopologyClient(Configuration[ManagementApiUrlSetting], Configuration[SasTokenSetting]); DeviceInfo = topologyClient.GetDeviceForHardwareId(hardwareId).Result; if (DeviceInfo == null) { Console.WriteLine("ERROR: Could not retrieve device information."); Environment.Exit(2); } HubDeviceClient = DeviceClient.CreateFromConnectionString(Configuration[IoTHubDeviceConnectionStringSetting], TransportType.Mqtt); IoTHubDeviceId = IotHubConnectionStringBuilder.Create(Configuration[IoTHubDeviceConnectionStringSetting]).DeviceId; await HubDeviceClient.SetMethodHandlerAsync("SetDesiredTemperature", SetDesiredTemperature, null); await HubDeviceClient.SetMethodHandlerAsync("SetDesiredAmbientLight", SetAmbientLight, null); Console.WriteLine("Connection to Digital Twins: " + DeviceInfo.ConnectionString); TopologyDeviceClient = DeviceClient.CreateFromConnectionString(DeviceInfo.ConnectionString); if (TopologyDeviceClient == null) { Console.WriteLine("Failed to create Digital Twins DeviceClient!"); Environment.Exit(3); } else { await Task.WhenAll(SimulateData( cts.Token )); } } catch (Exception ex) { Console.WriteLine("Error in RoomDevice: {0}", ex.Message); Environment.Exit(99); } }