Следующая новость
Предыдущая новость

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

01.03.2018 12:55
Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

Содержание статьи

  • Подключение и настройка девайса
  • Прошивка
  • Настройка IDE
  • Настройка облачной части для работы с устройством
  • Создание Azure-функции для генерации SAS
  • Написание кода для отправки данных в облако
  • Работаем с NodeMCU из Arduino IDE
  • Сохранение данных в облаке Azure

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

INFO

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

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

  • Дешевый и функциональный чип, который работает при экстремальных температурах от –40 °C до +125 °C
  • Сравнительно большой объем ROM
  • Детальная документация и полностью открытые спецификации

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub Загрузка …

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

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

Для того чтобы под Windows девайс распознался, нужно скачать драйвер по следующей ссылке: CP210x USB to UART Bridge VCP Drivers.

Стандартная скорость последовательного порта NodeMCU — это 115 200 бит/с. Ты можешь установить другую скорость, но при первом же сбросе устройства она вернется к 115 200. Важно, чтобы драйверу была установлена точно такая же скорость.

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

Свойства драйвера

Прошивка

Скорее всего, в первоначальной прошивке чего-то будет не хватать, поэтому в идеале нужно прошить устройство самостоятельно. Собрать образ 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 выглядит так:

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

PyFlasher

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

Настройка IDE

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

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

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

ESPlorer

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

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

Установка скорости порта в 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.

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

IoT Explorer

SAS можно сгенерировать на устройстве, а можно с помощью своего онлайн-сервиса. В принципе, SDK может сгенерировать SAS автоматически (достаточно в коде указать ключ двойника устройства).

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

Создание токена с помощью сервиса

Способ, при котором SAS-токен генерируется веб-сервисом на ограниченное время, чуть более безопасен. Хотя существует и определенный нюанс. Если отправлять сервису только имя устройства, то злоумышленник может перебором имен получить токен какого-то другого устройства. Поэтому, чтобы немного обезопасить процесс, предлагаю такое решение: сохраним на устройстве хеш Azure-ключа двойника устройства. И в коде сервиса перед генерацией SAS проверим, совпадает ли хеш с хешем ключа устройства. Таким образом, получить SAS можно будет, только зная имя устройства и хеш его ключа.

Первый способ, при котором SAS генерируется на устройстве, более простой и удобный, но чуть менее безопасный, так как, получив доступ к устройству, злоумышленник сможет добыть ключ и генерировать SAS устройства самостоятельно. Во втором случае взломщик сможет получать только SAS токены, время жизни которых ограничено.

Выходит, что оба способа по большому счету неидеальны, если у хакера есть доступ к устройству. Даже защита соединения с помощью VPN здесь не поможет. В таком случае канал передачи будет защищен, но тот, кому попадет в руки устройство, сможет получить и доступ к каналу. К сожалению, на устройствах NodeMCU, Arduino и подобных нет возможности хранить ключи/пароли в каком-либо безопасном хранилище.

Создание Azure-функции для генерации SAS

В качестве онлайн-сервиса проще всего использовать Azure-функции. Это своеобразные сниппеты, которые можно писать сразу на портале Azure в браузере. Шутки шутками, но таким образом программировать можно даже со смартфона. Конечно, никто не запрещает создавать и отлаживать их и из Visual Studio и только потом публиковать в Azure уже в откомпилированном виде. Задача функции — выполнить какую-то, как правило, не особо сложную операцию. По микросервисной задумке, каждая функция умеет делать что-то одно, но зато очень хорошо (принцип Single responsibility).

Создать Azure Function App можно на портале, заполнив небольшую анкету.

Прыжок в облако. Строим бюджетное решение для интернета вещей на NodeMCU + Azure IoT Hub

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

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

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

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

Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

1 год

6390 р.

Экономия 1400 рублей!

1 месяц

720 р.

25-30 статей в месяц

Уже подписан?

Источник

Последние новости