Блог

● 9. Протокол MQTT – простой протокол для Интернета вещей

Опубликовано: 23.01.2018

Наконец мы готовы к тому, чтобы устройства нашего "умного" дома стали устройствами Интернета вещей, что позволит получать данные с датчиков и управлять исполнительными устройствами нашего "умного дома" через интернет из любой точки мира. В качестве устройства управления удобнее всего использовать мобильный телефон. Нас интересует получение данных на телефон и управление исполнительными устройствами с телефона. Т.е. мобильный телефон выступает в качестве еще одного устройства IoT, совмещающего в себе табло для отображения данных с датчиков и пульт для управления исполнительными устройствами.
Устройства в сетях IoT взаимодействуют друг с другом по средствам различных интерфейсов и протоколов передачи данных. Рассмотрим наиболее популярный и одновременно простой протокола обмена для устройств Интернета вещей – MQTT (Message Queue Telemetry Transport).
Основные особенности протокола MQTT:

•    Асинхронный протокол;
•    Компактные сообщения;
•    Работа в условиях нестабильной связи на линии передачи данных;
•    Поддержка нескольких уровней качества обслуживания (QoS);
•    Легкая интеграция новых устройств.

Обмен сообщениями в протоколе MQTT осуществляется между клиентом (client), который может быть издателем или подписчиком (publisher/subscriber) сообщений, и брокером (broker) сообщений (например, Mosquitto MQTT). Издатель и подписчик не передают друг другу сообщения напрямую, не устанавливают прямой контакт, могут не знать о существовании друг друга. Издатель отправляет данные на MQTT брокер, указывая в сообщении определенную тему, топик (topic). Подписчики могут получать разные данные от множества издателей в зависимости от подписки на соответствующие топики.
Топики представляют собой символы с кодировкой UTF-8. Иерархическая структура топиков имеет формат "дерева", что упрощает их организацию и доступ к данным. Топики состоят из одного или нескольких уровней, которые разделены между собой символом "/".
/home/living /living-room1/temperature

Устройства MQTT используют определенные типы сообщений для взаимодействия с брокером, ниже представлены основные:

•    Connect – установить соединение с брокером
•    Disconnect – разорвать соединение с брокером
•    Publish – опубликовать данные в топик на брокере
•    Subscribe – подписаться на топик на брокере
•    Unsubscribe – отписаться от топика

Схема простого взаимодействия между подписчиком, издателем и брокером показана на рис. 9.1.
 


Рис. 9.1. Схема простого взаимодействия по протоколу MQTT.

Читать далее

● 9.1. IoT Manager - управление Умным домом через мобильное приложение

Опубликовано: 23.01.2018

IoT Manager – это мобильное приложение для телефонов и планшетов, совмещающего в себе табло для отображения данных с датчиков и пульт для управления исполнительными устройствами. Существуют версии для Android и iOS, которые можно скачать в GooglePlay и AppStore www.iotmanager.ru. Но прежде, чем скачивать приложение, определимся с брокером. В качестве брокеров выбираем сервис CloudMQTT.com (https://www.cloudmqtt.com/), в котором можно создать бесплатный аккаунт (по ссылке Control Panel). Для регистрации необходимо ввести адрес электронной почты (в качестве логина) и пароль (см. рис. 9.2).
 


Рис. 9.2. Регистрация в сервисе CloudMQTT.com.

Сразу попадаем в панель управления и создаем брокер (нажатие по кнопке +Create). Вводим название , выбираем датацентр (Европа или США), тарифный план — бесплатный Cute Cat  и сохраняем (рис. 9.3). Можно создать несколько брокеров.
 


Рис. 9.3. Регистрация брокера в сервисе CloudMQTT.com.

Теперь нажимаем на кнопку Details (см. рис. 9.4).
 


Рис. 9.4. Переход к настройкам выбранного брокера.

Попадаем в настройки (рис. 9.5). Нам необходимы следующие:

•    имя хоста m13.cloudmqtt.com;
•    порт 18274 (для скетча Arduino IDE);
•    WebSockets порт 38274 (для мобильного приложения).

Здесь же находится менеджер пользователей, где можно создать пользователей для доступа к данным брокера и назначить им права (Read, Write). В поле Topic вводим # (ко всем топикам) (см. рис. 9.6).
 


Рис. 9.5. Настройки выбранного брокера.
 


Рис. 9.6. Создание пользователей для доступа к брокеру.

Теперь можно скачать и установить мобильное приложение IoTManager. Запускаем. Необходимо произвести настройку. Нажимаем на Settings (рис. 9.7) и в появившейся форме вносим данные своего брокера (рис. 9.8):

•    MQTT hostname – m13.cloudmqtt.com;
•    MQTT Websocket port – 38274;
•    MQTT username – nodemcu1;
•    MQTT password.
 

 
Рис. 9.7. Основное меню приложения IoTManager.
 


Рис. 9.8. Окно настроек брокера.

Теперь выходим на страницу Dashboard и должны увидеть установленое соединение (рис. 9.9). Надпись No data не должна вас смущать – данные в топики еще не передавались.  
 


Рис. 9.9. Успешное подключение к брокеру.

Читать далее

● 9.2. Передача данных брокеру (тестовый пример)

Опубликовано: 23.01.2018

Для проверки работы брокера загрузим на плату NodeMcu тестовый пример, который можно скачать со страницы https://gist.github.com/4refr0nt/7d0ac08a5e530957b311. В скетч необходимо внести изменения – свои данные для точки доступа Wi-Fi, а также данные своего брокера:
const char *ssid =  "MacBook-Pro-Victor";            
const char *pass =  "*******";       
…..
String mqttServerName = "m13.cloudmqtt.com";            
int    mqttport = 18274;                                
String mqttuser =  "nodemcu1";                              
String mqttpass =  "******";                
Также необходимо установить в Arduino IDE библиотеку PubSubClient, скачать которую можно на сайте www.arduino-kit.ru по ссылке. Загружаем скетч на плату NodeMCU и открываем монитор последовательного порта, где видим отправку данных брокеру с платы (рис. 9.10).
 


Рис. 9.10. Отправка и получение данных с платы NodeMCU.

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


Рис. 9.11. Отправка и получение данных с платы NodeMCU.

Мы можем также посмотреть и список тем, на которые подписано мобильное устройство (рис. 9.12).
 


Рис. 9.12. Список тем (subscribe), на которые подписан IoTManager.

Но IoTManager не только подписан на темы, но также выступает в роли publisher – публикует данные в темы. Это значения слайдеров и статус кнопки. Эти данные плата NodeMCU, подписанная в качестве subscriber на эти темы, может использовать для управления, подключенными к плате устройствами.
Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке.
              

Читать далее

● 9.3. Публикация данных датчиков в темы брокера на примере NodeMCU

Опубликовано: 23.01.2018

9.3. Публикация данных датчиков в темы брокера на примере NodeMCU
Рассмотрим подоробнее отправку данных с датчиков нашего умного дома брокеру. Будем отправлять брокеру данные с двух датчиков DHT22 и DS18B20. Правки осуществляем в скетче из предыдущей главы. Устанавливаем количество виджетов для отображения по количеству датчиков:

const int nWidgets = 2;
String stat        [nWidgets];
String sTopic      [nWidgets];
String color       [nWidgets];
String style       [nWidgets];
String badge       [nWidgets];
String widget      [nWidgets];
String descr       [nWidgets];
String page        [nWidgets];
String thing_config[nWidgets];
String id          [nWidgets];
int    pin         [nWidgets];
float    defaultVal  [nWidgets];
bool   inverted    [nWidgets];



В процедуре initVar() прописываем настройки для виджетов, параметр page[] (вкладка(страница) в Iot Manager для отображения виджетов) устанавливаем SensorsNodemcu, параметр pin[] нам не нужен, т.к. данные датчиков мы будем получать программно, а не с пинов, тип для defaultVal[] назначаем float.

    id    [0] = "0";
  page  [0] = "SensorsNodemcu";
  descr  [0] = "DHT22";
  widget[0] = "small-badge";
  //pin   [0] = A0; 
  sTopic[0] = prefix + "/" + deviceID + "/DHT22";
  badge [0] = "\"badge\":\"badge-calm\"";                  
  style [0]   = "\"style\":\"font-size:150%;\"";

  id    [1] = "1";
  page  [1] = " SensorsNodemcu ";
  descr  [1] = "DS18b20";
  widget[1] = "small-badge";
  //pin   [1] = A0;                                          
  sTopic[1] = prefix + "/" + deviceID + "/DS18b20";
  badge [1] = "\"badge\":\"badge-calm\"";                  
  style [1]   = "\"style\":\"font-size:150%;\"";



Параметры конфигурации отображения датчиков, которые необходимо направить брокеру:

  thing_config[0] = "{\"id\":\"" + id[0] + "\",\"page\":\"" + page[0]+"\",\"descr\":\"" + descr[0] + "\",\"widget\":\"" + widget[0] + "\",\"topic\":\"" + sTopic[0] + "\"," + badge[0] + "," + style[0] + "}";  // DHT11
  thing_config[1] = "{\"id\":\"" + id[1] + "\",\"page\":\"" + page[1]+"\",\"descr\":\"" + descr[1] + "\",\"widget\":\"" + widget[1] + "\",\"topic\":\"" + sTopic[1] + "\"," + badge[1] + "," + style[1] + "}";  // ds18b20

Вносим изменения в функцию callback:

void callback(const MQTT::Publish& sub) {
  Serial.print("Get data from subscribed topic ");
  Serial.print(sub.topic());
  Serial.print(" => ");
  Serial.println(sub.payload_string());

   if (sub.topic() == sTopic[0] + "/control") {
   // DHT22
    } else if (sub.topic() == sTopic[1] + "/control") {
   // DS18B20 display only
    } else if (sub.topic() == prefix) {
      if (sub.payload_string() == "HELLO") {
        pubConfig();
      }
    }
}



Данные отправляем каждые 10 сек:

   if (client.connected()) {
      newtime = millis();
      if (newtime - oldtime > 10000) { // 10 sec
        float x = get_data_humidity();
        val = "{\"status\":\"" + String(x)+ "\"}";
        client.publish(sTopic[0] + "/status", val ); // widget 0
        x = get_data_ds18b20();
        val = "{\"status\":\"" + String(x)+ "\"}";
        client.publish(sTopic[1] + "/status", val ); // widget 1
        oldtime = newtime;
      }
      client.loop();
    }



Функции получения данных с датчиков DHT22 – get_data_humidity():

float get_data_humidity() {
   float h = dht.readHumidity();
   return h;
}

И датчика температуры DS18B20 – get_data_ds18b20():

 



Скачиваем полный скетч на сайте www.arduino-kit.ru по ссылке. Загружаем его на плату NodeMCU, открываем монитор последовательного порта и видим отправку данных с датчиков (рис. 9.13).


 
Рис. 9.13. Лог отправки в мониторе последовательного порта Arduino IDE.

И смотрим данные на смартфоне в приложении IoT Manager (рис. 9.14).
 


Рис. 9.14. Отображение даных на смартфоне в приложении IoT Manager.

Скачать данный скетч можно на сайте www.arduino-kit.ru по ссылке. Вы можете самостоятельно добавить отправку данных с датчиков  увлажненности почвы, уровня воды, огня, с датчиков газа.

Читать далее

Главное меню

Каталог

Полезные ссылки

Цена
от
до