Разработка для «интернета вещей»: языки программирования, операционки и каналы связи
Разбираемся, на чём кодят IoT, как выбрать язык программирования для проекта и что популярнее — провода или эти ваши хипстерские вайфаи.
Иллюстрация: Оля Ежак для Skillbox Media
Интернет вещей (Internet of Things, IoT) — это когда вещи и предметы физического мира могут взаимодействовать между собой напрямую, не требуя вмешательства человека.
Простой пример — холодильник, который сам следит за количеством молока и других продуктов и делает заказ в интернет-магазине, когда они заканчиваются. Или умная колонка, которая связана с датчиками протечки, задымления и другими девайсами в вашем доме и способна управлять ими и снимать с них показания.
Архитектуру IoT-решений принято делить на четыре уровня:
- датчики, которые собирают данные: например, датчики протечки, движения, освещения и тому подобные, подключённые к микроконтроллеру;
- локальные шлюзы — устройства, которые передают и обеспечивают обмен данными;
- Edge Servers — граничные серверы, которые хранят, аккумулируют и обрабатывают данные непосредственно там, где информация производится (например, это могут быть производственные помещения);
- облачная инфраструктура.
Компании, которые занимаются разработкой IoT-устройств и решений, нередко разрабатывают как и сами устройства, так и всё ПО для всех четырёх уровней устройств. Исключение — компании, которые собирают отдельные датчики или девайсы для уже готовых экосистем и стандартов, поддерживаемых крупными вендорами. «Железо» и различные архитектуры мы почти не затронем — подробности об этой стороне IoT можно узнать в выпуске нашего подкаста «Люди и код», посвящённом микроконтроллерам.
На чём программируют интернет вещей
Так как архитектура интернета вещей состоит из четырёх уровней, для программирования под каждый из них разработчики выбирают свои технологии. Согласно исследованию Eclipse Foundation от декабря 2021 года, в IoT наибольшей популярностью пользуются такие языки:
- Лидеры на встраиваемых устройствах и микроконтроллерах — C, C++, Java и Python.
- Для программирования шлюзов чаще всего выбирают Python, C++, C и Java.
- Для серверной разработки предпочтение отдают Python, Java, C++ и C.
- В облаках — Python, Java, JavaScript, C++.
«В разработке IoT-устройств всё делается с применением стандартных подходов — подводных камней нет, и всё более-менее предсказуемо. Выбор конкретного языка программирования чаще всего зависит от удобства и принятых стандартов, но на безопасность почти не влияет».
Иван Юшков,
разработчик в сфере IoT
Python
Примечательно, что по итогам 2021 года явным лидером стал Python — хотя за год до этого в топе был Java. Это, кстати, интересный тренд: в том же рейтинге популярности языков программирования TIOBE в 2021 году Python наконец-то сумел обойти Java и C — фактически бессменных лидеров последних десятилетий.
«Python прост в освоении и поддерживается большим отзывчивым сообществом. Его синтаксис чистый и простой, что привлекает большое количество программистов. Поэтому Python часто выбирают социологи и биологи — чтобы программировать лабораторные устройства. А ещё это предпочтительный язык для одного из самых популярных микроконтроллеров на рынке — Raspberry Pi».
Кинман Кови,
разработчик микроконтроллеров
Рост популярности Python вполне понятен: это удобный и быстрый с точки зрения написания кода язык с кучей библиотек почти под каждую задачу (особенно силён в сфере машинного обучения и работы с данными), он прекрасно взаимодействует со многими языками программирования (недаром его часто называют «клеем» среди языков программирования). Кроме того, устройства с каждым годом становятся всё мощнее и вопрос оптимизации стоит уже не так остро, как вопрос скорости разработки и поставки ПО.
Если проект простой и не требует больших вычислительных мощностей, можно использовать стандартные библиотеки Python, а вот для микроконтроллеров стоит посмотреть на пакет MicroPython — он подходит для запуска Python на небольших платах с 256 КБ памяти и 16 КБ оперативки и площадью в пару квадратных сантиметров.
Хотя вполне очевидно, почему в нише микроконтроллеров и встроенных устройств позиции Python не так прочны — здесь гораздо выше требования к скорости исполнения, энергосбережению и экономному расходованию памяти. Конечно, в таких условиях Python и MicroPython уступают более скоростным C, C++ и Java.
«В IoT существует свой набор ограничений — например, интернет-соединение в один килобит или ограничение частоты отправки сообщений. Такие ограничения возникают из-за повышенных требований к экономии ресурсов — например, может быть критично, чтобы ваше устройство было способно проработать условные 100 лет на одной батарейке».
Иван Игнатьев,
Cloud Solution Architect из Pluto Informatics
C++
Второе место можно отдать «плюсам» — всё-таки ещё не перевелись любители пощекотать себе нервишки :) Его часто используют на одноплатных компьютерах типа Raspberry Pi — он быстрый, как C, но при этом разработка на нём, как правило, занимает меньше времени.
Java
Сила Java — в переносимости и принципе write once, run anywhere. Если виртуальная Java-машина (JVM) поддерживает какую-то архитектуру, вы обычно можете быть уверены, что ваш код будет на ней работать так же, как и на других платформах.
Кроме того, Java — это классический ООП-язык, удобный для энтерпрайз-решений, с большим набором библиотек и инструментами для работы с безопасностью, а байт-код и сама Java-машина за долгие годы были оптимизированы и могут исполняться с достаточно хорошей скоростью.
«Какой язык использовать в проекте, зависит от юзкейсов. Например, есть задача — определить заполняемость мусорных баков в городе. Для этого внутри них ставят датчики и следят за наполнением. Датчик в этом случае должен быть как можно менее энергозатратный, так как мы не можем подключить каждый мусорный бак к розетке или регулярно ездить и менять в них батарейки. Поэтому для таких задач используются языки более низкого уровня вроде C или предназначенного для встроенных систем Java Embedded».
Иван Игнатьев,
Cloud Solution Architect из Pluto Informatics
C
Да, этот старичок ещё очень популярен во встраиваемых системах и в качестве средства для системного программирования — где-то в силу традиций и накопленной большой кодовой базы на C, которую пока невозможно (да часто и не нужно) перевести на более современные языки, где-то в силу его скорости и других плюсов. К тому же благодаря C разработчик может напрямую взаимодействовать с памятью и любым «железом» — не зря C называют «переносимым ассемблером».
«У меня был проект промышленного IoT с „Роснефтью“ с системой предиктивной (предсказательной) аналитики. С помощью датчиков она определяла, сколько нефти проходит через весы, а сколько попадает в хранилища, а потом анализировала, сходятся ли эти данные, нет ли издержек. Датчики весов подключались к интернету и передавали данные на сервер. Софт для них был написан на C».
Алексей Барышников,
Java-/JS-разработчик
JavaScript
JavaScript тоже используют в IoT. Причём не только для веб-интерфейса приложений, но и для софта серверов. А в сочетании с фреймворком Node.js — ещё и для датчиков, серверов и шлюзов на ОС Linux. Например, построить софт на Node.js удалось в микроконтроллерах производителей Espruino и Tessel.
«Если объект можно запитать от солнечной панели или другого внешнего источника, то обычно в IoT используют Python, MicroPython, JavaScript и Node.js».
Иван Игнатьев,
Cloud Solution Architect из Pluto Informatics
LUA
Этого языка (как и последующих) нет в топе исследования, однако он часто упоминается в связи с IoT. Фишка языка — он специально был разработан для поддержки средств описания данных, у него есть особый фреймворк Node.lua, то есть порт, или аналог, Node.js в LUA-мире, к тому же построенный на облегчённом интерпретаторе LUA.
Go
У Go богатая стандартная библиотека, отличная работа с параллелизмом из коробки, и его популярность в мире постоянно растёт.
«Golang в основном заменяет JavaScript/Node.js для серверных HTTP-приложений. На мой взгляд, он гораздо лучше JavaScript. Golang можно использовать и в других компонентах IoT, но, по моему опыту, он для этого не очень подходит. Часть кода используется в высокоуровневых программах, а часть должна работать на низком уровне — ближе к „железу“. В IoT хватает и того, и другого.
И вот для низкоуровневой работы Go практически не годится. Он некрасиво обрабатывает данные, а использование указателей — так и вообще устаревший подход. Короче говоря, для работы с протоколами он не подходит. Конечно, даже несмотря на это в подобных задачах он ещё лучше Java, но гораздо хуже C. А если вас пугает сложность C и вы думаете, чем бы его заменить, — лучше обратите внимание на Julia».
JP Norair,
IoT-разработчик, комментарий на Quora
PHPoC
Это особая версия PHP для работы с чипами. Удобна для тех, кто уже знает PHP и хочет заняться интернетом вещей. Плюс в этом диалекте из коробки есть средства, полезные для разработки под IoT. К тому же более 90% серверов в мире по-прежнему работают на PHP, поэтому этот язык также популярен в интернете вещей и применяется для управления микросервисами на базе Linux.
Swift
Swift используется для создания приложений для умных устройств в экосистеме Apple. У Swift собственные библиотеки для платформы HomeKit, которая обеспечивает поддержку интеграции каналов данных из сети совместимых устройств.
Какие операционные системы и каналы связи используют в IoT
Использование операционных систем, как и в случае языков программирования, определяется тем, с какой частью архитектуры вы работаете (но надо понимать, что для уровня микроконтроллеров и встраиваемых устройств операционная система — необязательный компонент).
Во встраиваемых устройствах, шлюзах и микроконтроллерах самым популярным выбором является Linux (в основном урезанные или специфические версии — из «обычных» линуксов более-менее популярен разве что CentOS). Linux — гибкая и свободная ОС, которую можно «доработать напильником» практически под любые нужды, которая умеет запускаться на множестве разных архитектур. Плюс у него огромное сообщество и куча готового софта почти под любые задачи (разве что с Photoshop и Microsoft Office проблемы — но кому они нужны в IoT).
«Для всего, что можно воткнуть в розетку, существует операционная система Linux. В качестве use case может быть определение безопасности закрытия дверей в поезде. Для этого используют обычные компьютеры, которые соединены с датчиками по проводу или с помощью Bluetooth.Чтобы эта система работала, нужно полноценное питание и интернет-соединение. Приложения для умного дома можно писать на чём угодно — в серверных используют файрволы, роутеры и хранилища App Storage для загрузки файлов. Для написания приложений существует множество open-source-проектов, в основном построенных на PHP».
Иван Игнатьев,
Cloud Solution Architect из Pluto Informatics
За Linux следует FreeRTOS — операционка реального времени, созданная специально под микроконтроллеры. А значит, она умеет экономно использовать даже самые скромные ресурсы. Особенность систем реального времени — они заранее гарантируют, что задача будет выполнена в конкретные сроки. То есть работают максимально предсказуемо, что особенно важно для обработки критических запросов в военной или космической промышленности, а также везде, где от точной до миллисекунды обработки задачи зависят жизни людей или работоспособность дорогостоящего оборудования. Кстати, Linux так не умеет.
На третьем месте с большим отрывом — Windows. Все мы работали с терминалами оплаты или банкоматами, в которых нередко используется именно система от Microsoft. Это закрытая и гораздо менее гибкая система, и подходит она только для тех устройств, в которых достаточно много свободных ресурсов.
На четвёртом месте Zephyr — ещё одна свободная операционка реального времени, созданная специально для работы со встраиваемыми устройствами и микроконтроллерами.
А вот на серверах и в облаках ситуация отличается — хотя в рейтинге всё так же присутствуют Linux (лидирует с большим отрывом) и Windows. Кроме того, достаточно популярен майкрософтовский вариант Linux — Azure Sphere. Неудивительно — на ней строится Azure, а это один из лидеров в мире среди облачных платформ. Четвёртое место скромно заняла FreeBSD, ещё одна свободная операционка, которая традиционно считается более надёжной и безопасной, чем Linux.
Среди каналов связи, конечно же, лидирует классический Ethernet — проводной, надёжный, стабильный и предсказуемый. Он обеспечивает самые большие скорости и может быть почти «бесплатным» с точки зрения энергопотребления.
Из беспроводных технологий наибольшей популярностью пользуется Wi-Fi — его можно развернуть относительно дёшево, не нужно использовать базовые станции, привязанные к операторам связи, у него отличная скорость, и он может покрывать относительно неплохое расстояние.
Чуть менее популярны сети сотовой связи. Их плюс — они уже есть на куче смартфонов, могут обеспечить хорошую зону покрытия и работают на больших расстояниях. То есть удобны там, где нет проводов, а Wi-Fi просто «не добивает».
Bluetooth на четвёртом месте — у него достаточно низкая скорость передачи данных, он не так стабилен в работе, и у него серьёзные ограничения по расстоянию между устройствами. Зато он экономнее в потреблении электроэнергии, чем Wi-Fi и сотовые сети связи.
«Приведу пример промышленного IoT-проекта — карта заводов с цветовой дифференциацией состояния. С помощью этой карты любой из менеджеров мог зайти на конкретный завод и посмотреть, в чём конкретно проблема на дашбордах с цифрами по каждому цеху — давление, температура и другие данные с промышленных IoT-устройств. Для передачи данных использовали DSL-линию — с её помощью выгружали Python-скрипты. Скрипты использовали для построения прогнозных моделей по объёмам производства нефти на заводе в Сочи. Для отображения моделей в единой ноде использовали Node.js и React, Polymer и Angular. С их помощью строили таблицы и графики из уже посчитанных дата-сайентистами данных, а также сырых данных, выгружаемых из Data Lake.
Конечный результат проекта — интерактивная карта в формате SVG, на которой отмечены точки с заводами „Роснефти“».
Алексей Барышников,
Java-/JS-разработчик
Заключение
Мир IoT — это наше будущее, а значит, разработка ПО для интернета вещей будет всё более востребованным занятием. Если вы уже кодите на Python, PHP, Java, Go или JS — попробуйте вкатиться в эту сферу через них. Python будет лучшим выбором для тех, кто ещё не знаком с программированием. А если вы хотите напрямую поработать с «железом» и памятью — обратите внимание на C/C++.