поднимаем свой сервер traccar и настраиваем GPS трекер для работы с ним

Был куплен у китайцев такой трекер:

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

Сразу оговорюсь, содержать свой сервер для одного устройства получится дороже (в моем случае $5 и безграничное количество устройств), чем платить за чужой (от 80 руб. за устройство).

Поискав готовые решения, я наткнулся на проект https://www.traccar.org, проект открытый, есть исходники на github https://github.com/traccar/traccar

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

<?php
set_time_limit (0);
$address = '127.0.0.1';
$port = 999;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, 0, $port) or die('Could not bind to address');
socket_listen($sock);
while (true) {
    $client =  socket_accept($sock);
    $input =  socket_read($client, 1024000);
    echo "$input\n";
    socket_close($client);
}
socket_close($sock);
?>

через NAT на роутере открыл порт наружу

дальше приступаем к настройкам трекера (брал с этого сайта http://miradmin.ru/gps-tracker-sinotrack-st-901/), далее транслирую то что использовал сам (команды отправляются смс сообщениями)

  1. Регистрируем номер телефона, с которого будем управлять устройством
    899977777770000 1
    89997777777 — номер телефона
    0000 — пароль (по умолчанию четыре ноля)
    1 — номер ячейки (можно зарегистрировать до 3 телефонов)
  2. Меняем пароль, конечно же
    77712340000
    777 — команда
    1234 — новый пароль
    0000 — старый пароль
  3. Меняем часовой пояс
    8960000E03
    896 — команда
    0000  — пароль
    E03 — часовой пояс Москвы
  4. Выбираем режим передачи данных (SMS или GPRS)
    7100000
    710 — команда для GPRS
    0000  — пароль
  5. Настройка точки доступа для GPRS
    Мегафон: 8030000 internet gdata gdata
    МТС: 8030000 internet.mts.ru mts mts
    Билайн: 8030000 internet.beeline.ru beeline beeline
    ТЕЛЕ2: 8030000 internet.tele2.ru
    0000  — пароль
  6. Задаем интервалы отправки сообщений на сервер при включенном зажигании и в режиме оффлайн
    800000 5
    каждые пять секунд при включенном зажигании
    8090000 300
    каждые пять минут при выключенном
    0000  — пароль
  7. Настройка спящего режима
    SLEEP0000 5
    после выключения зажигания через пять минут устройство «заснет», перестанет присылать сообщения на сервер, но будет реагировать на смс и звонки
    0000  — пароль
  8. Настройка сервера данных
    8040000 123.123.123.123 999
    123.123.123.123 — ip адрес сервера
    999 — порт сервера
    0000  — пароль

после указанных настроек я стал получать сообщения с трекера:

*HQ,9170631826,V1,105509,A,5576.7575,N,03761.0545,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105509,A,5576.7578,N,03761.0548,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105554,A,5576.7577,N,03761.0548,E,000.23,000,210919,FBFFBBFF,250,99,27914,55187#
*HQ,9170631826,V1,105624,A,5576.7575,N,03761.0549,E,001.05,000,210919,FBF7BBFF,250,99,27914,31740#

отлично! осталось создать сервер и транслировать данные туда

для начала я выбрал площадку для размещения виртуального сервера, делал на DigitalOcean
если хотите помочь нам и получить $25 на счет, воспользуйтесь реферальной ссылкой https://m.do.co/c/74f25c68fa79

используйте самый дешевый Droplet за $5 в месяц с ubuntu на борту

дальше в сжатой форме будут только команды для установки недостающих компонент и настройки конфигураций

$ apt-get update
$ apt-get upgrade
$ apt-get install mc

ставим java

$ apt-get install default-jdk

ставим mysql

$ apt-get install mysql-server mysql-client

далее запускаем mysql, настраиваем пароль пользователя root и создаем базу с пользователем для работы traccar

не забудьте указать свои
root_password — пароль root
user_password — пароль пользователя traccar_user

$ mysql -u root -p

USE mysql;
UPDATE USER SET authentication_string=PASSWORD(«root_password») WHERE USER=’root’;
FLUSH PRIVILEGES;

CREATE DATABASE traccar DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER ’traccar_user’@’localhost’ IDENTIFIED BY ’user_password’;
GRANT ALL ON traccar.* TO ’traccar_user’@’localhost’;
FLUSH PRIVILEGES;
EXIT;

качаем и устанавливаем сервер

$ cd /tmp

на момент написания статьи была актуальная версия 4.6, посмотреть версию можно тут https://github.com/traccar/traccar/releases/

$ wget https://github.com/traccar/traccar/releases/download/v4.6/traccar-linux-64-4.6.zip
$ unzip traccar-linux-64-4.6.zip

$ ./traccar.run
$ cd /opt/traccar/conf

настраиваем конфиг, приводим к виду ниже, не забудьте заменить user_password на тот, который указывали выше

$ mcedit 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>
    <entry key='database.driver'>com.mysql.jdbc.Driver</entry>
    <entry key='database.url'>jdbc:mysql://localhost:3306/traccar?useSSL=false&amp;allowMultiQueries=true&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF-8&amp;sessionVariables=sql_mode=''</entry>
    <entry key='database.user'>traccar_user</entry>
    <entry key='database.password'>user_password</entry>
</properties>

запускаем службу

$ service traccar start

смотрим запустился ли сервис

$ service traccar status

если все хорошо, получаем следующий вывод

● traccar.service - traccar
   Loaded: loaded (/etc/systemd/system/traccar.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-09-24 07:44:48 UTC; 1 day 3h ago
 Main PID: 8519 (java)
    Tasks: 30 (limit: 1152)
   CGroup: /system.slice/traccar.service
           └─8519 /opt/traccar/jre/bin/java -jar tracker-server.jar conf/traccar.xml

теперь можно подключиться непосредственно к web интерфейсу
http://ip_адрес_droplet:8082

по-умолчанию вводим:
Email: admin
Пароль: admin

не забудьте настроить наше устройство для передачи данных на сервер, для этого отправьте СМС
8040000 123.123.123.123 5013
123.123.123.123 — ip адрес нашего Droplet
5013 — порт сервера
0000  — пароль трекера

Важно! Трекер Sinotrack ST-901 использует протокол H02? соответственно указываем порт 5013!!!

В web интерфейсе добавляем устройство (левый верхний угол)

Имя: имя нашей машинки
Идентификатор: номер трекера (ID под штрих кодом)

через некоторое время машина появится на карте

Все! Для работы этого более чем достаточно!

Дальше пойдет дополнительная информация (необязательные опции)

  1. Для начала создал нового пользователя, чтобы не подключаться все время как admin
  2. Изменил единицы измерения скорости (в узлах скорость не очень)
    зашел Аккаунт — Атрибуты — добавить
  • Имя: Единица скорости
  • Значение: км/ч
  1. Сервер — Слой карты указал «Яндекс Карты», работают быстрее и стабильнее

Важная для меня опция — это ssl подключение к web интерфейсу, не хочется чтобы мой трафик мог видеть или менять оператор связи. Для этого вам понадобится доменное имя, и доступ к настройкам DNS, подтверждённый ssl сертификат не получится выпустить на ip адрес.

Для начала, создаем в DNS запись A, где для нашего домена (например, car.domain.ru) ассоциируем ip адрес нашего Droplet.

настраиваем nginx в режиме reverse proxy и подключаем Let’s Encrypt

$ apt-get install nginx
$ cd /etc/nginx
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

приводим конфиг к следующему виду, не забудьте заменить в четырех местах car.domain.ru на ваш домен

$ mcedit /etc/nginx/sites-enabled/default

server {
    listen 80;
    server_name car.domain.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443;
    server_name car.domain.ru;
    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;
    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
    access_log            /var/log/nginx/car.domain.ru.access.log;
    client_max_body_size 10M;
    client_body_buffer_size 128k;

    location / {
      proxy_set_header        Host $host;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";

      proxy_pass          http://localhost:8082;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8082 https://car.domain.ru;
      proxy_redirect ws://localhost:8082/api/socket /api/socket;
      proxy_send_timeout 86400s;
    }
}

Важно сделать именно так, в web интерфейсе используется WebSocket, который тоже надо правильно транслировать через прокси.

$ service nginx restart

Теперь вы можете открывать в браузере вашу карту по имени https://car.domain.ru и весь трафик к серверу и обратно будет шифроваться.

И самая малость, сделаем красиво, добавим подтвержденный сертификат. Нам поможет certbot (https://certbot.eff.org).

$ apt-get install software-properties-common
$ add-apt-repository universe
$ add-apt-repository ppa:certbot/certbot
$ apt-get update

$ apt-get install certbot python-certbot-nginx
$ certbot —nginx

далее будет предложено указать e-mail, выбрать найденные домены из конфигурации и сделать редирект http на https автоматически.

проверим автоматический выпуск сертификата:

$ certbot renew —dry-run

не забудьте добавить задание в crontab для автоматического перевыпуска сертификатов.

$ crontab -e

Например, каждого первого числа месяца, в 3 часа 12 минут будет попытка перевыпустить сертификат.
Добавьте строчку в конце (не забудьте, что в crontab нужно оставлять последнюю пустую строку).

12 3 1 * * /usr/bin/certbot renew

Поделиться
Отправить
Запинить
 9300   2019   GPS   Sinotrack   ST-901   traccar
6 комментариев
Дмитрий 2020

Добрый день.
Можtnt оказать услугу и сделать такой сервер для меня.
примерно 40 машин, 5 видов трекеров.

Павел 2021

А как же защита данных от самого трекера к серверу?
В общем статья классная, но для меня сложная (не айтишник).
Дмитрий, похожая ситуация была. Нужно было сделать такой решение для проката самокатов, обратился в компанию volhinsoft.ru, сделали мне сервис за месяц.

Игорь Соромотин 2021

● traccar.service — traccar
Loaded: loaded (/etc/systemd/system/traccar.service; enabled; vendor preset:
Drop-In: /etc/systemd/system/traccar.service.d
└─run-as-user.conf
Active: activating (auto-restart) (Result: exit-code) since Mon 2021-01-25 17
Process: 5537 ExecStart=/opt/traccar/jre/bin/java -jar tracker-server.jar conf
Main PID: 5537 (code=exited, status=1/FAILURE)

янв 25 17:27:05 trasar systemd[1]: traccar.service: Main process exited, code=ex
янв 25 17:27:05 trasar systemd[1]: traccar.service: Unit entered failed state.
янв 25 17:27:05 trasar systemd[1]: traccar.service: Failed with result ’exit-cod
У меня нормально не стартует не могу понять в чем дело

Алексей Наговицын 2021

после указанных настроек я стал получать сообщения с трекера:

*HQ,9170631826,V1,105509,A,5576.7575,N,03761.0545,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105509,A,5576.7578,N,03761.0548,E,000.13,000,210919,FBFF9FFF,250,99,27914,55187#
*HQ,9170631826,V1,105554,A,5576.7577,N,03761.0548,E,000.23,000,210919,FBFFBBFF,250,99,27914,55187#
*HQ,9170631826,V1,105624,A,5576.7575,N,03761.0549,E,001.05,000,210919,FBF7BBFF,250,99,27914,31740#

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

Алексей Наговицын 2021

0000 18 c0 4d 24 e6 bf c6 ad 34 7f 84 97 08 00 45 00 ..M$....4.....E.
0010 00 30 a1 38 40 00 75 06 02 43 2d 89 71 85 c0 a8 .0.8@.u..C-.q...
0020 02 96 8a ad 1e 61 0a 4c ed b6 00 00 00 00 70 02 .....a.L......p.
0030 35 20 4b 05 00 00 02 04 05 50 01 01 04 02 5 K......P....

Как это разобрать? Есть описание? Или что то я не так делаю?

Виталий Мерзлов 2022

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

  • на Windows?
  • на виртуальной машине или контейнер в Synology?
    Можете ли вы оказать услугу по реализации одного сервера?