- Как использовать MQTT в Python (Paho)
- Инициализация проекта
- Выбор клиента MQTT
- Использование Pip для установки MQTT-клиента Paho
- Использование Python MQTT
- Подключение к брокеру MQTT
- Импорт MQTT-клиента Paho
- Установка параметров подключения MQTT Broker
- Написание функции подключения MQTT
- Публикация сообщений
- Подписаться
- Полный код
- Проверить
- Публикация сообщений
- Подписаться на сообщения
- Резюме
Как использовать MQTT в Python (Paho)
Python — это интерпретируемый, высокоуровневый язык программирования общего назначения. Созданный Гвидо ван Россумом и впервые выпущенный в 1991 году, философия дизайна Python подчеркивает читабельность кода с заметным использованием значительного пробельного пространства. Его языковые конструкции и объектно-ориентированный подход призваны помочь программистам писать понятный, логичный код для небольших и масштабных проектов. 1
MQTT — это легкий протокол обмена сообщениями IoT, основанный на модели «публикация/подписка», который может обеспечить надежный сервис обмена сообщениями в реальном времени для устройств IoT, используя при этом очень мало кода и пропускной способности. Он подходит для устройств с ограниченными аппаратными ресурсами и сетевой среды с ограниченной пропускной способностью. Поэтому протокол MQTT широко используется в IoT, мобильном интернете, IoV, электроэнергетике и других отраслях.
Эта статья в основном рассказывает о том, как использовать клиент paho-mqtt и реализовать подключение, подписку, обмен сообщениями и другие функции между MQTT клиентом и MQTT брокером в проекте на Python.
Инициализация проекта
Этот проект использует Python 3.6 для разработки и тестирования. Читатели могут использовать следующую команду для подтверждения версии Python.
➜ ~ python3 --version Python 3.6.7
Выбор клиента MQTT
Paho Python Client предоставляет клиентский класс с поддержкой MQTT v3.1 и v3.1.1 на Python 2.7 или 3.x. Он также предоставляет несколько вспомогательных функций для упрощения публикации разовых сообщений на MQTT-сервер.
Использование Pip для установки MQTT-клиента Paho
Pip — это инструмент управления пакетом Python. Этот инструмент предоставляет функции поиска, загрузки, установки и удаления пакета Python.
Использование Python MQTT
Подключение к брокеру MQTT
В этой статье мы будем использовать бесплатный публичный MQTT-брокер, предоставляемый EMQX. Этот сервис основан на облачной платформе MQTT IoT для создания. Информация о доступе к брокеру выглядит следующим образом:
Импорт MQTT-клиента Paho
from paho.mqtt import client as mqtt_client
Установка параметров подключения MQTT Broker
Установите адрес, порт и тему подключения MQTT Broker. В то же время, мы вызываем функцию Python random.randint для случайной генерации идентификатора клиента MQTT.
broker = 'broker.emqx.io' port = 1883 topic = "/python/mqtt" client_id = f'python-mqtt-random.randint(0, 1000)>' # username = 'emqx' # password = 'public'
Написание функции подключения MQTT
Напишите функцию обратного вызова соединения on_connect . Эта функция будет вызываться после подключения клиента, и мы сможем определить, успешно ли подключен клиент, по rc в этой функции. Обычно мы создаем MQTT-клиент в то же время, и этот клиент подключается к broker.emqx.io .
def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %dn", rc) # Set Connecting Client ID client = mqtt_client.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client
Публикация сообщений
Сначала мы определим цикл while. В этом цикле мы зададим функцию MQTT-клиента publish для отправки сообщений в тему /python/mqtt каждую секунду.
def publish(client): msg_count = 0 while True: time.sleep(1) msg = f"messages: msg_count>" result = client.publish(topic, msg) # result: [0, 1] status = result[0] if status == 0: print(f"Send `msg>` to topic `topic>`") else: print(f"Failed to send message to topic topic>") msg_count += 1
Подписаться
Напишите функцию обратного вызова сообщения on_message . Эта функция будет вызываться после того, как клиент получил сообщения от MQTT Broker. В этой функции мы выведем название подписанных тем и полученные сообщения.
def subscribe(client: mqtt_client): def on_message(client, userdata, msg): print(f"Received `msg.payload.decode()>` from `msg.topic>` topic") client.subscribe(topic) client.on_message = on_message
Полный код
# python 3.6 import random import time from paho.mqtt import client as mqtt_client broker = 'broker.emqx.io' port = 1883 topic = "python/mqtt" # generate client ID with pub prefix randomly client_id = f'python-mqtt-random.randint(0, 1000)>' # username = 'emqx' # password = 'public' def connect_mqtt(): def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %dn", rc) client = mqtt_client.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client def publish(client): msg_count = 0 while True: time.sleep(1) msg = f"messages: msg_count>" result = client.publish(topic, msg) # result: [0, 1] status = result[0] if status == 0: print(f"Send `msg>` to topic `topic>`") else: print(f"Failed to send message to topic topic>") msg_count += 1 def run(): client = connect_mqtt() client.loop_start() publish(client) if __name__ == '__main__': run()
# python3.6 import random from paho.mqtt import client as mqtt_client broker = 'broker.emqx.io' port = 1883 topic = "python/mqtt" # generate client ID with pub prefix randomly client_id = f'python-mqtt-random.randint(0, 100)>' # username = 'emqx' # password = 'public' def connect_mqtt() -> mqtt_client: def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print("Failed to connect, return code %dn", rc) client = mqtt_client.Client(client_id) client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client def subscribe(client: mqtt_client): def on_message(client, userdata, msg): print(f"Received `msg.payload.decode()>` from `msg.topic>` topic") client.subscribe(topic) client.on_message = on_message def run(): client = connect_mqtt() subscribe(client) client.loop_forever() if __name__ == '__main__': run()
Проверить
Публикация сообщений
Запустите код публикации сообщений, мы увидим, что клиент успешно подключается и успешно публикует сообщения
Подписаться на сообщения
Запустите код подписки на сообщения, мы увидим, что клиент успешно подключается и успешно получает опубликованные сообщения
Резюме
На данный момент мы закончили работу над использованием клиента paho-mqtt для подключения к бесплатному публичному MQTT брокеру, а также реализовали подключение, публикацию сообщений и подписку на сообщения между тестовым клиентом и MQTT брокером.
Python отличается от языков высокого уровня, таких как C++ или Java, он больше подходит для реализации бизнес-логики на стороне устройства. Использование Python позволяет уменьшить логическую сложность кода и снизить стоимость взаимодействия с устройством. Мы считаем, что Python будет иметь более широкое применение в области IoT.
Далее мы опубликуем больше статей о разработке IoT и Python. Следите за новостями.