# Интернет вещей
> Интернет вещей (Internet of Things, IoT) – концепция вычислительной сети физических предметов,
> оснащённых встроенными технологиями для взаимодействия друг с другом или с внешней средой,
> рассматривающая организацию таких сетей как явление, способное перестроить экономические и общественные процессы,
> исключающее из части действий и операций необходимость участия человека.
> [ [Wikipedia] ](https://ru.wikipedia.org/wiki/Интернет_вещей)
## Концепция связи
Итак, все наши устройства должны иметь возможность объединяться в сеть и взаимодействовать друг с другом, то есть использовать какой-то протокол и технологию связи.
Давайте посмотрим на наиболее часто используемые технологии связи в сфере IoT.
| Параметр | LoRa | NB-IoT | BLE | Wi-Fi |
|:-------------------|:--------:|:------:|:------:|:------:|
| Работа без шлюза | - | - | - | + |
| Высокая скорость | - | - | - | + |
| Mesh-топология | + | - | + | + |
| Низкая стоимость | +/- | - | +/- | + |
| Безопасность | - | + | + | + |
| Дальность связи | + | + | - | +/- |
| Распространенность | - | - | + | + |
Глядя на эту таблицу, Wi-Fi выглядит бесспорным лидером, но это лидерство обманчиво!
Всё же дальность связи Wi-Fi не так высока, а потребление энергии очень велико.
Когда мы говорим об Интернете вещей, то каждая «вещь» не обязана быть привязанной к розетке,
а значит должна обладать автономным питанием. И в этом случае Wi-Fi явно проигрывает.
Для «Умного дома» Wi-Fi ещё сгодится, но если представить, что датчики и исполнительные механизмы
расположены на площади в несколько гектаров, то здесь уже без батареи точно не обойтись.
А ещё потребуются повторители сигналов, которым также нужна энергия.
LoRa потребляет мало энергии и может передавать данные на расстояние в несколько километров.
С другой стороны, если вы хотите использовать LoRA, ZigBee, NB-IoT или что-то другое с «умным» названием, вам всегда понадобится шлюз.
Шлюз – это чёрный ящик с радиомодулем внутри, который преобразует сигналы датчиков в сигналы, которые может понять ваша домашняя сеть (пакеты TCP/IP).
Для нашей работы мы должны что-то выбрать.
LoRa, BLE и ZigBee пока не так распространены, их чипы стоят дорого (9-10 долларов каждый), а модули Wi-Fi – значительно дешевле (около 2 долларов).
Более того, мы фактически будем создавать один из элементов умного дома, а раз так, то можно смело отказаться батарейного питания.
**Мы не будем экономить – мы будем использовать Wi-Fi!**
## Оборудование
### WeMos D1 mini
В нашей лаборатории имеются платы [WeMos D1 mini](https://docs.wemos.cc/en/latest/d1/).
Абсолютно не важно, какую версию платы мы будем использовать – самой последней третьей версии или предыдущей:
![WeMos D1 mini](/assets/images/iot/wemos_mini_1+1.png "WeMos D1 mini")
WeMos D1 mini построена на базе 32-разрядного микроконтроллера ESP8266 с интегрированным Wi-Fi модулем (802.11 b/g/n 2.4 ГГц).
Он входит в сборку ESP-12F, установленную на плате (в версиях v.1, v.2) или расположен непосредственно на самой плате (в версии v.3).
Так же на плате присутствуют: стабилизатор напряжения на 3.3 В, разъем Micro-USB и USB-UART преобразователь на базе чипа CH340G.
Микроконтроллер ESP8266 работает на тактовой частоте 80 МГц и обладает оперативной памятью RAM данных на 80 КБ (для хранения значений переменных)
и памятью RAM инструкций на 32 КБ. Программы хранятся во flash памяти объёмом 4 МБ. На плате доступно 11 цифровых портов ввода-вывода (GPIO) и
один аналоговый вход (с максимально допустимым уровнем входного напряжения 3.3 В).
В принципе, все выводы на плате обозначены, но, тем не менее, приведём диаграмму их расположения, поясняющую их назначение (вдруг кому-то из вас захочется сделать что-то самостоятельно).
![WeMos D1 mini (pinout)](/assets/images/iot/wemos_pinout.png "WeMos D1 mini pinout")
Используя платы WeMos можно достаточно легко осуществить подключение к сети Wi-Fi.
Преимуществом платы является возможность сохранения соединения при низком потреблении энергии (1 мА), благодаря этому можно делать различные приборы, которые будут работать от батареек.
Программирование платы осуществляется с помощью стандартной среды разработки [Arduino IDE](https://arduino.cc/).
### NodeMCU
Ещё один вариант – использовать отладочную плату [Node MCU](http://www.nodemcu.com/index_en.html)
![NodeMCU](/assets/images/iot/nodemcu.png "NodeMCU")
Эта плата строится на базе всё того же модуля ESP8266 и имеет сходные технические характеристики,
разве что количество портов ввода-вывода на ней увеличено до 17. И ещё USB-UART преобразователь устанавливается либо на базе чипа CH340G, либо на базе чипа CP2102 (что для наших задач вообще не принципиально).
Диаграмма расположения выводов для платы NodeMCU приведена ниже
![NodeMCU (pinout)](/assets/images/iot/nodemcu-pinout.png "NodeMCU pinout")
## Протокол MQTT
Интернет работает на сотнях различных протоколов: HTTP, FTP, SMTP, POP3, SSH и т.д. и т.д.
Какой же протокл наиболее предпочтительно использовать для Интернета вещей?
Наиболее распространенными являются HTTP RESTful, CoAP и MQTT.
Каким же требованиям должен удовлетворять протокол, предназначенный для Интернета вещей?
С точки зрения безопасности было бы лучше, если бы связь устанавливалась по инициативе устройства, а не сервера.
Такая модель предотвращает возможные атаки – если злоумышленник взломает сервер, то это не окажет негативного воздействия на конечное устройство,
так как в этой модели устройство не может управляться входящим запросом.
Далее, датчики в Интернете вещей, как правило, автономны. Они работают от батареи – вот почему размер передаваемого пакета данных должен быть
как можно меньше. Чем меньше времени тратится на приём/передачу, тем меньше энергопотребление.
HTTP RESTful и CoAP являются документно-ориентированными протоколами, поэтому они имеют большие издержки, а протокол MQTT – нет.
> MQTT (англ. message queuing telemetry transport) – упрощённый сетевой протокол, работающий поверх TCP/IP,
> ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик.
> Протокол ориентируется на простоту в использовании, невысокую нагрузку на каналы связи, работу в условиях постоянной потери связи,
> лёгкую встраиваемость в любую систему. Основное предназначение – работа с телеметрией от различных датчиков, устройств,
> использование шаблона подписчика обеспечивает возможность устройствам выходить на связь и публиковать сообщения,
> которые не были заранее известны или предопределены, в частности, протокол не вводит ограничений на формат передаваемых данных.
> [ [Wikipedia] ](https://ru.wikipedia.org/wiki/MQTT)
Протокол MQTT был разработан в 1999 году фирмой IBM для обмена данными между компьютерами (M2M).
Этот протокол хорош для применения в ситуациях, когда пропускная способность канала ограничена.
MQTT – это легкий, компактный и открытый протокол, основанный на модели **Издатель/Подписчик**.
Передающие устройства – это **Издатели**, а принимающие устройства – **Подписчики**.
Все они работают через сервер, называемый **брокером**. Он отвечает за получение, хранение и доставку сообщений.
Таким образом, этот подход хорошо и довольно эффективно подходит для приложений, в которых необходимо собирать данные и управлять простыми устройствами.
![MQTT](/assets/images/iot/mqtt.png "MQTT")
Все поступающие на брокер сообщения попадают в очередь. Каждое сообщение имеет определенную тему – **топик (topic)**.
Топик – это основная единица хранения информации. Топики состоят из одного или нескольких уровней, которые разделены между собой символом «**/**»,
что в конечном итоге позволяет формировать дерево топиков.
В целом, базовые требования к структуре топиков неплохо описаны The HiveMQ Team в их [блоге](https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/):
1. Уровни топиков разделяются с помощью "/"
2. Именем топика может быть любая UTF-8 строка
3. Имя каждого уровня топика должно содержать минимум один символ
4. Имена чувстВиТеЛьНы к РеГисТру
5. "/" тоже может быть именем топика, но это может запутать
Так что если у вас есть датчики температуры на кухне, в спальне и пара датчика в гостиной, то вы можете задать их так:
```
home/kitchen/temperature
home/bedroom/temperature
home/living_room/temperature1
home/living_room/temperature2
```
В топик можно опубликовать (PUBLISH) любой пакет информации и он будет доставлен всем, кто подписался (SUBSCRIBE) на этот топик.
Полная информация – http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html.
Подписчик может так же получать данные сразу с нескольких топиков, для этого существуют символы подстановок (**wildcard**).
Они бывают двух типов: одноуровневые (задаются символом «**+**») и многоуровневые (задаются символом «**#**»).
Если устройства подпишутся на топики так, как указано на рисунке ниже,
![MQTT_Wildcard](/assets/images/iot/mqtt_sub_wildcard.png "Подписка с подстановками")
то в итоге они буду принимать информацию от следующих датчиков:
| Подписчик | Топик | Сообщения от датчиков (id) |
|:----------|-------------------------:|:--------------------------:|
| 1 | home/kitchen/temperature | 1 |
| 2 | home/+/+ | 1, 2, 3, 4, 5 |
| 3 | home/+/temperature | 1, 2, 4 |
| 4 | home/living_room/# | 4, 5 |
[**Далее >>>**](iot/summer-2021/arduino)
[danger]: /assets/images/iot-academy/danger.png