Был куплен у китайцев такой трекер:
Не хотелось хранить информацию на чужом сервере, возникла идея создать свой, благо модель трекера позволяла настроить его на работу с любым сервером.
Сразу оговорюсь, содержать свой сервер для одного устройства получится дороже (в моем случае $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