溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

發(fā)布時間:2020-05-26 17:07:29 來源:億速云 閱讀:235 作者:鴿子 欄目:云計算

圖文講解:

1. 在DPS添加組注冊:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

注意:組注冊中,沒有注冊ID的概念,也沒有Device ID的概念。

機制

有三種:x509證書,對稱密鑰

在本例中,我們使用對稱密鑰方式以便我們快速理解和驗證組注冊的業(yè)務(wù)邏輯;

密鑰我們采用自動生成,當(dāng)然也可以手動輸入符合要求的自定義密鑰;

 

注意:本文中使用對稱密鑰方式做演示,后續(xù)章節(jié)介紹X509證書的方式,證書也是推薦的海量設(shè)備方案中應(yīng)用的方案。

如何分配設(shè)備到中心

  1. 最低延遲:將設(shè)備預(yù)配到具有最低延遲的 IoT 中心,注意最低延遲不是指地理位置,例如中國北部的設(shè)備根據(jù)網(wǎng)絡(luò)情況可能出現(xiàn)分配到中國東部IoT Hub的情況。

  2. 均勻加權(quán)分發(fā)(默認(rèn)):鏈接的 IoT 中心等可能地獲得預(yù)配到它們的設(shè)備。 此設(shè)置為默認(rèn)設(shè)置。 如果只將設(shè)備預(yù)配到一個 IoT 中心,則可以保留此設(shè)置。 

  3. 通過注冊列表進行靜態(tài)配置:注冊列表中所需 IoT 中心的規(guī)范優(yōu)先于設(shè)備預(yù)配服務(wù)級別的分配策略。

  4. 使用Azure Function(自定義):該方案可以使用自定義邏輯判斷分發(fā)到哪個IoT Hub。

在本例中,我們只配置了一個IoT Hub,因此采用默認(rèn)的均勻加權(quán)即可。

初始設(shè)備孿生狀態(tài)

例如可以設(shè)置版本號為 1.11,會按照device twin的邏輯進行版本升級;

添加之后的狀態(tài)為:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

注冊記錄為空:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

 

2.準(zhǔn)備示例代碼

項目中使用的示例代碼,https://codeload.github.com/Azure-Samples/azure-iot-samples-csharp/zip/master

關(guān)鍵處請參加如下代碼中的中文注釋:

// Copyright (c) Microsoft. All rights reserved.// Licensed under the MIT license. See LICENSE file in the project root for full license information.using Microsoft.Azure.Devices.Provisioning.Client;using Microsoft.Azure.Devices.Provisioning.Client.Samples;using Microsoft.Azure.Devices.Provisioning.Client.Transport;using Microsoft.Azure.Devices.Shared;using System;using System.Security.Cryptography;using System.Text;namespace SymmetricKeySample{    class Program
    {        // The Provisioning Hub IDScope.

        // For this sample either:
        // - pass this value as a command-prompt argument
        // - set the DPS_IDSCOPE environment variable 
        // - create a launchSettings.json (see launchSettings.json.template) containing the variable
        //private static string s_idScope = Environment.GetEnvironmentVariable("DPS_IDSCOPE");
        private static string s_idScope = "此處需要修改成dps的ID";        // In your Device Provisioning Service please go to "Manage enrollments" and select "Individual Enrollments".
        // Select "Add individual enrollment" then fill in the following:
        // Mechanism: Symmetric Key
        // Auto-generate keys should be checked
        // DeviceID: iothubSymmetricKeydevice1

        // Symmetric Keys may also be used for enrollment groups.
        // In your Device Provisioning Service please go to "Manage enrollments" and select "Enrollment Groups".
        // Select "Add enrollment group" then fill in the following:
        // Group name: <your  group name>
        // Attestation Type: Symmetric Key
        // Auto-generate keys should be checked
        // You may also change other enrollment group parameters according to your needs

       
        //private const string GlobalDeviceEndpoint = "global.azure-devices-provisioning.net";
        //此處應(yīng)該改成中國的終結(jié)點.CN結(jié)尾
        private const string GlobalDeviceEndpoint = "global.azure-devices-provisioning.cn";        //These are the two keys that belong to your enrollment group. 
        // Leave them blank if you want to try this sample for an individual enrollment instead
        private const string enrollmentGroupPrimaryKey = "僅當(dāng)使用組注冊時,必須填寫此值";        private const string enrollmentGroupSecondaryKey = "僅當(dāng)使用組注冊時,必須填寫此值";        //registration id for enrollment groups can be chosen arbitrarily and do not require any portal setup. 
        //The chosen value will become the provisioned device's device id.
        //
        //registration id for individual enrollments must be retrieved from the portal and will be unrelated to the provioned
        //device's device id
        //
        //This field is mandatory to provide for this sample
        private static string registrationId = "對于組注冊,此處為待注冊的設(shè)備DeviceID,通常填寫諸如MAC地址等唯一值";        //These are the two keys that belong to your individual enrollment. 
        // Leave them blank if you want to try this sample for an individual enrollment instead
        private const string individualEnrollmentPrimaryKey = "";        private const string individualEnrollmentSecondaryKey = "";        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和secondryKey即IoT Hub中新增Device 的primaryKey和secondryKey
                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;
        }        /// <summary>
        /// Generate the derived symmetric key for the provisioned device from the enrollment group symmetric key used in attestation
        /// </summary>
        /// <param name="masterKey">Symmetric key enrollment group primary/secondary key value</param>
        /// <param name="registrationId">the registration id to create</param>
        /// <returns>the primary/secondary key for the member of the enrollment group</returns>
        public static string ComputeDerivedSymmetricKey(byte[] masterKey, string registrationId)
        {            using (var hmac = new HMACSHA256(masterKey))
            {                return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(registrationId)));
            }
        }
    }
}

 

3.運行程序,得到分配的IoT Hub名稱以及DeviceID

設(shè)備側(cè)程序可以得到IoT Hub的名稱,設(shè)備的ID,加上代碼里的key,則具備了連接IoT Hub的所有參數(shù),此時可以直接連接到IoT Hub。

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

 

此時,可以在組注冊中的注冊列表中看到對應(yīng)的注冊記錄:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

 

此時,在IoT Hub中能夠看到由DPS注冊過來的Device:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?

 

將代碼中的  private static string registrationId = "對于組注冊,此處為待注冊的設(shè)備DeviceID,通常填寫諸如MAC地址等唯一值"; 替換,可以通過DPS的這個組注冊添加多臺設(shè)備到IoT Hub中:

如何使用DPS通過對稱密鑰進行設(shè)備組注冊?


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI