Подключайте любые устройства к плохим сетям.

Если вы раньше работали с IoT, скорее всего, вы слышали или даже работали с MQTT. Когда мы говорим об обмене сообщениями между удаленными устройствами, это один из первых протоколов, который приходит на ум.

Протокол был изобретен в 1999 году Энди Стэнфорд-Кларком и Арленом Ниппером для соединения нефтепроводов через спутник. Поскольку пропускная способность удаленных сетей могла быть не такой хорошей (особенно в те времена), требовался легкий протокол с минимальными накладными расходами.

Согласно спецификации MQTT:

MQTT - это транспортный протокол обмена сообщениями публикации / подписки на клиентском сервере. Он легкий, открытый, простой и сконструирован таким образом, чтобы его было легко реализовать. Эти характеристики делают его идеальным для использования во многих ситуациях, в том числе в ограниченных средах, например, для связи в контекстах «машина-машина» (M2M) и Интернета вещей (IoT), где требуется небольшой объем кода и / или пропускная способность сети очень высока.

Протокол MQTT преследует следующие цели:

  • Эффективность: клиенты обычно очень маленькие и у них не так много ресурсов.
  • Облегченный: заголовок сообщения небольшой для оптимизации пропускной способности сети.
  • Надежная доставка: устройства должны убедиться, что сообщение было доставлено.
  • Двунаправленный: и клиент, и сервер могут отправлять сообщения.
  • Независимость от данных: не имеет значения формат отправляемого сообщения.
  • Сеанс: многие устройства Интернета вещей подключаются через ненадежные сети, поэтому важно сократить время на повторное подключение клиента.
  • Безопасность: с помощью TLS легко зашифровать сообщения.

Архитектура

MQTT - это протокол публикация-подписка. То есть клиент отправляет сообщение (или публикует его), не зная напрямую, кто получит сообщение, если кто-либо. Таким же образом другой клиент может получать сообщения (или подписываться), не зная, какое устройство его отправило.

Для этого должен существовать сервер (или брокер), который будет управлять всем соединением и сообщать, какое сообщение будет отправлено каждому подписчику.

Таким образом, для отправки или получения сообщений издателям и подписчикам необходимо знать только адрес брокера. Еще одно преимущество состоит в том, что брокер может доставить сообщение клиенту, который не был в сети на момент публикации.

Go Client

Давайте создадим простое приложение на Go для отправки и получения сообщений с помощью MQTT.

Примечание. В этом руководстве использовалась версия Go 1.15.8 linux / amd64.

Он использует paho.mqtt.golang как клиентскую библиотеку MQTT, поэтому установите ее:

go get github.com/eclipse/paho.mqtt.golang

Для тестирования нашего приложения нам понадобится сервер. У вас есть два варианта:

  • Установите свой, используя, например, Москитто.
  • Или используйте публичный сервер. Вы можете найти список общедоступных серверов, доступных здесь. Помните, что не следует отправлять конфиденциальные данные, если вы используете общедоступный сервер.

Примечание: в этом руководстве я использую общедоступный сервер test.mosquitto.

Первый шаг - определить параметры клиента, такие как брокер, порт, идентификатор клиента, имя пользователя и т. Д. Это делается через mqtt.NewClientOptions. Все необходимые параметры будут зависеть от брокера, которого вы используете.

В этот момент вы также устанавливаете обратные вызовы, которые хотите обработать. Мы собираемся установить три обратных вызова:

  1. OnConnect: когда клиент подключен к серверу.
  2. OnConnectionLost: когда клиент отключен от сервера.
  3. MessageHandler: когда сообщение получено с сервера.

После того, как вся конфигурация установлена, мы вызываем mqtt.NewClient с созданными параметрами.

Для подключения просто позвоните client.Connect(). Процесс подключения выполняется в фоновом режиме, поэтому нам нужно подождать и убедиться, что ошибки нет.

Подписка

Клиент может подписаться на тему в брокере. Клиент получит только сообщения, отправленные в эту тему.

Чтобы подписаться, вызовите метод client.Subscribe с тремя параметрами:

  • topic: строка с темой для подписки.
  • qos: качество обслуживания. Он должен быть 0 (не более одного раза), 1 (хотя бы один раз) или 2 (ровно один).
  • callback: функция, вызываемая при получении сообщения в этой теме. Это может быть nil, поэтому будет вызываться только обработчик по умолчанию.

Публиковать

Для отправки сообщения (публикации) нам нужно использовать метод client.Publish. Он получает четыре параметра:

  • topic: строка с темой для публикации.
  • qos: качество обслуживания (те же значения, что и Subscribe).
  • retained: логическое значение, указывающее, должно ли сообщение оставаться на сервере. Это true, последнее сообщение темы будет отправляться каждому новому подписчику.
  • payload: собственно сообщение.

Сильфон - это полный код, который подписывается на тему и публикует в ней 10 сообщений.

После его запуска вы должны получить такой результат.

Шифрование

Некоторые брокеры используют TLS для повышения безопасности. Нам нужно создать tls.Config с сертификатами, которые требует сервер.

И добавляем эту конфигурацию в опции методом SetTLSConfig. Полный код приведен ниже.

Примечание: для тестового сервера mosquitto нам нужен его сертификат, чтобы иметь возможность подключаться к серверу. Вы можете скачать это здесь".

Заключение

Протокол MQTT очень простой, но мощный. С помощью нескольких строк кода вы можете реализовать клиента и начать его использовать.

Если вам нужно отправить данные на устройства с ограниченными ресурсами, MQTT - идеальный протокол для этого.