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

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

В этой статье показано, как выполнить следующие действия:

  • Отправка сообщений из облака на устройство (C2D) из серверной части решения на одно устройство через Центр Интернета вещей

  • Получение на устройстве сообщений, передаваемых из облака на устройство

Примечание

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовых и стандартных и бесплатных уровнях Центр Интернета вещей см. в статье Выбор подходящего уровня Центр Интернета вещей для решения.

В конце этой статьи вы запустите два консольных приложения Python.

  • SimulatedDevice.py: имитирует устройство, которое подключается к Центру Интернета вещей и получает сообщения из облака на устройство.

  • SendCloudToDeviceMessage.py: отправляет сообщение из облака на устройство через Центр Интернета вещей в приложение имитированного устройства.

Дополнительные сведения о сообщениях из облака на устройство см. в статье Отправка сообщений из облака на устройство из Центра Интернета вещей.

Примечание

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

Предварительные требования

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

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

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

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

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

Получение сообщений в приложении для имитации устройства

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

  1. В командной строке в рабочем каталоге установите пакет SDK устройства Центра Интернета вещей Azure для Python:

    pip install azure-iot-device
    
  2. В текстовом редакторе создайте файл с именем SimulatedDevice.py.

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

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Добавьте приведенный ниже код в файл SimulatedDevice.py. Замените {deviceConnectionString} значение заполнителя строкой подключения для зарегистрированного устройства в разделе Предварительные требования:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Определите следующую функцию, используемую для вывода полученных сообщений в консоль:

    def message_handler(message):
        global RECEIVED_MESSAGES
        RECEIVED_MESSAGES += 1
        print("")
        print("Message received:")
    
        # print data from both system and application (custom) properties
        for property in vars(message).items():
            print ("    {}".format(property))
    
        print("Total calls received: {}".format(RECEIVED_MESSAGES))
    
  6. Добавьте следующий код, чтобы инициализировать клиент и ожидать передачи сообщения из облака на устройство:

    def main():
        print ("Starting the Python IoT Hub C2D Messaging device sample...")
    
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for C2D messages, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_message_received = message_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoT Hub C2D Messaging device sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
  7. Добавьте функцию main со следующим содержимым:

    if __name__ == '__main__':
        main()
    
  8. Сохраните и закройте файл SimulatedDevice.py.

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

Получение строки подключения центра Интернета вещей

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

Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра Интернета вещей выберите Политики общего доступа.

  3. В списке политик выберите политику службы.

  4. Скопируйте основную строку подключения и сохраните значение.

Снимок экрана: извлечение строки подключения из Центра Интернета вещей на портале Azure.

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Отправка сообщения из облака на устройство

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

  1. В рабочей папке откройте окно командной строки и установите пакет SDK службы Центра Интернета вещей Azure для Python.

    pip install azure-iot-hub
    
  2. В текстовом редакторе создайте файл с именем SendCloudToDeviceMessage.py.

  3. Добавьте следующие инструкции import и переменные в начало файла SendCloudToDeviceMessage.js:

    import random
    import sys
    from azure.iot.hub import IoTHubRegistryManager
    
    MESSAGE_COUNT = 2
    AVG_WIND_SPEED = 10.0
    MSG_TXT = "{\"service client sent a message\": %.2f}"
    
  4. Добавьте приведенный ниже код в файл SendCloudToDeviceMessage.js. Замените заполнители {iot hub connection string} и {device id} строкой подключения центра Интернета вещей и идентификатором устройства, которые вы записали ранее:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. Добавьте код для отправки сообщений на устройство, приведенный ниже.

    def iothub_messaging_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            for i in range(0, MESSAGE_COUNT):
                print ( 'Sending message: {0}'.format(i) )
                data = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
    
                props={}
                # optional: assign system properties
                props.update(messageId = "message_%d" % i)
                props.update(correlationId = "correlation_%d" % i)
                props.update(contentType = "application/json")
    
                # optional: assign application properties
                prop_text = "PropMsg_%d" % i
                props.update(testProperty = prop_text)
    
                registry_manager.send_c2d_message(DEVICE_ID, data, properties=props)
    
            try:
                # Try Python 2.xx first
                raw_input("Press Enter to continue...\n")
            except:
                pass
                # Use Python 3.xx in the case of exception
                input("Press Enter to continue...\n")
    
        except Exception as ex:
            print ( "Unexpected error {0}" % ex )
            return
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging service sample stopped" )
    
  6. Добавьте функцию main со следующим содержимым:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. Сохраните и закройте файл SendCloudToDeviceMessage.py.

Запуск приложений

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

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

    python SimulatedDevice.py
    

    Запуск приложения виртуального устройства

  2. Откройте новую командную строку в рабочей папке и выполните приведенную ниже команду, чтобы отправить сообщения из облака на устройство.

    python SendCloudToDeviceMessage.py
    

    Запуск приложения для отправки команды из облака на устройство

  3. Обратите внимание на сообщения, принятые устройством.

    Полученное сообщение

Дальнейшие действия

В этой статье вы научились отправлять и получать сообщения из облака на устройство.