This example shows how to use the 51Degrees Cloud service to lookup the details of a device based on a given 'native model name'. Native model name is a string of characters that are returned from a query to the device's OS. There are different mechanisms to get native model names for Android devices and iOS devices
using FiftyOne.Pipeline.CloudRequestEngine.FlowElements;
 using FiftyOne.Pipeline.Core.FlowElements;
 using Microsoft.Extensions.Logging;
using System;
using System.IO;
using System.Net.Http;
{
    public class Program
    {
        public class Example
        {
            
            private const string _nativeModel1 = "SC-03L";
            private const string _nativeModel2 = "iPhone11,8";
            public void Run(string resourceKey, ILoggerFactory loggerFactory, 
                TextWriter output, string cloudEndPoint = "")
            {
                output.WriteLine("This example shows the details of devices " +
                    "associated with a given 'native model name'.");
                output.WriteLine($"The native model name can be retrieved by " +
                    $"code running on the device (For example, a mobile app).");
                output.WriteLine($"For Android devices, see " +
                    $"https://developer.android.com/reference/android/os/Build#MODEL");
                output.WriteLine($"For iOS devices, see " +
                    $"https://gist.github.com/soapyigu/c99e1f45553070726f14c1bb0a54053b#file-machinename-swift");
                output.WriteLine("----------------------------------------");
                HttpClient httpClient = new HttpClient();
                
                
                
                
                var cloudRequestEngineBuilder = new CloudRequestEngineBuilder(loggerFactory, httpClient)
                    .SetResourceKey(resourceKey);
                
                
                if (string.IsNullOrWhiteSpace(cloudEndPoint) == false)
                {
                    cloudRequestEngineBuilder.SetEndPoint(cloudEndPoint);
                }
                
                using (var cloudEngine = cloudRequestEngineBuilder.Build())
                
                
                using (var propertyKeyedEngine = new HardwareProfileCloudEngineBuilder(loggerFactory)
                    .Build())
                
                using (var pipeline = new PipelineBuilder(loggerFactory)
                    .AddFlowElement(cloudEngine)
                    .AddFlowElement(propertyKeyedEngine)
                    .Build())
                {
                    
                    AnalyseNativeModel(_nativeModel1, pipeline, output);
                    
                    AnalyseNativeModel(_nativeModel2, pipeline, output);
                }
            }
            static void AnalyseNativeModel(string nativemodel, IPipeline pipeline, TextWriter output)
            {
                
                
                using (var data = pipeline.CreateFlowData())
                {
                    
                    data.AddEvidence(Shared.Constants.EVIDENCE_QUERY_NATIVE_MODEL_KEY, nativemodel);
                    
                    data.Process();
                    
                    var result = data.Get<MultiDeviceDataCloud>();
                    output.WriteLine($"Which devices are associated with the " +
                        $"native model name '{nativemodel}'?");
                    
                    
                    
                    
                    foreach (var device in result.Profiles)
                    {
                        var vendor = device.HardwareVendor.GetHumanReadable();
                        var name = device.HardwareName.GetHumanReadable();
                        var model = device.HardwareModel.GetHumanReadable();
                        output.WriteLine($"\t{vendor} {name} ({model})");
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            
            
            string resourceKey = args.Length > 0 ? args[0] :
                Environment.GetEnvironmentVariable(
                    ExampleUtils.CLOUD_RESOURCE_KEY_ENV_VAR);
            
            var loggerFactory = LoggerFactory.Create(b => b.AddConsole());
            var logger = loggerFactory.CreateLogger<Program>();
            if (string.IsNullOrEmpty(resourceKey))
            {
                logger.LogError($"No resource key specified on the command line or in the " +
                    $"environment variable '{ExampleUtils.CLOUD_RESOURCE_KEY_ENV_VAR}'. " +
                    $"The 51Degrees cloud service is accessed using a 'ResourceKey'. " +
                    $"For more information " +
                    $"see https://51degrees.com/documentation/_info__resource_keys.html. " +
                    $"Native model lookup is not available as a free service. This means that " +
                    $"you will first need a license key, which can be purchased from our " +
                    $"pricing page: https://51degrees.com/pricing. Once this is done, a resource " +
                    $"key with the properties required by this example can be created at " +
                    $"https://configure.51degrees.com/QKyYH5XT. You can now populate the " +
                    $"environment variable mentioned at the start of this message with the " +
                    $"resource key or pass it as the first argument on the command line.");
            }
            else
            {
                new Example().Run(resourceKey, loggerFactory, Console.Out);
            }
            
            loggerFactory.Dispose();
        }
    }
}