INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

Взаимодействие с MQTT из Python

№ 8455 В разделах: Electronics Programming от September 8th, 2017,
В подшивках: , ,

Так уж случилось, что я стал крутым пацаном и начал делать интернет вещей 😀 В общем, для начала необходимо установить модуль paho-mqtt. А еще лучше сначала сделать виртуальное окружение и уже потом туда установить всё нужное.

sudo apt install python3-venv
cd /opt && pyvenv mymqtt
source mymqtt/bin/activate
pip install wheel
pip install paho-mqtt

Ну вот вроде и всё. Теперь можно приступать к работе 🙂 Открываем документацию и читаем. На этом запись можно заканчивать, но я всё-таки покажу вам пару примеров. Я люблю разносить все в разные файлы поэтому некоторые вещи будут работать через библиотеки в поддиректориях.

Итак, я создал директорию с проектом, где есть поддиректория libs и именно в нее я положу свою библиотечку для работы с mqtt.

import sys 
sys.path.append("..")

import paho.mqtt.subscribe as subscribe
import paho.mqtt.publish as publish
import config

def pub(topic, msg, retained=False):
    print("Connecting {}".format(config.mqtt_cred["hostname"]))
    publish.single(topic,msg,hostname=config.mqtt_cred["hostname"],
        port=config.mqtt_cred["port"],auth=config.mqtt_cred["auth"],retain=retained)

def sub(callback_function, topic, wait=False):
    subscribe.callback(callback_function, topic, hostname=config.mqtt_cred["hostname"],
        port=config.mqtt_cred["port"],auth=config.mqtt_cred["auth"])

Сразу же заметна вторая строка. Прикол в том, что у меня на уровне выше лежит конфигурационный файл и я просто добавил в PYTHON_PATH его местоположение. В функции sub я сделал передачу callback функции через параметры, а сама функция описана в файле основной программы. Конечно, я мог ее написать прямо тут, но тогда бы я считал это говнокодом 🙂

Теперь можно поугарать в файле основной программы

from libs import libmqtt

def any_message_received(client, userdata, message):
    '''Callback function on_message, catch any message and process it'''
    topic=message.topic
    value = message.payload.decode("utf-8")
    print(topic, value)
libmqtt.sub(any_message_received, "#")

any_message_received и есть та самая callback функция. На нее я возложил парсинг всего, что приходит из шины. Муторно, но зато делает то, что мне нужно 🙂

А теперь вишенка! Конфиг

'''Config module'''

mqtt_cred={
    "hostname": "myserver",
    "port": 5883,
    "auth": {"username":"mymqtt","password":"longlongpen1s"}
    }

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа

Микроблог перейти


🇷🇺 © Vladimir Smagin, 2005-2023. Копирование материалов без разрешения запрещено. GPG *
Яндекс.Метрика

Fortune cookie: -- I love KATRINKA because she drives a PONTIAC. We're going away now. I fed the cat.