// This method receives the the provisioning device client and security
        // instances created earlier.
        private static async Task <DeviceClient> ProvisionDevice(
            ProvisioningDeviceClient provisioningDeviceClient,
            SecurityProviderSymmetricKey security)
        {
            // The provisioningDeviceClient.RegisterAsync()
            // is called, which returns a DeviceRegistrationResult instance.
            // This result contains a number of properties including the DeviceId,
            // AssignedHub and the Status.
            var result = await provisioningDeviceClient
                         .RegisterAsync()
                         .ConfigureAwait(false);

            Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

            // The method then checks to ensure that the provisioning status has
            // been set and throws an exception if the device is not Assigned.
            // Other possible results here include Unassigned, Assigning,
            // Failed and Disabled.
            if (result.Status != ProvisioningRegistrationStatusType.Assigned)
            {
                throw new Exception($"DeviceRegistrationResult.Status is NOT 'Assigned'");
            }

            // The DeviceAuthenticationWithRegistrySymmetricKey class simplifies
            // the creation of an IoT Hub connection string using the device
            // ID and the Primary Symmetric Key
            var auth = new DeviceAuthenticationWithRegistrySymmetricKey(
                result.DeviceId,
                security.GetPrimaryKey());

            // Finally, a DeviceClient instance is returned that is connected
            // to the desired IoT Hub, using the authentication created above,
            // and using the AMQP protocol.
            return(DeviceClient.Create(result.AssignedHub, auth, TransportType.Amqp));
        }
示例#2
0
		static async Task Main(string[] args)
		{
			var securityProvider = new SecurityProviderSymmetricKey("{registrationId}", "{primaryKey}", "{secondaryKey}");
			var provisioningClient = ProvisioningDeviceClient.Create("global.azure-devices-provisioning.net", "{IdScope}", securityProvider, new ProvisioningTransportHandlerMqtt(Microsoft.Azure.Devices.Shared.TransportFallbackType.TcpWithWebSocketFallback));
			var result = await provisioningClient.RegisterAsync();
			Console.WriteLine($"HostName='{result.AssignedHub}';DeviceId='{result.DeviceId}';SharedAccessKey='{"{primaryKey}"}';");
		}
示例#3
0
        // INSERT Main method below here
        public static async Task Main(string[] args)
        {
            using (var security = new SecurityProviderSymmetricKey(registrationId,
                                                                   individualEnrollmentPrimaryKey,
                                                                   individualEnrollmentSecondaryKey))
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    ProvisioningDeviceClient provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, dpsIdScope, security, transport);

                    using (deviceClient = await ProvisionDevice(provClient, security))
                    {
                        await deviceClient.OpenAsync().ConfigureAwait(false);

                        // INSERT Setup OnDesiredPropertyChanged Event Handling below here
                        await deviceClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null).ConfigureAwait(false);

                        // INSERT Load Device Twin Properties below here
                        var twin = await deviceClient.GetTwinAsync().ConfigureAwait(false);
                        await OnDesiredPropertyChanged(twin.Properties.Desired, null);

                        // Start reading and sending device telemetry
                        Console.WriteLine("Start reading and sending device telemetry...");
                        await SendDeviceToCloudMessagesAsync();

                        await deviceClient.CloseAsync().ConfigureAwait(false);
                    }
                }
        }
示例#4
0
        private static async Task RegisterDevice(string deviceRegistrationId)
        {
            // using symmetric keys
            using var securityProvider = new SecurityProviderSymmetricKey(
                      registrationId: deviceRegistrationId,
                      primaryKey: ComputeKeyHash(enrollmentGroupPrimaryKey, deviceRegistrationId),
                      secondaryKey: ComputeKeyHash(enrollmentGroupSecondaryKey, deviceRegistrationId));

            // Amqp transport
            using var transportHandler = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly);

            // set up provisioning client for given device
            var provisioningDeviceClient = ProvisioningDeviceClient.Create(
                globalDeviceEndpoint: dpsGlobalDeviceEndpoint,
                idScope: dpsIdScope,
                securityProvider: securityProvider,
                transport: transportHandler);

            // register device
            var deviceRegistrationResult = await provisioningDeviceClient.RegisterAsync();

            Console.WriteLine($"   Device registration result: {deviceRegistrationResult.Status}");
            if (!string.IsNullOrEmpty(deviceRegistrationResult.AssignedHub))
            {
                Console.WriteLine($"   Assigned to hub '{deviceRegistrationResult.AssignedHub}'");
            }
            Console.WriteLine();
        }
