Обработка запросов от китайского GPS-Tracker TK-102B

По просьбе страждущих в этой теме: #comment_70408960

Скажу сразу: пост пилить не хотел, т.к. уверен, что далеко не всем это будет интересно, но 3 подписчика меня фактически обязали :-)

Некоторое время назад мною был приобретён на Алиэкспрессе такой вот зверь:

Обработка запросов от китайского GPS-Tracker TK-102B Gps трекер, Карты, Мониторинг, PHP, Mysql, Длиннопост

С трекером возможно общаться по СМС, так же он может работать в режиме передатчика звука и, что самое для меня интересное, может отчитываться на сервер. Этот вариант мы и рассмотрим подробнее.

Для начала необходимо настроить сам трекер. Делается это с помощью СМС команд, отправленных на номер трекера. Стоит отметить, что они могут значительно отличаться в зависимости от версии и прошивки. Для моего это так:

begin123456 - инициализация. Здесь "begin" - команда, а "123456" - стандартный пароль по умолчанию.

password123456 111111 - смена пароля, но мы для простоты будем со старым.

admin123456 +79119876543 - установка телефона администратора (т.е. вашего). До этого момента трекер принимает команды с любого номера, а после только с установленных. Номеров может быть несколько, но начать лучше со своего иначе рискуете потерять управление.

adminip123456 8.8.8.8 2222 - собственно самое важное для нас - указание IP адреса и порта нашего сервера. IP адрес естественно должен быть статичный и внешний. Живущим за роутерами - не забываем пробросить порт.

apn123456 internet.mts.ru - настраиваем выход в интернет. Для каждого оператора строка разная. У меня мтс. Иногда может потребоваться так же пользователь и пароль. Их пишем через пробел т.е. что-то типа:  apn123456 internet.mts.ru mts mts

gprs123456 - собственно переключение на отправку данных с трекера на сервер (тот, что выше указали), а не через СМС.

check123456 - проверка состояния устройства. Ответ придёт в СМС и ОЧЕНЬ сильно зависит от версии/модели/продавца и хрен знает чего ещё. Если на момент проверки у нас УЖЕ работает сервер, о котором ниже, то минимум нам придёт GPRS: OK. Так же обычно есть инфа о заряде батареи и статусе GPS.

t060s***n123456 - собственно интервал отправки данных. 060 говорит об необходимости отправки раз в 60 секунд. *** - количество раз. Если "***" значит бесконечно, но можно указать и число раз. Минимальный интервал около 20 секунд. Я меньше 30 не ставил.

Кроме указанного минимума команд существует ещё множество и они легко гуглятся. Останавливаться тут на них мы не будем. Перейдём к серверу. Тут всё делится на 2 части. 1 часть непосредственно слушает порт, разбирает запросы и записывает это всё в базу. В моём случае рабочая версия у меня на php и пишем в mysql. Делал я это через сокеты. В общих чертах:

Открываем:

$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$res=@socket_bind($master, $ip, $port);

и в цикле читаем как-то приблизительно так:

if (socket_select($read, $NULL, $NULL, 0, 10))

if(in_array($master, $read))

$sockets[]=socket_accept($master);

далее обрабатываем и пишем в базу.

Трекер присылает строку такого вида:

(0270*******2BR00160615A5934.7690N03007.2188E005.9174004242.9700000000L00000000)

Строка всегда в скобках.

Начинается с части (или полного) серийного номера устройства. В нашем случае 0270*******2 (замазал). Далее команда. У нас это BR00 (собственно команда отправки координат). Дальше данные в зависимости от команды. 160615 - дата 15-06-2016 года. "А" якобы говорит о том, что данные актуальные (по документации). Дальше идёт широта и долгота: lat:5934.7690 lon:03007.2188 (преобразовать в нужную систему координат ещё надо). Потом скорость: 5.9 км/ч. Затем время: 17:40:04

