Статьи

Учебное пособие по протоколу IoT MQTT: управление удаленными периферийными устройствами в проекте IoT

В руководстве по протоколу IoT MQTT описывается управление удаленным периферийным устройством. Мы уже рассмотрели протокол MQTT и его работу, и мы уже знаем, что IoT MQTT используется для отправки данных с удаленных датчиков. Коротко говоря, MQTT — это легкий протокол, используемый в телеметрии. Некоторые платформы IoT поддерживают MQTT для обмена данными с удаленными платами IoT и датчиками. Обычно платы IoT используют MQTT для подключения к платформам IoT, которые получают информацию.

Описание Проекта

В этом проекте мы используем MQTT другим способом или, другими словами, мы хотим управлять платой IoT (например, MKR1000), используя MQTT. Целью этого проекта является дистанционное управление матрицей RGB Led с использованием MQTT.
Для создания этого проекта мы будем использовать:

  • Arduino MKR1000
  • Матрица со светодиодом 4 × 4 RGB

MKR1000 подключится к облачной платформе Ubidots с помощью MQTT. Этот проект делится на два этапа:

  1. Сконфигурируйте Ubidots для обработки цветовых компонентов RGB с помощью веб-интерфейса.
  2. Разработайте MQTT-клиент для подключения к Ubidots и управления RGB Led Matrix.

В конце этого проекта мы дистанционно управляем светодиодной матрицей RGB с помощью веб-интерфейса Ubidots.

Настройте плату IoT

На этом первом шаге мы настроим интерфейс Ubidots для обработки трех цветовых компонентов. Мы будем использовать ползунки для управления ими. Начнем. Прежде чем продолжить, вы должны создать бесплатную учетную запись по этой ссылке . Войдите в приложение и нажмите « Устройство», чтобы создать новое устройство.

Мы использовали RGB Controller в качестве имени устройства. Устройство действует как контейнер данных, где мы можем сгруппировать переменные, которые хранят обмен данными. Как только устройство будет готово, мы можем начать добавлять новую переменную:

Мы создаем три переменные с именем:

  • красный цвет
  • зеленого цвета
  • Синий цвет

Теперь пришло время создать панель управления, которую мы будем использовать для управления этими значениями переменных. Перейти к панели инструментов и нажмите кнопку Добавить. Дайте имя своей панели и начните добавлять элементы управления. В этом проекте мы добавляем ползунки, поэтому нажмите на добавить новый виджет, а затем на ползунок:

Выберите устройство (или источник данных), ранее настроенный:

Выберите контроллер RGB, и вы увидите три переменные:

Выберите один из них и повторите процесс для всех трех переменных. В конце у вас будет панель инструментов, которая выглядит следующим образом:

Как реализовать клиент для обработки протокола IoT MQTT

После настройки платформы IoT мы можем сосредоточить свое внимание на клиенте IoT MQTT. Этот клиент получает данные с платформы и управляет матрицей RGB Led. Для создания клиента мы используем следующие библиотеки:

  • Adafruit Neomatrix
  • MQTT Client (вы можете скачать его из Arduino Library Manager)

Первым шагом инициализируется Neomatrix, предоставляя набор информации, такой как ширина и высота матрицы и номер контакта. В нашем случае матрица RGB Led подключается с помощью MKR PIN 5.

1
2
3
4
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(4, 4, 5,
                           NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
                           NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
                          NEO_GRB + NEO_KHZ800);

Обратите внимание, что первые три параметра представляют количество светодиодов в строке и столбце. Используя экземпляр matrix мы можем раскрасить матрицу.

Давайте реализуем MQTT-клиент. Этот проект использует MKR1000, поэтому подключение WIFI:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
WiFiClient net;
MQTTClient mqttClient;
 
void setup() {
  Serial.begin(115000); 
  Serial.println("Configuring the net...");
  WiFi.begin("your WiFi SID", "your WiFi password");
 
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println("Begin...");
  mqttClient.begin("mqtt://things.ubidots.com", net);
  matrix.begin();
  connect();
}

В методе setup() мы просто инициализируем соединение WiFi и mqttClient . Чтобы инициализировать клиент mqtt, мы должны установить сервер MQTT (адрес сервера Ubidots) и net .
Метод connect() обрабатывает соединение и подписку на тему MQTT . Согласно документации Ubidots , каждая переменная, определенная в источнике данных (он же устройство), имеет свою тему:

1
/v1.6/devices/_device_name/_variable_name/lv

Обратите внимание, что lv в конце темы обозначает последнее значение . Другими словами, нас интересует только последнее значение переменной для управления светодиодной матрицей RGB. В этом проекте приложение должно подписаться на следующие темы:

1
/v1.6/devices/RGBController/redColor/lv
1
/v1.6/devices/RGBController/greenColor/lv
1
/v1.6/devices/RGBController/blueColor/lv

Итак, метод connect() :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
void connect() {
  Serial.println("Connecting to MQTT....");
  if (mqttClient.connect("YOUR_UNIQUE_ID", "YOUR_UBIDOTS_TOKEN", "")) {
    Serial.println("MQTT client connected");
    int result = mqttClient.subscribe("/v1.6/devices/RGBController/redColor/lv");
    Serial.println(result);
    Serial.println("Subscribed red topic.");
    int result1 = mqttClient.subscribe("/v1.6/devices/RGBController/greenColor/lv");
    Serial.println(result1);
    Serial.println("Subscribed green topic.");
    int result2 = mqttClient.subscribe("/v1.6/devices/RGBController/blueColor/lv");
    Serial.println(result1);
    Serial.println("Subscribed blue topic.");
  }
  else {
    Serial.println("######### Client not connected ########");
  }
}

После того как приложение подключено к серверу MQTT и подписано на переменные темы, мы должны реализовать метод, который прослушивает значения, поступающие с сервера MQTT. Для этого нам нужно реализовать метод с именем messageReceived(String topic, String payload, char * bytes, unsigned int length) . В этом методе приложение должно выполнить следующие задачи:

  • определить тему, которая содержит сообщение
  • преобразовать сообщение в значение компонента цвета
  • управлять матрицей RGB LED, устанавливая новый цвет

Это реализация метода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  
  if (topic.indexOf("redColor") >= 0) {
    red = atoi(bytes);
  }
  else if (topic.indexOf("greenColor") >= 0) {
    green = atoi(bytes);
  }
   else if (topic.indexOf("blueColor") >= 0) {
    blue = atoi(bytes);
  }
  matrix.fillScreen(matrix.Color(red,green,blue));
  matrix.show();
}

Это все. В последних двух строках метода мы используем экземпляр matrix чтобы заполнить светодиодную матрицу RGB цветом, обозначенным красным, зеленым, синим компонентом, и покажем его.

Вывод

Надеемся, что в конце этой статьи вы узнали о протоколе IoT MQTT и о том, как его использовать для управления удаленным периферийным устройством.