使用IoTHubDeviceClient_LL_CreateFromDeviceAuth创建设备句柄失败求助
问题
在Linux环境下使用Azure C SDK,已通过对称密钥注册组和DPS,借助prov_dev_client_sample成功在IoT Hub中注册设备。目前使用iothub_ll_telemetry示例向已注册设备发送数据,使用设备连接字符串调用IoTHubDeviceClient_LL_CreateFromConnectionString创建设备句柄可正常运行,但改用IoTHubDeviceClient_LL_CreateFromDeviceAuth,传入此前prov_dev_client_sample返回的IoT hub URI(my-test-hub.azure-devices.net)和设备ID(new-test-device)时,始终失败,错误日志如下:
Creating IoTHub Device handle Error: Time:Wed Apr 17 13:09:39 2024 File:/home/azure-iot-sdk-c/provisioning_client/src/iothub_auth_client.c Func:iothub_device_auth_create Line:218 hsm_client_create is not a valid address Error: Time:Wed Apr 17 13:09:39 2024 File:/home/azure-iot-sdk-c/iothub_client/src/iothub_client_authorization.c Func:IoTHubClient_Auth_CreateFromDeviceAuth Line:184 Failed allocating IOTHUB_AUTHORIZATION_DATA Error: Time:Wed Apr 17 13:09:39 2024 File:/home/azure-iot-sdk-c/iothub_client/src/iothub_client_core_ll.c Func:initialize_iothub_client Line:875 Failed create authorization module Error: Time:Wed Apr 17 13:09:39 2024 File:/home/azure-iot-sdk-c/iothub_client/src/iothub_client_core_ll.c Func:IoTHubClientCore_LL_CreateFromDeviceAuth Line:1324 initialize iothub client Failure creating IotHub device. Hint: Check your connection string. Press any key to continue
请问该方式为何无法正常工作?
原因与解决方法
IoTHubDeviceClient_LL_CreateFromDeviceAuth并非仅靠设备ID和Hub URI就能完成认证,它依赖HSM(硬件安全模块)客户端提供密钥或证书等认证凭据,但当前SDK编译或初始化未包含对应的HSM客户端实现,这也是日志中hsm_client_create is not a valid address错误的核心原因。- 你通过DPS对称密钥注册的设备,认证需要用到对应对称密钥,但
CreateFromDeviceAuth不会自动关联DPS注册时的密钥,必须显式配置HSM客户端来提供该密钥。 - 解决步骤:
- 确保编译Azure C SDK时启用对称密钥HSM支持,需添加
USE_SYMMETRIC_KEY编译选项。 - 在调用
IoTHubDeviceClient_LL_CreateFromDeviceAuth前,初始化对称密钥HSM客户端并传入设备密钥,示例代码如下:// 初始化对称密钥HSM客户端 HSM_CLIENT_HANDLE hsmClient = HsmClient_CreateFromSymmetricKey(deviceId, symmetricKey); // 将HSM客户端绑定到认证模块 IoTHubClient_Auth_SetHsmClient(hsmClient); // 创建设备句柄 IOTHUB_DEVICE_CLIENT_LL_HANDLE deviceHandle = IoTHubDeviceClient_LL_CreateFromDeviceAuth(iotHubUri, deviceId); - 若不想配置HSM客户端,直接使用DPS返回的设备连接字符串调用
IoTHubDeviceClient_LL_CreateFromConnectionString是更简便的方案,这也是你此前能正常运行的原因。
- 确保编译Azure C SDK时启用对称密钥HSM支持,需添加
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

