поднимаем свой сервер 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/), далее транслирую то что использовал сам (команды отправляются смс сообщениями)
- Регистрируем номер телефона, с которого будем управлять устройством
899977777770000 1
89997777777 — номер телефона
0000 — пароль (по умолчанию четыре ноля)
1 — номер ячейки (можно зарегистрировать до 3 телефонов) - Меняем пароль, конечно же
77712340000
777 — команда
1234 — новый пароль
0000 — старый пароль - Меняем часовой пояс
8960000E03
896 — команда
0000 — пароль
E03 — часовой пояс Москвы - Выбираем режим передачи данных (SMS или GPRS)
7100000
710 — команда для GPRS
0000 — пароль - Настройка точки доступа для GPRS
Мегафон: 8030000 internet gdata gdata
МТС: 8030000 internet.mts.ru mts mts
Билайн: 8030000 internet.beeline.ru beeline beeline
ТЕЛЕ2: 8030000 internet.tele2.ru
0000 — пароль - Задаем интервалы отправки сообщений на сервер при включенном зажигании и в режиме оффлайн
800000 5
каждые пять секунд при включенном зажигании
8090000 300
каждые пять минут при выключенном
0000 — пароль - Настройка спящего режима
SLEEP0000 5
после выключения зажигания через пять минут устройство «заснет», перестанет присылать сообщения на сервер, но будет реагировать на смс и звонки
0000 — пароль - Настройка сервера данных
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&allowMultiQueries=true&autoReconnect=true&useUnicode=yes&characterEncoding=UTF-8&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 под штрих кодом)
через некоторое время машина появится на карте
Все! Для работы этого более чем достаточно!
Дальше пойдет дополнительная информация (необязательные опции)
- Для начала создал нового пользователя, чтобы не подключаться все время как admin
- Изменил единицы измерения скорости (в узлах скорость не очень)
зашел Аккаунт — Атрибуты — добавить
- Имя: Единица скорости
- Значение: км/ч
- Сервер — Слой карты указал «Яндекс Карты», работают быстрее и стабильнее
Важная для меня опция — это 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
Добрый день.
Можtnt оказать услугу и сделать такой сервер для меня.
примерно 40 машин, 5 видов трекеров.
А как же защита данных от самого трекера к серверу?
В общем статья классная, но для меня сложная (не айтишник).
Дмитрий, похожая ситуация была. Нужно было сделать такой решение для проката самокатов, обратился в компанию volhinsoft.ru, сделали мне сервис за месяц.
● 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
У меня нормально не стартует не могу понять в чем дело
после указанных настроек я стал получать сообщения с трекера:
*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#
Прямо в таком формате шлет?
Я пакет получаю, но там не текстовый формат... Как вы его парсите?
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....
Как это разобрать? Есть описание? Или что то я не так делаю?
Здравствуйте.
Подскажите пожалуйста, можно реализовать такой сервер:
Можете ли вы оказать услугу по реализации одного сервера?