Самое популярное назначение IoT-устройств — это сбор телеметрии. На сегодняшний день цены на облачные IoT-сервисы снизились буквально до одного доллара в месяц, который, согласись, не жалко отдать даже просто ради эксперимента. 🙂 В этой статье я расскажу, как отправить данные в облако с платы NodeMCU, используя язык Lua. Для создания облачной части я использовал Azure Functions и Table Storage, но мой PoC для NodeMCU и языка Lua можно использовать и с другими провайдерами облачных IoT-решений.

INFO

NodeMCU от Expressif — это одна из самых недорогих плат с Wi-Fi, microUSB и программатором на борту. Она создана на базе модуля ESP8266. Плату второго поколения можно приобрести приблизительно за 6–7 долларов. С платой можно работать из Arduino IDE. Кроме того, плата поддерживает скриптовый язык Lua (переводится с португальского как «Луна»).

Что отличает ESP8266 от других микроконтроллеров?

Загрузка ... Загрузка ...
 

Подключение и настройка девайса

Для того чтобы под 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 выглядит так:

PyFlasher
PyFlasher

Flash mode выбирается в зависимости от того, какая у нас плата. Большинству современных плат на базе модулей ESP8266 ESP-12 и ESP32 подходит режим DIO, ESP8266 от 01 до 07 — более быстрый режим QIO. DOUT используется ESP8285.

 

Настройка IDE

Скачиваем бесплатную IDE по ссылке ESPlorer. В качестве альтернативы есть ZeroBrane Studio. Мне больше всего по душе пришелся ESPlorer, поэтому приведу пример работы именно с ним.

ESPlorer написан на JAVA. Интерфейс приложения такой.

ESPlorer
ESPlorer

С левой стороны код, настройки и подобное. С правой — окно мониторинга и команды управления девайсом. Открываем приложение, выбираем порт. Устанавливаем скорость, на которой будет происходить обмен (вероятнее всего, это 115 200), и нажимаем Open.

Установка скорости порта в ESPlorer
Установка скорости порта в ESPlorer

Для разминки можно запустить простой скрипт, который мигает встроенным светодиодом:

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.

IoT Explorer
IoT Explorer

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 можно на портале, заполнив небольшую анкету.

Создание Azure-функции
Создание Azure-функции

Consumption Plan позволяет платить только за те вызовы функции, которые были совершены. Это самый недорогой вариант. На данный момент миллион вызовов функции дается бесплатно. Заметь, что вместе с функцией создается и вспомогательное хранилище данных (Storage).

После создания Function App можно создать и саму функцию. В данном случае нам нужна функция типа Webhook + API. Функция может быть открыта всем (анонимный доступ), а может быть доступна только обладателям особого кода. Код можно получить из окна работы с функцией, нажав на ссылку </> Get function URL.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    3 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии