Good news, everyone! Вышла новая версия прошивки DeviceHive для ESP8266. Мы реализовали поддержку самых популярных интерфейсов для подключения устройств: GPIO, ADC, PWM, UART, I2C, SPI, 1-wire. Теперь можно легко подключить устройства с этими интерфейсами к нашему облачному сервису. А самое главное — появилась возможность беспроводного конфигурирования прошивки (см. скриншот ниже). Об этом мы сегодня и поговорим.



Тройной RESET, или «Поехали!»


При создании IoT-устройств с беспроводным подключением часто можно столкнуться с неприятной проблемой: настроить устройство конечному пользователю не так легко, как кажется. Такие устройства обычно не оснащены экраном и клавиатурой, поэтому задать начальные настройки (данные Wi-Fi-сети, например) не выйдет без подходящего кабеля и специализированного ПО. Эту проблему мы и попытались решить в новой версии прошивки.

Теперь настроить все предельно просто:
• устройство трижды перезагружается (с интервалом не более 3-х секунд), после чего превращается в точку доступа Wi-Fi;
• вы подключаетесь к этой точке и через браузер вводите все необходимые настройки;
• после применения настроек устройство автоматически перезагружается уже с новыми настройками.

Таким образом разом решаются обе проблемы — вам не потребуются ни кабели, ни специальное ПО. Кроме браузера… но у вас же есть браузер? Кнопка RESET чаще всего располагается прямо на корпусе девайса, трижды нажать ее должно быть достаточно просто.

Более того, в современных мобильных ОС не придется открывать даже браузер, ведь большинство из них поддерживают портальную аутентификацию (captive portal). На Apple-девайсах страница ввода данных открывается автоматически. Android же покажет уведомление, кликнув по которому, вы окажетесь на этой страничке.

На видео ниже можно посмотреть, как все работает с новой прошивкой и Android-устройством.



Своими руками


Давайте посмотрим, как в принципе работает такая система настройки, ведь ее можно реализовать для любого другого беспроводного устройства с Wi-Fi.

Для начала поднимаем обычную сеть Wi-Fi. В ней создаем DHCP-сервер, который будет раздавать IP-адреса подключенным устройствам. Но в качестве DNS-сервера он передает IP-адрес «хитрого» DNS. Вся хитрость в том, что на на любой DNS запрос «A» записи будет возращен всегда один и тот же IP — адрес HTTP-сервера, с помощью которого мы можем конфигурировать устройство. В случае ESP8266 DHCP, DNS и HTTP-сервер работают прямо на чипе. В совсем базовом варианте этого достаточно — открыв любую страницу в браузере, увидим страницу с настройками. Но, чтобы было красиво, можно заставить устройства, поддерживающие портальную аутентификацию, выводить уведомление о необходимости ввести данные.

Портальная аутентификация обычно используется для ввода данных и/или отображранения соглашении об использовании в гостничных, отельных и других Wi-Fi-хотспотах. Мы же используем эту технику для отображения нашей страницы.

Android при подключении к Wi-Fi-сети попытается зайти по адресу clients3.google.com/generate_204.
Устройства Apple пытаются подключиться к captive.apple.com.

Послав туда запрос, получите ответ вида:

$ curl http://clients3.google.com/generate_204 -i
HTTP/1.1 204 No Content
Content-Length: 0
Date: Mon, 07 Sep 2015 14:58:21 GMT
Server: GFE/2.0


$ curl http://captive.apple.com -i
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 68
Date: Mon, 07 Sep 2015 15:00:32 GMT
Connection: keep-alive

<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>


Т. е. в ответ на HTTP-запрос они возвращают ответ со статусом 2xx. Благодаря этим запросам, устройства и определяют, подключены ли они к интернету. Для реализации же портальной аутентификации необходимо в ответ на эти запросы (или просто на все запросы, кроме интересных нам) посылать ответ с кодом 302 Moved Temporarily и указать в заголовке поле Location с нашим адресом, т. е. ответ должен быть примерной такой:

HTTP/1.1 302 Moved Temporarily
Content-Length: 0
Location: http://example.com


Получив такой ответ, устройства поймут, что необходимо отобразить страницу с настройками по указанному адресу — Apple-устройства сами откроют эту страницу на экране, а Android покажет уведомление. В операционных системах без поддержки портальной аутентификации достаточно лишь написать в адресной строке браузера любой адрес начинающейся с «http://» — бразуер откроет страницу с настройками. При этом вы не введете пользователя в заблуждение, т. к. в адресной строке будет отображен адрес именно страницы с настройками. В прошивке для ESP8266 мы используем адрес devicehive.config.

Надеемся, что это все вам пригодится. Удачи в создании собственных IoT-решений!

Автор: Николай Хабаров, Senior Embedded Developer

Комментарии (5)


  1. Misery
    09.09.2015 08:03

    Приветствую. Есть ли возможность поднять прозрачный мост WIFI-UART? т.е. всё, что сыпится в wifi будет передаваться в UART?


    1. blind_oracle
      09.09.2015 10:18
      +1

      На прошивке NodeMCU — без проблем точно.


  1. DataArt
    09.09.2015 11:51

    Нет, наша прошивка работает через облачный сервис. Т.е. можно сыпать, что нужно послать чипу на облачный сервис, чип будет это подбирать и отправлять в UART.


    1. Boba_Fett
      09.09.2015 18:59

      Есть ли возможность поднять свой собственный облачный сервис с аналогичным функционалом?


      1. DataArt
        10.09.2015 14:56

        Конечно! Сам сервер — тоже оупенсорсный проект: github.com/devicehive/devicehive-java-server. Его можно развернуть и на облачных сервисах (вот здесь можно купить сервер на azure — azure.microsoft.com/en-us/marketplace/partners/dataart/devicehive), и на сервере в локальной сети. И для удобства вы можете использовать Docker для легкой установки:
        registry.hub.docker.com/u/devicehive/devicehive-standalone
        Вся установка сводится к выполнению команд:
        curl -sSL get.docker.com | sh
        sudo service docker start
        docker run -d --name=devicehive -p 8080:80 -p 9001:9001 devicehive/devicehive-standalone
        причем первые две это установка и запуск самого Docker. После запуска на 80-м порту будет запущен аналогичный плейграунду сервер, в том числе, с аналогичной админской веб консолью (http://127.0.0.1/admin логин/пароль после установки — dhadmin/dhadmin_#911).