MQTT
Данный модуль описывает функции работы с MQTT и сделан на базе Eclipse Paho MQTT.
MQTT (Message Queue Telemetry Transport) - это стандарт ISO (ISO/IEC PRF 20922) протокола обмена сообщениями на основе публикации и подписки, предназначенный для использования поверх протокола TCP/IP. Он разработан для подключений с удаленными местоположениями, где требуется “малый объем кода” или ограниченная пропускная способность сети.
Паттерн обмена сообщениями с публикацией и подпиской требует наличия брокера сообщений. Брокер отвечает за распределение сообщений между заинтересованными клиентами на основе темы сообщения.
Для использования этого модуля нужно сделать следующее:
- Создайте экземпляр клиента MQTT и сохраните его в переменную.
client = mqtt.client("100", "xxxx.xx", 1883, false)
-
Подключитесь к брокеру:
client:connect("","")
-
Опубликуйте топик или подпишитесь на топик с помощью client:publish или client:subcribe.
-
Отключитесь от брокера:
client:disconnect()
client = mqtt.client(clientid, host, port, secure, [CA file, persistence, persistence path])
Создает новый экземпляр клиента MQTT.
Аргументы:
- clientid (строка): идентификатор клиента.
- host (строка): доменное имя или IP брокера.
- port (целое число): порт брокера (обычно 1883).
- secure (булево): true для безопасного общения, false для не защищенного общения.
- CA file (необязательная строка): путь к файлу CA, используется только если аргумент secure равен true.
- persistence (необязательное булево): если true, использовать постоянство, если false, не использовать постоянство.
- persistence path (необязательная строка): путь к папке файловой системы, где будут храниться данные о постоянстве. Если папка не существует, она создается при первом использовании.
Возвращает: экземпляр клиента или исключение. Вы должны сохранить этот экземпляр в переменную для дальнейших операций с ним.
-- Creates an mqtt instance. Broker domain is xxxx.xx, at port 1883
client = mqtt.client("100", "xxxx.xx", 1883, false)
-- Creates an mqtt instance, secured connection to xxxx.xx
client = mqtt.client(id, "xxxx.xx", 8883, true)
-- Creates an mqtt instance, secured connection to xxxx.xx, and checks if the MQTT Server is the expected one
client = mqtt.client(id, "xxxx.xx", 8883, true, "/path/to/certificate.pem")
-- Creates an mqtt instance, secured connection to xxxx.xx, with persistence in subfolder of the current script
client = mqtt.client(id, "xxxx.xx", 8883, true, nil, true)
-- Creates an mqtt instance, secured connection to xxxx.xx, with persistence in /sdcard
client = mqtt.client(id, "xxxx.xx", 8883, true, nil, true, "/sdcard")
instance:connect(username,password,[clean session])
Подключает экземпляр клиента к брокеру.
Аргументы:
- username (строка): имя пользователя.
- password (строка): пароль.
- clean session (необязательное булево): указывает, должна ли сессия быть очищена при подключении. Если true, сессия очищается, и не очищается, если false. Если не указано, аргумент устанавливается в значение false (не очищать сессию).
Возвращает: ничего или исключение.
-- Creates an mqtt instance. Broker domain is xxxx.xx, at port 1883
client = mqtt.client("100", "xxxx.xx", 1883, false)
-- Connect
client:connect("","")
instance:connected()
Может быть вызвана, чтобы узнать, все ли еще клиент подключен к серверу.
Аргументы: нет.
Возвращает: true или false
instance:disconnect()
Отключает экземпляр клиента от брокера.
Аргументы: нет.
Возвращает: ничего или исключение.
-- Creates an mqtt instance. Broker domain is xxxx.xx, at port 1883
client = mqtt.client("100", "xxxx.xx", 1883, false)
-- Connect
client:connect("","")
...
...
-- Disconnect
client:disconnect()
client:publish(topic, payload, qos, [retained])
Публикует сообщение в топике.
Аргументы:
- topic (строка): название топика.
- payload (строка): нагрузка, строка с информацией для публикации, упакованной в нее.
- qos (целое число): качество обслуживания, согласно спецификациям MQTT, может быть либо mqtt.QOS0, mqtt.QOS1 или mqtt.QOS2. Для использования mqtt.QOS1 или mqtt.QOS2 вы должны включить постоянство при вызове функции mqtt.client.
- retained (необязательное булево): флаг сохранения сообщения. Если true, флаг сохранения устанавливается, если false - флаг сохранения сбрасывается. Если не указан, значение по умолчанию для этого аргумента - false (не сохранять).
Возвращает: ничего или исключение
-- Creates an mqtt instance. Broker domain is xxxx.xx, at port 1883
client = mqtt.client("100", "xxxx.xx", 1883, false)
-- Connect
client:connect("","")
-- Publish to topic
client:publish("/100", "hello", mqtt.QOS0)
client:subscribe(topic, qos, callback)
Подписаться на топик.
Аргументы:
- topic (строка): название топика. Название топика может содержать символы подстановки:
Символ ‘#’ представляет полное поддерево иерархии и поэтому должен быть последним символом в названии топика, например, SENSOR/#. Это будет соответствовать любому топику, начинающемуся с SENSOR/, такому как SENSOR/1/TEMP и SENSOR/2/HUMIDITY.
Символ ‘+’ представляет один уровень иерархии и используется между разделителями. Например, SENSOR/+/TEMP соответствует SENSOR/1/TEMP и SENSOR/2/TEMP.
-
qos (целое число): качество обслуживания, согласно спецификациям MQTT, может быть либо mqtt.QOS0, mqtt.QOS1, или mqtt.QOS2.
-
callback (функция): функция обратного вызова, срабатывает, когда сообщение получено по топику. Эта функция принимает следующие аргументы:
- len (целое число): длина полученного сообщения.
- message (строка): полученное сообщение.
- topic len (целое число): длина топика, в котором было получено сообщение.
- topic name (строка): название топика, в котором было получено сообщение.
Возвращает: ничего или исключение
-- Creates an mqtt instance. Broker domain is xxxx.xx, at port 1883
client = mqtt.client("100", "xxxx.xx", 1883, false)
-- Connect
client:connect("","")
-- Subscribe to topic
client:subscribe("/100", mqtt.QOS0, function(len, message, topic_len, topic_name)
print("new message received on topic "..topic_name.." (length: "..topic_len..")")
print("message length: "..len)
print("message: "..message)
end)