GPS мониторинг с оповещениями по геозонам с помощью Traccar - igancev.ru blog

GPS мониторинг с оповещениями по геозонам с помощью Traccar

Речь пойдет про свободную платформу “Traccar”. О том, как развернуть серверную часть на своем железе или на VPS, как всегда, с помощью Docker. Установим на смартфон 2 приложения: административное и GPS трекер. Настроим уведомления в телеграм на события въезда или выезда из заранее размеченной геозоны.

Веб интерфейс Traccar, точка на карте с геопозицией устройства

Вступление и мотивация

Для кого это все

Сразу к делу

Функционал отслеживания местоположения чего бы то ни было может понадобиться многим:

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

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

О Traccar

Все вышеперечисленные хотелки с лихвой покроет Traccar - современная платформа для GPS слежения.

Достоинства:

  • Open source, открытый исходный код (GPL-3.0, Apache-2.0)
  • Self-hosted, т.е. возможность размещения серверной части продукта на своем сервере
  • Огромный список поддерживаемых протоколов и устройств gps трекеров различных поставщиков, от недорогих и до высококачественных брендов
  • Предоставляет для работы настольный административный веб интерфейс, мобильные приложения ios, android, а также отдельные мобильные приложения ios и android для использования в качестве GPS-трекеров
  • Просмотр в режиме реального времени местоположения устройств
  • Позволяет гибко настраивать уведомления по Email, SMS, Telegram о различных событиях, произошедших в системе, таких как вход или выход в обозначенную геозону, статусы онлайн/офлайн, движение, скорость. А для профессиональных устройств более детальные оповещения, вроде уровня топлива, зажигания, и много других вещей, больше скорее предназначенных для мониторинга автопарка
  • Предоставляет API интерфейсы для интеграции со сторонними системами
  • Построение графиков и отчетов о проделанных поездках, отображение на карте и воспроизведение записанных маршрутов

Разработчики проекта монетизируют его за счет продажи хостинга под него и оказания профессиональной поддержки.

Компоненты

Схема со списком ПО входящим в комплекс Traccar. Клиент, GPS устройства, сервер, веб, менеджер, API

Используем только свободные решения

Безусловно, для личных нужд можно купить одно из готовых устройств GPS-трекеров, представленных на рынке. Для большинства производителем будет предоставлена готовая проприетарная серверная часть, куда устройство с завода настроено слать координаты, и откуда пользователь эти данные должен просматривать. Возможно это удобно, но это не наш путь. Координаты наших детей, близких, характер передвижения нашего транспорта и нас самих будет предоставляться третьим лицам. Эта информация владельцами сервиса может быть использована недобросовестно. Например, может быть перепродана. С их серверов могут произойти утечки. Владельцы могут наложить санкции, заблокировав доступ по принципу местоположения. Бизнес может обанкротиться, сервера отключат. Или на сервере спустя время обновится ПО, внезапно перестав поддерживать ваше оборудование, вынуждая купить новую модель.

Чтобы избежать всех вышеперечисленных рисков, необходимо такие чувствительные данные как местоположение хранить на своих серверах. Поэтому из аналогов рассматриваем только open source и self-hosted продукты.

Аналоги

  1. OwnTracks https://owntracks.org. Достойное решение, больше предназначенное для отслеживания местоположения близких и друзей через их смартфоны. Если вы ищете безопасный функционал для мониторинга местоположения своего ребенка, то стоит рассмотреть именно его. В свою очередь Traccar поддерживает прием данных из клиентского приложения OwnTracks. В экосистеме есть серверная часть (хранилище), а также Frontend (веб интерфейс на VueJs), Ios, Android.
  2. μlogger. Клиент на android + серверная часть. Решение в виде приложения только для android, которое пишет координаты на заданный сервер. Просто и незамысловато. Сервер монолитно и хранит данные, и предоставляет веб интерфейс.
  3. GPSLogger for Android https://gpslogger.app. Только клиентское приложение и только для android. Приложение пишет координаты локально на устройство, может выгружать дамп в облако, по ftp, а также можно настроить отправку координат на любой адрес по http, что позволяет быстро подружить его при желании со своим бэкендом.

Настройка сервера

Для развертывания серверной части нам потребуется машина с дистрибутивом на базе linux на борту. Подойдет любой современный дистрибутив с относительно свежим ядром, чтобы можно было установить docker. Это может быть как арендованный VPS, так и например ваш собственный домашний сервер. Подойдет даже Raspberry Pi с ее arm архитектурой.

Я же в качестве примера буду использовать арендованный VPS с Ubuntu 20.04.5 LTS на борту, и далее все примеры будут адаптированы именно к ubuntu.

Арендовать недорогой и надежный VPS для личных нужд можно тут.

Установка Docker

Следуем инструкциям по установке на сайте докера для своего дистрибутива, после чего выполняем пост инсталляционные действия.

