You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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客户端来提供该密钥。
  • 解决步骤:
    1. 确保编译Azure C SDK时启用对称密钥HSM支持,需添加USE_SYMMETRIC_KEY编译选项。
    2. 在调用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);
      
    3. 若不想配置HSM客户端,直接使用DPS返回的设备连接字符串调用IoTHubDeviceClient_LL_CreateFromConnectionString是更简便的方案,这也是你此前能正常运行的原因。

内容的提问来源于stack exchange,提问作者Engineer999

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:39