1 of 39

Вступ до інтернету речей з NodeMCU. Воркшоп 3.�

2 of 39

Посилання

  • Відео:

https://www.youtube.com/watch?v=3q4kttm8sx4

  • Презентація:

https://goo.gl/ZujD07

3 of 39

Попередні воркшопи

  • Воркшоп 1:

https://goo.gl/QoHy79

  • Воркшоп 2:

https://goo.gl/kDZU9s

4 of 39

План

  • Переведення ESP8266 в режим глибокого сну;
  • MQTT протокол для спілкування IoT пристроїв через Internet;
  • MQTT клієнт для ESP8266;
  • Використання тестового MQTT сервера (брокера);
  • Керування NodeMCU з браузерного MQTT клієнта;
  • Обмін даними між кількома NodeMCU через MQTT;
  • Встановлення власного MQTT брокера Mosquitto;

5 of 39

Енергоспоживання ESP8266

6 of 39

Енергоспоживання ESP8266

7 of 39

Режими сну ESP8266

  • Modem Sleep. Працює лише коли ESP8266 знаходиться в режимі STATION і підключений до WiFi роутера (не Access Point). Процесор і периферія працює, однак передача по WiFi відбувається через значні проміжки часу (100мс - 1с) через механізм DTIM beacon. Більшу частину часу WiFi модем вимкнутий, однак з’єднання з роутером підтримується.

8 of 39

Режими сну ESP8266

  • Light Sleep. Схожий на Modem sleep, однак в режимі пауз вимикається процесор і периферія. З певною періодичністю процесор виходить з Light Sleep обмінюється невеликими пакетами даних з роутером та повертається назад в Light Sleep. Може бути виведений з режиму відключення сигналом на GPIO.

9 of 39

Режими сну ESP8266

  • Deep Sleep. Повністю відключається WiFi, процесор та периферія. Найменше енергоспоживання. Працює лише вбудований RTC. Модуль можна вивести з Deep Sleep подачею імпульсу на ресет. Через проміжок часу, заданий при вході в Deep Sleep, RTC зформує імпульс на виході GPIO16. Якщо з’єднати цей пін з ресетом, можливий вихід з Deep Sleep через заданий інтервал часу. Після виходу з Deep Sleep прошивка запускається немов після ресету.

10 of 39

Режими сну ESP8266

11 of 39

Приклад переведення ESP8266 в режим Deep Sleep

  • З’єднайте пін GPIO16 (D0 на NodeMCU) з RST;
  • Підключіть світлодіод до піна D1;
  • Переведення NodeMCU в режим Deep Sleep відбувається за допомогою функції ESP.deepSleep([microseconds], [mode]);

12 of 39

Переведення ESP8266 в Deep Sleep

  • Завантажте скетч в NodeMCU:

13 of 39

Переведення ESP8266 в Deep Sleep

  • В моніторі послідовного порта можна спостерігати наступне:

14 of 39

Переведення ESP8266 в Deep Sleep

  • За допомогою мультиметру виміряйте струм споживання NodeMCU в режимі Deep Sleep;
  • Зверніть увагу, що цей струм досить великий, оскільки на платі встановлено лінійний стабілізатор, що споживає відносно багато струму;

15 of 39

Переведення ESP8266 в Deep Sleep

  • Клас Ticker дозволяє викликати функцію з певною періодичністю;
  • Більш детальна інформація:

https://github.com/esp8266/Arduino/blob/master/libraries/Ticker/Ticker.h

16 of 39

Протокол MQTT

  • Протокол обміну текстовими повідомленнями для пристроїв інтернету речей (зараз це відкритий стандарт);
  • Потребує мало коду і обчислювальних ресурсів для реалізації (може бути реалізований на найпростіших мікроконтроллерах);
  • реалізована гарантована доставка повідомлень;
  • Клієнт-серверна архітектура;
  • Обмін даними за принципом publish/subscribe;
  • Можлива передача даних у зашифрованому вигляді;

17 of 39

Протокол MQTT

  • Більш детальна інформація по MQTT:

http://goo.gl/2L3M32 (дуже крута підбірка статей по всім аспектам MQTT)

http://goo.gl/XCGshB

http://goo.gl/avpuYO (гарний опис основних моментів російською мовою)

http://goo.gl/GmOh1e (більш детальний опис російською 1)

http://goo.gl/wSIw0W (більш детальний опис російською 2)

18 of 39

Протокол MQTT

  • В MQTT пристрої є клієнтами, що підключаються до сервера (брокера) через TCP з’єднання (кожен клієнт має унікальний ідентифікатор);
  • В MQTT обмін даними відбувається через передачу повідомлень (messages);
  • З кожним повідомленням пов’язана адреса (topic). Ця адреса є ієрархічною строкою, наприклад, “room1/north_wall/temperature” (детальніше про топіки: http://goo.gl/bJ7GwX);
  • Клієнти можуть підписуватись на довільну кількість адрес (топіків);

19 of 39

Протокол MQTT

  • Кожен клієнт підписаний на топік одержує всі повідомлення, що передаються в цей топік іншими пристроями;
  • Будь-який пристрій може передати на сервер повідомлення пов’язане з певним топіком і сервер перешле це повідомлення всім пристроям, які підписані на даний топік;

20 of 39

Протокол MQTT

  • Розглянемо просту мережу з трьома клієнтами (пристроями Інтернету Речей) та MQTT сервером (брокером);
  • Всі клієнти підключаються до сервера за допомогою TCP з’єднання;
  • Клієнти B та C підписуються на топік “temperature”;

21 of 39

Протокол MQTT

  • Трохи пізніше клієнт С передає текстове значення “22.5” в топік “temperature”;
  • Брокер перенаправляє це повідомлення всім клієнтам, що підписані на топік “temperature”;

22 of 39

Протокол MQTT

  • За допомогою MQTT можна утворювати з’єдання типу один-до-одного, один-до-багатьох, багато-до-одного;

23 of 39

Можливості підписування на топіки

  • Кожен клієнт може підписатися на будь-який конкретний топік, наприклад на топік “room1/north_wall/temperature” ;
  • Однак можна підписатися одразу на багато топіків в ієрархії назв;

24 of 39

Можливості підписування на топіки

  • З використанням символу “+” можна підписатися на всі топіки, в яких один з рівнів ієрархії може бути довільним (мати будь-яке ім’я).
  • Наприклад, використаємо подібний шаблон при підписці (subscribe):

  • Замість символу “+” може бути будь-яке текстове ім’я рівня;
  • Це дозволить підписатися лише на топіки відмічені зеленою галочкою:

25 of 39

Можливості підписування на топіки

  • Символ “#” дозволяє підписатися на всі топіки, у яких присутня певна початкова частина;
  • Наприклад, використаємо подібний шаблон при підписці (subscribe):

  • Це дозволить підписатися лише на топіки відмічені зеленою галочкою:

26 of 39

Якість обслуговування

  • Існує три рівні якості обслуговування (Quality of Service, QoS), які дозволяють визначити гарантоване доставлення повідомлень до брокеру під час процедури публікації повідомлень клієнтом.
  • Детально про QoS в MQTT:

http://goo.gl/t68igS

27 of 39

Якість обслуговування

  • QoS0. Передав і забув. Доставка в такому випадку забезпечується засобами протоколу TCP. Клієнт не зберігає повідомлення після відправки брокеру. Брокер не надсилає підтвердження про прийом. Доставка даних не гарантована. Менше навантаження на клієнт.

28 of 39

Якість обслуговування

  • QoS1. Гарантована доставка повідомлень брокеру. Після прийому повідомлення брокер надсилає підтвердження клієнту. Якщо клієнт не отримує підтвердження протягом таймауту, надсилає повідомлення повторно. Доки підтвердження не надійшло до клієнта, він зберігає повідомлення у себе. Збільшується навантаження на клієнт.

29 of 39

Якість обслуговування

  • QoS2. Гарантована доставка повідомлень брокеру. Аналогічно до QoS1, однак в цьому випадку брокер гарантовано отримує лише одне повідомлення (при QoS1 теоретично можливе отримання дублікатів). Більш складна взаємодія клієнта з брокером ніж у випадку QoS1. Потребує для реалізації більше ресурсів ніж QoS1.

30 of 39

Якість обслуговування

  • Порівняння навантаження на клієнт в плані енергоспоживання для різних рівнів QoS:

31 of 39

Retained повідомлення

  • Є можливість передавати повідомлення брокеру з флагом Retain. В такому випадку повідомлення зберігається у брокері до отримання наступного retained повідомлення і передається кожному клієнту, який щойно підключився до брокеру та підписався на топік, у який передане retained повідомлення. Кожне наступне retained повідомлення перезаписує попереднє. Для видалення retained повідомлення, необхідно надіслати у топік порожнє retained повідомлення. Retained повідомлення зручно використовувати, коли клієнт рідко публікує дані (раз в кілька годин). В такому випадку, як тільки будь-який інший клієнт підпишеться на подібний топік, він одразу одержить останні валідні дані, не чекаючи наступної публікації.
  • Детальніше про retained повідомлення:

http://goo.gl/NY9Q6Y

32 of 39

MQTT брокер

  • В наступному прикладі ми будемо використовувати тестовий MQTT брокер за адресою broker.mqtt-dashboard.com (порт 1883);
  • А трохи пізніше встановимо власний брокер Mosquitto на Windows (також існують реалізації Mosquitto для мікрокомп'ютерів, наприклад, Raspberry Pi): http://mosquitto.org/download/
  • Можна використовувати інший тестовий брокер:

https://github.com/mqtt/mqtt.github.io/wiki/public_brokers

33 of 39

Порти для підключення до MQTT брокера

Для підключення до MQTT брокера клієнт використовує наступні номера портів (найбільш типові значення):

  • 1883 -- передача даних через незахищене TCP з’єднання;
  • 8883 -- передача даних через захищене TLS/SSL TCP з’єднання;
  • 8000 -- передача даних через незахищене WebSockets з’єднання;

34 of 39

MQTT клієнт для ESP8266

  • Завантажте та встановіть бібліотеку MQTT клієнту для Arduino IDE:

https://github.com/knolleary/pubsubclient

  • Детальний опис методів клієнту:

http://pubsubclient.knolleary.net/api.html

35 of 39

Браузерний MQTT клієнт

  • Для обміну по протоколу MQTT з NodeMCU будемо використовувати браузерний MQTT клієнт:

http://www.hivemq.com/demos/websocket-client

або

http://www.hivemq.com/blog/seven-best-mqtt-client-tools

36 of 39

Обмін даними з NodeMCU через MQTT

  • Вихідний код: https://goo.gl/dP9iCD

37 of 39

Обмін даними з NodeMCU через MQTT

  • Зробіть імена топіків "/elconf/outTopic" та "/elconf/inTopic" унікальними, дописавши в кінець якесь число, наприклад "/elconf/outTopic3456";
  • Скомпілюйте та завантажте приклад в NodeMCU;
  • Відкрийте браузерний MQTT клієнт http://www.hivemq.com/demos/websocket-client та підключіться до брокеру broker.mqttdashboard.com через WebSockets з’єднання (8000 port);
  • Підпишіться на топік /elconf/outTopic3456 і матимете змогу одержувати повідомлення від NodeMCU;
  • Спробуйте надсилати повідомлення у топік /elconf/inTopic на який підписана ваша NodeMCU та перегляньте одержані повідомлення в моніторі послідовного порту NodeMCU;

38 of 39

Обмін даними між кількома NodeMCU через MQTT

  • Спробуйте підключити різні датчики/актуатори до різних NodeMCU та обмінюватись між ними командами по MQTT;
  • Спробуйте вимірювати температуру на одному пристрої, та виводити її на OLED дисплей другого пристрою, детектувати рух на третьому пристрої та засвічувати після кожного руху лампочку четвертим пристроєм, тощо.

39 of 39

Встановлення власного MQTT брокера Mosquitto