Зарегистрировать устройство с помощью rest API службы подготовки устройств Azure?

Мне нужно зарегистрировать устройство в Центре Интернета вещей с помощью службы DPS. Я не могу использовать .net SDK, поскольку прошивка устройства не поддерживает, поэтому мы решили использовать API на основе REST, чтобы сделать то же самое.

С C # SDK все, что мне нужно, - это файл .PFX с паролем, DPS_IDSCOPE и конечная точка устройства примерно так (xyz.azure-devices-provisioning.net).

Теперь, как я могу использовать приведенную выше информацию, чтобы сделать то же самое с API Azure Rest. Для аутентификации я видел ссылку ниже, в которой говорится, что я должен использовать токен SAS для того же, что и токен доступа Azure AD, не будет работать.

https://social.msdn.microsoft.com/Forums/en-US/19183e82-437e-4d6f-8498-ed33ba18a3fa/creating-iot-device-with-azure-dps-via-rest?forum=azureiothub

Теперь, если я доверяю приведенной выше ссылке (однако я не думаю, что это сработает), тогда где можно использовать файл сертификата .PFX?

Я нашел этот официальный API для регистрации устройства.

https://docs.microsoft.com/en-us/rest/api/iot-dps/runtimeregistration/registerdevice

Я не понимаю, как передать информацию о теле, такую ​​как структура JSON. Я знаю, что должен использовать x509 в качестве типа аттестации, но как я буду его формировать, это похоже на

  var pairs = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("registrationId", "device1"),
            new KeyValuePair<string, string>("type", "x509"),

         };

Или, если это json, то как будет называться атрибут?

введите здесь описание изображения

Ниже приведен пример кода, который я пытался использовать и получил ту же ошибку.

Way-1 (Используется .PFX как аутентификация)

  public static void RegisterDeviceWithEnrollementGroup()
    {
        try
        {
            var handler = new WebRequestHandler();
            var certFile = Path.Combine(@"C:\IoT\", "device1.pfx");
            handler.ClientCertificates.Add(new X509Certificate2(certFile, "certificatepassword"));
            HttpClient client4 = new HttpClient(handler);

            client4.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client4.BaseAddress = new Uri("https://XYZ.azure-devices-provisioning.net/scopeid/registrations/device1/register?api-version=2018-11-01");
            string content = Newtonsoft.Json.JsonConvert.SerializeObject(null);
            var httpContent3 = new StringContent(content, Encoding.UTF8, "application/json");


            var pairs = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("registrationId", "device1"),
            new KeyValuePair<string, string>("type", "x509"),

         };

            var content2 = new FormUrlEncodedContent(pairs);


            HttpResponseMessage response4 = client4.PutAsync(client4.BaseAddress.ToString(), content2).Result;

            var commandResult = string.Empty;

            if (response4.IsSuccessStatusCode)
            {
                commandResult = response4.Content.ReadAsStringAsync().Result;
            }
            else
            {
                commandResult = response4.Content.ReadAsStringAsync().Result;
            }

            Console.WriteLine("IoT hub API call result - " + commandResult);
        }
        catch (Exception)
        {
            throw;
        }
    } 

Способ-2 - Использование токена SAS:

общедоступный статический void RegisterDeviceWithEnrollementGroup () {попробуйте {
HttpClient client4 = новый HttpClient ();

            var sas = generateSasToken("XYZ.azure-devices-provisioning.net", "key", "provisioningserviceowner");
             client4.DefaultRequestHeaders.Add("Authorization", sas);

            client4.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


            client4.BaseAddress = new Uri("https://XYZ.azure-devices-provisioning.net/scopeid/registrations/device1/register?api-version=2018-11-01");
            string content = Newtonsoft.Json.JsonConvert.SerializeObject(null);
            var httpContent3 = new StringContent(content, Encoding.UTF8, "application/json");


            var pairs = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("registrationId", "device1"),
            new KeyValuePair<string, string>("type", "x509"),

         };

            var content2 = new FormUrlEncodedContent(pairs);


            HttpResponseMessage response4 = client4.PutAsync(client4.BaseAddress.ToString(), content2).Result;

            var commandResult = string.Empty;

            if (response4.IsSuccessStatusCode)
            {
                commandResult = response4.Content.ReadAsStringAsync().Result;
            }
            else
            {
                commandResult = response4.Content.ReadAsStringAsync().Result;
            }

            Console.WriteLine("IoT hub API call result - " + commandResult);
        }
        catch (Exception)
        {
            throw;
        }
    }

Вспомогательный метод:

 public static string generateSasToken(string resourceUri, string key, string policyName, int expiryInSeconds = 3600)
    {
        TimeSpan fromEpochStart = DateTime.UtcNow - new DateTime(1970, 1, 1);
        string expiry = Convert.ToString((int)fromEpochStart.TotalSeconds + expiryInSeconds);

        string stringToSign = WebUtility.UrlEncode(resourceUri) + "\n" + expiry;

        HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(key));
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));

        string token = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}", WebUtility.UrlEncode(resourceUri), WebUtility.UrlEncode(signature), expiry);

        if (!String.IsNullOrEmpty(policyName))
        {
            token += "&skn=" + policyName;
        }

        return token;
    }

Теперь, пожалуйста, ответьте кому-нибудь, правильно ли я делаю здесь или нет, поскольку я получаю исключение.

{StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: {x-ms-request-id: 6475343d-5a2e-407a-9e7f-896e0c489307 Strict-Transport -Безопасность: max-age = 31536000; includeSubDomains Дата: Чт, 28 февраля 2019 г., 11:42:59 GMT Content-Length: 0}}

Жду помощи ...


person JARVIS    schedule 28.02.2019    source источник


Ответы (2)


Выполните действия, описанные здесь: https://docs.microsoft.com/en-us/azure/iot-dps/tutorial-net-provision-device-to-hub, чтобы сначала создать регистрацию в DPS. для этого устройства с использованием X.509 (нет необходимости использовать EnrollmentGroup для одного устройства).

При регистрации устройства в DPS используйте глобальную конечную точку - global.azure-devices-provisioning.net. Настройте HTTP-клиент для включения сертификата клиента устройства. Не предоставляйте SAStoken с устройства.

Вы можете настроить содержимое HTTP-сообщения для регистрации устройства следующим образом:

httpRequest.Content = new StringContent ("{\" registrationId \ ": \" device1 \ "}", Encoding.UTF8); httpRequest.Content.Headers.ContentType = MediaTypeHeaderValue.Parse ("приложение / json; charset = utf-8");

Обратите внимание, что содержимое JSON НЕ включает «тип»: «x509».

Конечная точка устройства будет следующей:

ВЫПОЛНИТЕ https://global.azure-devices-provisioning.net/ {idScope} / registrations / device1 / register? api-version = 2018-11-01 (замените idScope на тот из вашего DPS. Пример idScope будет 0ne00000012)

person Rajeev Vokkarne    schedule 14.03.2019
comment
Вы знаете, как удалить устройство с помощью DPS с HTTP DELETE, какой формат токена - person Liverpool; 08.10.2020
comment
DPS не поддерживает удаление устройства. Однако существуют API для удаления индивидуальной регистрации, GroupEnrollment, а также состояние регистрации устройства. - person Rajeev Vokkarne; 21.05.2021

Этот POST хорошо объясняет это: http://busbyland.com/azure-iot-device-provisioning-service-via-rest-part-1/

Использование конечной точки, описанной здесь: https://docs.microsoft.com/es-es/rest/api/iot-dps/runtimeregistration/registerdevice

Вы можете зарегистрировать свои устройства с помощью HTTPRequest, см. Пример CURL выше:

curl -L -i -X PUT --cert ./chain.pem --key ./iot-device-1.key.pem -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -d '{"registrationId": "iot-device-1", "payload": {"CustomProperty": "CustomValue"}}' https://global.azure-devices-provisioning.net/XXXXXXXXXXX/registrations/iot-device-1/register?api-version=2019-03-31

Вы можете воспроизвести этот запрос в своей среде разработки.

Обратите внимание, что используется global.azure-devices-provisioning.net, который является общедоступным, и вам не требуется никакой аутентификации / авторизации.

person kevin    schedule 09.06.2021