Периодически трекер требует так называемый handshake (рукопожатие). Если на него не ответить, то требовать он его будет после каждого ответа. Команда-запрос: BP00. Ответ: (серийный номер+AP01HSO) Более подробно по серверу думаю не уложится в рамки данного поста. Спрашивайте - постараюсь ответить.

Вторая же часть отвечает за вывод из базы на карту. Я сделал это через API yandex карт. Выглядит у меня как-то так:

Обработка запросов от китайского GPS-Tracker TK-102B Gps трекер, Карты, Мониторинг, PHP, Mysql, Длиннопост

Это я к тёще ехал :-) Каждая точка это минута. Соответственно чем выше скорость, тем больше расстояние между точками. Однако реализация визуальной части у каждого может быть своя. Тут огромный простор для фантазии. Читаем из нашей базы и с помощью API формируем фигурами то, что хотим от точки до точки. Можно учитывать дороги, можно получать ближайший адрес (запрещено в бесплатном API в реальном времени, но может тут есть миллионеры, желающие купить платный доступ для бизнеса). Да хоть расход топлива рассчитывайте. Возможностей масса.

Описание самого API тут: https://tech.yandex.ru/maps/ По Гуглу есть аналогичное на гугле.

В заключении хочу сказать, что данный девайс полностью оправдал лично мои надежды, но тут раз на раз не приходится. Ссылку на продавца оставлю в комментариях. Прошу прощения за столь сжатый пост. Инфы действительно ОЧЕНЬ много и всё сюда вероятно не влезет, да и Лига Лени затягивает в свои сети.

TECHNO BROTHER

1.6K постов12.5K подписчиков

Добавить пост

Правила сообщества

1-Мы А-политическое сообщество. 2-Запрещено оскорбление: Администрации Пикабу, сообщества, участников сообщества а также родных, близких выше указанных.

3-Категорически запрещается разжигание межнациональной розни или действий, направленных на возбуждение национальной, расовой вражды, унижение национального достоинства, а также высказывания о превосходстве либо неполноценности пользователей по признаку их отношения к национальной принадлежности или политических взглядов. Мат - Нежелателен. Учитесь выражать мысли без матерщины

Вы смотрите срез комментариев. Показать все
1
Автор поста оценил этот комментарий

поделись исходниками. на своём raspberryPi попробую поднять. cyberpunkpro@gmail.com

Иллюстрация к комментарию
раскрыть ветку (19)
3
Автор поста оценил этот комментарий

Давайте я лучше вам помогу там, где у вас не получается. За время использования исходники выросли многократно, обросли ненужным для большинства функционалом и содержат кучу личных данных. Мне, если честно, лень это всё выпиливать до приемлемого состояния что бы ещё и работало. Если есть хоть минимальные знания в php - начните сами и спрашивайте тут. Я помогу. Общий принцип я привёл в посте.

раскрыть ветку (18)
Автор поста оценил этот комментарий

благодарю. если возникнут сложности - спрошу. наверно недели через две время будет свободное чтобы этим заняться. Если что в этом же посте отпишусь.

Автор поста оценил этот комментарий

Не понял. Какими исходниками? Я думал устройство само по себе работает и управляется по смс.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Есть вариант работы только через СМС. Я же попытался в посте рассмотреть вариант работы через сервер, исходники которого у меня и спрашивали.

Автор поста оценил этот комментарий
я никогда раньше не работал с сокетами(и вообще далёк от сетевого php), поэтому задам два ламерских вопроса.
1) допустим я написал скрипт который читает инфу из сокета и сохраняет в БД. куда этот php файл запихивать, чтобы он работал постоянно(автоматически)?
2) сколько gps-устройств можно повесить на один сокет/порт одновременно?
раскрыть ветку (14)
1
Автор поста оценил этот комментарий

1. rc.local например

2. теоретически очень много. Верхний предел мне неизвестен. Десятки тысяч, если памяти сервера хватит.

раскрыть ветку (13)
Автор поста оценил этот комментарий

никак не получается в автозагрузку добавить. сейчас в файле rc.local у меня такая строка:

/usr/bin/php /var/www/html/test.php

exit 0

и нихера не происходит.
обёртка вида:
#! /usr/bin/php
<?php
...
?> 
тоже не работает.
бедную VPS-ку перезагрузил уже раз 20 не меньше

раскрыть ветку (12)
Автор поста оценил этот комментарий

а rc.local вообще выполняется при перезагрузке ?

а что в логах пишут ?

Проверь права.

У меня сам php файл по твоему второму варианту ("обёртка вида") с правами на исполнение, а из rc.local я его просто вызываю. Всё работает.

Да, ещё советую добавить в самое начало скрипта это, если нет ещё:

set_time_limit(0);

ob_implicit_flush();

раскрыть ветку (11)
Автор поста оценил этот комментарий

слушай а может правильнее будет засунуть в крон скрипт который каждые 5 минут будет делать проверку создан ли сокет. если нет то будет вызываться основной скрипт?

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

хотя это звучит как костыль.

раскрыть ветку (3)
Автор поста оценил этот комментарий

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


p.s. если это кто-то читает в далёком будущем логи лежат по пути /var/log/daemon.log

Автор поста оценил этот комментарий

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

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я же написал: set_time_limit(0);

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

Автор поста оценил этот комментарий

А вообще лучше в rc.local в последнюю очередь прописывать. Когда сервер уже полностью отлажен и дорабатываться не будет. До этого лучше руками запускать.

раскрыть ветку (6)
Автор поста оценил этот комментарий

слушай а рукопожатие обязательно в ответ отсылать? у меня вчера весь вечер запись в бд шла без обратного ответа. а сегодня тупо по нолям. трекер на смс отвечает но отправлять данные по gprs на отрез отказывается. причём порт открыт и функционирует. могу в него записывать данные если связаться из командной строки windows через telnet.

раскрыть ветку (5)
Автор поста оценил этот комментарий

Если не отправлять, то он просто будет их в каждом ответе просить. Что будет если сутки не отвечать - не знаю. Может и отвечать перестанет или сессию закроет, но у тебя скорее всего проблема с сокетами. Делай списками. Так как в посте. Тогда понятнее будет кто открыт/закрыт

раскрыть ветку (4)
Автор поста оценил этот комментарий

Я попытался открыть второй порт тупо скопировав и переименовав файл server.php и изменив в нём порт. запустил их два одновременно и теперь происходят странные вещи. Связал примерно так:
gpsA - портA  и gpsB-портВ  но данные пишутся не туда))  gpsA пишет в базу данныхB , а gpsB в базу_данных_А.  у них область видимости переменных одинаковая чтоли?

Кстати вот мои исходники

https://docs.google.com/document/d/1VhKweA5HKG_gmAloS5Rq0Leb...

Автор поста оценил этот комментарий

У меня похоже сам gps-трекер не правильно настроен. он создает соединение и начинает туда пиздячить строки пока сервер не разорвёт соединение. Я делал сокет по примеру в котором разрыв происходил после получения 1Кбайт данных socket_read($read_sock, 1024, PHP_NORMAL_READ); а это примерно раз в полчаса. поэтому казалось что ничего не приходит.

Сейчас попробую настроить сервер, чтобы он обрывал соединение после получения полной строки вида (***).
Лично у тебя как разрыв происходит?

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

У меня это приблизительно так:

$master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

$res=@socket_bind($master, $ip, $port);

$sockets = array();

$read = array($master);


while (!$abort)

if (socket_select($read, $NULL, $NULL, 0, 10))

foreach($sockets as $key => $client)

и.т.д

1
Автор поста оценил этот комментарий

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

По поводу сокетов: почитайте про "socket_select" и всё что с этим связано. Ты, на сколько я вижу, немного не так его готовишь. :)

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку