Ejemplo n.º 1
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }