Esempio n. 1
0
        public async Task <EvaluationResult> GetReadings(DeviceWebAPIParameters parms)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Processed telemetry", Passed = true
            };

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

                if (connectionStrings.Count != 3)
                {
                    throw new IndexOutOfRangeException("Incorrect number of device connection strings. There should be three.");
                }
                List <Task> tasks   = new List <Task>();
                var         devices = generateDevices(connectionStrings, parms.Interval);
                for (int i = 0; i < 3; i++)
                {
                    tasks.Add(deviceReadings(devices[i], parms.Iterations));
                }

                Task.WaitAll(tasks.ToArray());
            }
            catch (Exception ex)
            {
                result.Passed  = false;
                result.Code    = ex.HResult;
                result.Message = ex.Message;
            }
            return(result);
        }
Esempio n. 2
0
        public async Task <EvaluationResult> ReceiveCommand(DeviceWebAPIParameters parms)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Received a command", Passed = true
            };
            var iotReg            = new IotUtilities.IotRegistry(parms.IotConnection);
            var connectionStrings = await iotReg.GetTwinsConnectionString();

            var client = DeviceClient.CreateFromConnectionString(connectionStrings[0], s_transportType);

            if (client == null)
            {
                throw new ArgumentException("Failed to create a device client");
            }

            Message receivedMessage;


            receivedMessage = await client.ReceiveAsync(TimeSpan.FromSeconds(30)).ConfigureAwait(false);

            if (receivedMessage != null)
            {
                result.Message = Encoding.ASCII.GetString(receivedMessage.GetBytes());
                await client.CompleteAsync(receivedMessage).ConfigureAwait(false);
            }
            else
            {
                result.Message = "Device message receive timed out.  You must add a message within 30 seconds.";
                result.Passed  = false;
                result.Code    = -1;
            }
            return(result);
        }
        public async Task <EvaluationResult> VerifyData()
        {
            var result = new EvaluationResult {
                Code = 0, Passed = true, Message = "Verified Stream Analytics results"
            };

            try
            {
                var iotreg  = new IotUtilities.IotRegistry(parms.IotConnection);
                var devices = await iotreg.GetDeviceNames();

                result = await storage.RetrieveProcessedData(5, devices);
            }
            catch (Exception ex)
            {
                result.Code    = ex.HResult;
                result.Passed  = false;
                result.Message = $"Error testing Stream Analytics: {ex.Message}";
            }
            return(result);
        }
Esempio n. 4
0
        public async Task <EvaluationResult> GetDeviceCount(DeviceWebAPIParameters parms)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Processed telemetry", Passed = true
            };
            var retry   = true;
            var retries = 3;

            while (retry && (retries < 3))
            {
                try
                {
                    var iotReg      = new IotUtilities.IotRegistry(parms.IotConnection);
                    var deviceCount = (await iotReg.GetTwinsConnectionString()).Count;
                    result.Passed  = deviceCount == 3;
                    result.Message = $"There are {deviceCount} devices registered in IoY Hub";
                    result.Code    = deviceCount == 3 ? 0 : -1;
                    retry          = false;
                }
                catch (Exception ex)
                {
                    retries++;
                    if (retries == 3)
                    {
                        result.Passed  = false;
                        result.Code    = ex.HResult;
                        result.Message = $"Error: {ex.Message}";
                    }
                    else
                    {
                        Thread.Sleep(1000);
                    }
                }
            }
            return(result);
        }
Esempio n. 5
0
        public async Task <EvaluationResult> ReceiveCommand(DeviceWebAPIParameters parms)
        {
            var result = new EvaluationResult {
                Code = 0, Message = "Received a command", Passed = false
            };

            //Added Try-Catch to prevent instantation errors from breaking webpage. 2021/05/11 - Anders Grasdal
            //Updated Method to include a serviceClient which sends the test message.
            //Updated evaluation response to be falsey by default and true only after success.
            try
            {
                /**
                 * var serviceClient = IotD.ServiceClient.CreateFromConnectionString(parms.IotConnection);
                 * if (serviceClient == null)
                 * {
                 *  throw new ArgumentException("Failed to create a service client ");
                 * }
                 *
                 * string messageContent = "This is a test message from the cloud to Building001";
                 * IotD.Message sentMessage = new IotD.Message(Encoding.ASCII.GetBytes(messageContent));
                 * try
                 * {
                 *  await serviceClient.SendAsync("Building001", sentMessage);
                 * }
                 * catch
                 * {
                 *  throw new ArgumentException("Failed to send message to Building001, device does not exist.");
                 * }
                 **/



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

                var found = false;

                foreach (var deviceConnectionString in connectionStrings)
                {
                    if (deviceConnectionString.Contains("DeviceId=Building001"))
                    {
                        found = true;
                        var client = DeviceClient.CreateFromConnectionString(deviceConnectionString, s_transportType);
                        if (client == null)
                        {
                            throw new ArgumentException("Failed to create a device client");
                        }

                        Message receivedMessage;
                        receivedMessage = await client.ReceiveAsync(TimeSpan.FromSeconds(30)).ConfigureAwait(false);

                        if (receivedMessage != null)
                        {
                            result.Message = Encoding.ASCII.GetString(receivedMessage.GetBytes());
                            await client.CompleteAsync(receivedMessage).ConfigureAwait(false);

                            result.Passed = true;
                        }
                        else
                        {
                            result.Message = "Device message receive timed out.  You must add a message to Building001 within 30 seconds.";
                            //result.Passed = false;
                            result.Code = -1;
                        }
                        break;
                    }
                }
                if (!found)
                {
                    result.Message = "The \"Building001\" device does not exist.";
                    result.Code    = -1;
                }
            }
            catch (Exception ex)
            {
                //result.Passed = false;
                result.Code    = ex.HResult;
                result.Message = $"Error: {ex.Message}";
            }
            return(result);
        }
Esempio n. 6
0
        public async Task <EvaluationResult> DeviceTwin(DeviceWebAPIParameters parms)
        {
            // Update, default pass/fail state is now false, will only become true after complete success. 2021/05/12 - Anders Grasdal
            var result = new EvaluationResult {
                Code = 0, Message = "Received a command", Passed = false
            };

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

                var retries = 0;
                var retry   = true;
                var found   = false;
                //Added basic retry pattern
                while ((retry) && (retries < 3))
                {
                    try
                    {
                        //Iterate over each device twin connection string until the one for Building001 is found, then perform tests against that.
                        //2021/05/12 - Anders Grasdal
                        foreach (var deviceConnectionString in connectionStrings)
                        {
                            if (deviceConnectionString.Contains("DeviceId=Building001"))
                            {
                                found = true;
                                var client = DeviceClient.CreateFromConnectionString(deviceConnectionString, 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 = $"The \"sample\" property of Building001 is: \"{prop}\"";
                                    TwinCollection reportedProperties = new TwinCollection();
                                    reportedProperties["sample"] = prop;
                                    try
                                    {
                                        await client.UpdateReportedPropertiesAsync(reportedProperties).ConfigureAwait(false);
                                    }
                                    catch
                                    {
                                        //Ignore error here.  This is a write operation and it fails if the value already exists.
                                    }
                                    result.Passed = true;
                                }
                                else
                                {
                                    result.Message = $"The \"sample\" property does not exist for the Building001 device.";
                                    //result.Passed = false;
                                    result.Code = -1;
                                }
                                break;
                            }
                        }


                        if (!found)
                        {
                            result.Message = "The \"Building001\" device does not exist.";
                            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);
        }
Esempio n. 7
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);
        }
Esempio n. 8
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);
        }