Azure IoT SDK C:连接到 Blob 存储时出现错误 401

Azure IoT SDK C: Error 401 when connecting to Blob Storage

OS 和使用的版本: Ubuntu 18.04

使用的 SDK 版本: 2018 年 12 月 13 日发布

目标: ESP32.

问题描述:

我正在尝试将 ESP32 连接到我的 Blob 存储。我收到 HTTP 错误 401(未经授权的访问)。 我正在使用示例:iothub_client_sample_upload_to_blob_mb。 我尝试仅使用连接字符串中的共享访问密钥进行连接,但这不起作用(无连接)。之后,我在 Azure 中生成了一个 SAS 令牌(存储帐户 -> -> 共享访问签名)并将其插入到我的连接字符串中。 我的连接字符串如下所示:

static const char* connectionString = "HostName=<Host name>;DeviceId=<Device ID>;SharedAccessSignature=<inserted here without the "?" at the beginning>"; 

Q1:为什么有个“?”在令牌前面?当我查看连接字符串时,在 SharedAccessSignature=.. 我没有看到“?”。

我还在 Azure 中的 IoT 中心 -> 上传文件下设置了端点。 在示例中,我使用选项 SET_TRUSTED_CERT_IN_SAMPLES.

Q2:什么意思?我对基本加密不是很熟悉,应该仔细阅读一下。

问题 3:为什么我会收到 401 错误?可能的解决方案是什么?

日志:

正在初始化 SNTP ESP 平台 sntp 启动! 时间尚未确定。连接到 WiFi 并通过 NTP 获取时间。 timeinfo.tm_year:70 等待设置系统时间... tm_year:0[times:1] 开始将 IoTHub 客户端示例上传到具有多个块的 blob...

信息:等待 TLS 连接 信息:等待 TLS 连接 信息:等待 TLS 连接 信息:等待 TLS 连接

错误:Time:Thu 1 月 17 日 22:06:00 2019 文件:/home/julian/eclipse-workspace/chaze-esp32/components/esp-azure/azure-iot-sdk-c/iothub_client/src/iothub_client_ll_uploadtoblob.c Func:send_http_request Line:142 HTTP 代码为 401

错误:Time:Thu 1 月 17 日 22:06:00 2019 文件:/home/julian/eclipse-workspace/chaze-esp32/components/esp-azure/azure-iot-sdk-c/iothub_client/src/iothub_client_ll_uploadtoblob.c Func:IoTHubClient_LL_UploadToBlob_step1and2 Line:494 无法 HTTPAPIEX_ExecuteRequest

错误:Time:Thu 1 月 17 日 22:06:00 2019 文件:/home/julian/eclipse-workspace/chaze-esp32/components/esp-azure/azure-iot-sdk-c/iothub_client/src/iothub_client_ll_uploadtoblob.c Func:IoTHubClient_LL_UploadMultipleBlocksToBlob_Impl Line:768 IoTHubClient_LL_UploadToBlob_step1 中的错误 收到意外结果 FILE_UPLOAD_ERROR

hello world上传失败 按任意键继续

Here 是 link 到 GitHub 回购。

可以找到示例here

I generated an SAS token in Azure (Storage Accounts -> -> Shared Access Signature) and plugged that in into my connection string. My connection string looks like this:

static const char* connectionString = "HostName=<Host name>;DeviceId=<DeviceID>;SharedAccessSignature=<inserted here without the "?" at the beginning>";

Q1: Why is there a "?" in front of the token? When I look at the connection string, at SharedAccessSignature=.. I don't see the "?".

在 IoTHub 上注册设备后,您需要检索它的连接字符串以用于此示例。请参阅 here 有关如何从 IoTHub 上的设备注册和检索连接字符串的示例。

I also set up the Endpoint in Azure under IoT Hub -> Upload files. In the example, I am using the option SET_TRUSTED_CERT_IN_SAMPLES.

Q2: What does that mean? I am not so familiar with basic encryption and should probably read up on that.

在为您的设备编译 SDK 时使用该标志。见 the CMake File:

#Conditionally use the SDK trusted certs in the samples
if(${use_sample_trusted_cert})
    add_definitions(-DSET_TRUSTED_CERT_IN_SAMPLES)
    include_directories(${PROJECT_SOURCE_DIR}/certs)
    set(iothub_client_sample_upload_to_blob_mb_c_files ${iothub_client_sample_upload_to_blob_mb_c_files} ${PROJECT_SOURCE_DIR}/certs/certs.c)
endif()

Q3: Why am I getting an 401 error? What could be a possible solution?

确保在 Azure IoTHub 上正确配置文件上传 - https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-file-upload and use the correct connection string on the sample. Also leverage the ESP8266 sample 这应该具有与 ESP32 配置类似的步骤。

消除 401 错误:在代码中使用 MSFT Baltimore 证书。 要摆脱 ESP 上的恐慌:看看这个 GitHub issue.