我已在 Debian(在 Virtual Box 虚拟机上)上克隆并构建了 azure-iot-sdk-c。我在调整 prov_dev_client_sample 并使其正常工作时遇到问题。我只是无法在 IoT 中心上配置我的 Debian 设备。
我已详细完成创建 IoT 中心、DPS、链接它们,然后为 DPS 创建对称密钥注册的所有步骤。 id_scope 是正确的。对称密钥设置中的主密钥在prov_dev_set_symmetry_key_info中使用。我也尝试过辅助键。
这是我的 prov_dev_client_sample 代码:
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
// CAVEAT: This sample is to demonstrate azure IoT client concepts only and is not a guide design principles or style
// Checking of return codes and error values shall be omitted for brevity. Please practice sound engineering practices
// when writing production code.
#include <stdio.h>
#include <stdlib.h>
#include "iothub.h"
#include "azure_c_shared_utility/shared_util_options.h"
#include "azure_c_shared_utility/http_proxy_io.h"
#include "azure_c_shared_utility/threadapi.h"
#include "azure_prov_client/prov_device_client.h"
#include "azure_prov_client/prov_security_factory.h"
#ifdef SET_TRUSTED_CERT_IN_SAMPLES
#include "certs.h"
#endif // SET_TRUSTED_CERT_IN_SAMPLES
//
// The protocol you wish to use should be uncommented
//
#define SAMPLE_MQTT
//#define SAMPLE_MQTT_OVER_WEBSOCKETS
//#define SAMPLE_AMQP
//#define SAMPLE_AMQP_OVER_WEBSOCKETS
//#define SAMPLE_HTTP
#ifdef SAMPLE_MQTT
#include "iothubtransportmqtt.h"
#include "azure_prov_client/prov_transport_mqtt_client.h"
#endif // SAMPLE_MQTT
#ifdef SAMPLE_MQTT_OVER_WEBSOCKETS
#include "iothubtransportmqtt_websockets.h"
#include "azure_prov_client/prov_transport_mqtt_ws_client.h"
#endif // SAMPLE_MQTT_OVER_WEBSOCKETS
#ifdef SAMPLE_AMQP
#include "iothubtransportamqp.h"
#include "azure_prov_client/prov_transport_amqp_client.h"
#endif // SAMPLE_AMQP
#ifdef SAMPLE_AMQP_OVER_WEBSOCKETS
#include "iothubtransportamqp_websockets.h"
#include "azure_prov_client/prov_transport_amqp_ws_client.h"
#endif // SAMPLE_AMQP_OVER_WEBSOCKETS
#ifdef SAMPLE_HTTP
#include "iothubtransporthttp.h"
#include "azure_prov_client/prov_transport_http_client.h"
#endif // SAMPLE_HTTP
#ifdef SET_TRUSTED_CERT_IN_SAMPLES
#include "certs.h"
#endif // SET_TRUSTED_CERT_IN_SAMPLES
// This sample is to demostrate iothub reconnection with provisioning and should not
// be confused as production code
MU_DEFINE_ENUM_STRINGS_WITHOUT_INVALID(PROV_DEVICE_RESULT, PROV_DEVICE_RESULT_VALUE);
MU_DEFINE_ENUM_STRINGS_WITHOUT_INVALID(PROV_DEVICE_REG_STATUS, PROV_DEVICE_REG_STATUS_VALUES);
static const char* global_prov_uri = "global.azure-devices-provisioning.net";
static const char* id_scope = "0ne00C8369A";
volatile static bool g_registration_complete = false;
static bool g_use_proxy = false;
static const char* PROXY_ADDRESS = "127.0.0.1";
#define PROXY_PORT 8888
#define MESSAGES_TO_SEND 2
#define TIME_BETWEEN_MESSAGES 2
static void registration_status_callback(PROV_DEVICE_REG_STATUS reg_status, void* user_context)
{
(void)user_context;
(void)printf("Provisioning Status: %s\r\n", MU_ENUM_TO_STRING(PROV_DEVICE_REG_STATUS, reg_status));
}
static void register_device_callback(PROV_DEVICE_RESULT register_result, const char* iothub_uri, const char* device_id, void* user_context)
{
(void)user_context;
if (register_result == PROV_DEVICE_RESULT_OK)
{
(void)printf("\r\nRegistration Information received from service: %s, deviceId: %s\r\n", iothub_uri, device_id);
}
else
{
(void)printf("\r\nFailure registering device: %s\r\n", MU_ENUM_TO_STRING(PROV_DEVICE_RESULT, register_result));
}
g_registration_complete = true;
}
int main(void)
{
SECURE_DEVICE_TYPE hsm_type;
//hsm_type = SECURE_DEVICE_TYPE_TPM;
//hsm_type = SECURE_DEVICE_TYPE_X509;
hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
// Used to initialize IoTHub SDK subsystem
(void)IoTHub_Init();
(void)prov_dev_security_init(hsm_type);
// Set the symmetric key if using they auth type
// If using DPS with an enrollment group, this must the the derived device key from the DPS Primary Key
// https://docs.microsoft.com/azure/iot-dps/concepts-symmetric-key-attestation?tabs=azure-cli#group-enrollments
prov_dev_set_symmetric_key_info("test-device-Debian", "f/+oXlAlz3ejgOduLND7FbBBepEkiT8X184qzNe7pXYNoI2cJ6AOb1wsAVgxwr4SHHnX57pV6vyL4TaZgbabvA==");
HTTP_PROXY_OPTIONS http_proxy;
PROV_DEVICE_TRANSPORT_PROVIDER_FUNCTION prov_transport;
memset(&http_proxy, 0, sizeof(HTTP_PROXY_OPTIONS));
// Protocol to USE - HTTP, AMQP, AMQP_WS, MQTT, MQTT_WS
#ifdef SAMPLE_MQTT
prov_transport = Prov_Device_MQTT_Protocol;
#endif // SAMPLE_MQTT
#ifdef SAMPLE_MQTT_OVER_WEBSOCKETS
prov_transport = Prov_Device_MQTT_WS_Protocol;
#endif // SAMPLE_MQTT_OVER_WEBSOCKETS
#ifdef SAMPLE_AMQP
prov_transport = Prov_Device_AMQP_Protocol;
#endif // SAMPLE_AMQP
#ifdef SAMPLE_AMQP_OVER_WEBSOCKETS
prov_transport = Prov_Device_AMQP_WS_Protocol;
#endif // SAMPLE_AMQP_OVER_WEBSOCKETS
#ifdef SAMPLE_HTTP
prov_transport = Prov_Device_HTTP_Protocol;
#endif // SAMPLE_HTTP
printf("Provisioning API Version: %s\r\n", Prov_Device_GetVersionString());
if (g_use_proxy)
{
http_proxy.host_address = PROXY_ADDRESS;
http_proxy.port = PROXY_PORT;
}
PROV_DEVICE_RESULT prov_device_result = PROV_DEVICE_RESULT_ERROR;
PROV_DEVICE_HANDLE prov_device_handle;
if ((prov_device_handle = Prov_Device_Create(global_prov_uri, id_scope, prov_transport)) == NULL)
{
(void)printf("failed calling Prov_Device_Create\r\n");
}
else
{
if (http_proxy.host_address != NULL)
{
Prov_Device_SetOption(prov_device_handle, OPTION_HTTP_PROXY, &http_proxy);
}
//bool traceOn = true;
//Prov_Device_SetOption(prov_device_handle, PROV_OPTION_LOG_TRACE, &traceOn);
#ifdef SET_TRUSTED_CERT_IN_SAMPLES
// Setting the Trusted Certificate. This is only necessary on systems without
// built in certificate stores.
Prov_Device_SetOption(prov_device_handle, OPTION_TRUSTED_CERT, certificates);
#endif // SET_TRUSTED_CERT_IN_SAMPLES
// This option sets the registration ID it overrides the registration ID that is
// set within the HSM so be cautious if setting this value
//Prov_Device_SetOption(prov_device_handle, PROV_REGISTRATION_ID, "[REGISTRATION ID]");
prov_device_result = Prov_Device_Register_Device(prov_device_handle, register_device_callback, NULL, registration_status_callback, NULL);
if (prov_device_result == PROV_DEVICE_RESULT_OK)
{
(void)printf("\r\nRegistering Device\r\n\r\n");
do
{
ThreadAPI_Sleep(1000);
} while (!g_registration_complete);
}
else
{
(void)printf("\r\nRegistering failed with error: %d\r\n\r\n", prov_device_result);
}
Prov_Device_Destroy(prov_device_handle);
}
prov_dev_security_deinit();
// Free all the sdk subsystem
IoTHub_Deinit();
(void)printf("Press enter key to exit:\r\n");
(void)getchar();
return 0;
}
无论如何,我都会收到以下未经授权的错误。
我已经尝试一遍又一遍地重新创建 IoT 中心和 DPS 等。这里可能有什么问题?谢谢
Provisioning API Version: 1.13.0
Registering Device
Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
Error: Time:Sat Apr 13 18:35:28 2024 File:/home/paul/azure-iot-sdk-c/provisioning_client/src/prov_device_ll_client.c Func:prov_transport_process_json_reply Line:668 Unsuccessful json encountered: {"errorCode":401000,"trackingId":"99be0a9d-4f0a-417a-bd87-d35fc757a0ca","message":"Unauthorized","timestampUtc":"2024-04-13T16:35:29.4923688Z"}
Error: Time:Sat Apr 13 18:35:28 2024 File:/home/paul/azure-iot-sdk-c/provisioning_client/src/prov_transport_mqtt_common.c Func:prov_transport_common_mqtt_dowork Line:979 Unable to process registration reply.
Error: Time:Sat Apr 13 18:35:28 2024 File:/home/paul/azure-iot-sdk-c/provisioning_client/src/prov_device_ll_client.c Func:on_transport_registration_data Line:762 Failure retrieving data from the provisioning service
Failure registering device: PROV_DEVICE_RESULT_DEV_AUTH_ERROR
Press enter key to exit:
确保您提供注册 ID、主密钥、ID 范围的详细信息,并确保共享访问策略具有此权限以避免“未经授权”错误。
按照所提供的文档中的指南,我使用 Azure 设备配置服务 (DPS) 和 C 中的对称密钥证明成功将设备连接到 Azure IoT 中心。请记住链接 IoT 中心,在注册期间包括目标 IoT 中心创建,并根据需要添加例外。
选择“管理注册”选项,然后选择“个人注册”。
证明机制:选择“对称密钥”。
对称密钥设置:您可以自动生成密钥或提供自己的密钥。
注册ID:为设备提供唯一的ID。
其他详细信息:根据您的要求设置配置状态、重新配置策略和其他选项。
添加目标 IoT 中心。
代码取自git
prov_device_result = Prov_Device_Register_Device(prov_device_handle, register_device_callback, NULL, registration_status_callback, NULL);
if (prov_device_result == PROV_DEVICE_RESULT_OK)
{
(void)printf("\r\nRegistering Device\r\n\r\n");
do
{
ThreadAPI_Sleep(1000);
} while (!g_registration_complete);
}
else
{
(void)printf("\r\nRegistering failed with error: %d\r\n\r\n", prov_device_result);
}
Prov_Device_Destroy(prov_device_handle);
}
prov_dev_security_deinit();
// Free all the sdk subsystem
IoTHub_Deinit();
(void)printf("Press enter key to exit:\r\n");
(void)getchar();
return 0;
}
输出: