# Интернет вещей > Интернет вещей (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