Przekazywanie plików z urządzenia do chmury za pomocą usługi Azure IoT Hub (Python)

W tym artykule pokazano, jak przekazywać pliki możliwości przekazywania plików w usłudze IoT Hub do usługi Azure Blob Storage przy użyciu języka Python.

Artykuły Wysyłanie danych telemetrycznych z urządzenia do centrum IoT Hub i Wysyłanie komunikatów z chmury do urządzenia przy użyciu usługi IoT Hub pokazują podstawowe funkcje obsługi komunikatów między urządzeniami i chmurą w usłudze IoT Hub. Samouczek Konfigurowanie routingu komunikatów za pomocą usługi IoT Hub przedstawia sposób niezawodnego przechowywania komunikatów z urządzenia do chmury w usłudze Microsoft Azure Blob Storage. Jednak w niektórych scenariuszach nie można łatwo mapować danych wysyłanych przez urządzenia do stosunkowo małych komunikatów z urządzenia do chmury akceptowanych przez usługę IoT Hub. Na przykład:

  • Filmy wideo
  • Duże pliki zawierające obrazy
  • Próbkowane dane drgań o wysokiej częstotliwości
  • Niektóre formy wstępnie przetworzonych danych.

Te pliki są zwykle przetwarzane wsadowo w chmurze przy użyciu narzędzi, takich jak usługa Azure Data Factory lub stos usługi Hadoop . Jeśli musisz przekazać pliki z urządzenia, nadal możesz korzystać z zabezpieczeń i niezawodności usługi IoT Hub. W tym artykule pokazano, jak to zrobić.

Na końcu tego artykułu uruchomisz aplikację konsolową języka Python FileUpload.py, która przekazuje plik do magazynu przy użyciu zestawu SDK urządzenia języka Python.

Uwaga

Usługa IoT Hub obsługuje wiele platform urządzeń i języków (w tym C, Java, Python i JavaScript) za pośrednictwem zestawów SDK urządzeń usługi Azure IoT. Zapoznaj się z centrum deweloperów usługi Azure IoT, aby dowiedzieć się, jak połączyć urządzenie z usługą Azure IoT Hub.

Ważne

Funkcje przekazywania plików na urządzeniach korzystających z uwierzytelniania urzędu certyfikacji X.509 są w publicznej wersji zapoznawczej, a tryb podglądu musi być włączony. Jest ona ogólnie dostępna na urządzeniach korzystających z uwierzytelniania odcisku palca X.509 lub zaświadczania certyfikatu X.509 za pomocą usługi Azure Device Provisioning Service. Aby dowiedzieć się więcej na temat uwierzytelniania X.509 w usłudze IoT Hub, zobacz Obsługiwane certyfikaty X.509.

Wymagania wstępne

  • Aktywne konto platformy Azure. (Jeśli go nie masz, możesz utworzyć bezpłatne konto próbne w zaledwie kilka minut).

  • Centrum IoT. Utwórz go za pomocą interfejsu wiersza polecenia lub witryny Azure Portal.

  • Zarejestrowane urządzenie. Zarejestruj je w witrynie Azure Portal.

  • Zalecane jest użycie języka Python w wersji 3.7 lub nowszej . Upewnij się, że używasz 32-bitowej lub 64-bitowej instalacji zgodnie z wymaganiami konfiguracji. Po wyświetleniu monitu podczas instalacji upewnij się, że język Python został dodany do zmiennej środowiskowej specyficznej dla platformy.

  • Port 8883 powinien być otwarty w zaporze. Przykład urządzenia w tym artykule używa protokołu MQTT, który komunikuje się za pośrednictwem portu 8883. Ten port może zostać zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych. Aby uzyskać więcej informacji i sposobów obejścia tego problemu, zobacz Połączenie do usługi IoT Hub (MQTT).

Kojarzenie konta usługi Azure Storage z usługą IoT Hub

Aby przekazać pliki z urządzenia, musisz mieć konto usługi Azure Storage i kontener usługi Azure Blob Storage skojarzony z centrum IoT. Po skojarzeniu konta magazynu i kontenera z centrum IoT Hub centrum IoT hub może podać elementy identyfikatora URI sygnatury dostępu współdzielonego w przypadku żądania przez urządzenie. Następnie urządzenie może użyć tych elementów do skonstruowania identyfikatora URI sygnatury dostępu współdzielonego używanego do uwierzytelniania w usłudze Azure Storage i przekazywania plików do kontenera obiektów blob.

