Опануйте протокол MQTT для IoT за допомогою Python. Цей детальний посібник охоплює принципи, бібліотеку Paho-MQTT, безпеку та реалізацію реальних проєктів.
Python для IoT: Комплексний посібник з реалізації MQTT
Світ на зв'язку: Чому протоколи IoT мають значення
Ми живемо в епоху безпрецедентного зв'язку. Інтернет речей (IoT) — це вже не футуристична концепція, а глобальна реальність, яка непомітно сплітає мережу з мільярдів розумних пристроїв, що моніторять наше середовище, автоматизують наші будинки, оптимізують промисловість та вдосконалюють міста. Від розумного термостата в будинку в Сеулі до сільськогосподарського датчика на полі в сільській місцевості Кенії — ці пристрої генерують колосальну кількість даних. Але як вони всі спілкуються один з одним та з хмарою, особливо коли вони часто малі, малопотужні та працюють у ненадійних мережах? Відповідь криється у спеціалізованих протоколах зв'язку.
Хоча протокол HTTP лежить в основі більшої частини Інтернету, яким ми користуємося щодня, він часто є занадто важким та енергозатратним для обмеженого світу IoT. Саме тут на перший план виходять протоколи, розроблені спеціально для міжмашинної (M2M) комунікації. Серед них одна технологія стала домінуючою силою: MQTT.
Цей комплексний посібник призначений для розробників, інженерів та ентузіастів з усього світу, які хочуть використовувати потужність MQTT за допомогою Python — однієї з найбільш універсальних та популярних мов програмування у сфері IoT. Ми пройдемо шлях від фундаментальних концепцій MQTT до створення безпечних, надійних та масштабованих IoT-застосунків.
Що таке MQTT? Протокол, створений для обмежень
MQTT розшифровується як Message Queuing Telemetry Transport (Транспорт телеметрії з чергою повідомлень). Його винайшли у 1999 році доктор Енді Стенфорд-Кларк з IBM та Арлен Ніппер з Arcom (нині Cirrus Link) для моніторингу нафтопроводів через ненадійні супутникові мережі. Історія його створення ідеально відображає його призначення: бути легким, надійним та ефективним протоколом обміну повідомленнями для пристроїв, що працюють в умовах значних обмежень.
Пояснення моделі «Публікація/Підписка» (Pub/Sub)
В основі MQTT лежить елегантний архітектурний патерн «публікація/підписка». Це фундаментально відрізняється від моделі «запит/відповідь» протоколу HTTP, з якою знайомі багато розробників. Замість того, щоб клієнт безпосередньо запитував інформацію у сервера, комунікація є роз'єднаною.
Уявіть собі глобальну інформаційну агенцію. Журналісти (видавці) не надсилають свої статті безпосередньо кожному читачеві. Замість цього вони відправляють їх до центрального вузла агенції (брокера) та класифікують за певними темами, як-от «Світова політика» чи «Технології». Читачам (підписникам) не потрібно запитувати журналістів про оновлення; вони просто повідомляють агенції, які теми їх цікавлять. Агенція потім автоматично пересилає будь-які нові статті на ці теми зацікавленим читачам. Журналістам і читачам ніколи не потрібно знати про існування, місцезнаходження чи статус один одного.
У MQTT ця модель роз'єднує пристрій, що надсилає дані (видавець), від пристрою чи застосунку, що їх отримує (підписник). Це неймовірно потужно для IoT, оскільки:
- Просторове роз'єднання: Видавцю та підписнику не потрібно знати IP-адресу чи місцезнаходження один одного.
- Часове роз'єднання: Їм не потрібно працювати одночасно. Датчик може опублікувати показник, а застосунок може отримати його через кілька годин, якщо система спроєктована таким чином.
- Роз'єднання по синхронізації: Операції з обох боків не потрібно зупиняти, щоб чекати, доки інша сторона завершить обмін повідомленнями.
Ключові компоненти екосистеми MQTT
Архітектура MQTT побудована на кількох основних компонентах:
- Брокер: Центральний вузол або сервер. Це поштове відділення у світі MQTT. Брокер відповідає за отримання всіх повідомлень від видавців, їх фільтрацію за темами (топіками) та надсилання відповідним підписникам. Популярні брокери включають опенсорсні рішення, як-от Mosquitto та VerneMQ, а також керовані хмарні сервіси, такі як AWS IoT Core, Azure IoT Hub та Google Cloud IoT Core.
- Клієнт: Будь-який пристрій або застосунок, що підключається до брокера. Клієнт може бути видавцем, підписником або і тим, і іншим. IoT-датчик є клієнтом, і серверний застосунок, що обробляє дані з датчика, також є клієнтом.
- Топік: Рядок у форматі UTF-8, що слугує адресою або міткою для повідомлень. Брокер використовує топіки для маршрутизації повідомлень. Топіки є ієрархічними, використовуючи слеш як роздільник, подібно до шляху у файловій системі. Наприклад, вдалим топіком для датчика температури у вітальні в будівлі в Лондоні може бути:
UK/London/Building-A/Floor-1/LivingRoom/Temperature. - Корисне навантаження (Payload): Це фактичний вміст даних повідомлення. MQTT є агностичним до даних, що означає, що корисне навантаження може бути будь-яким: простий рядок, ціле число, JSON, XML або навіть зашифровані бінарні дані. JSON є дуже поширеним вибором через свою гнучкість та читабельність.
Чому MQTT домінує в комунікації IoT
Принципи дизайну MQTT роблять його винятково придатним для викликів IoT:
- Легковаговість: Повідомлення MQTT мають дуже малий заголовок (всього 2 байти), що мінімізує використання пропускної здатності мережі. Це критично важливо для пристроїв, що працюють у дорогих стільникових мережах або мережах з низькою пропускною здатністю, як-от LoRaWAN.
- Ефективність: Низькі накладні витрати протоколу безпосередньо призводять до меншого споживання енергії, дозволяючи пристроям на батарейках працювати місяцями або навіть роками.
- Надійність: Протокол включає механізми для гарантування доставки повідомлень, навіть через нестабільні мережі з високою затримкою. Це керується за допомогою рівнів якості обслуговування (QoS).
- Масштабованість: Один брокер може одночасно обробляти з'єднання від тисяч або навіть мільйонів клієнтів, що робить його придатним для великомасштабних розгортань.
- Двонаправленість: MQTT дозволяє комунікацію як від пристрою до хмари (телеметрія), так і від хмари до пристрою (команди), що є життєво важливою вимогою для дистанційного керування пристроями.
Розуміння рівнів якості обслуговування (QoS)
MQTT надає три рівні якості обслуговування (QoS), що дозволяє розробникам обирати правильний баланс між надійністю та накладними витратами для їхнього конкретного випадку використання.
- QoS 0 (Не більше одного разу): Це рівень «відправив і забув». Повідомлення надсилається один раз, без підтвердження отримання від брокера чи кінцевого підписника. Це найшвидший метод, але він не дає гарантії доставки. Приклад використання: Некритичні, високочастотні дані з датчиків, наприклад, показники кімнатної температури, що надсилаються кожні 10 секунд. Втрата одного показника не є проблемою.
- QoS 1 (Щонайменше один раз): Цей рівень гарантує, що повідомлення буде доставлено щонайменше один раз. Відправник зберігає повідомлення доти, доки не отримає підтвердження (пакет PUBACK) від одержувача. Якщо підтвердження не отримано, повідомлення надсилається повторно. Це іноді може призводити до дублювання повідомлень, якщо підтвердження було втрачено. Приклад використання: Команда увімкнути розумну лампу. Вам потрібно бути впевненим, що команда отримана, а отримання її двічі не завдасть шкоди.
- QoS 2 (Рівно один раз): Це найнадійніший, але й найповільніший рівень. Він використовує чотириетапне рукостискання для забезпечення доставки повідомлення рівно один раз, без дублікатів. Приклад використання: Критичні операції, де дублікати можуть бути катастрофічними, наприклад, фінансова транзакція, команда видати точну дозу ліків або керування роботизованою рукою на заводі.
Налаштування середовища Python для MQTT
Тепер перейдімо до практики. Щоб почати створювати MQTT-застосунки на Python, вам знадобляться дві речі: бібліотека Python для MQTT-клієнта та MQTT-брокер для комунікації.
Вибір бібліотеки Python для MQTT: Paho-MQTT
Найбільш поширеною та зрілою бібліотекою MQTT для Python є Paho-MQTT від Eclipse Foundation. Це надійна, багатофункціональна бібліотека, яка надає клієнтський клас для підключення до брокера та публікації або підписки на топіки. Встановити її дуже просто за допомогою pip, менеджера пакетів Python.
Відкрийте термінал або командний рядок і виконайте:
pip install paho-mqtt
Ця єдина команда встановлює все необхідне для початку написання MQTT-клієнтів на Python.
Налаштування MQTT-брокера
У вас є кілька варіантів брокера: від запуску на локальній машині для розробки до використання потужного хмарного сервісу для продакшену.
- Локальний брокер (для розробки та навчання): Найпопулярнішим вибором для локального брокера є Mosquitto, ще один проєкт Eclipse. Він легкий, з відкритим кодом і простий у встановленні.
- На Debian-подібних Linux (як-от Ubuntu, Raspberry Pi OS):
sudo apt-get update && sudo apt-get install mosquitto mosquitto-clients - На macOS (з використанням Homebrew):
brew install mosquitto - На Windows: Завантажте нативний інсталятор з веб-сайту Mosquitto.
127.0.0.1абоlocalhost). - На Debian-подібних Linux (як-от Ubuntu, Raspberry Pi OS):
- Публічний/хмарний брокер (для швидкого тестування): Для перших експериментів без встановлення будь-чого можна використовувати безкоштовний публічний брокер. Два популярних — це
test.mosquitto.orgтаbroker.hivemq.com. Важливо: Вони є публічними та незашифрованими. Не надсилайте на них жодних чутливих або приватних даних. Вони призначені лише для навчання та тестування.
Практика: Публікація та підписка за допомогою Python
Напишімо наш перший MQTT-застосунок на Python. Ми створимо два окремі скрипти: видавця, який надсилає повідомлення, та підписника, який їх отримує. Для цього прикладу ми припускаємо, що у вас запущений локальний брокер Mosquitto.
Створення простого MQTT-видавця (publisher.py)
Цей скрипт буде підключатися до брокера та публікувати повідомлення «Hello, MQTT!» у топік `python/mqtt/test` кожні дві секунди.
Створіть файл з назвою `publisher.py` та додайте наступний код:
import paho.mqtt.client as mqtt
import time
# --- Конфігурація ---
BROKER_ADDRESS = "localhost" # Використовуйте 'test.mosquitto.org' для публічного брокера
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Функція зворотного виклику для з'єднання ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Підключено до MQTT брокера!")
else:
print(f"Не вдалося підключитися, код повернення {rc}")
# --- Основний скрипт ---
# 1. Створення екземпляра клієнта
client = mqtt.Client("PublisherClient")
# 2. Призначення функції on_connect
client.on_connect = on_connect
# 3. Підключення до брокера
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Запуск фонового потоку для мережевого циклу
client.loop_start()
try:
count = 0
while True:
count += 1
message = f"Hello, MQTT! Message #{count}"
# 5. Публікація повідомлення
result = client.publish(TOPIC, message)
# Перевірка успішності публікації
status = result[0]
if status == 0:
print(f"Надіслано `{message}` в топік `{TOPIC}`")
else:
print(f"Не вдалося надіслати повідомлення в топік {TOPIC}")
time.sleep(2)
except KeyboardInterrupt:
print("Публікацію зупинено.")
finally:
# 6. Зупинка мережевого циклу та відключення
client.loop_stop()
client.disconnect()
print("Відключено від брокера.")
Створення простого MQTT-підписника (subscriber.py)
Цей скрипт підключиться до того ж брокера, підпишеться на топік `python/mqtt/test` і буде виводити будь-які отримані повідомлення.
Створіть ще один файл з назвою `subscriber.py`:
import paho.mqtt.client as mqtt
# --- Конфігурація ---
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "python/mqtt/test"
# --- Функції зворотного виклику ---
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Підключено до MQTT брокера!")
# Підписка на топік після успішного з'єднання
client.subscribe(TOPIC)
else:
print(f"Не вдалося підключитися, код повернення {rc}")
def on_message(client, userdata, msg):
# Декодування корисного навантаження повідомлення з байтів у рядок
payload = msg.payload.decode()
print(f"Отримано повідомлення: `{payload}` в топіку `{msg.topic}`")
# --- Основний скрипт ---
# 1. Створення екземпляра клієнта
client = mqtt.Client("SubscriberClient")
# 2. Призначення функцій зворотного виклику
client.on_connect = on_connect
client.on_message = on_message
# 3. Підключення до брокера
client.connect(BROKER_ADDRESS, PORT, 60)
# 4. Запуск мережевого циклу (блокуючий виклик)
# Ця функція автоматично обробляє перепідключення та повідомлення.
print("Підписник слухає...")
client.loop_forever()
Запуск прикладу
- Відкрийте два окремих вікна терміналу.
- У першому терміналі запустіть скрипт підписника:
python subscriber.py - Ви повинні побачити повідомлення "Підписник слухає...". Тепер він очікує на повідомлення.
- У другому терміналі запустіть скрипт видавця:
python publisher.py - Ви побачите, як видавець надсилає повідомлення кожні дві секунди. Одночасно ці повідомлення з'являтимуться у вікні терміналу підписника.
Вітаємо! Ви щойно створили повноцінну, робочу систему комунікації MQTT за допомогою Python.
Вихід за рамки основ: Розширені можливості Paho-MQTT
Реальні IoT-системи вимагають більшої надійності, ніж наш простий приклад. Розгляньмо деякі розширені функції MQTT, які є важливими для створення готових до продакшену застосунків.
Останній заповіт (Last Will and Testament, LWT)
Що станеться, якщо критично важливий пристрій, наприклад, камера безпеки або кардіомонітор, несподівано відключиться через збій живлення або втрату мережі? Функція LWT — це рішення від MQTT. Коли клієнт підключається, він може зареєструвати у брокера повідомлення «останнього заповіту». Якщо клієнт відключається некоректно (без надсилання пакету DISCONNECT), брокер автоматично опублікує це повідомлення від його імені у вказаний топік.
Це незамінно для моніторингу стану пристроїв. Ви можете налаштувати пристрій так, щоб він публікував повідомлення `devices/device-123/status` з корисним навантаженням `"online"` при підключенні та реєстрував LWT-повідомлення для того ж топіка, але з корисним навантаженням `"offline"`. Будь-яка служба моніторингу, підписана на цей топік, миттєво дізнається про статус пристрою.
Щоб реалізувати LWT в Paho-MQTT, ви встановлюєте його перед підключенням:
client.will_set('devices/device-123/status', payload='offline', qos=1, retain=True)
client.connect(BROKER_ADDRESS, PORT, 60)
Збережені повідомлення (Retained Messages)
Зазвичай, якщо підписник підключається до топіка, він отримуватиме лише ті повідомлення, які були опубліковані після його підписки. Але що, якщо вам потрібно негайно отримати останнє значення? Для цього існують збережені повідомлення. Коли повідомлення публікується з прапором `retain`, встановленим у `True`, брокер зберігає це повідомлення для конкретного топіка. Кожного разу, коли новий клієнт підписується на цей топік, він миттєво отримує останнє збережене повідомлення.
Це ідеально підходить для інформації про стан. Пристрій може публікувати свій стан (наприклад, `{"state": "ON"}`) з `retain=True`. Будь-який застосунок, що запускається та підписується, негайно дізнається поточний стан пристрою, не чекаючи наступного оновлення.
У Paho-MQTT ви просто додаєте прапор `retain` до виклику publish:
client.publish(TOPIC, payload, qos=1, retain=True)
Постійні та чисті сесії
Прапор `clean_session` у запиті на підключення клієнта контролює, як брокер обробляє сесію клієнта.
- Чиста сесія (
clean_session=True, за замовчуванням): Коли клієнт відключається, брокер відкидає всю інформацію про нього, включаючи його підписки та будь-які повідомлення QoS 1 або 2, що стояли в черзі. Коли він знову підключається, це виглядає як абсолютно новий клієнт. - Постійна сесія (
clean_session=False): Коли клієнт з унікальним Client ID підключається таким чином, брокер зберігає його сесію після відключення. Це включає його підписки та будь-які повідомлення QoS 1 або 2, які були опубліковані, поки він був офлайн. Коли клієнт знову підключається, брокер надсилає всі пропущені повідомлення. Це критично важливо для пристроїв у ненадійних мережах, які не можуть дозволити собі втратити важливі команди.
Щоб встановити постійну сесію, ви повинні надати стабільний, унікальний Client ID та встановити `clean_session=False` при створенні екземпляра клієнта:
client = mqtt.Client(client_id="my-persistent-device-001", clean_session=False)
Безпека — це не опція: Захист MQTT за допомогою Python
У будь-якому реальному застосунку безпека є першочерговою. незахищений MQTT-брокер — це відкрите запрошення для зловмисників підслуховувати ваші дані, надсилати хибні команди на ваші пристрої або здійснювати атаки на відмову в обслуговуванні. Захист MQTT включає три ключові стовпи: автентифікацію, шифрування та авторизацію.
Автентифікація: Хто ви?
Автентифікація перевіряє особу клієнта, що підключається до брокера. Найпростіший метод — використання імені користувача та пароля. Ви можете налаштувати свій брокер Mosquitto так, щоб він вимагав облікові дані, а потім надати їх у вашому клієнті Python.
У вашому клієнті Python використовуйте метод `username_pw_set()`:
client.username_pw_set(username="myuser", password="mypassword")
client.connect(BROKER_ADDRESS, PORT, 60)
Шифрування: Захист даних під час передачі за допомогою TLS/SSL
Ім'я користувача та пароль малокорисні, якщо вони надсилаються відкритим текстом через мережу. Шифрування гарантує, що вся комунікація між клієнтом та брокером є зашифрованою та нечитабельною для будь-кого, хто прослуховує мережу. Це досягається за допомогою Transport Layer Security (TLS), тієї ж технології, що захищає веб-сайти (HTTPS).
Щоб використовувати TLS з MQTT (часто називається MQTTS), вам потрібно налаштувати брокер для його підтримки (зазвичай на порту 8883) та надати необхідні сертифікати вашому клієнту. Зазвичай це включає сертифікат Центру сертифікації (CA) для перевірки ідентичності брокера.
У Paho-MQTT ви використовуєте метод `tls_set()`:
client.tls_set(ca_certs="path/to/ca.crt")
client.connect(BROKER_ADDRESS, 8883, 60)
Авторизація: Що вам дозволено робити?
Після того, як клієнт автентифікований, авторизація визначає, що йому дозволено робити. Наприклад, датчик температури повинен мати дозвіл публікувати лише у свій власний топік (наприклад, `sensors/temp-A/data`), але не в топік, що використовується для керування заводським обладнанням (наприклад, `factory/floor-1/robot-arm/command`). Зазвичай це налаштовується на брокері за допомогою Списків контролю доступу (ACL). Ви конфігуруєте брокер правилами, які визначають, які користувачі можуть `читати` (підписуватися) або `писати` (публікувати) у певні шаблони топіків.
Збираємо все разом: Простий проєкт моніторингу розумного середовища
Створімо трохи більш реалістичний проєкт, щоб закріпити ці концепції. Ми симулюємо сенсорний пристрій, який публікує дані про навколишнє середовище як JSON-об'єкт, та застосунок моніторингу, який підписується на ці дані та відображає їх.
Огляд проєкту
- Датчик (Видавець): Скрипт на Python, який симулює зчитування температури та вологості датчиком. Він буде пакувати ці дані в JSON-пейлоад та публікувати їх у топік
smart_env/device01/telemetryкожні 5 секунд. - Монітор (Підписник): Скрипт на Python, який підписується на
smart_env/device01/telemetry, отримує дані у форматі JSON, розбирає їх та виводить зручне для користувача оновлення статусу.
Код датчика (sensor_publisher.py)
import paho.mqtt.client as mqtt
import time
import json
import random
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
client = mqtt.Client("SensorDevice01")
client.connect(BROKER_ADDRESS, PORT, 60)
client.loop_start()
print("Видавець-датчик запущено...")
try:
while True:
# Симуляція показників датчика
temperature = round(random.uniform(20.0, 30.0), 2)
humidity = round(random.uniform(40.0, 60.0), 2)
# Створення JSON-пейлоаду
payload = {
"timestamp": time.time(),
"temperature": temperature,
"humidity": humidity
}
payload_str = json.dumps(payload)
# Публікація повідомлення з QoS 1
result = client.publish(TOPIC, payload_str, qos=1)
result.wait_for_publish() # Блокування до підтвердження публікації
print(f"Опубліковано: {payload_str}")
time.sleep(5)
except KeyboardInterrupt:
print("Зупинка видавця-датчика...")
finally:
client.loop_stop()
client.disconnect()
Код панелі моніторингу (monitor_subscriber.py)
import paho.mqtt.client as mqtt
import json
import datetime
BROKER_ADDRESS = "localhost"
PORT = 1883
TOPIC = "smart_env/device01/telemetry"
def on_connect(client, userdata, flags, rc):
print(f"Підключено з кодом результату {rc}")
client.subscribe(TOPIC)
def on_message(client, userdata, msg):
print("--- Отримано нове повідомлення ---")
try:
# Декодування рядка пейлоаду та його розбір як JSON
payload = json.loads(msg.payload.decode())
timestamp = datetime.datetime.fromtimestamp(payload.get('timestamp'))
temperature = payload.get('temperature')
humidity = payload.get('humidity')
print(f"Пристрій: {msg.topic}")
print(f"Час: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"Температура: {temperature}°C")
print(f"Вологість: {humidity}%")
except json.JSONDecodeError:
print("Помилка декодування JSON.")
except Exception as e:
print(f"Сталася помилка: {e}")
client = mqtt.Client("MonitoringDashboard")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER_ADDRESS, PORT, 60)
print("Панель моніторингу запущена...")
client.loop_forever()
Від прототипу до продакшену: Найкращі практики MQTT
Перехід вашого проєкту від простого скрипту до надійної, масштабованої продакшн-системи вимагає ретельного планування. Ось деякі важливі найкращі практики:
- Розробіть чітку ієрархію топіків: Ретельно сплануйте структуру топіків з самого початку. Гарна ієрархія є описовою, масштабованою та дозволяє гнучкі підписки з використанням символів-джокерів. Поширеним шаблоном є
<об'єкт>/<зона>/<тип_пристрою>/./<вимірювання> - Витончено обробляйте роз'єднання мережі: Мережі ненадійні. Ваш клієнтський код повинен реалізовувати надійну логіку перепідключення. Функція зворотного виклику `on_disconnect` в Paho-MQTT є ідеальним місцем для цього, реалізуючи стратегію, таку як експоненційна затримка, щоб уникнути перевантаження мережі спробами перепідключення.
- Використовуйте структуровані корисні навантаження: Завжди використовуйте структурований формат даних, як-от JSON або Protocol Buffers, для ваших повідомлень. Це робить ваші дані самоописовими, версіонованими та легкими для розбору різними застосунками (написаними будь-якою мовою).
- Захищайте все за замовчуванням: Не розгортайте IoT-систему без безпеки. Як мінімум, використовуйте автентифікацію за іменем користувача/паролем та шифрування TLS. Для вищих потреб у безпеці досліджуйте автентифікацію на основі клієнтських сертифікатів.
- Моніторте свого брокера: У продакшн-середовищі ваш MQTT-брокер є критично важливою частиною інфраструктури. Використовуйте інструменти моніторингу для відстеження його стану, включаючи використання ЦП/пам'яті, кількість підключених клієнтів, швидкість передачі повідомлень та кількість втрачених повідомлень. Багато брокерів надають спеціальну ієрархію топіків `$SYS`, яка надає цю інформацію про стан.
Висновок: Ваша подорож з Python та MQTT
Ми пройшли шлях від фундаментального «чому» MQTT до практичного «як» його реалізації за допомогою Python. Ви дізналися про потужність моделі «публікація/підписка», важливість QoS та критичну роль безпеки. Ви побачили, як бібліотека Paho-MQTT робить надзвичайно простим створення складних клієнтів, які можуть публікувати дані з датчиків та підписуватися на команди.
MQTT — це більше, ніж просто протокол; це фундаментальна технологія для Інтернету речей. Його легкість та надійні функції зробили його основним вибором для мільйонів пристроїв по всьому світу, від розумних міст до підключеного сільського господарства та промислової автоматизації.
Подорож на цьому не закінчується. Наступний крок — взяти ці концепції та застосувати їх до реального обладнання. Експериментуйте з Raspberry Pi, ESP32 або іншими мікроконтролерами. Підключайте фізичні датчики, інтегруйтеся з хмарними IoT-платформами та створюйте застосунки, що взаємодіють з фізичним світом. З Python та MQTT у вас є потужний інструментарій для створення наступного покоління підключених рішень.