Как открывать шлагбаумы и ворота силой мысли

от автора

Представьте: вы едете в машине на свою дачу с друзьями или девушкой и хотите произвести впечатление. Вы говорите: «Вот прямо сейчас я открою ворота на своём участке силой мысли!» Проходит буквально несколько секунд — и они начинают открываться. При этом вы не брали в руки пульт или телефон, не нажимали никаких кнопок, не давали голосовых команд… только ваш пристальный взгляд на ворота… Магия! Да, подобный сценарий точно имел бы огромный успех лет 20 назад, или, может, сработает и сегодня? Конечно, никакой магии нет — только современные технологии.

Я живу за городом, и каждый раз, когда еду из дома или домой, мне нужно открыть шлагбаум на въезде в посёлок и ворота на участок. Оба барьера можно открыть как с пульта, так и телефонным звонком. Вроде не сложно. Но у меня в машине целый зоопарк пультов (ещё плюс два от паркинга в городе и от работы) — попробуй-ка быстро найти нужный. Можно дать автомобилю голосовую команду «Позвони „шлагбаум“», и система послушно её выполнит. Но я частенько вспоминаю об этом уже перед самым шлагбаумом и стою перед ним, пока пройдёт звонок. Лично меня это иногда бесит…

Автоматизировать устранение преград

И однажды я задумался: а можно ли это автоматизировать? Просто ехать домой, оставаясь в своих мыслях, а все преграды открываются перед тобой, словно ими управляет невидимый швейцар. Конечно, я не был первым, кому пришла такая мысль. Есть множество систем автоматизации шлагбаумов и ворот — начиная с распознавания номера и заканчивая установкой специальной метки в автомобиле и считывателя у преграды. Но все эти системы небюджетны и не всегда справляются со своей задачей — номер банально может быть залеплен в снегопад. А что, если создать систему, которая не требует установки никаких дополнительных устройств, или стоимость этих устройств сравнима со стоимостью пяти чашек капучино в кофейне?

Так родилась идея создать мобильное приложение, которое будет следить за местоположением, и, если телефон — а вместе с ним и вы — приближается к преграде, приложение автоматически отправляет команду на открытие. Но команда может быть разной. В моём случае, если речь идёт о шлагбауме на въезде в посёлок, это будет телефонный звонок, т.к. до шлагбаума не добьёт Wi-Fi. А если нужно открыть ворота, команду можно отправить через интернет на специальное устройство.

Очертания технического задания есть, приступаем к уточнениям:

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

  • Чтобы случайный «залёт» GPS-точки в зону не открыл ворота, приложение не должно доверять одному замеру.

  • Нужно различать разные сценарии приближения к преграде – пользователь может ехать на автомобиле и тогда нужно открыть ворота, а может просто гулять со своей собакой и в этом случае команду посылать не надо.

  • Нужно различать направление движения чтобы не посылать ложные команды.


И вот что у нас получилось:

Приложение GeoTrigger Android версия

Внешний вид приложения можно увидеть ниже.

Интерфейс приложения

Интерфейс приложения

Пользователь может создать неограниченное количество «триггеров». В каждом триггере может быть от одной до пяти зон. Зона представляет собой круг с фиксированным радиусом — может быть от 10 до 1000 метров.

Настройка триггера

Настройка триггера

Подробности реализации

Если зон более одной, для успешного срабатывания триггера нужно «пройти» их все последовательно по порядку. Как было указано выше, требуется не просто попадание, а попадание с подтверждением. Работает простое правило: первое срабатывание не считается, оно лишь запускает таймер и поднимает внутренний флаг «мы здесь». Только начиная со второго замера подряд, когда флаг уже выставлен, приложение смотрит на таймер — и, если выдержка набрана, зона считается пройденной.

Длина выдержки зависит от того, насколько уверенно устройство находится внутри зоны. Если GPS-точка упала прямо в центр — достаточно полсекунды. Если болтается у самого края — нужно подождать две секунды. Это базовые временные промежутки, они дополнительно “сжимаются” в зависимости от скорости движения. Стоит одному из последующих замеров оказаться за пределами зоны — флаг и таймер сбрасываются, и всё начинается заново.

Постоянно опрашивать GPS каждую секунду — расточительно: это быстро садит батарею. Поэтому приложение подстраивает частоту проверок под расстояние до ближайшей зоны. Когда вы где-то далеко, приложение «засыпает» между проверками на время, пропорциональное этому расстоянию: грубо говоря, делится на предполагаемую скорость движения (~45 м/с, это около 160 км/ч) — намеренно завышенная оценка, чтобы перестраховаться и проверить позицию раньше, чем это может понадобиться. В итоге получается разумная пауза — иногда несколько минут, но при этом не более 10. Ближе к зоне паузы становятся короче: в пределах километра — раз в 5 секунд, в пределах 400 метров — раз в 3 секунды, ближе 100 метров — каждую секунду. Холодно-тепло-горячо!

Как только устройство входит в зону и начинается прохождение цепочки, приложение переключается в режим максимальной готовности и опрашивает GPS строго каждую секунду — до тех пор, пока ситуация не разрешится в ту или иную сторону.

Но меняется не только частота но и точность запроса геолокации. Пока ближайшая зона далеко, достаточно грубого сигнала — он дешевле для батареи. Когда до зоны меньше километра или уже идёт активное прохождение, приложение запрашивает высокоточный GPS: это важно, чтобы не пропустить момент входа и не получить ложное срабатывание из-за погрешности.

Дополнительно реализован Bluetooth-фильтр, правда только на Android — iOS не позволяет корректно и полностью реализовать этот функционал. При включении этого фильтра триггер и его зоны проверяются только если телефон подключен к указанному Bluetooth устройству, например, к автомобильной аудиосистеме или Bluetooth колонке, установленной на квадрике.

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

На практике этих правил оказалось достаточно: триггер срабатывает надёжно и именно тогда, когда нужно.

В приложении реализовано четыре варианта действий при срабатывании триггера (на iOS три), это:

  • Телефонный звонок. Открывается стандартная звонилка телефона и пользователю нужно нажать на «вызов». На Android в настройках можно включить прямой вызов и в этом случае звонок пройдет без подтверждения.

  • Прямое управление устройством S-Tech Relay Controller (доступно только на Android).

  • Управление этим же устройством через облако.

  • Демо-сигнал. Этот тип действия активируется в настройках и при срабатывании триггера телефон просто издает три коротких сигнала без реального действия. Этот тип удобен для тестирования и настройки триггеров.

Дополнительное железо

Ну вот в тексте появилось «S-Tech Relay Controller». Что это такое?

При проработке идеи мы задумались: раз у нас появляется такой инструмент, почему исполнительным устройством должно быть только GSM-реле? Оно имеет неоспоримые преимущества, но в то же время и очевидный минус — ежемесячная абонентская плата. А что если сделать собственное устройство, управляемое через интернет? Так и родился S-Tech Relay Controller.

Контроллер

Контроллер

Мы разработали девайс на основе Wi-Fi-модуля (ESP32), к которому приложение может подключиться как напрямую, так и через облако. Да, мы пошли дальше — помимо приложения и устройства, мы ещё и разработали собственный облачный сервис. Но как это всё работает?

Прямое подключение.

В случае прямого подключения в приложении указываются белый IP, порт, ID устройства, секретный код и ключ. Почему так много? Дело в том, что при прямом подключении организовать зашифрованное HTTPS-соединение — лишняя морока: мало кто, помимо покупки белого IP, приобретает ещё и доменное имя с сертификатом. Поэтому команды передаются по HTTP, и каждая из них содержит тайм-код и подписывается ключом — даже если команда будет перехвачена, воспользоваться ею злоумышленник не сможет. На iOS незашифрованные подключения запрещены на уровне системы, поэтому там этот режим недоступен.

Рассмотрим настройку подробнее. После подключения модуля к Wi-Fi (инструкция по подключению нанесена прямо на корпус устройства) открываем его веб-интерфейс и видим следующие параметры:

Настройка прямого подключения в контроллере

Настройка прямого подключения в контроллере
  • ID устройства — уникальный идентификатор, присваивается при производстве и не меняется;

  • Код доступа — секретный код, задаётся пользователем;

  • Порт — порт, который слушает контроллер, именно на него нужно настроить проброс на роутере;

  • Ключ — секретный ключ для подписи команд;

Вводим, генерируем и сохраняем все поля.

После настройки контроллера настраиваем проброс TCP-порта на роутере — внешний порт и порт контроллера при этом могут не совпадать. Не забываем «застолбить» за устройством в роутере IP-адрес, чтобы он никому больше не выдавался.

Далее в приложении указываем белый IP роутера, внешний порт проброса, ID устройства, код доступа и ключ из веб-интерфейса контроллера.

Настройка прямого подключения в приложении

Настройка прямого подключения в приложении

На этом настройка прямого подключения завершена.

Подключение через облако.

Для настройки такого подключения, также сначала заходим на веб-интерфейс S-Tech Relay Controller, и в соответствующей секции включаем эту опцию.

Облачное подключение на контроллере

Облачное подключение на контроллере

Далее, для получения секрета подключения нужно зайти на https://s-tech-cloud.ru и зарегистрироваться. Для этого понадобится ID устройства, его мы узнали на предыдущем шаге.

Регистрация в облачном сервисе, шаг 1

Регистрация в облачном сервисе, шаг 1
Регистрация в облачном сервисе, шаг 2

Регистрация в облачном сервисе, шаг 2

После успешной регистрации система предоставит два секрета, один для контроллера и второй для подключения смартфонов.

Возвращаемся в веб-интерфейс контроллера (http://s-tech.relay.local), вводим полученный секрет и сохраняем настройки облака.

Настройка облачного подключения в контроллере

Настройка облачного подключения в контроллере

На этом настройка подключения модуля к облаку завершена.

Далее нужно настроить подключение приложения смартфона. Необходимо ввести ID и секрет подключения смартфона, полученный в облачном сервисе, как показано ниже.

Настройка облачного подключения в приложении

Настройка облачного подключения в приложении

Всё, облачное подключение настроено.

Также в приложении предусмотрен обмен триггерами через QR-код — удобно, если нужно поделиться настроенным триггером с членом семьи или коллегой.

В общем, надеемся, наш труд будет полезен для уважаемого сообщества. Для обсуждения и уточнений приглашаем в специальный ТГ-канал

P.S. На момент написания статьи мобильное приложение доступно только для Android на RuStore, для iOS будет опубликовано позже.

ссылка на оригинал статьи https://habr.com/ru/articles/1043728/