Далее следует установить docker-compose либо из пакетного менеджера вашего дистрибутива, либо по инструкции с официального сайта. В моем случае на убунте удобнее поставить из пакетного менеджера:

sudo apt install docker-compose -y

Установка Traccar

Подготовка директорий под конфиги

На нашем сервере необходимо выделить директорию, где мы будем хранить конфигурационные файлы docker. Я обычно в домашней директории текущего пользователя создаю директорию ~/docker, в которой уже создаю отдельную директорию под каждое разворачиваемое на сервере решение, для порядка. В нашем случае конечная директория будет ~/docker/traccar. Также нам понадобятся директории для монтирования внутрь контейнера под конфиги ~/docker/traccar/conf и под логи ~/docker/traccar/logs. Создадим все директории одной командой:

mkdir -p ~/docker/traccar/{conf,logs}

docker-compose.yml

Запускать Traccar мы будем из официального докер образа (ссылки:
Github, Docker hub). По умолчанию контейнер настроен на работу с H2 Database, но для боевой эксплуатации рекомендовано использовать связку с Mysql. Для этого нам необходимо запустить рядом с Traccar контейнером еще контейнер mysql:8.0.31. Именно версии mysql:8.0.31, т.к. тут уже есть поддержка arm архитектуры, т.е. будет работать на Raspberry PI.

Скриншот с docker hub, mysql:8.0.31 имеет поддержку архитектур arm64/v8

Создадим ~/docker/traccar/docker-compose.yml со следующим содержимым:

---
version: '3'

services:

  traccar:
    image: traccar/traccar:latest
    restart: unless-stopped
    depends_on:
      - mysql
    ports:
      - '80:8082'
      - '5000-5150:5000-5150'
      - '5000-5150:5000-5150/udp'
    volumes:
      - ./data/logs:/opt/traccar/logs:rw
      - ./conf/traccar.xml:/opt/traccar/conf/traccar.xml:ro

  mysql:
    image: mysql:8.0.31
    command: --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
    environment:
      MYSQL_USER: mysqlUser
      MYSQL_PASSWORD: mySecretPassword
      MYSQL_DATABASE: traccar
      MYSQL_RANDOM_ROOT_PASSWORD: 1
    volumes:
      - traccar-mysql-volume:/var/lib/mysql

volumes:
  traccar-mysql-volume:

В нем мы описали сервис traccar, который будет запущен из официального образа. Внутрь монтируется пустая директория под логи, и xml файл с конфигом, который создадим на следующем шаге. Также прокидываем ряд портов:

  • 80 порт хостовой машины прокидываем на порт 8082 контейнера, на котором находится веб интерфейс
  • tcp и udp порты 5000-5150 с хостовой машины прокидываем как есть внутрь контейнера. Все эти порты нужны для поддержки всего зоопарка устройств, которые могут делиться своими координатами

Далее мы описали сервис mysql, в который примонтировали ниже описанный том, названный нами traccar-mysql-volume в директорию /var/lib/mysql. Здесь mysql хранит свое состояние, и данное монтирование обеспечит нам его сохранение при перезапуске контейнера. Порт 3306, на котором работает mysql, мы намеренно не будем расшаривать на хостовую машину потому, что описанные контейнеры будут находиться друг с другом в одной docker сети. Контейнер traccar итак беспрепятственно может обращаться к контейнеру mysql по алиасу сервиса.

Конфиг

Создадим файл конфига ~/docker/traccar/conf/traccar.xml со следующим содержимым:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE properties SYSTEM 'http://java.sun.com/dtd/properties.dtd'>
<properties>
    <entry key='config.default'>./conf/default.xml</entry>
    <!-- настройки подключения к базе данных mysql -->
    <entry key='database.driver'>com.mysql.cj.jdbc.Driver</entry>
    <entry key='database.url'>jdbc:mysql://mysql:3306/traccar?serverTimezone=UTC&amp;allowPublicKeyRetrieval=true&amp;useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
    <entry key='database.user'>mysqlUser</entry>
    <entry key='database.password'>mySecretPassword</entry>
    <!-- настройки telegram -->
    <entry key='notificator.types'>telegram</entry>
    <entry key='notificator.telegram.key'>token</entry>
    <entry key='notificator.telegram.chatId'>userId</entry>
</properties>

Как переключить дефолтный конфиг на работу с mysql описано тут. К настройкам telegram вернемся чуть позже.

Хоть порт mysql и не торчит наружу, оставаясь лишь доступным внутри docker сети, рекомендую заменить пароль в обоих файлах демонстрационный mySecretPassword на безопасный, сложный пароль.

Запуск

Все готово, можно запускать:

docker-compose up -d

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

docker-compose ps 

У обоих контейнеров в колонке STATUS должен быть статус running.

Запустим веб интерфейс, введя в браузере ip адрес вашего сервера http://ip-адрес-сервера. Должен открыться веб интерфейс. Вводим логин admin и пароль admin, входим.

