Базовые принципы настройки и последующей работы интернет-вещи через WiFi
Пишу длинно, чтобы объяснить весь контекст ситуации, допускаю что я придумываю велосипед, но не знаю какой.
Дано:
- Разрабатывается интернет-вещь, построенная на симбиозе raspberry pi и микроконтроллера.
- Контроллер в режиме реального времени собирает показания с датчиков и выполняет заложенную автоматическую программу, например стабилизации температуры в помещении.
- Малина используется для взаимодействия с пользователем через интернет, передачи команд контроллеру(зашифрованных), приема показаний контроллера и передачи их удаленному серверу(сервер тоже из "дано"), а также для обновления прошивки контроллера.
- Устройство монолитное, неразборное. Лишь кнопка включения/выключения/перезапуска. Необходимо реализовать надежную и удобную процедуру первоначальной настройки и последующего управления этой вещи у пользователя, после её приобретения. Предполагается что управлять вещью можно как в локальной сети, так и по глобальной.
- Юзер управляет вещью или через приложения, или через бразуер.
Говоря о "надежности" я подразумеваю как стабильность соединения, так и его безопасность. Говоря об удобстве, я подразумеваю как скорость отклика девайса, так и минимум телодвижений юзера для приведения девайса к работоспособности.
Излагаю свой вариант, исходя из своих поверхностных познаний в области интернет-сетей.
Первый запуск:
- После распакови вещи и подаче питания, малина настраевается как точка доступа, защищенная паролем. SSID уникален для каждого девайса, и соответствующий пароль находятся в базе данных сервера.
- Юзер, прочитав инструкцию, скачивает приложение на смартфон. Приложение требует от юзера как-то идентифицировать себя, например через google или facebook.
- Далее приложение требует от смартфона все разрешения для сканирования окружающих wifi-сетей, находит SSID "вещи", и загружает из удаленного сервера пароль для этого SSID, соединяется с малиной.
- Теперь малина передает смартфону список доступных ей wifi-соединений(он может не совпадать со списком смартфона, но это не так важно), смартфон предлагает юзеру ввести пароль для какой-нибудь. Перезапустив wifi в обычном режиме, малина получает доступ к локальной сети юзера и, возможно, к интернету.
- Также малина сохраняет в себе идентификатор пользователя, и теперь только он сможет с ней соединиться, и перенастроить, если ей снова придется перейти в режим точки доступа. База данных на удаленном сервере также запоминает, что этот девайс теперь привязан к этому пользователю.
Штатный режим работы:
На данном этапе мы получили устройство имеющее доступ к интернету и локальной сети роутера пользователя.
Допустим на малине запущен веб-сервер, однако в этом случае(насколько я знаю) даже зная глобальный ip девайса, законнектиться с малиной из приложения(браузера) получится только в локальной сети,
ведь заводские настройки роутера не пропускают входящие соединения извне.
Это я о том что не имею представления как напрямую соединиться с девайсом из интернета, кроме как удосужив объяснить пользователю как сделать проброс портов его роутера. Что, разумеется, колхоз.
Взаимодействовать через удаленный сервер тоже не вариант, т.к. получим жуткое время отклика, учитывая что девайсы будут в разных точках планеты, а сервер хочется один.
Уверен что можно как-то использовать удаленный сервер как посредника при установке соединения, а дальше устройства будут общаться напрямую, но не имею представления как это сделать, и какие инструменты для этого уже есть.
Я иногда пользуюсь программой Team Viewer, мне кажется что она работает по такому принципу.
Ответы (2 шт):
Жирность предложенного решения с малиной зашкаливает за все возможные пределы - это крайне избыточно - эти задачи может решить копеешный модуль типа ESP8266 / ESP32 "в одну каску". А если его еще и усилить микроконтроллером - ужас, сколько всего можно сотворить.
Посмотрите на то, как элегантно конфигурируется амазоновская кнопка или Яндекс-станция - мобильное приложение пропиликивает ей настройки через динамик - и все! Никакого ковряния в вайфаях, точках доступа и прочем.
После того, как устройство получило доступ к интернетику, оно может по https прицепиться к серверу управления и получать от него команды.
Еще одним неплохим вариантом, не требующим покупки внешнего сервера, может быть использование TOR - создание скрытого хоста. Не знаю, влезет ли клиент TOR в ESP8266 - но уж в RPi - точно влезет.
Например, как у меня сделан контроль протечек воды, чисто "админское" решение, наколеночное, за половину выходного дня:
Железо: плата ESP-01 + плата собственной разработки, на которой расположен источник питания + вторая плата, на которой расположена схема обработки сигнала от датчика протечки.
Сам датчик - две струны из стальной проволоки по периметру пола.
Протекшая вода электрически замыкает цепь между струнами, о чем узнает ESP-01 через свой PIN GPIO3
Каждые 20 секунд плата шлет на сервер по https (с контролем сертификата) свое состояние и токен авторизации (Исходник).
Сервер у себя пишет это состояние в файлик.
На том же сервере работает nagios, который следит за тем, что
- файлик свежий
- в файлике записана `#` - нет замыкания шлейфа
Стандартное приложение на телефоне (aNag) регулярно общается с nagios на сервере, информируя меня, что дома все спокойно.
В этом решении параметры доступа вкомпилированы в прошивку, однако, в дальнейших решениях я буду делать что-то похожее по конфигурированию на Яндекс-станцию.
Что касается использования внешнего сервера как посредника для последующего создания прямого соединения между устройствами - такие технологии есть, они применяются в VoIP.
Эти протоколы могут прокинуть UDP трафик сквозь NAT, путем манипулирования заголовками пакетов.


