Содержание статьи
INFO
NodeMCU от Expressif — это одна из самых недорогих плат с Wi-Fi, microUSB и программатором на борту. Она создана на базе модуля ESP8266. Плату второго поколения можно приобрести приблизительно за 6–7 долларов. С платой можно работать из Arduino IDE. Кроме того, плата поддерживает скриптовый язык Lua (переводится с португальского как «Луна»).
Подключение и настройка девайса
Для того чтобы под Windows девайс распознался, нужно скачать драйвер по следующей ссылке: CP210x USB to UART Bridge VCP Drivers.
Стандартная скорость последовательного порта NodeMCU — это 115 200 бит/с. Ты можешь установить другую скорость, но при первом же сбросе устройства она вернется к 115 200. Важно, чтобы драйверу была установлена точно такая же скорость.
Прошивка
Скорее всего, в первоначальной прошивке чего-то будет не хватать, поэтому в идеале нужно прошить устройство самостоятельно. Собрать образ Firmware можно несколькими способами: с помощью облачного сервиса, образа Docker’а или используя инструкцию для Linux.
Я собирал с помощью облачного сервиса, что и всем советую. 🙂
Если нужно отправить данные в облако, то понадобится выбрать SNTP, MQTT, HTTP (Wi-Fi, timer, file, GPIO, net, node, UART уже выбраны по умолчанию). Также следует пометить в качестве необходимого TLS/SSL support в пункте Miscellaneous options. Ссылка с bin-файлом приходит на почту. Точнее сказать, приходят даже сразу две ссылки. Одна с образом, поддерживающим операции с плавающей запятой, и вторая с не поддерживающим.
Перед прошивкой ESP8266 необходимо привести в особый режим. На плате имеется отдельная кнопка FLASH. Ее нажатие во время включения питания или нажатия reset переводит девайс в режим bootloader. Если вдруг в твоей модификации платы такой кнопки нет, то перед прошивкой нужно соединить GPIO0 с GND и нажать reset (этот способ подходит для ESP-12). Прошить Firmware можно утилитой PyFlasher. Py в названии означает, что приложение написано на Python. Есть еще nodemcu-flasher, но она давно уже не обновлялась. Ее я не пробовал.
Окно PyFlasher выглядит так:
Flash mode выбирается в зависимости от того, какая у нас плата. Большинству современных плат на базе модулей ESP8266 ESP-12 и ESP32 подходит режим DIO, ESP8266 от 01 до 07 — более быстрый режим QIO. DOUT используется ESP8285.
Настройка IDE
Скачиваем бесплатную IDE по ссылке ESPlorer. В качестве альтернативы есть ZeroBrane Studio. Мне больше всего по душе пришелся ESPlorer, поэтому приведу пример работы именно с ним.
ESPlorer написан на JAVA. Интерфейс приложения такой.
С левой стороны код, настройки и подобное. С правой — окно мониторинга и команды управления девайсом. Открываем приложение, выбираем порт. Устанавливаем скорость, на которой будет происходить обмен (вероятнее всего, это 115 200), и нажимаем Open.
Для разминки можно запустить простой скрипт, который мигает встроенным светодиодом:
LED = 0
gpio.mode(LED, gpio.OUTPUT)
function flash_led()
gpio.write(LED, gpio.LOW)
tmr.delay(500000)
gpio.write(LED, gpio.HIGH)
end
tmr.alarm(1, 1000, tmr.ALARM_AUTO, flash_led)
Если на нашей плате нет встроенного светодиода (или тебе уже вконец надоели примеры моргания светодиодом), то можно попробовать выполнить еще более простой скрипт, который выводит на экран строку:
print("Hello from Lua!")
После того как создашь файл формата .lua (допустим, test.lua), внесешь в него код и сохранишь на диск, можно будет загрузить его на устройство. Для этого необходимо открыть порт, если он не открыт (кнопка Open), и нажать кнопку Upload. Ее можно найти среди кнопок, которые расположены под кодом (слева).
Загрузив файл, выполним его, отправив команду
dofile("test.lua")
Команду можно ввести вручную в нижнее поле, расположенное справа под монитором. Особо ленивые, а точнее — рациональные программисты могут нажать кнопку Reload (крайний ряд кнопок справа). Появится список кнопок с загруженными на плату файлами .lua. Нажатие на кнопку с именем файла запустит файл на исполнение.
Если хочешь, чтобы файл запускался сразу после включения платы, то создай файл с именем AUTOEXEC.BA… тьфу, то есть init.lua. 🙂
Настройка облачной части для работы с устройством
Оставим на какое-то время наше устройство и создадим его двойник в облаке. С недавних пор двойник устройства можно создать прямо на портале Azure, воспользовавшись новыми возможностями. В группе настроек IoT-хаба под названием Explorers необходимо выбрать IoT Devices и нажать + Add
.
Для подключения устройства к IoT-хабу нам необходимо сгенерировать SAS (shared access signature). Для генерации SAS используется ключ двойника устройства, который можно получить с помощью вспомогательной утилиты (Device Explorer, iothub-explorer, IoT Extension for Azure CLI 2.0). Но проще всего получить ключ все там же, на портале Azure, зайдя в IoT Hub → IoT Devices.
SAS можно сгенерировать на устройстве, а можно с помощью своего онлайн-сервиса. В принципе, SDK может сгенерировать SAS автоматически (достаточно в коде указать ключ двойника устройства).
Способ, при котором SAS-токен генерируется веб-сервисом на ограниченное время, чуть более безопасен. Хотя существует и определенный нюанс. Если отправлять сервису только имя устройства, то злоумышленник может перебором имен получить токен какого-то другого устройства. Поэтому, чтобы немного обезопасить процесс, предлагаю такое решение: сохраним на устройстве хеш Azure-ключа двойника устройства. И в коде сервиса перед генерацией SAS проверим, совпадает ли хеш с хешем ключа устройства. Таким образом, получить SAS можно будет, только зная имя устройства и хеш его ключа.
Первый способ, при котором SAS генерируется на устройстве, более простой и удобный, но чуть менее безопасный, так как, получив доступ к устройству, злоумышленник сможет добыть ключ и генерировать SAS устройства самостоятельно. Во втором случае взломщик сможет получать только SAS токены, время жизни которых ограничено.
Выходит, что оба способа по большому счету неидеальны, если у хакера есть доступ к устройству. Даже защита соединения с помощью VPN здесь не поможет. В таком случае канал передачи будет защищен, но тот, кому попадет в руки устройство, сможет получить и доступ к каналу. К сожалению, на устройствах NodeMCU, Arduino и подобных нет возможности хранить ключи/пароли в каком-либо безопасном хранилище.
Создание Azure-функции для генерации SAS
В качестве онлайн-сервиса проще всего использовать Azure-функции. Это своеобразные сниппеты, которые можно писать сразу на портале Azure в браузере. Шутки шутками, но таким образом программировать можно даже со смартфона. Конечно, никто не запрещает создавать и отлаживать их и из Visual Studio и только потом публиковать в Azure уже в откомпилированном виде. Задача функции — выполнить какую-то, как правило, не особо сложную операцию. По микросервисной задумке, каждая функция умеет делать что-то одно, но зато очень хорошо (принцип Single responsibility).
Создать Azure Function App можно на портале, заполнив небольшую анкету.
Consumption Plan позволяет платить только за те вызовы функции, которые были совершены. Это самый недорогой вариант. На данный момент миллион вызовов функции дается бесплатно. Заметь, что вместе с функцией создается и вспомогательное хранилище данных (Storage).
После создания Function App можно создать и саму функцию. В данном случае нам нужна функция типа Webhook + API. Функция может быть открыта всем (анонимный доступ), а может быть доступна только обладателям особого кода. Код можно получить из окна работы с функцией, нажав на ссылку </> Get function URL
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»