Сегодня рассказываем как написать простой MQTT-клиент на Raspberry Pi при помощи MicroPython и реализовать функции подключения, отправки сообщений и подписки между клиентом и брокером MQTT-сообщений. Подробности о разработке с использованием протокола интернета вещей MQTT — к старту курса по Fullstack-разработке на Python.
Микрокомпьютерная материнская плата Raspberry Pi разработана британской компанией Raspberry Pi Foundation на базе ядра ARM. Для подключения клавиатуры, мыши и сетевого кабеля предусмотрены интерфейсы USB и Ethernet. Raspberry Pi обладает всеми основными функциями персонального компьютера, при этом имеет встроенный Wi-Fi, Bluetooth и множество GPIO. Эта плата широко применяется для интернета вещей, развлечений и т. д.
MicroPython — полная программная реализация языка Python 3. Она написана на C и оптимизирована под полный компилятор Python и исполняющую систему на основе микроконтроллера. При этом пользователь получает интерактивные подсказки для немедленного исполнения поддерживаемых команд, они называются REPL. Помимо избранных основных библиотек Python, MicroPython включает модули доступа к низкоуровневому «железу». Это реализация Python 3 с небольшой частью стандартной библиотеки Python, которая оптимизирована для запуска на микроконтроллерах в условиях ограниченного окружения.
MQTT — облегчённый протокол обмена сообщениями между устройствами интернета вещей, который работает по принципу «издатель — подписчик». Это обеспечивает надёжный обмен сообщениями в реальном времени с подключёнными устройствами при минимальном количестве кода и ограниченной пропускной способности, что делает такое решение подходящим для устройств с ограниченными аппаратными ресурсами, а также ограниченной пропускной способностью. Поэтому протокол MQTT широко используют для задач интернета вещей, мобильного интернета, интеллектуального оборудования, телематики, энергетики и промышленности.
Установка окружения
1. Установим MicroPython:
sudo apt-get update
# Install MicroPython
sudo apt-get -y install micropython
Затем выполним в консоли команду micropython
. Если вернётся строка MicroPython x.x.x
, где x
— некоторое число, то установка прошла успешно.
2. Установим клиентскую библиотеку MQTT.
Для простоты подключения к серверу MQTT установите библиотеку umqtt.simple
:
micropython -m upip install umqtt.simple
Подключение к брокеру MQTT-сообщений
Воспользуемся общедоступным брокером MQTT-сообщений от EMQ на основе облачной службы MQTT — EMQX Cloud. Для доступа к брокеру нужны следующие данные:
- брокер:
broker.emqx.io
; - порт TCP:
1883
; - порт WebSocket:
8083
.
В файле sub.py
напишем такой код:
# sub.py
import time
from umqtt.simple import MQTTClient
SERVER="broker.emqx.io"
ClientID = f'raspberry-sub-{time.time_ns()}'
user = "emqx"
password = "public"
topic = "raspberry/mqtt"
msg = b'{"msg":"hello"}'
def sub(topic, msg):
print('received message %s on topic %s' % (msg, topic))
def main(server=SERVER):
client = MQTTClient(ClientID, server, 1883, user, password)
client.set_callback(sub)
client.connect()
print('Connected to MQTT Broker "%s"' % (server))
client.subscribe(topic)
while True:
if True:
client.wait_msg()
else:
client.check_msg()
time.sleep(1)
if __name__ == " __main__":
main()
А в файле pub.py
сохраним такой код:
# pub.py
import time
from umqtt.simple import MQTTClient
server="broker.emqx.io"
ClientID = f'raspberry-pub-{time.time_ns()}'
user = "emqx"
password = "public"
topic = "raspberry/mqtt"
msg = b'{"msg":"hello"}'
def connect():
print('Connected to MQTT Broker "%s"' % (server))
client = MQTTClient(ClientID, server, 1883, user, password)
client.connect()
return client
def reconnect():
print('Failed to connect to MQTT broker, Reconnecting...' % (server))
time.sleep(5)
client.reconnect()
try:
client = connect()
except OSError as e:
reconnect()
while True:
print('send message %s on topic %s' % (msg, topic))
client.publish(topic, msg, qos=0)
time.sleep(1)
Отправка сообщений (Publish)
В файл pub.py
сохраним такой код:
# pub.py
import time
from umqtt.simple import MQTTClient
server="broker.emqx.io"
ClientID = f'raspberry-pub-{time.time_ns()}'
user = "emqx"
password = "public"
topic = "raspberry/mqtt"
msg = b'{"msg":"hello"}'
def connect():
print('Connected to MQTT Broker "%s"' % (server))
client = MQTTClient(ClientID, server, 1883, user, password)
client.connect()
return client
def reconnect():
print('Failed to connect to MQTT broker, Reconnecting...' % (server))
time.sleep(5)
client.reconnect()
try:
client = connect()
except OSError as e:
reconnect()
while True:
print('send message %s on topic %s' % (msg, topic))
client.publish(topic, msg, qos=0)
time.sleep(1)
Этот код вызывает функцию publish()
для отправки сообщений в тему raspberry/mqtt
. Ещё одно свойство MQTT — параметр QoS
. Подробнее о нём — в статье Introduction to MQTT QoS (Quality of Service). Ниже ему задаётся значение 0
.
Тестирование
С помощью клиента MQTT 5.0 — MQTT X проведём следующие тесты.
Откроем консоль, запустим код MicroPython и примем сообщения:
micropython sub.py
С помощью клиента MQTT X подключимся к серверу MQTT и отправим сообщения в тему raspberry/mqtt
:
Смотрим данные в консоли Raspberry Pi и видим, что опубликованные сообщения MQTT X успешно получены:
Тестируем отправку сообщений
1. Подпишемся на тему raspberry/mqtt
в клиенте MQTT X.
2. Запустим код MicroPython из консоли и отправим сообщение:
micropython pub.py
3. В клиенте MQTT X просмотрим сообщения, отправленные Raspberry Pi:
Это пример программирования Raspberry Pi с помощью MicroPython. Мы реализовали простой тестовый клиент с помощью umqtt.simple
MicroPython и выполнили подключение, отправку и получение сообщений между клиентом и сервером MQTT. Главное преимущество MQTT — надёжный обмен сообщениями между подключёнными удалёнными устройствами в реальном времени с очень небольшим количеством кода и в условиях ограниченной пропускной способности. Raspberry Pi — это небольшой, «малогреющийся», малопотребляющий и довольно универсальный аппаратный модуль. Cочетание MicroPython и Raspberry Pi позволяет разрабатывать инновационные приложения даже на микроконтроллерах с ограниченным окружением.
Научим работать c Python, чтобы вы прокачали карьеру или стали востребованным IT-специалистом. А если вы не найдёте работу, мы вернём вам деньги.
Чтобы посмотреть все курсы, кликните по баннеру:
Data Science и Machine Learning
- Профессия Data Scientist
- Профессия Data Analyst
- Курс «Математика для Data Science»
- Курс «Математика и Machine Learning для Data Science»
- Курс по Data Engineering
- Курс «Machine Learning и Deep Learning»
- Курс по Machine Learning
Python, веб-разработка
- Профессия Fullstack-разработчик на Python
- Курс «Python для веб-разработки»
- Профессия Frontend-разработчик
- Профессия Веб-разработчик
Мобильная разработка
Java и C#
- Профессия Java-разработчик
- Профессия QA-инженер на JAVA
- Профессия C#-разработчик
- Профессия Разработчик игр на Unity
От основ — в глубину
А также
Комментарии (8)
Eugene_Rymarev
07.11.2022 11:23@honyaki, мне кажется, что где-то был потерян в статье код файла
sub.py
artalex
В чем профит использования именно MicroPython на Raspberry Pi? Там обычный Python замечательно заводится.
stranger777
Наверное, дело в простой экономии места. Мало ли что ещё там будет крутиться.
boopiz
в чем экономия? дешёвый orange pi 1гб и 4 ядра спокойно тянет все базовое по. и mqtt и web и mysql и тл и тп. одноплатники тянут все. у вас же не сотни запросов в секунду. а если нагрузка подеялась, штош, купи второй одноплатник и разнеси сервисы. цена вопроса не килобаксы, а какие то пару тысяч рублей
eps
Думаю, чтобы потом портировать на ESP32 или Pi Pico W. Там это супер-актуальная тема
osmanpasha
Лучше бы сразу статью для RP2040 или ESP32 сделали тогда, там-то нет ни линукса, ни apt, ни ssh, ни даже монитора с клавиатурой. И upip скорее всего тоже нет.
stranger777
Учту при отборе материала. Спасибо!