使用 IoT 中心将文件从设备上传到云

此教程介绍了如何使用 IoT 中心的文件上传功能将文件上传到 Azure Blob 存储。 本教程介绍如何:

  • 安全地提供存储容器用于文件上传。
  • 使用 Python 客户端通过 IoT 中心上传文件。

IoT 中心入门教程展示了 IoT 中心基本的设备到云消息功能。 但是,在某些情况下,无法轻松地将设备发送的数据映射为 IoT 中心接受的相对较小的设备到云消息。 需要从设备上传文件时,仍可以使用 IoT 中心的安全性和可靠性。

Note

IoT 中心 Python SDK 目前仅支持上传基于字符的文件,如 .txt 文件。

在本教程最后,会运行下述 Python 控制台应用:

  • FileUpload.py,该应用使用 Python 设备 SDK 将文件上传到存储中。

Note

IoT 中心通过 Azure IoT 设备 SDK 来支持许多设备平台和语言(包括 C、.NET、Javascript、Python 和 Java)。 有关如何将设备连接到 Azure IoT 中心的分步说明,请参阅 Azure IoT 开发人员中心

要完成本教程,需要以下各项:

创建 IoT 中心

此部分介绍如何使用 Azure 门户创建 IoT 中心。

  1. 登录到 Azure 门户

  2. 选择+“创建资源”,然后选择“物联网”。

  3. 在右侧列表中单击“Iot 中心”。 随即显示 IoT 中心创建过程的第一个屏幕。

    显示了在 Azure 门户中创建中心的屏幕截图

    填充字段。

    订阅:请选择要用于 IoT 中心的订阅。

    资源组:可创建新的资源组或使用现有资源组。 若要新建一个,请单击“新建”,并填写要使用的名称。 若要使用现有资源组,请单击“使用现有资源组”并从下拉列表中选择该组。 有关详细信息,请参阅使用资源组管理 Azure 资源

    区域:这是要在其中设置中心的区域。 从下拉列表中选择最靠近自己的位置。

    IoT 中心名称:输入 IoT 中心的名称。 此名称必须全局唯一。 如果输入的名称可用,会显示一个绿色复选标记。

    Important

    IoT 中心将公开为 DNS 终结点,因此,命名时请务必避免包含任何敏感信息。

  4. 单击“下一步: 大小和规模”,以便继续创建 IoT 中心。

    屏幕截图显示使用 Azure 门户为新的 IoT 中心设置大小和缩放级别

    在此屏幕上,可以采用默认值,只需在底部单击“查看+创建”即可。

    定价和缩放层级:可以根据需要的功能数以及每天通过解决方案发送的消息数从多个层中进行选择。 免费层适用于测试和评估。 它允许 500 台设备连接到 IoT 中心,并且每天最多传输 8,000 条信息。 每个 Azure 订阅可以在免费层中创建一个 IoT 中心。

    IoT 中心单位:每日每单位允许的消息数取决于中心的定价层。 例如,如果希望 IoT 中心支持 700,000 条消息输入,则选择两个 S1 层单位。

    有关其他层选项的详细信息,请参阅选择合适的 IoT 中心层

    高级/设备到云的分区:此属性将设备到云消息与这些消息的同步读取器数目相关联。 大多数 IoT 中心只需要 4 个分区。

  5. 单击“查看+创建”可查看选择。 会显示类似于以下的屏幕。

    屏幕截图显示用于创建新 IoT 中心的信息

  6. 单击“创建”以创建新的 IoT 中心。 创建中心需要几分钟时间。

检索 IoT 中心的连接字符串

创建中心以后,请检索中心的连接字符串。 该字符串用于将设备和应用程序连接到中心。

  1. 单击中心,查看“IoT 中心”窗格,其中包含“设置”等内容。 单击“共享访问策略”。

  2. 在“共享访问策略”中,选择 iothubowner 策略。

  3. 在“共享访问密钥”下,复制“连接字符串 -- 主密钥”供以后使用。

    显示如何检索连接字符串

    有关详细信息,请参阅“IoT 中心开发人员指南”中的访问控制

在 IoT 中心内注册新设备

本部分在 IoT 中心的标识注册表中创建设备标识。 设备无法连接到 IoT 中心,除非它在标识注册表中具有条目。 有关详细信息,请参阅 IoT 中心开发人员指南的“标识注册表”部分

  1. 在 IoT 中心导航菜单中,打开“IoT 设备”,然后单击“添加”,在 IoT 中心注册新设备。

    在门户中创建设备标识

  2. 提供新设备的名称(例如 myDeviceId),然后单击“保存”。 此操作会为 IoT 中心创建新设备标识。

    添加新设备

    Important

    收集的日志中可能会显示设备 ID 用于客户支持和故障排除,因此,在为日志命名时,请务必避免包含任何敏感信息。

  3. 创建设备后,在“IoT 设备”窗格的列表中打开该设备。 复制“连接字符串 ---主密钥”供以后使用。

    设备连接字符串

Note

IoT 中心标识注册表仅存储用于实现 IoT 中心安全访问的设备标识。 它存储设备 ID 和密钥作为安全凭据,以及启用/禁用标志让你禁用对单个设备的访问。 如果应用程序需要存储其他特定于设备的元数据,则应使用特定于应用程序的存储。 有关详细信息,请参阅 IoT 中心开发人员指南

将 Azure 存储帐户关联到 IoT 中心

由于模拟设备应用将文件上传到 Blob,因此必须拥有与 IoT 中心关联的 Azure 存储帐户。 将 Azure 存储帐户与 IoT 中心相关联时,IoT 中心会生成一个 SAS URI。 设备可以使用此 SAS URI 安全地将文件上传到 Blob 容器。 IoT 中心服务和设备 SDK 协调生成 SAS URI 的过程,并使其可供设备用来上传文件。

按照通过 Azure 门户配置文件上传中的说明,将 Azure 存储帐户关联到 IoT 中心。 确保有一个 Blob 容器与 IoT 中心关联并且已启用文件通知。

在门户中启用文件通知

从设备应用上传文件

本部分中操作将会创建可将文件上传到 IoT 中心的设备应用。

  1. 在命令提示符处,运行以下命令来安装 azure-iothub-device-client 包:

    pip install azure-iothub-device-client
    
  2. 使用文本编辑器,在工作文件夹中创建一个 FileUpload.py 文件。

  3. 在 FileUpload.py 文件的开头添加以下 import 语句和变量。 将 deviceConnectionString 替换为 IoT 中心设备的连接字符串:

    import time
    import sys
    import iothub_client
    import os
    from iothub_client import IoTHubClient, IoTHubClientError, IoTHubTransportProvider, IoTHubClientResult, IoTHubError
    
    CONNECTION_STRING = "[Device Connection String]"
    PROTOCOL = IoTHubTransportProvider.HTTP
    
    PATHTOFILE = "[Full path to file]"
    FILENAME = "[File name on storage after upload]"
    
  4. 针对 upload_blob 函数创建一个回调:

    def blob_upload_conf_callback(result, user_context):
        if str(result) == 'OK':
            print ( "...file uploaded successfully." )
        else:
            print ( "...file upload callback returned: " + str(result) )
    
  5. 添加以下代码用于连接客户端和上传文件。 此外还包含 main 例程:

    def iothub_file_upload_sample_run():
        try:
            print ( "IoT Hub file upload sample, press Ctrl-C to exit" )
    
            client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
    
            f = open(PATHTOFILE, "r")
            content = f.read()
    
            client.upload_blob_async(FILENAME, content, len(content), blob_upload_conf_callback, 0)
    
            print ( "" )
            print ( "File upload initiated..." )
    
            while True:
                time.sleep(30)
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error %s from IoTHub" % iothub_error )
            return
        except KeyboardInterrupt:
            print ( "IoTHubClient sample stopped" )
        except:
            print ( "generic error" )
    
    if __name__ == '__main__':
        print ( "Simulating a file upload using the Azure IoT Hub Device SDK for Python" )
        print ( "    Protocol %s" % PROTOCOL )
        print ( "    Connection string=%s" % CONNECTION_STRING )
    
        iothub_file_upload_sample_run()
    
  6. 保存并关闭 UploadFile.py 文件。

  7. 将示例文本文件复制到工作文件夹,并将其重命名为 sample.txt

    Note

    IoT 中心 Python SDK 目前仅支持上传基于字符的文件,如 .txt 文件。

运行应用程序

现即可运行应用程序。

  1. 在工作文件夹的命令提示符处,运行以下命令:

    python FileUpload.py
    
  2. 以下屏幕截图显示来自 FileUpload 应用的输出:

    simulated-device 应用的输出

  3. 可以使用门户查看所配置的存储容器中上传的文件:

    上传的文件

后续步骤

在本教程中,已学习了如何使用 IoT 中心的文件上传功能来简化从设备进行的文件上传。 可以使用以下文章继续探索 IoT 中心功能和方案: