MQTT

MQTT

Данный модуль описывает функции работы с MQTT и сделан на базе Eclipse Paho MQTT.

MQTT (Message Queue Telemetry Transport) - это стандарт ISO (ISO/IEC PRF 20922) протокола обмена сообщениями на основе публикации и подписки, предназначенный для использования поверх протокола TCP/IP. Он разработан для подключений с удаленными местоположениями, где требуется “малый объем кода” или ограниченная пропускная способность сети.

Паттерн обмена сообщениями с публикацией и подпиской требует наличия брокера сообщений. Брокер отвечает за распределение сообщений между заинтересованными клиентами на основе темы сообщения.

Для использования этого модуля нужно сделать следующее:

  1. Создайте экземпляр клиента MQTT и сохраните его в переменную.
 client = mqtt.client("100", "xxxx.xx", 1883, false)
  1. Подключитесь к брокеру:

    client:connect("","")
  2. Опубликуйте топик или подпишитесь на топик с помощью client:publish или client:subcribe.

  3. Отключитесь от брокера:

    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)