Здесь описан один проверенный мной способ передачи данных с трекера на вебсервер.
Как известно этот девайс умеет передавать координаты не только по SMS, но и через GPRS. Трекер подключается к серверу по TCP протоколу на IP адрес и порт, указанный в его настройках. При успешном соединении координаты передаются потоком в виде отдельных записей с координатами точек:
$356245134206721,10,3,180209,011908,E13154.4445,N4307.6488,28.5,0.35,273.05,5,4.15!
$356245134206721,10,3,180209,012003,E13154.4447,N4307.6491,28.5,0.35,273.02,5,4.15!
$356245134206721,10,3,180209,012124,E13154.4439,N4307.6483,28.5,0.35,273.13,5,4.15!
Каждая запись содержит данные о IMEI трекера, текущем режиме работы, количестве видимых спутников, дату, время получения координаты, высоту над уровнем моря. Подробнее можно узнать в инструкции к трекеру.
Так как вебсервер принимает данные только по протоколу HTTP, то передавать данные от трекера напрямую php-скрипту нашего сайта не получится. Один из способов решения этой проблемы состоит в том, что можно воспользоваться сервисом xinetd. Этот сервис прослушивает определенные порты нв сервере и как только к ним происходит подключение - запускает соответствующее приложение. Если этим приложением будет наш php-скрипт выполняющийся в интерпретаторе PHP из командной строки, то он просто прочитает данные со стандартного потока и обработает так как нам нужно.
Для настройки xinetd заходим в каталог /etc/xinetd.d и создаем там файл с именем gprs-gps
service gprs-gps
{
flags = REUSE
socket_type = stream
wait = no
user = user
server = /usr/bin/php
server_args = /home/user/get_gps_point.php
log_on_failure += USERID
disable = no
}
где:
/usr/bin/php - путь к php-интерпретатору
/home/user/get_gps_point.php - путь php-скрипта
Далее нам нужно добавить название сервиса и номер порта в файл /etc/service
Добавляем в конец файла строку:
gprs-gps 20100/tcp # GPS data over GPRS
Номер порта 20100 можно поменять на любой другой свободный.
Теперь перезапускаем сервис xinetd:
# service xinetd restart
В php-скрипте данные принимаем такой конструкцией:
$data = file_get_contents('php://stdin');
В $data при этом попадают одна или несколько координат переданных в текущем сеансе связи треккера.
Как настроить трекер на GPRS передачу и обновить прошивку можно почитать на сайте
gpshome.ru.
UPD: При полевых испытаниях оказалось, что трекер не рвет TCP соединение после окончания сеанса связи, в итоге PHP скрипт уходит в бесконечный системный вызов и процесс повисает в памяти. Решить проблему либо убиванием процессов по cron'у через каждые N минут, либо добавить в скрипт такую консрукцию
function signal_handler($signal)
{
die "Caught SIGALRM\n";
}
pcntl_signal(SIGALRM, "signal_handler", false);
pcntl_alarm(100);
Теперь, при работе скрипта, на 100 секунде произойдет системный вызов SIGALRM, который запустит функцию signal_handler и эта функция завершит процесс.