Aby skojarzyć konto usługi Azure Storage z centrum IoT:

  1. W obszarze Ustawienia centrum wybierz pozycję Przekazywanie pliku w okienku po lewej stronie centrum IoT Hub.

    Zrzut ekranu przedstawiający wybieranie ustawień przekazywania plików z portalu.

  2. W okienku Przekazywanie plików wybierz pozycję Kontener usługi Azure Storage. W tym artykule zaleca się, aby twoje konto magazynu i usługa IoT Hub znajdowały się w tym samym regionie.

    • Jeśli masz już konto magazynu, którego chcesz użyć, wybierz je z listy.

    • Aby utworzyć nowe konto magazynu, wybierz pozycję +Konto magazynu. Podaj nazwę konta magazynu i upewnij się, że lokalizacja jest ustawiona na ten sam region co centrum IoT, a następnie wybierz przycisk OK. Nowe konto jest tworzone w tej samej grupie zasobów co centrum IoT Hub. Po zakończeniu wdrażania wybierz konto magazynu z listy.

    Po wybraniu konta magazynu zostanie otwarte okienko Kontenery .

  3. W okienku Kontenery wybierz kontener obiektów blob.

    • Jeśli masz już kontener obiektów blob, którego chcesz użyć, wybierz go z listy i kliknij pozycję Wybierz.

    • Aby utworzyć nowy kontener obiektów blob, wybierz pozycję + Kontener. Podaj nazwę nowego kontenera. Na potrzeby tego artykułu można pozostawić wszystkie inne pola domyślnie. Wybierz pozycję Utwórz. Po zakończeniu wdrażania wybierz kontener z listy i kliknij pozycję Wybierz.

  4. Wróć do okienka Przekazywanie pliku, upewnij się, że powiadomienia o plikach są ustawione na włączone. Wszystkie inne ustawienia można pozostawić w ustawieniach domyślnych. Wybierz pozycję Zapisz i poczekaj na ukończenie ustawień przed przejściem do następnej sekcji.

    Przechwytywanie ekranu przedstawiające potwierdzanie ustawień przekazywania plików w portalu.

Aby uzyskać bardziej szczegółowe instrukcje dotyczące tworzenia konta usługi Azure Storage, zobacz Tworzenie konta magazynu. Aby uzyskać bardziej szczegółowe instrukcje dotyczące kojarzenia konta magazynu i kontenera obiektów blob z centrum IoT Hub, zobacz Konfigurowanie przekazywania plików przy użyciu witryny Azure Portal.

Przekazywanie pliku z aplikacji urządzenia

W tej sekcji utworzysz aplikację urządzenia, aby przekazać plik do centrum IoT Hub.

  1. W wierszu polecenia uruchom następujące polecenie, aby zainstalować pakiet azure-iot-device . Ten pakiet służy do koordynowania przekazywania plików z centrum IoT Hub.

    pip install azure-iot-device
    
  2. W wierszu polecenia uruchom następujące polecenie, aby zainstalować pakiet azure.storage.blob. Ten pakiet służy do przekazywania pliku.

    pip install azure.storage.blob
    
  3. Utwórz plik testowy, który zostanie przekazany do magazynu obiektów blob.

  4. Za pomocą edytora tekstów utwórz plik FileUpload.py w folderze roboczym.

  5. Dodaj następujące import instrukcje i zmienne na początku pliku 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. W pliku zastąp [Device Connection String] element parametry połączenia urządzenia centrum IoT Hub. Zastąp [Full path to local file] ciąg ścieżką do utworzonego pliku testowego lub dowolnego pliku na urządzeniu, który chcesz przekazać.

  7. Utwórz funkcję w celu przekazania pliku do magazynu obiektów 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)
    

    Ta funkcja analizuje przekazaną do niej strukturę blob_info , aby utworzyć adres URL używany do zainicjowania obiektu azure.storage.blob.BlobClient. Następnie przekazuje plik do usługi Azure Blob Storage przy użyciu tego klienta.

  8. Dodaj następujący kod, aby połączyć klienta i przekazać plik:

    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()
    

    Ten kod tworzy obiekt IoTHubDeviceClient i używa następujących interfejsów API do zarządzania przekazywaniem plików za pomocą centrum IoT:

    • get_storage_info_for_blob pobiera informacje z centrum IoT o połączonym koncie magazynu utworzonym wcześniej. Te informacje obejmują nazwę hosta, nazwę kontenera, nazwę obiektu blob i token SAS. Informacje o magazynie są przekazywane do funkcji store_blob (utworzonej w poprzednim kroku), więc obiekt BlobClient w tej funkcji może uwierzytelniać się w usłudze Azure Storage. Metoda get_storage_info_for_blob zwraca również correlation_id, która jest używana w metodzie notify_blob_upload_status . Correlation_id to sposób oznaczania obiektów blob, nad którymi pracujesz.

    • notify_blob_upload_status powiadamia usługę IoT Hub o stanie operacji magazynu obiektów blob. Przekazujesz correlation_id uzyskane przez metodę get_storage_info_for_blob . Jest ona używana przez usługę IoT Hub do powiadamiania dowolnej usługi, która może nasłuchiwać powiadomienia o stanie zadania przekazywania plików.

  9. Zapisz i zamknij plik FileUpload.py .

Uruchamianie aplikacji

Teraz możesz uruchomić aplikację.

  1. W wierszu polecenia w folderze roboczym uruchom następujące polecenie:

    python FileUpload.py
    
  2. Poniższy zrzut ekranu przedstawia dane wyjściowe z aplikacji FileUpload :

    Zrzut ekranu przedstawiający dane wyjściowe z uruchamiania aplikacji FileUpload.

  3. Za pomocą portalu możesz wyświetlić przekazany plik w skonfigurowanym kontenerze magazynu:

    Zrzut ekranu przedstawiający kontener w witrynie Azure Portal przedstawiający przekazany plik.

Następne kroki

W tym artykule przedstawiono sposób użycia funkcji przekazywania plików usługi IoT Hub w celu uproszczenia przekazywania plików z urządzeń. Możesz kontynuować eksplorowanie tej funkcji, wykonując następujące artykuły:

Dowiedz się więcej o usłudze Azure Blob Storage, wykonując następujące linki: