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

时间:2019-01-17 22:27:45

标签: azure azure-iot-hub esp32 azure-iot-sdk

使用的操作系统和版本: 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 = ..上我看不到“?”。

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

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

Q3:为什么会出现401错误?有什么可能的解决方案?

日志:

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

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

错误:时间:2019年1月17日星期四22:06:00文件:/ 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行:142 HTTP代码为401

错误:时间:2019年1月17日星期四22:06:00文件:/ 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行:494无法HTTPAPIEX_ExecuteRequest

错误:时间:2019年1月17日星期四22:06:00文件:/ 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行:IoTHubClient_LL_UploadToBlob_step1中出现768错误 收到意外结果FILE_UPLOAD_ERROR

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

Here是指向GitHub Repo的链接。

可以在here中找到示例。

2 个答案:

答案 0 :(得分:1)

  

我在Azure(存储帐户->->共享访问签名)中生成了一个SAS令牌,并将其插入到我的连接字符串中。我的连接字符串如下所示:

     

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

     

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

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

  

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

     

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

在为您的设备编译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:为什么会出现401错误?有什么可能的解决方案?

确保在Azure IoTHub上正确配置文件上传-https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-file-upload,并在示例上使用正确的连接字符串。还利用the ESP8266 sample,该步骤应与ESP32配置类似。

答案 1 :(得分:0)

要摆脱401错误:在代码中使用MSFT巴尔的摩证书。 要摆脱对ESP的恐慌:请查看此GitHub issue