Exemplo n.º 1
0
        public async Task <EvaluationResult> DeviceTwin(DeviceWebAPIParameters parms)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Received a command", Passed = true
            };

            try
            {
                var iotReg            = new IotUtilities.IotRegistry(parms.IotConnection);
                var connectionStrings = await iotReg.GetTwinsConnectionString();

                var retries = 0;
                var retry   = true;
                //Added basic retry pattern
                while ((retry) && (retries < 3))
                {
                    try
                    {
                        var client = DeviceClient.CreateFromConnectionString(connectionStrings[0], s_transportType);
                        if (client == null)
                        {
                            throw new ArgumentException("Failed to create a device client");
                        }
                        Twin twin = await client.GetTwinAsync().ConfigureAwait(false);

                        if (twin.Properties.Desired.Contains("sample"))
                        {
                            dynamic prop = twin.Properties.Desired["sample"];
                            result.Message = prop;
                            TwinCollection reportedProperties = new TwinCollection();
                            reportedProperties["sample"] = result.Message;
                            try
                            {
                                await client.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false);
                            }
                            catch
                            {
                                //Ignore error here.  This is a write operation and it fails if the value already exists.
                            }
                        }
                        else
                        {
                            result.Message = $"The \"sample\" property does not exist for the {twin.DeviceId} device.";
                            result.Passed  = false;
                            result.Code    = -1;
                        }
                        retry = false;
                    }
                    catch (Exception inner)
                    {
                        retries++;
                        if (retries < 3)
                        {
                            Thread.Sleep(1000);
                        }
                        else
                        {
                            result.Passed  = false;
                            result.Code    = inner.HResult;
                            result.Message = $"Error: {inner.Message}";
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                result.Passed  = false;
                result.Code    = ex.HResult;
                result.Message = $"Error: {ex.Message}";
            }
            return(result);
        }
Exemplo n.º 2
0
        public async Task <EvaluationResult> ReceiveEvents(string consumerGroup = null)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Received messages", Passed = true
            };

            try
            {
                consumerGroup = consumerGroup ?? PartitionReceiver.DefaultConsumerGroupName;
                var regUtil     = new IotUtilities.IotRegistry(parms.IotConnection);
                var deviceNames = await regUtil.GetDeviceNames();

                var priorRowKeys = await storage.RetrieveLastKeys(deviceNames);

                var priorRowKey        = priorRowKeys[0];
                var currentRowKey      = priorRowKey;
                var eventProcessorHost = new EventProcessorHost(
                    parms.HubName,
                    consumerGroup,
                    parms.EhubConnection,
                    parms.EhubStorage,
                    this.containerName);
                try
                {
                    //await eventProcessorHost.RegisterEventProcessorAsync<EventHubProcessor>();
                    await eventProcessorHost.RegisterEventProcessorFactoryAsync(new MyEventProcessorFactory(parms.EhubStorage, tableName, containerName));

                    var start       = DateTime.Now;
                    var currentTime = DateTime.Now;
                    var seconds     = (currentTime - start).TotalSeconds;
                    //Wait for the first table entry for 30 seconds.
                    while ((priorRowKey == currentRowKey) && (seconds < 30))
                    {
                        Thread.Sleep(100);
                        currentTime   = DateTime.Now;
                        currentRowKey = (await storage.RetrieveLastKeys(deviceNames))[0];
                        seconds       = (currentTime - start).TotalSeconds;
                        System.Diagnostics.Trace.WriteLine($"Seconds: {seconds}\tPrior: {priorRowKey}\tCurrent: {currentRowKey}");
                    }
                    if (currentRowKey == priorRowKey)
                    {
                        //No rows found
                        result.Code    = -1;
                        result.Passed  = false;
                        result.Message = "No errors occurred, but no events were processed.";
                    }
                    else
                    {
                        //Wait for events to come in.  If synchronous, this will be 0 seconds.  This can be no more than 10 seconds.
                        if (parms.EventReceiveDelay > 10)
                        {
                            parms.EventReceiveDelay = 10;
                        }
                        if (parms.EventReceiveDelay > 0)
                        {
                            Thread.Sleep(parms.EventReceiveDelay * 1000);
                        }
                        List <DeviceReadingEntity> data = new List <DeviceReadingEntity>();

                        data.AddRange((await storage.RetrieveProcessedData(5, deviceNames)).Data);
                        result.Data    = data;
                        result.Message = $"IoT device messages were received and processed into the {tableName} storage table";
                    }
                }
                finally
                {
                    await eventProcessorHost.UnregisterEventProcessorAsync();
                }
            }
            catch (Exception outer)
            {
                result.Passed  = false;
                result.Code    = outer.HResult;
                result.Message = $"Error: {outer.Message}";
            }
            return(result);
        }