Подключайте любые устройства к плохим сетям.
Если вы раньше работали с 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
. Все необходимые параметры будут зависеть от брокера, которого вы используете.
В этот момент вы также устанавливаете обратные вызовы, которые хотите обработать. Мы собираемся установить три обратных вызова:
OnConnect
: когда клиент подключен к серверу.OnConnectionLost
: когда клиент отключен от сервера.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 - идеальный протокол для этого.