Форма входа в веб интерфейс traccar

Первым делом сменим пароль администратора на надежный в разделе Настройки -> Аккаунт.

Настройка клиентов

Настройка клиента трекера

Трекером, т.е. устройством, которое сообщает о своих координатах на сервер, может выступать любой девайс из огромного списка поддерживаемых устройств. Мы же настроим официальное мобильное приложение под android. Есть также приложение под ios, а также скрытое приложение под android.

Установим Traccar Client из Google play.

Мобильное приложение traccar client под android

Нас интересуют в первую очередь настройки:

  • URL сервера, вводим http://ip-адрес-вашего-сервера:5055. Порт 5055 открыт на сервере, и ожидает, что туда будут прилетать координаты с клиента.
  • Идентификатор устройства уже любезно сгенерирован, на скриншоте 520794. Необходимо его будет далее зарегистрировать на сервере, чтобы сервер о нем знал и записывал присылаемые координаты. При желании id на клиенте можно изменить на собственный.

Устанавливаем переключатель состояния сервиса в активное положение, после чего приложение начинает периодически отправлять координаты на сервер. Частоту отправки и другие настройки можно настроить по желанию.

Регистрация девайса

Для добавления девайса на сервере перейдем на веб интерфейс Настройки -> Устройства -> Добавить устройство. Зададим удобное для отображения Имя устройства, а в поле Идентификатор внесем Идентификатор устройства, ранее полученный в мобильном приложении клиента:

Добавление девайса в веб интерфейсе traccar

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

Метка на карте в веб интерфейсе traccar

По прошествии времени можно строить отчеты в веб интерфейсе о проделанных маршрутах:

Отчет на карте о проделанном маршруте за промежуток времени

Есть и альтернативные клиенты, настраиваемые аналогичным образом.

Настройка клиента менеджера

Существуют мобильные приложения под android и ios c функционалом веб интерфейса. По сути это и есть веб интерфейс, завернутый в мобильное приложение.

Установим Traccar Manager из Google play. На старте приложение попросит ввести адрес вашего сервера, которым оно будет управлять. Вводим http://ip-адрес-сервера, далее логин и пароль администратора. Увидим уже знакомый интерфейс в миниатюре:

Мобильное приложение traccar manager под android

Нотификации в телеграм по гео зонам

Добавление геозоны

Для начала разметим на карте геозону, т.е. местность, по входу в которую и/или выходя из которой мы хотим получать уведомление, в нашем случае в телеграм. Перейдем в Настройки -> Геозоны, разметим интересующую нас область и сохраним.

Размеченная геозона на карте в веб интерфейсе traccar

Добавление уведомлений

Далее нужно создать нотификации. Зайдем в Настройки -> Уведомления, и добавим следующие нотификации:

  • Тип уведомления: Вход в геозону, Канал: Telegram
  • Тип уведомления: Выход из геозоны, Канал: Telegram

Создание уведомлений в traccar

Привязка к устройству

Привяжем к устройству ранее созданную геозону и уведомления. Для этого зайдем в Редактирование устройства -> Соединения. В геозонах выберем нашу геозону, и в уведомлениях выберем оба события вход/выход.

Привязка геозоны и уведомлений к девайсу в traccar

Со стороны Traccar все готово к отправке уведомлений. Тригеры входа девайса в зону и выхода из обозначенной зоны работают, осталось внести настройки в конфиг для получения уведомлений в телеграм.

Настройка телеграм бота

Создание бота

Необходимо создать телеграм бота, от имени которого Traccar будет отправлять нам уведомления. Делается это через сервисный аккаунт телеграма по созданию ботов @botfather. Там все интуитивно понятно, надо выбрать создание нового бота, выбрать ему имя, никнейм, пошагово все, что попросит бот по созданию ботов. В конце будет выдан токен для взаимодействия с ботом вида:

4839574812:AAFD39kkdpWt3ywyRZergyOLMaJhac60qc

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

Получение своего telegram id

Чтобы бот отправлял сообщения нам, необходимо знать наш Telegram id. Быстро и просто его узнать можно написав например боту @my_id_bot, который в ответном сообщении в чате отправит нам наш целочисленный Telegram id.

Редактирование конфига

Токен и Telegram id необходимо добавить в конфиг traccar. Для этого откроем для редактирования файл конфига ~/docker/traccar/conf/traccar.xml, и изменим значения в строках:

<entry key='notificator.telegram.key'>СюдаКопируемТокен</entry>
<entry key='notificator.telegram.chatId'>СюдаКопируемTelegramId</entry>

Сохраняем файл, переходим в директорию cd ~/docker/traccar и перезапускаем контейнеры:

docker-compose stop
docker-compose up -d

После чего Traccar наконец сможет уведомлять нас о событиях в Telegram:

Сообщения от telegram бота о событиях в traccar

Заключение

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

Комментарии

Любые обсуждения по теме приветствуются под постом данной статьи в телеграм канале.