示例#5
0
        // https://github.com/Azure-Samples/azure-iot-samples-csharp/blob/master/provisioning/Samples/device/SymmetricKeySample/Program.cs
        // Azure IoT Central Client

        static async Task Main(string[] args)
        {
            IAuthenticationMethod auth;

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))
                using (var transport = new ProvisioningTransportHandlerHttp())
                {
                    ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, idScope, security, transport);
                    DeviceRegistrationResult result     = await provClient.RegisterAsync();

                    auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());

                    using (DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt))
                    {
                        while (true)
                        {
                            if (_temperature.IsAvailable)
                            {
                                try
                                {
                                    Console.WriteLine($"The CPU temperature is {Math.Round(_temperature.Temperature.Celsius, 2)}");
                                    await SendMsgIotHub(iotClient, _temperature.Temperature.Celsius);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("exception msg: " + ex.Message);
                                }
                            }
                            Thread.Sleep(10000); // sleep for 10 seconds
                        }
                    }
                }
        }
示例#6
0
        private async Task <bool> Init()
        {
            try
            {
                using (var security = new SecurityProviderSymmetricKey(_deviceID, _primaryKey, null))
                {
                    DeviceRegistrationResult result = await RegisterDeviceAsync(security);

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        _logger.LogInformation("{time} - Failed to register device", DateTimeOffset.Now);

                        return(false);
                    }
                    IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());
                    _deviceClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt);
                }

                await SendDevicePropertiesAsync();
            }
            catch (Exception ex)
            {
                _logger.LogError($"{DateTimeOffset.Now} - Error:{ex.Message}");
                return(false);
            }

            return(true);
        }
示例#7
0
 public DeviceAuthenticationSymmetricKeyFactory(
     SecurityProvider securityProvider,
     IDeviceRegistrationProvider deviceRegistrationProvider
     )
 {
     _securityProvider           = (SecurityProviderSymmetricKey)securityProvider;
     _deviceRegistrationProvider = deviceRegistrationProvider;
 }
        public async Task RunSampleAsync()
        {
            // When registering with a symmetric key using a group enrollment, the provided key will not
            // work for a specific device, rather it must be computed based on two values: the group enrollment
            // key and the desired device Id.
            if (_parameters.EnrollmentType == EnrollmentType.Group)
            {
                _parameters.PrimaryKey = ComputeDerivedSymmetricKey(_parameters.PrimaryKey, _parameters.Id);
            }

            Console.WriteLine($"Initializing the device provisioning client...");

            // For individual enrollments, the first parameter must be the registration Id, where in the enrollment
            // the device Id is already chosen. However, for group enrollments the device Id can be requested by
            // the device, as long as the key has been computed using that value.
            // Also, the secondary could could be included, but was left out for the simplicity of this sample.
            using var security = new SecurityProviderSymmetricKey(
                      _parameters.Id,
                      _parameters.PrimaryKey,
                      null);

            using var transportHandler = GetTransportHandler();

            ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(
                _parameters.GlobalDeviceEndpoint,
                _parameters.IdScope,
                security,
                transportHandler);

            Console.WriteLine($"Initialized for registration Id {security.GetRegistrationID()}.");

            Console.WriteLine("Registering with the device provisioning service...");
            DeviceRegistrationResult result = await provClient.RegisterAsync();

            Console.WriteLine($"Registration status: {result.Status}.");
            if (result.Status != ProvisioningRegistrationStatusType.Assigned)
            {
                Console.WriteLine($"Registration status did not assign a hub, so exiting this sample.");
                return;
            }

            Console.WriteLine($"Device {result.DeviceId} registered to {result.AssignedHub}.");

            Console.WriteLine("Creating symmetric key authentication for IoT Hub...");
            IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(
                result.DeviceId,
                security.GetPrimaryKey());

            Console.WriteLine($"Testing the provisioned device with IoT Hub...");
            using DeviceClient iotClient = DeviceClient.Create(result.AssignedHub, auth, _parameters.TransportType);

            Console.WriteLine("Sending a telemetry message...");
            using var message = new Message(Encoding.UTF8.GetBytes("TestMessage"));
            await iotClient.SendEventAsync(message);

            Console.WriteLine("Finished.");
        }
        public static async Task RunTest(string scopeId, string sasToken, string deviceId, string dpsEndpoint)
        {
            Console.WriteLine("Starting DPS client tests.");

            int successes = 0;
            int failures  = 0;

            var security          = new SecurityProviderSymmetricKey(deviceId, sasToken, null);
            var transportHandlers = new List <(ProvisioningTransportHandler, string)>();

            transportHandlers.Add((new ProvisioningTransportHandlerHttp(), "default"));
            foreach (var transportFallbackType in _transportFallbackTypes)
            {
                transportHandlers.Add((new ProvisioningTransportHandlerAmqp(transportFallbackType), transportFallbackType.ToString()));
                transportHandlers.Add((new ProvisioningTransportHandlerMqtt(transportFallbackType), transportFallbackType.ToString()));
            }

            foreach ((ProvisioningTransportHandler, string)transportHandler in transportHandlers)
            {
                try
                {
                    Console.WriteLine($"Registering with {transportHandler.Item1.GetType().Name}/{transportHandler.Item2}");

                    var provClient = ProvisioningDeviceClient.Create(
                        dpsEndpoint,
                        scopeId,
                        security,
                        transportHandler.Item1);
                    DeviceRegistrationResult provResult = await provClient.RegisterAsync().ConfigureAwait(false);

                    if (provResult.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        Console.WriteLine($"Failed to connect due to {provResult.ErrorCode}: {provResult.ErrorMessage}.");
                        continue;
                    }

                    Console.WriteLine("Succeeded.\n");
                    successes++;
                }
                catch (Exception ex)
                {
                    // Print all the relevant reasons for failing, without printing out the entire exception information
                    var reason = new StringBuilder();

                    Exception next = ex;
                    do
                    {
                        reason.AppendFormat($" - {next.GetType()}: {next.Message}\n");
                        next = next.InnerException;
                    }while (next != null);
                    Console.WriteLine($"Failed for {transportHandler} due to:\n{reason}");
                    failures++;
                }
            }

            Console.WriteLine($"DPS client tests finished with {successes} successes and {failures} failures.");
        }
        public SecurityProvider Create()
        {
            var securityProvider = new SecurityProviderSymmetricKey(
                _options.RegistrationId,
                _options.PrimaryKey,
                _options.SecondaryKey
                );

            return(securityProvider);
        }
示例#11
0
        //Provision the Device
        static void ProvisionDevice()
        {
            Console.WriteLine("Provisioning process starting..");
            Console.WriteLine("Fetching secrets..");
            var secrets = ReadSecrets();

            if (secrets == null)
            {
                Console.WriteLine("No secrets found!");
                return;
            }

            Console.WriteLine("Secrets found!");

            string dpsServiceEndpoint = secrets.serviceEndpoint;
            string idScope            = secrets.idScope;
            string registrationId     = secrets.registrationId;
            string primaryDeviceKey   = secrets.primaryDerivedKey;
            string secondaryDeviceKey = secrets.secondaryDerivedKey;

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryDeviceKey, secondaryDeviceKey))
            {
                // Select one of the available transports:
                // To optimize for size, reference only the protocols used by your application.
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerHttp())
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly))
                {
                    try
                    {
                        Console.WriteLine("Creating provisioning client");

                        ProvisioningDeviceClient provClient =
                            ProvisioningDeviceClient.Create(dpsServiceEndpoint, idScope, security, transport);

                        Console.WriteLine("Starting attestation..");
                        DeviceRegistrationResult registrationResult = provClient.RegisterAsync().GetAwaiter().GetResult();
                        Console.WriteLine("Device successfully provisioned");

                        Console.WriteLine("Storing primary and secondary connection strings in settings file!");
                        Console.WriteLine("Primary Connection string: Hostname={0};DeviceId={1};SharedAccessKey={2}", registrationResult.AssignedHub, registrationId, primaryDeviceKey);
                        Console.WriteLine("Secondary Connection string: Hostname={0};DeviceId={1};SharedAccessKey={2}", registrationResult.AssignedHub, registrationId, secondaryDeviceKey);
                        string primaryConnectionString   = "Hostname=" + registrationResult.AssignedHub + ";DeviceId=" + registrationResult.DeviceId + ";SharedAccessKey=" + primaryDeviceKey;
                        string secondaryConnectionString = "Hostname=" + registrationResult.AssignedHub + ";DeviceId=" + registrationResult.DeviceId + ";SharedAccessKey=" + secondaryDeviceKey;

                        WriteSettings(primaryConnectionString, secondaryConnectionString);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message + ": " + ex.InnerException.Message);
                    }
                }
            }
        }
示例#12
0
        static async Task <DeviceClient> DeviceRegistration(string applicationId, string deviceId, int port)
        {
            string deviceKey;

            // See if AzureIoT hub connections string has been configured
            string connectionString = ApplicationConfiguration.ConnectionStringResolve(applicationId, port);

            if (!String.IsNullOrEmpty(connectionString))
            {
                return(DeviceClient.CreateFromConnectionString(connectionString, deviceId));
            }

            // See if Azure DPS has been configured
            using (var hmac = new HMACSHA256(Convert.FromBase64String(ApplicationConfiguration.DpsEnrollmentGroupSymmetricKeyResolve(applicationId, port))))
            {
                deviceKey = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(deviceId)));
            }

            using (var securityProvider = new SecurityProviderSymmetricKey(deviceId, deviceKey, null))
            {
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(ApplicationConfiguration.DpsGlobaDeviceEndpointResolve(),
                                                                                          ApplicationConfiguration.DpsIdScopeResolve(applicationId, port),
                                                                                          securityProvider,
                                                                                          transport);

                    DeviceRegistrationResult result = await provClient.RegisterAsync();

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        throw new ApplicationException($"DevID:{deviceId} Status:{result.Status} RegisterAsync failed");
                    }

                    IAuthenticationMethod authentication = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (securityProvider as SecurityProviderSymmetricKey).GetPrimaryKey());

                    return(DeviceClient.Create(result.AssignedHub,
                                               authentication,
                                               new ITransportSettings[]
                    {
                        new AmqpTransportSettings(TransportType.Amqp_Tcp_Only)
                        {
                            PrefetchCount = 0,
                            AmqpConnectionPoolSettings = new AmqpConnectionPoolSettings()
                            {
                                Pooling = true,
                            }
                        }
                    }
                                               ));
                }
            }
        }
示例#13
0
        private static string ProvisionDevice(string scope, string deviceId, string primaryKey)
        {
            Console.Write("Provisioning device...");

            using var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly);
            var security   = new SecurityProviderSymmetricKey(deviceId, primaryKey, null);
            var provClient = ProvisioningDeviceClient.Create(GlobalProvisionEndPoint, scope, security, transport);
            var result     = provClient.RegisterAsync().GetAwaiter().GetResult();

            Console.WriteLine(" successfully provisioned");
            return(result.AssignedHub);
        }
示例#14
0
        public static int Main(string[] args)
        {
            if (string.IsNullOrWhiteSpace(s_idScope) && (args.Length > 0))
            {
                s_idScope = args[0];
            }

            if (string.IsNullOrWhiteSpace(s_idScope))
            {
                Console.WriteLine("ProvisioningDeviceClientSymmetricKey <IDScope>");
                return(1);
            }

            string primaryKey   = "";
            string secondaryKey = "";

            if (!String.IsNullOrEmpty(registrationId) && !String.IsNullOrEmpty(enrollmentGroupPrimaryKey) && !String.IsNullOrEmpty(enrollmentGroupSecondaryKey))
            {
                //Group enrollment flow, the primary and secondary keys are derived from the enrollment group keys and from the desired registration id
                primaryKey   = ComputeDerivedSymmetricKey(Convert.FromBase64String(enrollmentGroupPrimaryKey), registrationId);
                secondaryKey = ComputeDerivedSymmetricKey(Convert.FromBase64String(enrollmentGroupSecondaryKey), registrationId);
            }
            else if (!String.IsNullOrEmpty(registrationId) && !String.IsNullOrEmpty(individualEnrollmentPrimaryKey) && !String.IsNullOrEmpty(individualEnrollmentSecondaryKey))
            {
                //Individual enrollment flow, the primary and secondary keys are the same as the individual enrollment keys
                primaryKey   = individualEnrollmentPrimaryKey;
                secondaryKey = individualEnrollmentSecondaryKey;
            }
            else
            {
                Console.WriteLine("Invalid configuration provided, must provide group enrollment keys or individual enrollment keys");
                return(-1);
            }

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))

                // Select one of the available transports:
                // To optimize for size, reference only the protocols used by your application.
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerHttp())
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
                // using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.WebSocketOnly))
                {
                    ProvisioningDeviceClient provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, s_idScope, security, transport);

                    var sample = new ProvisioningDeviceClientSample(provClient, security);
                    sample.RunSampleAsync().GetAwaiter().GetResult();
                }
            Console.WriteLine("Enter any key to exit");
            Console.ReadLine();
            return(0);
        }
示例#15
0
        public async Task <Microsoft.Azure.Devices.Client.DeviceClient> ProvisionAsync <DeviceClient>(DataStorage storage)
        {
            var connStringContent       = storage.Read("ConnectionString");
            DevicePortalInfoModel model = JsonConvert.DeserializeObject <DevicePortalInfoModel>(connStringContent);
            string scope          = model.Device.ID_Scope;
            string primaryKey     = model.Device.PrimaryKey;
            string secondaryKey   = model.Device.SecondaryKey;
            string registrationId = model.Device.RegistrationId;

            _sendTelemetry = false;

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))
            {
                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    _sendTelemetry = false;
                    ProvisioningDeviceClient provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, scope, security, transport);
                    DeviceRegistrationResult result = await provClient.RegisterAsync().ConfigureAwait(false);

                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        return(null);
                    }
                    Console.WriteLine($"Provisioninged device : {result.DeviceId} at {result.AssignedHub}");
                    var client = Microsoft.Azure.Devices.Client.DeviceClient.Create(result.AssignedHub, model.Auth, TransportType.Amqp);
                    client.SetMethodHandlerAsync("Reprovision", ReprovisionHandler, null).GetAwaiter().GetResult();
                    client.SetDesiredPropertyUpdateCallbackAsync(DesiredPropertyUpdated, null).GetAwaiter().GetResult();

                    //  TODO:Save new connection information
                    var auth    = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, security.GetPrimaryKey());
                    var host    = result.AssignedHub;
                    var builder = IotHubConnectionStringBuilder.Create(host, auth);
                    var device  = new DevicePortalInfoModel
                    {
                        Host   = result.AssignedHub,
                        Auth   = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, security.GetPrimaryKey()),
                        Device = new DeviceModel {
                            ID_Scope       = scope,
                            PrimaryKey     = security.GetPrimaryKey(),
                            SecondaryKey   = security.GetSecondaryKey(),
                            RegistrationId = result.RegistrationId,
                            DeviceId       = result.DeviceId
                        },
                        ConnectionString = builder.ToString()
                    };

                    _storage.Write(DataStorage.DeviceConnectionString, JsonConvert.SerializeObject(device));
                    return(client);
                }
            }
        }
示例#16
0
        // Provision a device via DPS, by sending the PnP model Id as DPS payload.
        private static async Task <DeviceRegistrationResult> ProvisionDeviceAsync(Parameters parameters, CancellationToken cancellationToken)
        {
            SecurityProvider             symmetricKeyProvider = new SecurityProviderSymmetricKey(parameters.DeviceId, parameters.DeviceSymmetricKey, null);
            ProvisioningTransportHandler mqttTransportHandler = new ProvisioningTransportHandlerMqtt();
            var pdc = ProvisioningDeviceClient.Create(parameters.DpsEndpoint, parameters.DpsIdScope, symmetricKeyProvider, mqttTransportHandler);

            var pnpPayload = new ProvisioningRegistrationAdditionalData
            {
                JsonData = $"{{ \"modelId\": \"{ModelId}\" }}",
            };

            return(await pdc.RegisterAsync(pnpPayload, cancellationToken));
        }
示例#17
0
        public static async Task <DeviceRegistrationResult> RegisterDeviceAsync(SecurityProviderSymmetricKey security, Device dev)
        {
            // Console.WriteLine("Register device...");
            using var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly);
            var provClient =
                ProvisioningDeviceClient.Create(dev.IoTGlobalDeviceEndpoint, dev.IoTDeviceScopeId, security, transport);
            // Console.WriteLine($"RegistrationID = {security.GetRegistrationID()}");
            // Console.Write("ProvisioningClient RegisterAsync...");
            var result = await provClient.RegisterAsync();

            // Console.WriteLine($"ProvisioningClient Stauts: {result.Status}, AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");
            return(result);
        }
        static async Task Main(string[] args)
        {
            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))
                using (var transport = new ProvisioningTransportHandlerMqtt())
                {
                    ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, idScope, security, transport);
                    var pnpPayload = new ProvisioningRegistrationAdditionalData
                    {
                        JsonData = $"{{ \"modelId\": \"{ModelId}\" }}",
                    };

                    DeviceRegistrationResult result = await provClient.RegisterAsync(pnpPayload);

                    IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());

                    using (iotClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt))
                    {
                        await iotClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChangedAsync, null).ConfigureAwait(false); // callback for Device Twin updates
                        await DeviceTwinGetInitialState(iotClient);                                                                       // Get current cloud state of the device twin

                        while (true)
                        {
                            if (_temperature.IsAvailable)
                            {
                                try
                                {
                                    temperature = Math.Round(_temperature.Temperature.DegreesCelsius, 2);

                                    Console.WriteLine($"The CPU temperature is {temperature}");

                                    await SendMsgIotHub(iotClient, temperature);

                                    roomState = (int)temperature > targetTemperature ? RoomAction.Cooling : (int)temperature < targetTemperature ? RoomAction.Heating : RoomAction.Green;
                                    await UpdateRoomAction(roomState);

                                    if (temperature > maxTemperature)
                                    {
                                        maxTemperature = temperature;
                                        await UpdateDeviceTwin("maxTempSinceLastReboot", maxTemperature);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine("exception msg: " + ex.Message);
                                }
                            }
                            Thread.Sleep(2000); // sleep for 2 seconds
                        }
                    }
                }
        }
示例#19
0
        public static DeviceClient CreateDeviceClient(Device dev)
        {
            using var security = new SecurityProviderSymmetricKey(dev.IoTDeviceId, dev.IoTDevicePrimaryKey, null);
            var result = RegisterDeviceAsync(security, dev).GetAwaiter().GetResult();

            if (result.Status != ProvisioningRegistrationStatusType.Assigned)
            {
                Console.WriteLine("Failed to register device");
                return(null);
            }
            IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, security.GetPrimaryKey());

            return(DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt));
        }
示例#20
0
        static void Main(string[] args)
        {
            rand = new Random();
            colorMessage($"Starting {truckIdentification}", ConsoleColor.Yellow);
            currentLat = baseLat;
            currentLon = baseLon;

            // Connect to Azure Maps.
            azureMapsServices = new AzureMapsServices(AzureMapsKey);

            try
            {
                using (var security = new SecurityProviderSymmetricKey(DeviceID, PrimaryKey, null))
                {
                    DeviceRegistrationResult result = RegisterDeviceAsync(security).GetAwaiter().GetResult();
                    if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                    {
                        Console.WriteLine("Failed to register device");
                        return;
                    }
                    IAuthenticationMethod auth = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (security as SecurityProviderSymmetricKey).GetPrimaryKey());
                    s_deviceClient = DeviceClient.Create(result.AssignedHub, auth, TransportType.Mqtt);
                }
                greenMessage("Device successfully connected to Azure IoT Central");

                SendDevicePropertiesAsync().GetAwaiter().GetResult();

                Console.Write("Register settings changed handler...");
                s_deviceClient.SetDesiredPropertyUpdateCallbackAsync(HandleSettingChanged, null).GetAwaiter().GetResult();
                Console.WriteLine("Done");

                cts = new CancellationTokenSource();

                // Create a handler for the direct method calls.
                s_deviceClient.SetMethodHandlerAsync("GoToCustomer", CmdGoToCustomer, null).Wait();
                s_deviceClient.SetMethodHandlerAsync("Recall", CmdRecall, null).Wait();

                SendTruckTelemetryAsync(rand, cts.Token);

                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
                cts.Cancel();
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine(ex.Message);
            }
        }
示例#21
0
        static async Task <EnrollmentDetails> EnrollDeviceAsync(string deviceId)
        {
            //we need a couple of parameters to start. How you get these values is up to you.
            //What is important is that the enrollment keys (Primary & secondary) should
            //be considered as secrets and stored as such. Just like certificate, it
            //will be the responsibility of Bell to deploy these credentials to the device
            //and keep them up to date
            string dpsEndpoint            = Environment.GetEnvironmentVariable("dpsEndpoint") ?? "global.azure-devices-provisioning.net";
            string dpsIdScope             = Environment.GetEnvironmentVariable("idscope") ?? "{Insert ID Scope Here}";
            string enrollmentKeyPrimary   = Environment.GetEnvironmentVariable("enrollmentKeyPrimary") ?? "{Insert Primary Enrollment Key Here}";
            string enrollmentKeySecondary = Environment.GetEnvironmentVariable("enrollmentKeySecondary") ?? "{Insert Seconday Enrollment Key Here}";

            //first, we need to create a device specific attestation key, derived from
            //the enrollment key. These attestation keys will ultimately become the credentials
            //for the device into Iot Hub when provisioned. They also serve as a way for
            //the DPS service to validate the device is trusted, without actually having to
            //send the enrollment group key across the network
            string attestationKeyPrimary   = ComputeDeviceAttestationKey(enrollmentKeyPrimary, deviceId);
            string attestationKeySecondary = ComputeDeviceAttestationKey(enrollmentKeySecondary, deviceId);

            //now, we can attempt to register this device with DPS
            using (SecurityProviderSymmetricKey keyProvider = new SecurityProviderSymmetricKey(deviceId, attestationKeyPrimary, attestationKeySecondary))
            {
                using (ProvisioningTransportHandlerAmqp transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    ProvisioningDeviceClient provisioningClient = ProvisioningDeviceClient.Create(dpsEndpoint, dpsIdScope, keyProvider, transport);
                    DeviceRegistrationResult result             = await provisioningClient.RegisterAsync();

                    switch (result.Status)
                    {
                    case ProvisioningRegistrationStatusType.Assigned:
                        //device was successfully assigned by dps to an Iot Hub
                        return(new EnrollmentDetails()
                        {
                            DeviceId = deviceId,
                            IotHubEndpoint = result.AssignedHub,
                            Authentication = new DeviceAuthenticationWithRegistrySymmetricKey(deviceId, attestationKeyPrimary)
                        });

                    case ProvisioningRegistrationStatusType.Assigning:
                    case ProvisioningRegistrationStatusType.Disabled:
                    case ProvisioningRegistrationStatusType.Failed:
                    case ProvisioningRegistrationStatusType.Unassigned:
                    default:
                        return(null);
                    }
                }
            }
        }
示例#22
0
        public ProvisioningDeviceClientWrapper(string s_idScope, string registrationId, string enrollmentGroupPrimaryKey, string enrollmentGroupSecondaryKey)
        {
            //Group enrollment flow, the primary and secondary keys are derived from the enrollment group keys and from the desired registration id
            string primaryKey   = ComputeDerivedSymmetricKey(Convert.FromBase64String(enrollmentGroupPrimaryKey), registrationId);
            string secondaryKey = ComputeDerivedSymmetricKey(Convert.FromBase64String(enrollmentGroupSecondaryKey), registrationId);

            SecurityProviderSymmetricKey     security  = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey);
            ProvisioningTransportHandlerAmqp transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly);

            ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, s_idScope, security, transport);


            _provClient = provClient;
            _security   = security;
        }
示例#23
0
        private async Task <DeviceRegistrationResult> RegisterDeviceAsync(SecurityProviderSymmetricKey security)
        {
            _logger.LogInformation("{time} - Register device...", DateTimeOffset.Now);

            using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
            {
                ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(_globalDeviceEndpoint, _scopeID, security, transport);
                _logger.LogInformation($"{DateTimeOffset.Now} - RegistrationID = {security.GetRegistrationID()}");

                DeviceRegistrationResult result = await provClient.RegisterAsync();

                _logger.LogInformation($"{DateTimeOffset.Now} - ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");

                return(result);
            }
        }
        public static async Task <DeviceRegistrationResult> RegisterToIoTHubAsync(string primaryKey, string secondKey, string registeredId)
        {
            using var security  = new SecurityProviderSymmetricKey(registeredId, primaryKey, secondKey);
            using var transport = new ProvisioningTransportHandlerHttp();
            var provClient = ProvisioningDeviceClient.Create(
                GlobalDeviceEndpoint,
                IdScope,
                security,
                transport);

            // register into IoTHub
            var result = await provClient.RegisterAsync();

            Console.WriteLine($"ProvisioningClient AssignedHub: {result.AssignedHub}; DeviceID: {result.DeviceId}");
            return(result);
        }
示例#25
0
        public async Task <IoTHubDeviceClient> ProvisionDeviceAsync()
        {
            string             connectionKey;
            IoTHubDeviceClient iotHubClient = null;

            Console.WriteLine("Provisioning...");

            if (!String.IsNullOrEmpty(_deviceId) && !String.IsNullOrEmpty(s_sasKey) && !String.IsNullOrEmpty(s_idScope))
            {
                connectionKey = GenerateSymmetricKey();
                Console.WriteLine($"Connection Key : {connectionKey}");

                using (var securityProvider = new SecurityProviderSymmetricKey(_deviceId, connectionKey, null))
                    using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
                    {
                        _provClient = ProvisioningDeviceClient.Create(s_global_endpoint, s_idScope, securityProvider, transport);

                        // Sanity check
                        Console.WriteLine($"Device ID      : {securityProvider.GetRegistrationID()}");

                        DeviceRegistrationResult result = await _provClient.RegisterAsync().ConfigureAwait(false);

                        if (result.Status == ProvisioningRegistrationStatusType.Assigned)
                        {
                            Console.WriteLine($"Provisioned    : {result.Status}");
                            Console.WriteLine($"  Device ID    : {result.DeviceId}");
                            Console.WriteLine($"  IoT Hub      : {result.AssignedHub}");

                            IAuthenticationMethod authenticationMethod = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, securityProvider.GetPrimaryKey());

                            iotHubClient = new IoTHubDeviceClient(result.AssignedHub, authenticationMethod);
                        }
                        else
                        {
                            Console.WriteLine($"Err : Provisioning Failed {result.Status}");
                        }
                    }
            }
            else
            {
                Console.WriteLine("Please set following Environment Variables");
                Console.WriteLine("DPS_IDSCOPE : ID Scope");
                Console.WriteLine("SAS_KEY     : SAS Key");
            }

            return(iotHubClient);
        }
        public static int Main(string[] args)
        {
            if (string.IsNullOrWhiteSpace(dpsIdScope) && (args.Length > 0))
            {
                dpsIdScope = args[0];
            }

            if (string.IsNullOrWhiteSpace(dpsIdScope))
            {
                Console.WriteLine("ProvisioningDeviceClientSymmetricKey <IDScope>");
                return(1);
            }

            string primaryKey   = string.Empty;
            string secondaryKey = string.Empty;

            if (!String.IsNullOrEmpty(registrationId) && !String.IsNullOrEmpty(individualEnrollmentPrimaryKey) && !String.IsNullOrEmpty(individualEnrollmentSecondaryKey))
            {
                //Individual enrollment flow, the primary and secondary keys are the same as the individual enrollment keys
                primaryKey   = individualEnrollmentPrimaryKey;
                secondaryKey = individualEnrollmentSecondaryKey;
            }
            else
            {
                Console.WriteLine("Invalid configuration provided, must provide individual enrollment keys");
                return(-1);
            }

            using (var security = new SecurityProviderSymmetricKey(registrationId, primaryKey, secondaryKey))



                using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                {
                    ProvisioningDeviceClient provClient =
                        ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, dpsIdScope, security, transport);


                    var provisioningDeviceLogic = new ProvisioningDeviceLogic(provClient, security);
                    provisioningDeviceLogic.RunAsync().GetAwaiter().GetResult();
                }


            return(0);
        }
        static async Task DeviceRegistration(string globalDeviceEndpoint, string IdScope, string enrollmentGroupSymmetricKey, string registrationId, string applicationId)
        {
            DeviceClient deviceClient;

            try
            {
                string deviceKey = ComputeDerivedSymmetricKey(Convert.FromBase64String(enrollmentGroupSymmetricKey), registrationId);

                using (var securityProvider = new SecurityProviderSymmetricKey(registrationId, deviceKey, null))
                {
                    using (var transport = new ProvisioningTransportHandlerAmqp(TransportFallbackType.TcpOnly))
                    {
                        ProvisioningDeviceClient provClient = ProvisioningDeviceClient.Create(globalDeviceEndpoint, IdScope, securityProvider, transport);

                        DeviceRegistrationResult result = await provClient.RegisterAsync();

                        if (result.Status != ProvisioningRegistrationStatusType.Assigned)
                        {
                            throw new ApplicationException($"DevID:{registrationId} AppID:{applicationId} Status:{result.Status} RegisterAsync failed");
                        }
                        Log.LogInformation("DevID:{registrationId} AppID:{applicationId} Assigned IoTHub:{assignedHub}", registrationId, applicationId, result.AssignedHub);

                        IAuthenticationMethod authentication = new DeviceAuthenticationWithRegistrySymmetricKey(result.DeviceId, (securityProvider as SecurityProviderSymmetricKey).GetPrimaryKey());

                        deviceClient = DeviceClient.Create(result.AssignedHub, authentication, TransportType.Amqp);

                        if (!DeviceClients.TryUpdate(registrationId, deviceClient, null))
                        {
                            Log.LogWarning("DevID:{registrationID} AppID:{applicationId} Device Registration TryUpdate failed", registrationId, applicationId);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (!DeviceClients.TryRemove(registrationId, out deviceClient))
                {
                    Log.LogWarning("DevID:{registrationID} AppID:{applicationId} Device Registration TryRemove failed", registrationId, applicationId);
                }

                Log.LogError(ex, "DevID:{registrationID} AppID:{applicationId} Device Registration failed", registrationId, applicationId);
                throw;
            }
        }
示例#28
0
        public static async Task <DeviceRegistrationResult> RegisterDeviceAsync(SecurityProviderSymmetricKey security)
        {
            Console.WriteLine("Register device...");

            using (var transport = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly))
            {
                ProvisioningDeviceClient provClient =
                    ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, ScopeID, security, transport);

                Console.WriteLine($"RegistrationID = {security.GetRegistrationID()}");

                Console.Write("ProvisioningClient RegisterAsync...");
                DeviceRegistrationResult result = await provClient.RegisterAsync();

                Console.WriteLine($"{result.Status}");

                return(result);
            }
        }
        private static async Task <DeviceRegistrationResult> RegisterDevice()
        {
            try
            {
                ConsoleWriteLine($"Will register device {deviceId}...", ConsoleColor.White);

                // using symmetric keys
                using var securityProvider = new SecurityProviderSymmetricKey(
                          registrationId: deviceId,
                          primaryKey: devicePrimaryKey,
                          secondaryKey: null);

                using var transportHandler = new ProvisioningTransportHandlerMqtt(TransportFallbackType.TcpOnly);

                // set up provisioning client for given device
                var provisioningDeviceClient = ProvisioningDeviceClient.Create(
                    globalDeviceEndpoint: provisioningGlobalDeviceEndpoint,
                    idScope: provisioningIdScope,
                    securityProvider: securityProvider,
                    transport: transportHandler);

                // register device
                var deviceRegistrationResult = await provisioningDeviceClient.RegisterAsync();

                ConsoleWriteLine($"Device {deviceId} registration result: {deviceRegistrationResult.Status}", ConsoleColor.White);

                if (deviceRegistrationResult.Status != ProvisioningRegistrationStatusType.Assigned)
                {
                    throw new Exception($"Failed to register device {deviceId}");
                }

                ConsoleWriteLine($"Device {deviceId} was assigned to hub '{deviceRegistrationResult.AssignedHub}'", ConsoleColor.White);
                ConsoleWriteLine();

                return(deviceRegistrationResult);
            }
            catch (Exception ex)
            {
                ConsoleWriteLine($"* ERROR * {ex.Message}", ConsoleColor.Red);
            }

            return(null);
        }
示例#30
0
        internal static async Task <DeviceClient> ProvisionDeviceWithSasKeyAsync(string scopeId, string deviceId, string deviceKey, string modelId, ILogger log)
        {
            using (var transport = new ProvisioningTransportHandlerMqtt())
            {
                using (var security = new SecurityProviderSymmetricKey(deviceId, deviceKey, null))
                {
                    DeviceRegistrationResult provResult;
                    var provClient = ProvisioningDeviceClient.Create("global.azure-devices-provisioning.net", scopeId, security, transport);

                    if (!string.IsNullOrEmpty(modelId))
                    {
                        provResult = await provClient.RegisterAsync(GetProvisionPayload(modelId)).ConfigureAwait(false);
                    }
                    else
                    {
                        provResult = await provClient.RegisterAsync().ConfigureAwait(false);
                    }

                    log.LogInformation($"Provioning Result. Status [{provResult.Status}] SubStatus [{provResult.Substatus}]");

                    if (provResult.Status == ProvisioningRegistrationStatusType.Assigned)
                    {
                        log.LogWarning($"Device {provResult.DeviceId} in Hub {provResult.AssignedHub}");
                        log.LogInformation($"LastRefresh {provResult.LastUpdatedDateTimeUtc} RegistrationId {provResult.RegistrationId}");
                        var    csBuilder        = IotHubConnectionStringBuilder.Create(provResult.AssignedHub, new DeviceAuthenticationWithRegistrySymmetricKey(provResult.DeviceId, security.GetPrimaryKey()));
                        string connectionString = csBuilder.ToString();
                        return(await Task.FromResult(
                                   DeviceClient.CreateFromConnectionString(
                                       connectionString, TransportType.Mqtt,
                                       new ClientOptions()
                        {
                            ModelId = modelId
                        })));
                    }
                    else
                    {
                        string errorMessage = $"Device not provisioned. Message: {provResult.ErrorMessage}";
                        log.LogError(errorMessage);
                        throw new IotHubException(errorMessage);
                    }
                }
            }
        }