Поделиться через


Отправка файлов с устройства в облако с помощью Центр Интернета вещей Azure (Python)

В этой статье показано, как использовать возможности передачи файлов Центра Интернета вещей для передачи файла в хранилище BLOB-объектов Azure с помощью Python.

В кратком руководстве Отправка данных телеметрии с устройства в Центр Интернета вещей и статьях Отправка сообщений из облака на устройство с помощью Центра Интернета вещей описаны базовые функции Центра Интернета вещей для обмена сообщениями между устройством и облаком. В учебнике Настройка маршрутизации сообщений с Центром Интернета вещей описан способ надежного хранения сообщений, отправляемых с устройства в облако, в хранилище BLOB-объектов Microsoft Azure. Но в некоторых случаях непросто сопоставить данные, отправляемые устройством, с относительно небольшими сообщениями, отправляемыми из устройства в облако, которые принимает Центр Интернета вещей. Например:

  • Видео
  • Большие файлы, содержащие изображения.
  • Данные вибрации с высокой частотой выборки.
  • Некоторые виды предварительно обработанных данных.

Эти файлы обычно обрабатываются в виде пакета в облаке с помощью таких инструментов, как Фабрика данных Azure или стек Hadoop. При передаче файлов с устройства вы можете рассчитывать на безопасность и надежность Центра Интернета вещей. В этой статье показано, как это сделать.

В конце этой статьи вы запустите консольное приложение Python FileUpload.py, которое отправляет файл в хранилище с помощью пакета SDK для устройства Python.

Примечание.

Существуют пакеты SDK для устройств Azure IoT, обеспечивающие поддержку многих платформ устройств и языков (включая C, Java, Python и JavaScript) в Центре Интернета вещей. Дополнительные сведения по подключению устройства к Центру Интернета вещей Azure см. в статье Центр разработчика для Интернета вещей Azure.

Внимание

Функция отправки файлов на устройствах, использующих проверку подлинности на основе сертификата X.509, доступна в общедоступной предварительной версии, при этом должен быть включен режим предварительного просмотра. Общедоступная версия доступна на устройствах, использующих проверку подлинности X.509 или аттестацию сертификатов X.509 с помощью Службы подготовки устройств Azure. Дополнительные сведения о проверке подлинности на основе сертификата X.509 с помощью Центра Интернета вещей см. в разделе Поддерживаемые сертификаты X.509.

Необходимые компоненты

  • Активная учетная запись Azure. Если ее нет, можно создать бесплатную учетную запись всего за несколько минут.

  • Центр Интернета вещей. Создайте его с помощью CLI или портала Azure.

  • Зарегистрированное устройство. Зарегистрируйте его на портале Azure.

  • Рекомендуется использовать Python 3.7 или более поздней версии. Обязательно используйте 32-разрядную или 64-разрядную версию установки согласно требованиям программы настройки. При появлении запроса во время установки обязательно добавьте Python в переменную среды соответствующей платформы.

  • Порт 8883 должен быть открытым в брандмауэре. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

Связывание учетной записи хранения Azure с Центром Интернета вещей

Для загрузки файлов с устройства у вас должна быть учетная запись хранилища Azure и контейнер хранилища BLOB-объектов Azure, связанный с вашим центром Интернета вещей. После связывания учетной записи хранения и контейнера с центром Интернета вещей, центр Интернета вещей сможет предоставлять элементы универсального кода ресурса подписанного URL-адреса по запросу устройства. Затем устройство может использовать эти элементы для создания универсального кода ресурса подписанного URL-адреса, применяемого для проверки подлинности в службе хранилища Azure и отправки файлов в контейнер больших двоичных объектов.

Чтобы связать учетную запись хранения Azure с центром Интернета вещей, выполните следующее.

  1. В разделе Параметры центра выберите Отправка файлов на левой панели Центра Интернета вещей.

    Снимок экрана: выбор параметров отправки файла на портале.

  2. На панели Загрузка файла выберите Контейнер хранилища Azure. В этой статье рекомендуется размещать учетную запись хранения и центр Интернета вещей в одном регионе.

    • Если у вас уже есть учетная запись хранения, которую вы хотите использовать, выберите ее в списке.

    • Чтобы создать новую учетную запись хранения, выберите +Учетная запись хранения. Укажите имя для учетной записи хранения и убедитесь, что для параметра Расположение задан тот же регион, что и для вашего центра Интернета вещей, затем нажмите OK. Новая учетная запись создается в той же группе ресурсов, что и центр Интернета вещей. По завершении развертывания выберите учетную запись хранения в списке.

    После выбора учетной записи хранения откроется панель Контейнеры.

  3. На странице Контейнеры выберите созданный контейнер больших двоичных объектов.

    • Если у вас уже есть контейнер больших двоичных объектов, который вы хотите использовать, выберите его в списке и нажмите кнопку Выбрать.

    • Выберите +Контейнер для создания контейнера больших двоичных объектов. Укажите имя для нового контейнера. Для этой статьи можно оставить для всех остальных полей значения по умолчанию. Нажмите кнопку создания. После завершения развертывания выберите контейнер в списке и нажмите Выбрать.

  4. Вернувшись на панель Загрузка файла, убедитесь, что для уведомлений о файлах установлено значение Вкл. Для других параметров можно оставить значения по умолчанию. Выберите Сохранить и дождитесь завершения настроек, прежде чем переходить к следующему разделу.

    Снимок экрана: подтверждение параметров отправки файла на портале.

Более подробные инструкции по созданию учетной записи хранения Azure см. в статье Создание учетной записи хранения. Более подробные инструкции по связыванию учетной записи хранения и контейнера больших двоичных объектов с центром Интернета вещей см. в статье Настройка отправки файлов с помощью портал Azure.

Передача файла из приложения устройства

В этом разделе вы создадите приложение для устройства, чтобы отправлять файлы в Центр Интернета вещей.

  1. В командной строке выполните приведенную ниже команду, чтобы установить пакет azure-iot-device. Этот пакет используется для координации передачи файлов с Центром Интернета вещей.

    pip install azure-iot-device
    
  2. В командной строке выполните приведенную ниже команду, чтобы установить пакет azure.storage.blob. Этот пакет используется для отправки файла.

    pip install azure.storage.blob
    
  3. Создайте тестовый файл, чтобы отправить его в хранилище BLOB-объектов.

  4. В текстовом редакторе создайте в рабочей папке файл FileUpload.py.

  5. Добавьте следующие инструкции import и переменные в начало файла FileUpload.py.

    import os
    from azure.iot.device import IoTHubDeviceClient
    from azure.core.exceptions import AzureError
    from azure.storage.blob import BlobClient
    
    CONNECTION_STRING = "[Device Connection String]"
    PATH_TO_FILE = r"[Full path to local file]"
    
  6. В файле замените [Device Connection String] строкой подключения устройства Центра Интернета вещей. Замените [Full path to local file] путем к созданному тестовому файлу или любому файлу на устройстве, который требуется передать.

  7. Создайте функцию для передачи файла в хранилище BLOB-объектов:

    def store_blob(blob_info, file_name):
        try:
            sas_url = "https://{}/{}/{}{}".format(
                blob_info["hostName"],
                blob_info["containerName"],
                blob_info["blobName"],
                blob_info["sasToken"]
            )
    
            print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))
    
            # Upload the specified file
            with BlobClient.from_blob_url(sas_url) as blob_client:
                with open(file_name, "rb") as f:
                    result = blob_client.upload_blob(f, overwrite=True)
                    return (True, result)
    
        except FileNotFoundError as ex:
            # catch file not found and add an HTTP status code to return in notification to IoT Hub
            ex.status_code = 404
            return (False, ex)
    
        except AzureError as ex:
            # catch Azure errors that might result from the upload operation
            return (False, ex)
    

    Эта функция анализирует полученную структуру blob_info и создает на ее основе URL-адрес для инициализации объекта azure.storage.blob.BlobClient. Затем она с помощью этого клиента отправляет нужный файл в хранилище BLOB-объектов Azure.

  8. Добавьте следующий код, который отвечает за подключение клиента и отправку файла.

    def run_sample(device_client):
        # Connect the client
        device_client.connect()
    
        # Get the storage info for the blob
        blob_name = os.path.basename(PATH_TO_FILE)
        storage_info = device_client.get_storage_info_for_blob(blob_name)
    
        # Upload to blob
        success, result = store_blob(storage_info, PATH_TO_FILE)
    
        if success == True:
            print("Upload succeeded. Result is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)
            )
    
        else :
            # If the upload was not successful, the result is the exception object
            print("Upload failed. Exception is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], False, result.status_code, str(result)
            )
    
    def main():
        device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        try:
            print ("IoT Hub file upload sample, press Ctrl-C to exit")
            run_sample(device_client)
        except KeyboardInterrupt:
            print ("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            device_client.shutdown()
    
    
    if __name__ == "__main__":
        main()
    

    Этот код создает объект IoTHubDeviceClient и с помощью указанных ниже API управляет отправкой файлов в центр Интернета вещей.

    • get_storage_info_for_blob получает от центра Интернета вещей информацию о ранее созданной и связанной учетной записи хранения. Эти сведения включают имена узла, контейнера и BLOB-объекта, а также маркер SAS. Сведения о хранилище передаются в функцию store_blob, которую мы создали на предыдущем шаге, чтобы BlobClient в этой функции смог выполнить проверку подлинности в хранилище Azure. Кроме того, метод get_storage_info_for_blob возвращает идентификатор correlation_id, который используется далее в методе notify_blob_upload_status. Этот идентификатор корреляции используется для маркировки BLOB-объекта, с которым вы работаете.

    • notify_blob_upload_status извещает Центр Интернета вещей о состоянии текущей операции с хранилищем BLOB-объектов. В него передается значение correlation_id, полученное методом get_storage_info_for_blob. Оно используется Центром Интернета вещей для извещения о состоянии задачи передачи файлов любых служб, которых может интересовать это состояние.

  9. Сохраните и закройте файл FileUpload.py.

Выполнение приложения

Теперь все готово к запуску приложения.

  1. В командной строке в рабочей папке выполните следующую команду.

    python FileUpload.py
    
  2. На следующем снимке экрана показаны выходные данные приложения FileUpload.

    Снимок экрана: результат запуска приложения FileUpload.

  3. На портале можно просмотреть отправленный файл в контейнере хранилища, который вы настроили.

    Снимок экрана: контейнер на портале Azure, в котором отображается переданный файл.

Следующие шаги

Из этой статьи вы узнали, как использовать возможности передачи файлов Центра Интернета вещей, чтобы упростить передачу файлов из устройств. Вы можете продолжить изучение этой возможности, ознакомившись со следующими статьями:

Дополнительные сведения о Хранилище BLOB-объектов доступны в следующих статьях: